내용으로 건너뛰기

월별로 기록되는 CI 수를 사용하여 AWS Config 결제에 대해 이해하려면 어떻게 해야 합니까?

5분 분량
0

AWS Config에서 기록한 구성 항목(CI)의 수를 검색하려고 합니다. 그런 다음, 이 정보를 사용하여 AWS Config 결제에 대해 이해하려고 합니다.

해결 방법

이전 및 현재의 결제 추세를 파악하려면 Amazon Athena를 사용하여 계정의 월별 CI 수를 확인하십시오.

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

AWS Config 서비스가 구성 기록 파일을 지정된 Amazon Simple Storage Service(Amazon S3) 버킷으로 성공적으로 전송할 수 있어야 합니다. AWS Config는 6시간마다 버킷에 CI를 구성 기록 파일로 전송합니다. 자세한 내용은 AWS Config로 AWS 리소스의 규정 준수 기록 보기를 참조하십시오.

다음 단계를 완료하십시오.

  1. AWS Config 콘솔을 엽니다.
  2. 탐색 창에서 설정을 선택합니다.
  3. Amazon S3 버킷 섹션에서 버킷 이름을 기록해 둡니다.
  4. Amazon S3 콘솔을 엽니다.
  5. 탐색 창에서 버킷을 선택한 다음, S3 버킷을 선택합니다.
  6. S3 버킷에서 구성 파일을 검토합니다.
    참고: 구성 파일이 없는 경우 역할에 권한이 없는 것일 수 있습니다. 자세한 내용은 Amazon S3의 AWS Identity and Access Management(AWS IAM)를 참조하십시오.

Athena에서 테이블 만들기

Athena 콘솔을 엽니다. 그런 다음, 해당 환경에 맞는 구문을 사용하여 테이블을 만듭니다.

중요: 다음 테이블 구문에서 LOCATION을 S3 버킷에 저장된 AWS Config 항목의 위치 및 AWS 리전으로 바꾸십시오. BUCKET-NAME, ACCOUNT-ID, REGIONORG-ID의 경우 구체적인 정보를 사용하십시오.

표준 AWS Config 구현의 경우

다음 테이블 구문을 사용합니다.

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/';

Athena 엔진 버전 2의 경우

Athena 엔진 버전 2를 사용하는 경우 텍스트 파일의 최대 행 길이는 100MB입니다. 리소스가 많으면 지정된 S3 버킷에 저장된 AWS Config 항목이 이 제한을 초과할 수 있습니다. 예를 들어 AWS Config는 동일한 버킷 LOCATION에서 구성 스냅샷 파일도 전송하며, 구성 스냅샷 파일이 이 제한을 초과할 수 있습니다. 제한을 초과하는 경우 AWS Config 항목을 쿼리할 때 다음과 비슷한 오류가 발생합니다.

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

이 경우, Athena가 구성 기록 파일을 저장하는 Amazon 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/')

참고: 다음 예제 테이블은 /2021/1/1/부터 /2121/12/31/까지의 파티션 프로젝션을 사용하여 Athena 테이블을 분할합니다. 요구 사항에 따라 이러한 파티션을 업데이트하십시오. AWS Config 데이터 Amazon S3 경로의 날짜 형식은 Athena 파티션 프로젝션의 날짜 형식과 호환되지 않습니다.

AWS Control Tower 환경의 경우

AWS Control Tower를 사용하는 경우 계정 구조를 수용하려면 다음 테이블 구문을 사용하여 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 > >
)
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/' -- Bucket name and org should be updated
TBLPROPERTIES (
 'projection.enabled'='true',
 'projection.account.type'='enum',
 'projection.account.values'='<account-id1, accountid2>', -- Enter all account ids
 'projection.region.type'='enum',
 'projection.region.values'='<region-1,region-2,region-3>', -- Enter all regions
 '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/') -- Bucket name and org should be updated

Athena 쿼리 예

다음 예제 쿼리는 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

AWS Config 레코더에서 특정 리소스 유형을 제외해도 레코더는 해당 리소스의 생성 및 삭제를 계속 기록합니다. 이러한 기록은 무료로 수행됩니다. 이러한 리소스 CI에는 configurationItemStatus 필드에 대해 다음 상태가 포함됩니다.

  • ResourceNotRecorded
  • ResourceDeletedNotRecorded

또한 기록에는 resource-id, ARN 및 CI와 같은 기본 메타데이터가 포함되지만 리소스 구성 및 관계 정보는 포함되지 않습니다.

참고: 이 쿼리는 여전히 ResourceNotRecorded 정보를 계산합니다. 이 정보를 제외하려면 다음 쿼리를 실행하십시오.

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-08T%'
        AND configurationItem.configurationItemCaptureTime <= '2021-02-28T%'
        AND configurationItem.configurationItemStatus NOT IN ('ResourceNotRecorded','ResourceDeletedNotRecorded')
GROUP BY  configurationItem.resourceType
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

다음 예제 쿼리는 2021년 2월의 일일 구성 항목 수를 검색합니다.

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

참고: 기록되지 않은 리소스를 필터링하려면 GROUP BY 옵션 앞에 다음과 같은 절을 추가할 수 있습니다.

"AND configurationItem.configurationItemStatus NOT IN ('ResourceNotRecorded','ResourceDeletedNotRecorded')"

결과는 다음 예와 비슷합니다.

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

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

가장 좋은 방법은 지정된 종료일을 월말에서 하루씩 증가시키는 것입니다.

예를 들어 원래 쿼리를 다음과 같이 업데이트된 쿼리로 변경할 수 있습니다.

원래 쿼리:

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

업데이트된 쿼리:

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

참고: 해당 월의 마지막 날이 하루씩 증가합니다.

관련 정보

AWS Config 요금

Amazon Athena 요금

AWS Config를 사용하여 AWS 리소스 기록

댓글 없음