[AWS] Athena를 활용하여 Config 구성 항목 분석하기

Squirrel·2021년 10월 6일
0

AWS

목록 보기
1/5
post-thumbnail

AWS Config는 AWS 리소스에 대한 변경 세부 정보를 기록하여 구성 기록을 제공한다.

즉, 과거 어느 시점에 리소스 구성이 어떻게 생성되었는지에 대한 디테일을 얻을 수 있다.

다만, config 사용 시 자원의 구성이 변경될 때마다 구성 항목이 기록되고, 리전별로 구성된 구성 항목당 0.003 USD 요금이 부과되기 때문에(서울 리전 기준) 많이 변경되는 리소스를 미리 인지하고 해당 구성 레코더를 중지하여 기록을 중지하면 비용을 절약할 수 있다.
(테스트로 Config를 생성했다가 비용이 꽤나 나와서 당황스러웠다..)

그렇다면 자주 변경된 리소스 항목에 대해 식별하는 방법을 알아보도록 하자.

AWS Config 및 Athena를 활용하여 자주 변경된 리소스 항목 식별


AWS config는 리소스에 대한 변경 사항을 추적하여 이를 사용자가 지정한 S3 버킷에 기록한다.

이 버킷에 기록된 구성 항목을 source로 Athena 쿼리문을 사용하여 리소스별 변경 수를 검색하고 가장 자주 변경된 순서로 정렬할 수 있다.

1. AWS Config의 구성 변경이 기록되는 S3 버킷 확인

Config Settings을 확인해보면 config 생성 시 생성 및 지정한 S3 버킷명을 알 수 있다.
참고로, 지난 90일에 대한 구성 기록 파일에 대해서만 사용할 수 있다.

S3를 확인하니 버킷 "config-test-squirrel"가 존재하고 해당 버킷에 config 구성 변경 기록이 저장된 것을 알 수 있다.


2. Athena에서 테이블 생성

AWS Cloudformation 템플릿을 활용해서 테이블을 만들어줄 수도 있는데 이 방법이 더 귀찮은 것 같아 바로 Athena에서 수동으로 쿼리문을 실행하여 테이블을 생성했다.

cfn으로 테이블을 생성하는 방법은 아래에 첨부한 링크[1]를 참고하면 좋을 것 같다.

아래 쿼리문에서 (1) bucket name (2) Account ID (3) region 정보만 변경한 후 Run query를 실행해주면 awsconfig 테이블이 생성된 것을 확인할 수 있다.

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/[AccountID]/Config/[region]/';



3. 쿼리 실행

3-1. 2021년 9월 1일부터 9월 28일까지의 하루 구성 항목 수 검색

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-09-01T%'
            AND configurationItem.configurationItemCaptureTime <= '2021-09-28T%') result
GROUP BY  result.configurationitemcapturetime
ORDER BY  result.configurationitemcapturetime

하루에 몇 번의 변경이 발생했는지에 대해 아래와 같이 정렬된다.
9월 7일에 가장 많은 변경 사항이 발생한 것을 알 수 있다.



3-2. 2021년 9월 1일부터 9월 28일까지의 변경 사항 수 검색 및 가장 자주 변경된 항목을 기준으로 정렬

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-09-01T%'
        AND configurationItem.configurationItemCaptureTime <= '2021-09-28T%'
GROUP BY  configurationItem.resourceType, configurationItem.resourceId
ORDER BY  NumberOfChanges DESC

결과는 해당 시점에 VPC 유형에서의 변경 사항이 37건으로 가장 많았던 것으로 확인된다.
아래는 가시성을 위해 csv format으로 변환한 형태이다.

만일 cfn 스택을 통해 Athena 테이블을 생성하게 되면 아래와 같이 예시 쿼리문이 생성되기 때문에 필요에 따라 원하는 쿼리문을 사용하면 된다.

이 경우 설정한 파라미터 값(config 캡처 기간 및 s3 버킷명 등)이 자동으로 들어가 있어 편리하게 사용할 수 있다.

cfn으로 Athena 테이블 생성 시 필요한 권한이라던가 상세한 내용은 아래 링크[1]에서 추가적으로 확인할 수 있다.

Recommendation


기본적으로 구성 레코더는 AWS Config가 실행되는 리전에서 지원되는 모든 리소스를 기록하기 때문에 Athena를 통해 분석한 결과로 자주 변경되는 항목에 대해서는 구성 기록에서 제외하여 특정 리소스 유형만 기록하는 것이 비용 절감에 도움이 된다.


참고 링크


[1] - https://aws.amazon.com/blogs/mt/identifying-resources-most-configuration-changes-aws-config/

[2] - https://aws.amazon.com/premiumsupport/knowledge-center/retrieve-aws-config-items-per-month/?nc1=h_ls

0개의 댓글