跳至内容

如何使用每月记录的 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 控制台
  5. 在导航窗格中,选择 Buckets(存储桶),然后选择您的 S3 存储桶。
  6. 查看 S3 存储桶中的配置文件。
    **注意:**如果没有配置文件,则说明您的角色可能缺少权限。有关详细信息,请参阅 Amazon S3 的 AWS Identity and Access Management (IAM)

在 Athena 中创建表

打开 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 中,且配置快照文件可能会超过此限制。如果超过限制,则在查询 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 记录器中排除某些资源类型时,记录器仍会记录这些资源的创建和删除。这些记录是免费完成的。这些资源 CI 包括 configurationItemStatus 字段的以下状态:

  • ResourceNotRecorded
  • ResourceDeletedNotRecorded

这些记录还包括基本元数据,例如资源 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 Config 定价

Amazon Athena 定价

使用 AWS Config 记录 AWS 资源

AWS 官方已更新 3 个月前