AWS Config の請求を把握するために、月ごとに記録された CI 数を利用する方法を教えてください。
AWS Config が記録した構成項目 (CI) の数を取得し、この情報を AWS Config の請求を把握するために利用したいと考えています。
解決策
過去および現在の料金の傾向を特定しやすくするには、Amazon Athena を使用してアカウントにおける 1 か月あたりの構成項目 (CI) 数を判断します。
Amazon S3 バケットに構成ファイルが含まれていることを確認する
AWS Config サービスは、構成履歴ファイルを、指定した Amazon Simple Storage Service (Amazon S3) バケットに正常に配信できる必要があります。AWS Config は、6 時間ごとに CI を構成履歴ファイルとしてバケットに配信します。詳細については、「AWS Config における AWS リソースのコンプライアンス履歴を確認する」を参照してください。
次の手順を実行します。
- AWS Config コンソールを開きます。
- ナビゲーションペインで [設定] を選択します。
- [Amazon S3 バケット] セクションの [バケット名] を書き留めます。
- Amazon S3 コンソールを開きます。
- ナビゲーションペインで [バケット] を選択し、目的の S3 バケットを選択します。
- S3 バケットで構成ファイルをレビューします。
注: 構成ファイルが存在しない場合は、ロールの権限が不足している可能性があります。詳細については、「Amazon S3 における AWS Identity and Access Management (IAM)」を参照してください。
Athena でテーブルを作成する
Athena コンソールを開きます。次に、環境に応じた構文を使用してテーブルを作成します。
重要: 次のテーブル構文において、LOCATION を S3 バケットに保存する AWS Config 項目のロケーションと AWS リージョンに置き換えてください。BUCKET-NAME、ACCOUNT-ID、REGION、ORG-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 を使用する場合、テキストファイルの最大行長は 100 MB です。リソースが多い場合、指定された 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 Recorder から特定のリソースタイプを除外した場合も、レコーダーはそれらのリソースの作成と削除を記録します。上記の記録にコストは発生しません。これらのリソース 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 月の 1 日あたりの構成項目数を取得します。
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 がクエリするデータが 1 日の境界を越える場合や、隣接する月に請求される CI が含まれる場合があります。AWS Config の CI 数は、configurationItemCaptureTime の開始タイミングに基づいて測定されます。
指定する終了日を、月末より 1 ずつ増やすことをおすすめします。
たとえば、本来のクエリを次のクエリに更新します。
本来のクエリ:
AND configurationItem.configurationItemCaptureTime <= '2021-02-28T%') result
更新後のクエリ:
AND configurationItem.configurationItemCaptureTime <= '2021-03-01T%') result
注: 月の最終日が 1 日ずつ増えます。
関連情報
関連するコンテンツ
- 質問済み 2年前
- 質問済み 1ヶ月前
AWS公式更新しました 1年前
