Athena 中对 Amazon S3 存储桶的跨账户访问 - Amazon Athena
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

如果我们为英文版本指南提供翻译,那么如果存在任何冲突,将以英文版本指南为准。在提供翻译时使用机器翻译。

Athena 中对 Amazon S3 存储桶的跨账户访问

一个常见的 Amazon Athena 方案是向账户中与存储桶所有者不同的用户授予访问权限,以便他们可以执行查询。在这种情况下,使用存储桶策略来授予访问权限。

注意

有关跨帐户访问权限的信息,请访问 AWS Glue,参见 授予跨账户访问AWS Glue 开发人员指南.

以下示例存储桶策略 (由存储桶所有者创建并应用到存储桶 s3://my-athena-data-bucket) 向账户 123456789123 (它是不同账户) 中的所有用户授予访问权限。

{ "Version": "2012-10-17", "Id": "MyPolicyID", "Statement": [ { "Sid": "MyStatementSid", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::123456789123:root" }, "Action": [ "s3:GetBucketLocation", "s3:GetObject", "s3:ListBucket", "s3:ListBucketMultipartUploads", "s3:ListMultipartUploadParts", "s3:AbortMultipartUpload", "s3:PutObject" ], "Resource": [ "arn:aws:s3:::my-athena-data-bucket", "arn:aws:s3:::my-athena-data-bucket/*" ] } ] }

要授予帐户中特定用户的访问权限,请更换 Principal 密钥用于指定用户而非 root。例如,用户配置文件 Dave,使用 arn:aws:iam::123456789123:user/Dave.

跨账户访问使用自定义 AWS KMS 密钥加密的存储桶

如果您的 Amazon S3 存储桶使用自定义 AWS Key Management Service (AWS KMS) 密钥加密,则可能需要向其他 AWS 账户中的用户授予访问该存储桶的权限。

向账户 B 中的用户授予对账户 A 中 AWS KMS 加密存储桶的访问权限需要以下权限:

  • 账户 A 中的存储桶策略必须向账户 B 授予访问权限。

  • 账户 A 中的 AWS KMS 密钥策略必须向账户 B 中的用户授予访问权限。

  • 账户 B 中的 AWS Identity and Access Management (IAM) 用户策略必须同时授予用户对账户 A 中存储桶和密钥的访问权限。

以下过程描述如何授予这些权限中的每个权限。

向账户 B 中的用户授予对账户 A 中存储桶的访问权限

  • 在账户 A 中,查看 S3 存储桶策略并确认存在允许从账户 B 的账户 ID 访问的语句。

    例如,以下存储桶策略允许 s3:GetObject 访问账户 ID 111122223333:

    { "Id": "ExamplePolicy1", "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleStmt1", "Action": [ "s3:GetObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::awsexamplebucket/*", "Principal": { "AWS": [ "111122223333" ] } } ] }

从账户 A 中的 AWS KMS 密钥策略向账户 B 中的用户授予访问权限

  1. 在账户 A 的 AWS KMS 密钥策略中,向账户 B 中的用户授予执行以下操作的权限:

    • kms:Encrypt

    • kms:Decrypt

    • kms:ReEncrypt*

    • kms:GenerateDataKey*

    • kms:DescribeKey

    以下示例仅向一个 IAM 用户或角色授予密钥访问权限。

    { "Sid": "Allow use of the key", "Effect": "Allow", "Principal": { "AWS": [ "arn:aws:iam::111122223333:role/role_name", ] }, "Action": [ "kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey" ], "Resource": "*" }
  2. 在账户 A 中,使用 AWS 管理控制台策略视图查看密钥策略。

  3. 在密钥策略中,验证以下语句是否将账户 B 列为委托人。

    "Sid": "Allow use of the key"
  4. 如果 "Sid": "Allow use of the key" 语句不存在,请执行以下步骤:

    1. 切换到使用控制台默认视图查看密钥策略。

    2. 将账户 B 的账户 ID 添加为可访问密钥的外部账户。

从账户 B 的 IAM 用户策略授予对账户 A 中存储桶和密钥的访问权限

  1. 从账户 B 中,通过 https://console.amazonaws.cn/iam/ 打开 IAM 控制台。

  2. 打开与账户 B 中的用户关联的 IAM 用户或角色。

  3. 查看应用于 IAM 用户或角色的权限策略列表。

  4. 确保应用授予对存储桶的访问权限的策略。

    以下示例语句授予 IAM 用户对 awsexamplebucket 存储桶执行 s3:GetObjects3:PutObject 操作的访问权限:

    { "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleStmt2", "Action": [ "s3:GetObject", "s3:PutObject" ], "Effect": "Allow", "Resource": "arn:aws:s3:::awsexamplebucket/*" } ] }
  5. 确保应用授予对密钥的访问权限的策略。

    注意

    如果账户 B 中的 IAM 用户或角色已经具有管理员访问权限,则您不需要从用户的 IAM 策略授予对密钥的访问权限。

    以下示例语句授予 IAM 用户使用密钥 arn:aws:kms:example-region-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd 的权限。

    { "Version": "2012-10-17", "Statement": [ { "Sid": "ExampleStmt3", "Action": [ "kms:Decrypt", "kms:DescribeKey", "kms:Encrypt", "kms:GenerateDataKey", "kms:ReEncrypt*" ], "Effect": "Allow", "Resource": "arn:aws:kms:example-region-1:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd" } ] }

有关如何添加或更正 IAM 用户的权限的说明,请参阅更改 IAM 用户的权限

跨账户访问存储桶对象

由存储桶拥有账户(账户 A)以外的账户(账户 C)上传的对象可能需要明确的对象级 ACL,以向查询账户(账户 B)授予读取访问权限。为避免此要求,账户 C 在将对象放入账户 A 的存储桶之前应代入账户 A 中的角色。有关更多信息,请参阅如何提供对 Amazon S3 存储桶中的对象的跨账户访问权限?