

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

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

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

## 注意事项和限制
<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.amazonaws.cn/athena/) 打开 Athena 控制台。

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

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

1. 在**查询结果配置**下，选择 **Athena 托管**。  
![查询结果配置菜单。](http://docs.amazonaws.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>

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

## 为托管查询结果设置 Amazon 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.amazonaws.cn/kms/latest/developerguide/concepts.html#encrypt_context)。由于 `Principal` 部分是一项 Amazon 服务，因此您还需要在密钥策略条件中添加 `aws:sourceArn` 和 `aws:sourceAccount`。以下示例显示了对单个工作组具有最低权限的 Amazon 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}}}"
    }
}
```

以下示例 Amazon KMS 密钥策略允许同一账户 {{account-id}} 内的所有工作组使用相同的 Amazon 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)。