如何通过检索按月记录的配置项目数量来了解 AWS Config 账单?

上次更新时间:2022 年 3 月 25 日

我需要了解 AWS Config 记录的配置项目数量。

解决方法

为帮助您确定以前和当前的账单趋势,请使用 Amazon Athena 识别您账户的每月配置项目(CI)数。

验证您的 S3 存储桶是否包含配置文件

注意:请确保 AWS Config 服务能够成功地将配置历史记录文件交付到您指定的 Amazon Simple Storage Service(Amazon S3)存储桶。通常,系统会每隔 6 小时将 CI 作为配置历史文件发送到存储桶。有关更多信息,请参阅查看配置详细信息

  1. 打开 AWS Config 控制台,然后从导航窗格中选择设置
  2. Amazon S3 bucket(Amazon S3 存储桶)部分中,记下 Bucket name(存储桶名称)的值。
  3. 打开 S3 控制台。然后,对于 Bucket name(存储桶名称),选择您的 S3 存储桶。验证您选择的 S3 存储桶包含配置文件。
    注意:如果没有配置文件,则说明您的角色可能缺少权限。如需更多信息,请参阅 Amazon S3 中的身份和访问管理

在 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(账户 ID)和 REGION(区域),请使用您的具体信息。

注意:如果您使用的是 Athena 引擎版本 2,则文本文件的最大行长度为 100MB。如果您有大量资源,则存储在指定的 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(账户 ID)和 REGION(区域),请使用您的具体信息。下面的示例表使用从 /2021/1/1/ 到 /2121/12/31/ 的分区投影Athena 表进行分区。根据需要自定义此时间段。

注意:AWS Config 数据 S3 路径日期格式与 Athena 分区投影日期类型格式不兼容。

Athena 查询示例

以下查询示例检索 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

结果与如下内容类似:

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 的时间进行计费。

最佳实践是,从月末开始将指定的结束日期增加一天。

例如,更改此查询:

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

对于此查询:

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

注意:本月的最后一天增加一天。


这篇文章对您有帮助吗?


您是否需要账单或技术支持?