

# 托管查询结果
<a name="managed-results"></a>

使用托管查询结果，您可以运行 SQL 查询，而无需提供用于存储查询结果的 Amazon S3 存储桶。这使您无需预置、管理、控制访问和清理自己的 S3 存储桶。首先，创建新的工作组或编辑现有工作组。在**查询结果配置**下，选择 **Athena 托管**。

**主要 功能**
+ 通过无需在运行查询之前选择 S3 存储桶位置来简化工作流。
+ 使用托管查询结果无需额外费用，并且查询结果的自动删除可减少管理开销和单独的 S3 存储桶清理过程的需要。
+ 简单易上手：可轻松配置新的和预先存在的工作组以使用托管查询结果。您可以在 AWS 账户中混合使用 Athena 托管查询结果和客户管理的查询结果。
+ 简化了 IAM 权限，允许通过与各个工作组绑定的 `GetQueryResults` 和 `GetQueryResultsStream` 访问读取结果。
+ 查询结果将使用您选择的 AWS 拥有的密钥或客户拥有的密钥自动加密。

## 注意事项和限制
<a name="managed-results-considerations"></a>

****
+ 在 Athena 中，对查询结果的访问是在工作组级别进行管理的。为此，您需要对特定工作组的 `GetQueryResults` 和 `GetQueryResultsStream` IAM 操作具有显式权限。`GetQueryResults` 操作确定谁可以以分页格式检索已完成查询的结果，而 `GetQueryResultsStream` 操作确定谁可以流式传输已完成查询的结果（通常由 Athena 驱动程序使用）。
+ 您无法从控制台下载大于 200 MB 的查询结果文件。使用 `UNLOAD` 语句将大于 200 MB 的结果写入可单独下载的位置。
+ 托管查询结果功能不支持[查询结果重用](reusing-query-results.md)。
+ 查询结果 24 小时内可用。在此期间，查询结果将免费存储。此期限过后，查询结果将被自动删除。

## 使用托管查询结果创建或编辑工作组
<a name="using-managed-query-results"></a>

要从控制台创建工作组或使用托管查询结果更新现有工作组，请执行以下操作：

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

1. 从左侧导航中，选择**工作组**。

1. 选择**创建工作组**以创建新的工作组或编辑列表中的现有工作组。

1. 在**查询结果配置**下，选择 **Athena 托管**。  
![\[查询结果配置菜单。\]](http://docs.aws.amazon.com/zh_cn/athena/latest/ug/images/athena-managed.png)

1. 对于**加密查询结果**，选择所需的加密选项。有关更多信息，请参阅 [选择查询结果加密](#managed-query-results-encryption-at-rest)。

1. 填写所有其他必需的详细信息并选择**保存更改**。

## 选择查询结果加密
<a name="managed-query-results-encryption-at-rest"></a>

加密配置有两个选项：
+ **使用 AWS 拥有的密钥加密** – 这是使用托管查询结果时的默认选项。如果希望查询结果由 AWS 拥有的密钥加密，请选择此选项。
+ **使用客户自主管理型密钥加密** – 如果希望使用客户自主管理型密钥加密和解密查询结果，请选择此选项。要使用客户自主管理型密钥，请在密钥策略部分的 Principal 元素中添加 Athena 服务。有关更多信息，请参阅 [为托管查询结果设置 AWS KMS 密钥策略](#managed-query-results-set-up)。要成功运行查询，运行查询的用户需要访问 AWS KMS 密钥的权限。

## 为托管查询结果设置 AWS KMS 密钥策略
<a name="managed-query-results-set-up"></a>

密钥策略的 `Principal` 部分指定了谁可以使用此密钥。托管查询结果功能引入了必须在 `Principal` 部分中指定的主体 `encryption.athena.amazonaws.com`。此服务主体专门用于访问非 Athena 拥有的密钥。您还必须将 `kms:Decrypt`、`kms:GenerateDataKey` 和 `kms:DescribeKey` 操作添加到用于访问托管结果的密钥策略中。这三个操作是最低允许的操作。

托管查询结果使用您的工作组 ARN 作为[加密上下文](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#encrypt_context)。由于 `Principal` 部分是一项 AWS 服务，因此您还需要在密钥策略条件中添加 `aws:sourceArn` 和 `aws:sourceAccount`。以下示例显示了对单个工作组具有最低权限的 AWS KMS 密钥策略。

```
 {
    "Sid": "Allow athena service principal to use the key",
    "Effect": "Allow",
    "Principal": {
        "Service": "encryption.athena.amazonaws.com"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:DescribeKey"
      ],
    "Resource": "arn:aws:kms:us-east-1:{account-id}:key/{key-id}",
    "Condition": {
    "ArnLike": {
        "kms:EncryptionContext:aws:athena:arn": "arn:aws:athena:us-east-1:{account-id}:workgroup/{workgroup-name}",
        "aws:SourceArn": "arn:aws:athena:us-east-1:{account-id}:workgroup/{workgroup-name}"
    },
    "StringEquals": {
        "aws:SourceAccount": "{account-id}"
    }
}
```

以下示例 AWS KMS 密钥策略允许同一账户 *account-id* 内的所有工作组使用相同的 AWS KMS 密钥。

```
{
    "Sid": "Allow athena service principal to use the key",
    "Effect": "Allow",
    "Principal": {
        "Service": "encryption.athena.amazonaws.com"
    },
    "Action": [
        "kms:Decrypt",
        "kms:GenerateDataKey",
        "kms:DescribeKey"
    ],
    "Resource": "arn:aws:kms:us-east-1:account-id:key/{key-id}",
    "Condition": {
        "ArnLike": {
          "kms:EncryptionContext:aws:athena:arn": "arn:aws:athena:us-east-1:account-id:workgroup/*",
          "aws:SourceArn": "arn:aws:athena:us-east-1:account-id:workgroup/*"
        },
        "StringEquals": {
          "aws:SourceAccount": "account-id"
        }
    }
}
```

除了 Athena 和 Amazon S3 权限外，您还必须获得执行 `kms:GenerateDataKey` 和 `kms:Decrypt` 操作的权限。有关更多信息，请参阅 [Amazon S3 中加密数据的权限](encryption.md#permissions-for-encrypting-and-decrypting-data)。

有关托管查询结果加密的更多信息，请参阅[加密托管查询结果](encrypting-managed-results.md)。

# 加密托管查询结果
<a name="encrypting-managed-results"></a>

Athena 提供以下用于加密[托管查询结果](managed-results.md)的选项。

## 使用 AWS 拥有的密钥进行加密
<a name="encrypting-managed-results-aws-owned-key"></a>

这是使用托管查询结果时的默认选项。此选项表示您要使用 AWS 拥有的密钥对查询结果进行加密。AWS 拥有的密钥不会存储在您的 AWS 账户中，而是 AWS 拥有的 KMS 密钥集合的一部分。当您使用 AWS 拥有的密钥时，无需支付任何费用，并且它们不会计入您账户的 AWS KMS 配额。

## 使用 AWS KMS 客户自主管理型密钥进行加密
<a name="encrypting-managed-results-customer-managed-key"></a>

客户自主管理型密钥是在您的 AWS 账户中由您创建、拥有和管理的 KMS 密钥。您可以完全控制这些 KMS 密钥，包括建立和维护其密钥策略、IAM 策略和授权、启用和禁用它们、轮换其加密材料、添加标签、创建引用它们的别名以及安排删除它们。有关更多信息，请参阅[客户自主管理型密钥](https://docs.aws.amazon.com/kms/latest/developerguide/concepts.html#customer-cmk)。

## Athena 如何使用客户自主管理型密钥对结果进行加密
<a name="encrypting-managed-results-how-ate-uses-cmk"></a>

当您指定客户自主管理型密钥时，Athena 会在将查询结果存储在托管查询结果中时使用它来加密查询结果。当您调用 `GetQueryResults` 时，将使用相同的密钥来解密结果。当您将客户自主管理型密钥的状态设置为禁用或安排删除它时，它会阻止 Athena 和所有用户使用该密钥加密或解密结果。

Athena 使用信封加密和密钥层次结构来加密数据。您的 AWS KMS 加密密钥用于生成和解密此密钥层次结构的根密钥。

每个结果都使用加密时在工作组中配置的客户自主管理型密钥进行加密。将密钥切换到其他客户自主管理型密钥或 AWS 拥有的密钥不会使用新密钥重新加密现有结果。删除和禁用特定客户自主管理型密钥只会影响密钥加密的结果的解密。

Athena 需要访问您的加密密钥来执行 `kms:Decrypt`、`kms:GenerateDataKey` 和 `kms:DescribeKey` 操作以加密和解密结果。有关更多信息，请参阅 [Amazon S3 中加密数据的权限](encryption.md#permissions-for-encrypting-and-decrypting-data)。

除了 Athena 和 Amazon S3 权限之外，使用 `StartQueryExecution` API 提交查询并使用 `GetQueryResults` 读取结果的主体还必须对客户自主管理型密钥具有执行 `kms:Decrypt`、`kms:GenerateDataKey` 和 `kms:DescribeKey` 操作的权限。有关更多信息，请参阅[AWS KMS 中的密钥策略](https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-users)。