

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Amazon Athena 查询成本和使用情况报告
<a name="cur-query-athena"></a>

Amazon Athena 是一项无服务器查询服务，您可以使用标准 SQL 在亚马逊简单存储服务 (A AWS mazon S3) 中分析成本和使用情况报告 (AWS CUR) 中的数据。这可以帮助您避免创建自己的数据仓库解决方案来查询 AWS CUR 数据。

我们强烈建议您同时创建新的 Amazon S3 存储桶和新的 AWS CUR 报告，以便与 Athena 一起使用。 AWS CUR 仅支持 Athena 的 Apache Parquet 压缩格式，并会自动覆盖之前存储在 S3 存储桶中的报告。

本节简要说明如何使用 Athena 分析成本和使用情况报告。有关 Athena 服务的完整说明，请参阅[《Amazon Athena 用户指南》](https://docs.aws.amazon.com/athena/latest/ug/)。

**Topics**
+ [使用模板设置 Athena CloudFormation](use-athena-cf.md)
+ [手动设置 Athena](cur-ate-manual.md)
+ [运行 Amazon Athena 查询](cur-ate-run.md)
+ [将报告数据加载到其他资源](cur-query-other.md)

有关使用 Athena 查询报告的演示，请观看以下视频。

[![AWS Videos](http://img.youtube.com/vi/https://www.youtube.com/embed/KEeJEZTYE8E/0.jpg)](http://www.youtube.com/watch?v=https://www.youtube.com/embed/KEeJEZTYE8E)


# 使用模板设置 Athena CloudFormation
<a name="use-athena-cf"></a>

**重要**  
CloudFormation 不支持跨区域资源。如果您计划使用 CloudFormation 模板，则必须在同一个 AWS 区域中创建所有资源。区域必须支持以下服务：  
AWS Lambda
Amazon Simple Storage Service（Amazon S3）
AWS Glue
Amazon Athena

为了简化和自动整合您的成本和使用情况报告与 Athena AWS ，请提供 CloudFormation 一个包含多个关键资源的模板以及您为 Athena 集成设置的报告。该 CloudFormation 模板包括 AWS Glue 爬虫、 AWS Glue 数据库和 AWS Lambda 事件。

 CloudFormation 使用的 Athena 集成设置过程会删除您的存储桶可能已经存在的任何 Amazon S3 事件。这可能会对现有 AWS CUR 报告中的任何基于事件的现有流程产生负面影响。我们强烈建议您同时创建新的 Amazon S3 存储桶和新的 AWS CUR 报告，以便与 Athena 一起使用。

在使用 CloudFormation 模板自动集成 Athena 之前，请务必完成以下操作：
+ 为您的报告创建新的 Amazon S3 存储桶。有关更多信息，请参阅《Amazon S3 用户指南》中的[创建桶](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html)。**
+ [创建新的报告](cur-create.md)以用于 Athena。在设置过程中，对于**报告数据集成**，选择 **Athena**。
+ 等待第一个报告传送到您的 Amazon S3 存储桶。最长可能需要 24 小时才能提交您的第一份报告。 AWS <a name="use-athena-cf-steps"></a>

**使用 Athena 模板 CloudFormation**

1. 打开 Amazon S3 控制台，网址为 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 从存储桶列表中，选择您选择接收 AWS CUR 报告的存储桶。

1. 选择您的报告路径前缀 (*your-report-path-prefix/*)。然后，选择您的报告名称（*your-report-name/*）。

1. 选择 `.yml` 模板文件。

1. 选择**对象操作**，然后选择**下载为**。

1. 在 [https://console.aws.amazon.com/cloudformat](https://console.aws.amazon.com/cloudformation/) ion 上打开 CloudFormation 控制台。

1. 如果您 CloudFormation 以前从未使用过，请选择 “**创建新堆栈**”。否则，选择 **Create Stack (创建堆栈)**。

1. 在 **Prepare template (准备模板)** 下，选择 **Template is ready (模板就绪)**。

1. 在 **Template source (模板源)** 下，选择**上传模板文件**。

1. 选择**选择文件**。

1. 选择 `.yml` 模板，然后选择 **Open (打开)**。

1. 选择**下一步**。

1. 对于 **Stack name (堆栈名称)**，输入您的模板的名称，然后选择 **Next (下一步)**。

1. 选择**下一步**。

1. 在页面底部，选择**我确认 AWS CloudFormation 可能会创建 IAM 资源。**

   此模板创建以下资源：
   + 三个 IAM 角色
   + 一个 AWS Glue 数据库
   + 一个 AWS Glue 爬行者
   + 两个 Lambda 函数
   + 一条 Amazon S3 通知

1. 选择**创建堆栈**。

**更新现有 Athena 模板 CloudFormation**

1. 打开 Amazon S3 控制台，网址为 [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 从存储桶列表中，选择您选择接收 AWS CUR 报告的存储桶。

1. 选择您的报告路径前缀 (*your-report-path-prefix/*)。然后，选择您的报告名称（*your-report-name/*）。

1. 选择 `.yml` 模板文件。

1. 选择**对象操作**，然后选择**下载为**。

1. 在 [https://console.aws.amazon.com/cloudformat](https://console.aws.amazon.com/cloudformation/) ion 上打开 CloudFormation 控制台。

1. 选择以前创建的堆栈，然后选择**更新**。

1. 在 **Prepare template (准备模板)** 下面，选择 **Replace current template (替换当前模板)**。

1. 在 **Template source (模板源)** 下，选择**上传模板文件**。

1. 选择**选择文件**。

1. 选择 `.yml` 模板，然后选择 **Open (打开)**。

1. 选择**下一步**。

1. 在**指定堆栈详细信息**页面上，修改任何详细信息，然后选择**下一步**。

1. 选择**下一步**。

1. 在页面底部，选择**我确认 AWS CloudFormation 可能会创建 IAM 资源。**

1. 选择**更新堆栈**。

# 手动设置 Athena
<a name="cur-ate-manual"></a>

我们强烈建议您使用 AWS CloudFormation 模板来创建表格，而不是自己创建。所提供的 SQL 查询会创建一个仅涵盖一个月数据的表，但该 AWS CloudFormation 模板创建的表可以包含多个月份并且会自动更新。有关如何设置 AWS CloudFormation 模板的更多信息，请参阅[使用模板设置 Athena CloudFormation](use-athena-cf.md)。

如果您选择不使用 CloudFormation 模板来设置 Athena 表，请手动执行以下步骤。您需要先创建一个表，然后才能对 AWS CUR 数据运行 SQL 查询。您需要每月至少执行一次此步骤，并且该表仅包含来自当前 AWS CUR 的数据。

作为表创建过程的一部分， AWS 转换 AWS CUR 列名。有关转换过程的更多信息，请参阅[列名称](cur-ate-run.md#column-transformations)。
+ [创建 Athena 表](create-manual-table.md)
+ [创建成本和使用情况报告状态表](create-manual-cur-table.md)
+ [上传您的报告分区](upload-report-partitions.md)

# 创建 Athena 表
<a name="create-manual-table"></a>

AWS 包括在 AWS CUR 存储桶中创建此表时需要运行的 SQL。<a name="create-manual-table-steps"></a>

**创建 Athena 表**

1. 登录 AWS 管理控制台 并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 从存储桶列表中，选择您选择接收成本和使用情况报告的存储桶。

1. 导航路径 `your-report-prefix-your-report-name-path-to-report`。

   确切的路径取决于您的 AWS CUR 是否设置为覆盖以前的版本。有关更多信息，请参阅 [成本和使用情况报告交付时间表](understanding-report-versions.md#access-cur-s3-timeline)。

1. 打开 `my-report-name-create-table.sql` 文件。

1. 从文件中复制 SQL，开头是 `CREATE`，结尾是 `LOCATION 's3://your-report-prefix/your-report-name/the-rest-of-the=path'`。记下第一行，因为您需要使用数据库名称和表创建 Athena 数据库。

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 打开 Athena 控制台。

1. 在 **New query 1 (新查询 1)** 查询窗格中，粘贴以下 SQL。对于 *`<database name>.<table name>`*，使用您复制的 SQL 的第一行中的数据库和表名称。

   ```
   CREATE DATABASE <database name>
   ```

1. 选择**运行查询**。

1. 在下拉菜单中，选择刚刚创建的数据库。

1. 在 **New query 1 (新查询 1)** 查询窗格中，粘贴 SQL 文件中的其余 SQL。

1. 选择**运行查询**。

创建表后，需要先加载分区，然后才能运行查询。有关更多信息，请参阅 [上传您的报告分区](upload-report-partitions.md)。

# 创建成本和使用情况报告状态表
<a name="create-manual-cur-table"></a>

AWS 每天多次刷新 AWS CUR。Athena 无法分辨 AWS 何时正在刷新您的报告，这可能会导致查询结果中包含新旧数据的组合。为了缓解这种情况，请创建一个表来跟踪 AWS 是否在刷新成本和使用情况报告，然后查询该表以查看 AWS 是否在刷新数据。您只需要创建此表一次。之后， AWS 使表格保持最新。<a name="create-refresh-table"></a>

**创建您的刷新表**

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 打开 Athena 控制台。

1. 在 **New query 1 (新查询 1)** 查询窗格中，粘贴以下 SQL。

   ```
   CREATE EXTERNAL TABLE IF NOT EXISTS cost_and_usage_data_status(
     status STRING)
   ROW FORMAT SERDE
     'org.apache.hadoop.hive.ql.io.parquet.serde.ParquetHiveSerDe'
   WITH SERDEPROPERTIES (
    'serialization.format' = '1'
   )
   LOCATION 's3://{S3_Bucket_Name}/{Report_Key}/cost_and_usage_data_status/'
   ```

1. 选择**运行查询**。

要检查是否 AWS 正在刷新您的数据，请使用 Athena 控制台运行以下 SQL 查询。

```
select status from cost_and_usage_data_status 
```

# 上传您的报告分区
<a name="upload-report-partitions"></a>

要查询成本和使用情况报告数据，您需要将数据上传到 Athena 表中。您必须对 AWS 交付给您的每份新 AWS CUR 报告执行此操作。<a name="upload-partitions"></a>

**上传您的最新分区**

1. 从 [https://console.aws.amazon.com/athena/](https://console.aws.amazon.com/athena/home) 打开 Athena 控制台。

1. 选择表名称旁边的垂直三个点。

1. 选择**加载分区**。

如果您未上传分区，Athena 不会返回任何结果，或者返回错误消息以指示缺少数据。

# 运行 Amazon Athena 查询
<a name="cur-ate-run"></a>

要对您的数据运行 Athena 查询，请先使用 Athena 控制台检查 AWS 是否正在刷新数据，然后在 Athena 控制台上运行查询。当您运行 SQL 时，请确保从下拉列表中选择了正确的数据库。您可以使用以下 SQL 来检查状态。

```
select status from cost_and_usage_data_status 
```

两个可能的结果是 `READY` 和 `UPDATING`。如果状态为 `READY`，则可以查询您的 Athena 数据库。如果状态为 `UPDATING`，则 Athena 可能返回不完整的结果。

确认 AWS 正在刷新数据后，您可以运行自己的查询。例如，以下查询显示了名为的示例数据库中每个月按服务划分的 year-to-date费用`mycostandusage_parquet`。以下查询显示了 2018 年的 year-to-date成本。更新年度以查看当前 year-to-date成本。

```
SELECT line_item_product_code,
sum(line_item_blended_cost) AS cost, month
FROM mycostandusage_parquet
WHERE year='2018'
GROUP BY  line_item_product_code, month
HAVING sum(line_item_blended_cost) > 0
ORDER BY  line_item_product_code;
```

## 列名称
<a name="column-transformations"></a>

Athena 列名称限制与成本和使用情况报告列名称限制不同。这意味着，当你的 AWS CUR 数据上传到 Athena 表时，列名会发生变化。 AWS 进行了以下更改：
+ 在大写字母前添加下划线
+ 大写字母会替换为小写字母 
+ 任何非字母数字字符都会替换为下划线
+ 会删除重复的下划线
+ 会删除任何前导和尾随下划线
+ 如果列名称长于允许的列名称长度，则会从左到右删除下划线

**注意**  
应用这些规则后，某些资源标签列的名称将重复。 AWS 当有多个列具有相同名称时，会合并列。

例如，列名 `ExampleColumnName` 变为 `example_column_name`，列名 `Example Column Name` 变为 `example_column_name`。

# 将报告数据加载到其他资源
<a name="cur-query-other"></a>

您可以将成本和使用情况报告上传到 Amazon Redshift 和 Amazon Quick，以分析您的 AWS 成本和使用情况。

**Topics**
+ [正在将报告数据加载到 Amazon Quick](#cur-query-other-qs)
+ [将报告数据加载到 Amazon Redshift](#cur-query-other-rs)

## 正在将报告数据加载到 Amazon Quick
<a name="cur-query-other-qs"></a>

您可以将成本和使用情况报告上传到 Amazon Quick。

有关上传到 Quick 的更多信息，请参阅*快速用户指南*中的[使用 Amazon S3 文件创建数据集](https://docs.aws.amazon.com/quicksight/latest/user/create-a-data-set-s3.html)。

## 将报告数据加载到 Amazon Redshift
<a name="cur-query-other-rs"></a>

本节介绍如何将 AWS CUR 上传到 Amazon Redshift 以分析 AWS 您的成本和使用情况。

**重要**  
Amazon Redshift 列不区分大小写，并具有比用户定义的标签更严格的字符限制。为了防止 Amazon Redshift 和用户定义的标签之间发生冲突，请使用标签`userTag0``userTag1``userTag2`、等 AWS 替换您的标签。在创建 Amazon Redshift 表并将报告上传到该表之后，您可以创建一个 Amazon Redshift 表，该表将定义的标签映射到您用户定义 AWS的标签。该标签表使您可以查找您的原始标签。  
例如，如果您具有 `OWNER` 和 `Owner` 标签，Amazon Redshift 不允许您创建的表包含两个名为“owner”的列。相反，您应创建包含列 `userTag0` 和 `userTag1` (而不是 `OWNER` 和 `Owner`) 的报告表，然后创建包含列 `remappedUserTag` 和 `userTag` 的表。该`remappedUserTag`列存储 AWS定义的标签`userTag0`和`userTag1`，`userTag`列存储您的原始标签，`OWNER`以及 `Owner` 

AWS 提供了用于创建 Amazon Redshift 表、上传报告、创建标签表以及将所有标签行插入标签表的命令。这些命令在 S3 中与清单`RedshiftCommands.sql`文件一起存储的文件以及账单和成本管理控制台的 **Redshift 文件** **Helper 文件**中提供给您。 AWS 还提供了一个 RedshiftManifest文件，用于控制哪些文件在上传 RedshiftCommand 文件时报告命令。删除或删除 RedshiftManifest 文件会破坏 RedshiftCommands文件中的复制命令。

**在账单和成本管理控制台中查找 `RedshiftCommands.sql` 文件**

1. 打开账单与成本管理控制台，网址为 [https://console.aws.amazon.com/costmanagement/](https://console.aws.amazon.com/costmanagement/)。

1. 在导航窗格中，在**旧版页面**下面，选择**成本和使用情况报告**。

1. 选择您要上传到 Amazon Redshift 的报告。

1. 在**您已启用在以下服务中查看报告:** 旁边，选择 **Amazon Redshift**。

1. 从对话框中选择命令并将其粘贴到您的 SQL 客户端。

以下过程假设您熟悉数据库和 Amazon Redshift。

**将成本和使用情况报告上传到 Amazon Redshift**

1. 创建一个 Amazon Redshift 集群。

   有关更多信息，请参阅《Amazon Redshift 管理指南》中的[创建集群](https://docs.aws.amazon.com/redshift/latest/mgmt/managing-clusters-console.html#create-cluster)。**

1. 登录 AWS 管理控制台 并打开 Amazon S3 控制台，网址为[https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)。

1. 导航到存储 AWS CUR 的 Amazon S3 位置。

1. 打开 `RedshiftCommands.sql` 文件。

   该文件包含自定义命令，用于创建 Amazon Redshift 表、从 Amazon S3 上传 AWS CUR 以及创建允许将用户定义的标签导入 Amazon Redshift 的标签表。

1. 在`copy`命令中，*<AWS\$1ROLE>*替换为有权访问存储 CUR 的 Amazon S3 存储桶的 IAM 角色的 ARN。 AWS 

1. *<S3\$1BUCKET\$1REGION>*替换为您的 Amazon S3 存储桶所在的区域。例如 `us-east-1`。

1. 使用 SQL 客户端连接到群集。

   有关更多信息，请参阅《Amazon Redshift 管理指南》中的[访问 Amazon Redshift 集群和数据库](https://docs.aws.amazon.com/redshift/latest/mgmt/using-rs-tools.html)。**

1. 按以下顺序将 SQL 命令从 `RedshiftCommands.sql` 文件复制到您的 SQL 客户端：
   + create table - 该命令创建一个 Amazon Redshift 表，并自定义其架构以与您的报告匹配。
   + copy-此命令使用提供的 IAM 角色将 AWS CUR 文件从 S3 上传到 Amazon Redshift。
   + create tag table - 此命令将创建一个表，该表允许您将 AWS定义的标签映射到用户定义的标签。
   + insert - 这些命令会将用户定义的标签插入到标签表。

1. 将 AWS CUR 中的所有数据复制到 Amazon Redshift 后，您可以使用 SQL 查询数据。有关在 Amazon Redshift 中查询数据的更多信息，请参阅《Amazon Redshift 数据库开发人员指南》中的 [Amazon Redshift SQL](https://docs.aws.amazon.com/redshift/latest/dg/c_redshift-sql.html)。**

**注意**  
成本和使用情况报告中的列数可能会每月发生变化，例如，在创建新的成本分配标签时，或者在服务添加新的产品属性时。我们建议您每月将 AWS CUR 中的数据复制到一个新表中，然后将您感兴趣的列复制到单独的 month-by-month表中。