Complete a 3 Question Survey and Earn a re:Post Badge
Help improve AWS Support Official channel in re:Post and share your experience - complete a quick three-question survey to earn a re:Post badge!
AWS Config에서 매달 기록하는 구성 항목의 수를 검색하려면 어떻게 해야 합니까?
AWS 계정의 청구 내역을 이해할 수 있도록 AWS Config에서 기록하는 구성 항목(CI)의 수를 찾으려고 합니다.
해결 방법
Amazon Athena를 사용하여 계정의 매달 CI 수를 확인할 수 있습니다.
Amazon S3 버킷에 구성 파일이 포함되어 있는지 확인
AWS Config가 구성 기록 파일을 지정된 Amazon Simple Storage Service(Amazon S3) 버킷으로 전송할 수 있어야 합니다. AWS Config는 일반적으로 6시간마다 버킷에 구성 기록 파일을 전송합니다.
S3 버킷에 구성 파일이 포함되어 있는지 확인하려면 다음 단계를 완료합니다.
- AWS Config 콘솔을 엽니다.
- 탐색 창에서 설정을 선택합니다.
- Amazon S3 버킷 섹션에서 버킷 이름을 기록해 둡니다.
- Amazon S3 콘솔을 열고, S3 버킷을 선택합니다.
- 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
관련 정보
관련 콘텐츠
- 질문됨 일 년 전lg...
- 질문됨 2년 전lg...