跳至內容

如何利用每月記錄的 CI 數量來了解 AWS Config 的帳單?

4 分的閱讀內容
0

我想要取得 AWS Config 所記錄的組態項目 (CI) 數量。接著,我想利用這些資訊來了解 AWS Config 帳單情況。

解決方法

為了協助您找出先前和目前的帳單趨勢,請使用 Amazon Athena 來識別帳戶每月的 CI 數量。

確認您的 Amazon S3 儲存貯體包含組態檔案

AWS Config 服務必須能成功將組態歷史記錄檔案傳送到您指定的 Amazon Simple Storage Service (Amazon S3) 儲存貯體。AWS Config 會每 6 小時將 CI 以組態歷史記錄檔案的形式傳送到儲存貯體。如需更多資訊,請參閱使用 AWS Config 查看 AWS 資源的合規性歷史記錄

請完成下列步驟:

  1. 開啟 AWS Config 主控台
  2. 在導覽窗格中,選擇 Settings (設定)。
  3. Amazon S3 bucket (Amazon S3 儲存貯體) 區段中,記下 Bucket name (儲存貯體名稱)。
  4. 開啟 Amazon S3 console (Amazon S3 主控台)。
  5. 在導覽窗格中選擇 Buckets (儲存貯體),然後選取您的 S3 儲存貯體。
  6. 檢查 S3 儲存貯體是否包含組態檔案。
    **注意:**如果沒有組態檔案,則您的角色可能缺少權限。如需詳細資訊,請參閱適用於 Amazon S3 的 AWS Identity and Access Management (IAM)

在 Athena 中建立一個資料表

開啟 Athena console (Athena 主控台)。然後,使用適合您環境的語法建立資料表

**重要:**在下列資料表語法中,將 LOCATION 替換為儲存在 S3 儲存貯體中的 AWS Config 項目的位置及 AWS 區域。在 BUCKET-NAMEACCOUNT-IDREGIONORG-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](https://aws.amazon.com/blogs/mt/configuration-history-configuration-snapshot-files-aws-config/) 中提供[組態快照檔案,而且組態快照檔案可能會超過此限制。如果超過限制,則當您查詢 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/')

**注意:**下列範例資料表使用分區投影分割 Athena 資料表,範圍從 /2021/1/1/ 到 /2121/12/31/。請根據您的需求更新這些分區。AWS Config 資料的 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 外,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 月的每日組態項目數目:

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 查詢的資料可能會超出單日範圍,並且納入相鄰月份內計費的 CI。AWS Config CI 是根據您啟動 configurationItemCaptureTime 的時間計費。

最佳實務是將月底的指定結束日往後延一天。

例如,您可以將原始查詢修改為下列更新查詢。

原始查詢:

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

更新查詢:

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

**注意:**每月的最後一天已向後延期一天。

相關資訊

AWS 組態定價

Amazon Athena 定價

使用 AWS Config 記錄 AWS 資源

AWS 官方已更新 3 個月前