AWS Config에서 매달 기록하는 구성 항목의 수를 검색하려면 어떻게 해야 합니까?

5분 분량
0

AWS 계정의 청구 내역을 이해할 수 있도록 AWS Config에서 기록하는 구성 항목(CI)의 수를 찾으려고 합니다.

해결 방법

Amazon Athena를 사용하여 계정의 매달 CI 수를 확인할 수 있습니다.

Amazon S3 버킷에 구성 파일이 포함되어 있는지 확인

AWS Config가 구성 기록 파일을 지정된 Amazon Simple Storage Service(Amazon S3) 버킷으로 전송할 수 있어야 합니다. AWS Config는 일반적으로 6시간마다 버킷에 구성 기록 파일을 전송합니다.

S3 버킷에 구성 파일이 포함되어 있는지 확인하려면 다음 단계를 완료합니다.

  1. AWS Config 콘솔을 엽니다.
  2. 탐색 창에서 설정을 선택합니다.
  3. Amazon S3 버킷 섹션에서 버킷 이름을 기록해 둡니다.
  4. Amazon S3 콘솔을 열고, S3 버킷을 선택합니다.
  5. S3 버킷에 구성 파일이 포함되어 있는지 확인합니다.
    참고: 구성 파일이 없는 경우 AWS Identity and Access Management(IAM) 역할Amazon S3에 필요한 권한이 없을 수 있습니다.

Athena에서 테이블 생성

Amazon Athena 쿼리 편집기를 사용하여 테이블을 생성합니다. 쿼리 편집기에서 다음 명령문을 입력합니다.

CREATE EXTERNAL TABLE awsconfig (         
         fileversion string,
         configSnapshotId string,
         configurationitems ARRAY < STRUCT < configurationItemVersion : STRING,
         configurationItemCaptureTime : STRING,
         configurationStateId : BIGINT,
         awsAccountId : STRING,
         configurationItemStatus : STRING,
         resourceType : STRING,
         resourceId : STRING,
         resourceName : STRING,
         ARN : STRING,
         awsRegion : STRING,
         availabilityZone : STRING,
         configurationStateMd5Hash : STRING,
         resourceCreationTime : STRING > >
)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' LOCATION 's3://BUCKET-NAME/AWSLogs/ACCOUNT-ID/Config/REGION/';

참고: 예시로 나온 S3 버킷 위치를 해당하는 S3 버킷 위치로 바꾸십시오.

Athena 엔진 버전 2를 사용하는 경우 텍스트 파일의 최대 행 길이는 100MB입니다. 리소스가 많으면 지정된 AWS Config S3 버킷에 저장된 CI가 이 할당량을 초과할 수 있습니다. 예를 들어 AWS Config는 동일한 버킷 위치에서 구성 스냅샷 파일도 전송하기 때문에 구성 스냅샷 파일이 할당량을 초과할 수 있습니다.

할당량을 초과하면 CI를 쿼리한 후 다음과 비슷한 오류가 표시됩니다.

"HIVE_BAD_DATA: Line too long in text file: s3_path_to_config_data_object"

이 문제를 방지하려면 Athena가 구성 기록 파일을 저장하는 S3 경로를 직접 쿼리하도록 다음 테이블 명령문을 실행하십시오.

CREATE EXTERNAL TABLE awsconfig (         
         fileversion string,
         configSnapshotId string,
         configurationitems ARRAY < STRUCT < configurationItemVersion : STRING,
         configurationItemCaptureTime : STRING,
         configurationStateId : BIGINT,
         awsAccountId : STRING,
         configurationItemStatus : STRING,
         resourceType : STRING,
         resourceId : STRING,
         resourceName : STRING,
         ARN : STRING,
         awsRegion : STRING,
         availabilityZone : STRING,
         configurationStateMd5Hash : STRING,
         resourceCreationTime : STRING > >
)
PARTITIONED BY (`year` string,`month` string,`day` string)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://BUCKET-NAME/AWSLogs/ACCOUNT-ID/Config/REGION/'
TBLPROPERTIES (
  'projection.enabled'='true',
  'projection.year.interval'='1',
  'projection.year.range'='2021,2121',
  'projection.year.type'='integer',
  'projection.month.interval'='1',
  'projection.month.range'='1,12',
  'projection.month.type'='integer',
  'projection.day.interval'='1',
  'projection.day.range'='1,31',
  'projection.day.type'='integer',
  'storage.location.template'='s3://BUCKET-NAME/AWSLogs/ACCOUNT-ID/Config/REGION/${year}/${month}/${day}/ConfigHistory/')

참고: 예시로 나온 S3 버킷 위치를 해당하는 S3 버킷 위치로 바꾸십시오.

위 테이블 명령문은 /2021/1/1/부터 /2121/12/31/까지의 파티션 프로젝션으로 Athena 테이블을 분할합니다.

참고: AWS Config 데이터 S3 경로 날짜 형식은 Athena 파티션 프로젝션 날짜 형식 형식과 호환되지 않습니다.

Athena 쿼리 예시

다음 쿼리 예시는 2021년 2월의 각 날짜에 대한 CI 수를 검색합니다.

SELECT result.configurationitemcapturetime,
         count(result.configurationitemcapturetime) AS NumberOfChanges
FROM
    (SELECT regexp_replace(configurationItem.configurationItemCaptureTime,
         '(.+)(T.+)', '$1') AS configurationitemcapturetime
    FROM default.awsconfig
    CROSS JOIN UNNEST(configurationitems) AS t(configurationItem)
    WHERE "$path" LIKE '%ConfigHistory%'
            AND configurationItem.configurationItemCaptureTime >= '2021-02-01T%'
            AND configurationItem.configurationItemCaptureTime <= '2021-02-28T%') result
GROUP BY  result.configurationitemcapturetime
ORDER BY  result.configurationitemcapturetime

출력 예시:

configurationitemcapturetime    NumberOfChanges  
2021-02-02    7
2021-02-03    3
2021-02-07   11
...

다음 쿼리 예시는 2021년 2월의 리소스당 변경 횟수를 가장 자주 변경된 순서대로 검색합니다.

SELECT configurationItem.resourceType,           
         configurationItem.resourceId,
         COUNT(configurationItem.resourceId) AS NumberOfChanges
FROM default.awsconfig
CROSS JOIN UNNEST(configurationitems) AS t(configurationItem)
WHERE "$path" LIKE '%ConfigHistory%'
        AND configurationItem.configurationItemCaptureTime >= '2021-02-01T%'
        AND configurationItem.configurationItemCaptureTime <= '2021-02-28T%'
GROUP BY  configurationItem.resourceType, configurationItem.resourceId
ORDER BY  NumberOfChanges DESC

출력 예시:

resourcetype              resourceid        NumberOfChanges  
AWS::EC2::VPC             vpc-9ed00bfa        7
AWS::EC2::Subnet          subnet-4472e248     5
AWS::EC2::SecurityGroup   sg-450c6531         4

참고: Athena 쿼리 출력과 같은 달 및 AWS 리전의 AWS 결제 데이터 간의 총 CI 수를 비교하면 불일치가 발생할 수 있습니다. Athena가 쿼리하는 데이터는 날짜 범위를 넘을 수 있으며 인접한 달에 청구된 CI도 포함될 수 있습니다. AWS Config는 configurationItemCaptureTime 시간이 시작된 시기를 기준으로 CI를 측정합니다.

월말에서 종료일을 하루씩 늘리는 것이 바람직합니다.

예를 들어, 다음 쿼리에서 종료일은 2월 28일입니다.

AND configurationItem.configurationItemCaptureTime <= '2021-02-28T%') result

종료일을 3월 1일로 업데이트합니다.

AND configurationItem.configurationItemCaptureTime <= '2021-03-01T%') result

Control Tower 환경에서 AWS Config 쿼리

Control Tower는 모든 구성 로그를 동일한 S3 버킷에 저장하므로 AWS Organizations의 모든 계정을 쿼리할 수 있습니다.

Control Tower 설정을 위한 테이블을 생성하려면 다음과 유사한 명령문을 실행합니다.

CREATE EXTERNAL TABLE awsconfig (
         fileversion string,
         configSnapshotId string,
         configurationitems ARRAY < STRUCT < configurationItemVersion : STRING,
         configurationItemCaptureTime : STRING,
         configurationStateId : BIGINT,
         awsAccountId : STRING,
         configurationItemStatus : STRING,
         resourceType : STRING,
         resourceId : STRING,
         resourceName : STRING,
         ARN : STRING,
         awsRegion : STRING,
         availabilityZone : STRING,
         configurationStateMd5Hash : STRING,
         resourceCreationTime : STRING > >
)
PARTITIONED BY (`account` string,`region` string,`year` string,`month` string,`day` string)
ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe'
LOCATION 's3://bucket-name/org-id/AWSLogs/'
TBLPROPERTIES (
  'projection.enabled'='true',
  'projection.account.type'='enum',
  'projection.account.values'='account-id1, accountid2',
  'projection.region.type'='enum',
  'projection.region.values'='us-east-1,us-east-2,us-west-2',
  'projection.year.interval'='1',
  'projection.year.range'='2021,2121',
  'projection.year.type'='integer',
  'projection.month.interval'='1',
  'projection.month.range'='1,12',
  'projection.month.type'='integer',
  'projection.day.interval'='1',
  'projection.day.range'='1,31',
  'projection.day.type'='integer',
  'storage.location.template'='s3://bucket-name/org-id/AWSLogs/${account}/Config/${region}/${year}/${month}/${day}/ConfigHistory/')

참고: 조직의 각 계정에 ID를 추가하고 모든 리전을 사용자의 리전으로 바꾸십시오.

위 명령문은 계정, 연도, 월, 일에 대한 파티션을 자동으로 생성합니다. 특정 월의 CI 수를 쿼리하려면 다음 명령문을 실행합니다.

SELECT result.configurationitemcapturetime,
         count(result.configurationitemcapturetime) AS NumberOfChanges
FROM
    (SELECT regexp_replace(configurationItem.configurationItemCaptureTime,
         '(.+)(T.+)', '$1') AS configurationitemcapturetime
    FROM default.awsconfig
    CROSS JOIN UNNEST(configurationitems) AS t(configurationItem)
    WHERE "$path" LIKE '%ConfigHistory%'
            AND year='2024'
            AND month='9') result
GROUP BY  result.configurationitemcapturetime
ORDER BY  result.configurationitemcapturetime

같은 달의 각 리소스에 대한 변경 횟수를 가져오려면 다음 명령문을 실행합니다.

SELECT configurationItem.resourceType,
         configurationItem.resourceId,
         COUNT(configurationItem.resourceId) AS NumberOfChanges
FROM default.awsconfig
CROSS JOIN UNNEST(configurationitems) AS t(configurationItem)
WHERE "$path" LIKE '%ConfigHistory%'
        AND year='2024'
        AND month='9'
GROUP BY  configurationItem.resourceType, configurationItem.resourceId
ORDER BY  NumberOfChanges DESC

관련 정보

AWS Config로 AWS 리소스의 규정 준수 기록 보기

AWS Config 요금

Amazon Athena 요금