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 を使用している場合、テキストファイルの最大行長は 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
関連情報
関連するコンテンツ
- 質問済み 8ヶ月前lg...
- 質問済み 7ヶ月前lg...
- 質問済み 8ヶ月前lg...