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

上次更新时间:2020 年 6 月 24 日

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

解决方法

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

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

注意:请确保 AWS Config 服务能够成功地将配置历史记录文件交付到您的 Amazon Simple Storage Service (Amazon S3) 存储桶。配置历史记录文件仅在过去 90 天里可用。有关更多信息,请参阅查看配置详细信息。

    打开 AWS Config 控制台,然后从导航窗格中选择设置。 在 Amazon S3 存储桶部分中,记下存储桶名称。 打开 Amazon S3 控制台,然后为存储桶名称选择您的 Amazon S3 存储桶。验证您选择的 Amazon S3 存储桶包含配置文件。
    注意:如果没有配置文件,您的角色可能会缺少权限。有关更多信息,请参阅设置存储桶和对象访问权限。

在 Athena 中创建表

    登录Athena 控制台,然后按照使用向导创建表中的说明操作。 使用以下表语法。
    注意:对于 LOCATION,请使用存储在 Amazon S3 存储桶中的 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 查询示例

以下查询示例检索 2018 年 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 >= '2018-02-01T%'
            AND configurationItem.configurationItemCaptureTime <= '2018-02-28T%') result
GROUP BY  result.configurationitemcapturetime
ORDER BY  result.configurationitemcapturetime

结果与如下内容类似:

configurationitemcapturetime    NumberOfChanges
2018-02-02    7
2018-02-03    3
2018-02-07   11
...

以下查询示例检索 2018 年 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 >= '2018-02-01T%'
        AND configurationItem.configurationItemCaptureTime <= '2018-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 <= '2018-02-28T%') result

对于此查询:

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

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