AWS Config が毎月記録する設定項目の数を取得する方法を教えてください。

所要時間4分
1

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 を使用している場合、テキストファイルの最大行長は 100 MB です。リソースの数が多い場合、指定した AWS Config S3 バケットに格納される CI の数がこの制限を超える可能性があります。たとえば、AWS Config は同じバケットの場所に設定スナップショットファイルも配信するため、設定スナップショットファイルがクォータを超過する可能性があります。

クォータを超えた場合は、CI にクエリを実行した後に次のようなエラーが表示されます。

HIVE_BAD_DATA: テキストファイル 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 のパーティションプロジェクションの date 型形式と互換性がありません。

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

注: 同じ月と AWS リージョンにおいて、Athena クエリ出力と AWS 請求データで CI の総数を比較すると、相違が生じる場合があります。Athena がクエリするデータは、1 日の境界を越えたり、隣接する月に請求される CI も含んでいたりする場合があります。AWS Config は、configurationItemCaptureTime が開始した時間に基づいて CI の数を測定します。

終了日は、月末から 1 日増やした値にすることがベストプラクティスです。

たとえば、次のクエリでは、終了日は 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 の料金

AWS公式
AWS公式更新しました 4ヶ月前
コメントはありません

関連するコンテンツ