1 か月あたりに記録された設定項目の数を取得して、AWS Config の請求を理解する方法を教えてください。

所要時間3分
1

AWS Config で記録された設定項目の数が知りたいと考えています。

解決方法

過去および現在の請求傾向を特定するには、Amazon Athena を使用して、アカウントの 1 か月あたりの設定項目 (CI) の数を確認します。

S3 バケットに設定ファイルが含まれていることを確認する

注: AWS Config サービスが指定された Amazon Simple Storage Service (Amazon S3) バケットに設定履歴ファイルを正常に配信できることを確認してください。通常、CI は 6 時間ごとに設定履歴ファイルとしてバケットに配信されます。詳細については、「設定の詳細の表示」を参照してください。

  1. AWS Config コンソールを開き、ナビゲーションペインから [設定] を選択します。
  2. [Amazon S3 bucket] (Amazon S3 バケット) のセクションで、[Bucket name] (バケット名) を選択します。
  3. S3 コンソールを開きます。その後、[Bucket name] (バケット名) で S3 バケットを選択します。選択した S3 バケットに設定ファイルが含まれていることを確認します。
    注: 設定ファイルが存在しない場合は、ロールの許可が不足している可能性があります。詳細については、「Amazon S3 での Identity and Access Management」を参照してください。

Athena でテーブルを作成する

  1. Athena コンソールにサインインし、手順に従ってウィザードを使用してテーブルを作成します。
  2. 以下のテーブルの構文を使用します。
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>/';

[LOCATION] には、Amazon S3 バケットに保存されている AWS Config 項目の場所とリージョンを使用します。[BUCKET-NAME][ACCOUNT-ID]、および [REGION] には、特定の情報を使用します。

注: Athena エンジンバージョン 2 を使用している場合、テキストファイルの行の最大長は 100 MB です。リソースの数が多い場合、指定された AWS Config S3 バケットに保存されている Config 項目がこの制限を超える可能性があります。例えば、AWS Config では、設定スナップショットファイルも同じバケット LOCATION に配信され、設定スナップショットファイルはこの制限を超える可能性があります。制限を超えると、AWS Config 項目をクエリすると、次のようなエラーが表示されます。

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

この場合は、次の表構文を使用して、Amazon 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/')

[LOCATION] には、Amazon S3 バケットに保存されている AWS Config 項目の場所とリージョンを使用します。[BUCKET-NAME][ACCOUNT-ID]、および [REGION] には、特定の情報を使用します。次のテーブルの例では、/2021/1/1/ から /2121/12/31/ へのパーティション射影を使用して Athena テーブルをパーティショニングします。必要に応じてこの期間をカスタマイズします。

注: AWS Config データ S3 パスの日付形式は、Athena パーティション射影の日付タイプの形式と互換性がありません。

Athena クエリの例

次のクエリ例は、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

結果は次のようになります。

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

注: 同じ月およびリージョンの Athena クエリ結果と AWS 請求データ間で CI の総数を比較すると、矛盾が発生する可能性があります。Athena がクエリするデータは、日の境界を越えることができます。また、隣接する月に請求される CI も含まれます。AWS Config CI は、configurationItemCaptureTime が開始された時刻に基づいて測定されます。

指定された終了日を月末から 1 日増やすのがベストプラクティスです。

たとえば、次のクエリを変更します。

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

このクエリに対して:

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

注: 月の最終日は 1 日増加します。


関連情報

AWS Config の料金

Amazon Athena の料金

AWS公式
AWS公式更新しました 2年前
コメントはありません

関連するコンテンツ