

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

# 为计划查询配置 S3 目的地
<a name="scheduled-queries-s3-destination"></a>

将 Amazon S3 配置为目标，将您的计划查询结果存储为 JSON 文件，以便长期保留和分析。

使用 Amazon S3 作为目标时，查询结果将作为 JSON 文件存储在指定的存储桶和前缀中。此选项非常适合存档结果、执行批量分析或与其他处理 S3 数据的 AWS 服务集成。

您可以将查询结果传送到与计划查询相同的 AWS 账户中的 Amazon S3 存储桶，也可以将查询结果传送到其他 AWS 账户中的存储桶。您也可以选择使用客户托管密 AWS KMS 钥 (SSE-KMS) 对查询结果进行加密。

## 将结果传送到同一个账户中的 Amazon S3 存储桶
<a name="scheduled-queries-s3-same-account"></a>

当目标 Amazon S3 存储桶与计划查询位于同一 AWS 账户时，您可以直接从控制台浏览和选择存储桶。

**配置同账户 Amazon S3 目的地（控制台）**

1. 在 “将**查询结果发布到 S3**” 部分中，对于 **S3 存储桶**，选择**此账户**。

1. 对于 **Amazon S3 URI**，请输入存储结果的 Amazon S3 存储桶和前缀（例如`s3://my-bucket/query-results/`），或者选择**浏览亚马逊 S3** 进行导航并选择现有的 Amazon S3 位置。

1. （可选）要使用客户管理的 AWS KMS 密钥对结果进行加密，请在 **KMS 密钥 ARN 字段中输入 AWS KMS 密钥的 ARN**。密钥必须与目标 Amazon S3 存储桶位于同一 AWS 区域。如果您未指定 AWS KMS 密钥，则应用存储桶的默认加密设置。

1. 在**用于向 Amazon S3 发布查询结果的 IAM 角色****部分，选择自动创建具有默认权限的新角色**以自动设置所需权限，或者选择**使用现有角色**选择具有所需策略的现有 IAM 角色。

目的地配送 IAM 角色需要以下权限：

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::my-bucket/prefix/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

## 将结果传送到另一个账户中的 Amazon S3 存储桶
<a name="scheduled-queries-s3-cross-account"></a>

您可以将计划查询结果传送到其他 AWS 账户中的 Amazon S3 存储桶。使用跨账户存储桶时，必须提供 Amazon S3 URI 和拥有存储桶的账户的账户 ID。

**配置跨账户 Amazon S3 目标（控制台）**

1. 在 “将**查询结果发布到 S3**” 部分中，对于 **S3 存储桶**，选择**其他账户**，并提供拥有存储桶的账户的账户 ID 作为输入。

1. 对于 **Amazon S3 URI**，请输入目标存储桶的完整 Amazon S3 URI，并在另一个账户中输入前缀（例如，`s3://cross-account-bucket/query-results/`）。

1. （可选）要使用客户管理的 AWS KMS 密钥对结果进行加密，请在 **KMS 密钥 ARN 字段中输入 AWS KMS 密钥的 ARN**。密钥必须与目标 Amazon S3 存储桶位于同一 AWS 区域。

1. 在**用于向 Amazon S3 发布查询结果的 IAM 角色****部分，选择自动创建具有默认权限的新角色**以自动设置所需权限，或者选择**使用现有角色**选择具有所需策略的现有 IAM 角色。

跨账户交付需要双方的权限。源账户中的目标配送 IAM 角色需要以下权限：

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::cross-account-bucket/prefix/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceAccount": "123456789012"
                }
            }
        }
    ]
}
```

目标账户中的 Amazon S3 存储桶策略必须向源账户的 IAM 角色授予写入对象的权限：

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowScheduledQueryRolePutObject",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/my-s3-delivery-role"
            },
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::cross-account-bucket/prefix/*"
        }
    ]
}
```

## 使用客户管理 AWS KMS 的密钥对结果进行加密
<a name="scheduled-queries-s3-kms-encryption"></a>

您可以选择指定客户托管 AWS KMS 密钥，以便使用 SSE-KMS 对发送到 Amazon S3 的查询结果进行加密。 AWS KMS 密钥可以与计划查询位于同一个账户中，也可以位于不同的账户中。

当您指定 AWS KMS 密钥时，计划查询将使用该密钥通过 SSE-KMS 对结果进行加密。如果您不指定 AWS KMS 密钥，则会应用存储桶的默认加密设置。如果使用客户托管密钥将存储桶配置为默认 SSE-KMS 加密，则目标交付 IAM 角色仍必须拥有该密钥的`kms:GenerateDataKey`权限。

目的地交付 IAM 角色需要 AWS KMS 密钥`kms:GenerateDataKey`权限。以下示例显示了使用客户托管 AWS KMS 密钥的 Amazon S3 目标所需的权限：

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::my-bucket/prefix/*",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceAccount": "111122223333"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "kms:GenerateDataKey",
            "Resource": "arn:aws:kms:us-east-1:111122223333:key/key-id",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "s3.us-east-1.amazonaws.com"
                },
                "StringLike": {
                    "kms:EncryptionContext:aws:s3:arn": "arn:aws:s3:::my-bucket*"
                }
            }
        }
    ]
}
```

当 AWS KMS 密钥位于与目标交付 IAM 角色不同的账户中时，拥有 AWS KMS 密钥的账户中的密钥策略必须明确授予该角色访问权限：

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "AllowScheduledQueryRoleToEncrypt",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::111122223333:role/my-s3-delivery-role"
            },
            "Action": "kms:GenerateDataKey",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "kms:ViaService": "s3.us-east-1.amazonaws.com"
                },
                "StringLike": {
                    "kms:EncryptionContext:aws:s3:arn": "arn:aws:s3:::my-bucket*"
                }
            }
        }
    ]
}
```

**注意**  
当 AWS KMS 密钥和目标交付 IAM 角色在同一个账户中时，如果 AWS KMS 密钥策略包含默认的 “启用 IAM 策略” 根语句，则仅使用 IAM 身份策略就足够了。仅当 AWS KMS 密钥策略未委托给 IAM 时，才需要明确的密钥策略授权。

用于将查询结果发布到 Amazon S3 的 IAM 角色必须与用于计划查询执行的 IAM 角色分开配置。这种分离允许精细的访问控制，执行角色可以运行查询，而 Amazon S3 角色则专门处理结果交付。这两个角色都必须包含允许 CloudWatch 日志服务 (`logs.amazonaws.com`) 代入该角色的信任策略。