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

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

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

注意

有关从 Athena 跨账户访问 Amazon Glue 数据目录的信息,请参阅 授予 Amazon Glue 数据目录跨账户访问权限

以下示例存储桶策略 (由存储桶所有者创建并应用到存储桶 s3://DOC-EXAMPLE-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" ], "Resource": [ "arn:aws:s3:::DOC-EXAMPLE-BUCKET", "arn:aws:s3:::DOC-EXAMPLE-BUCKET/*" ] } ] }

要向账户中的特定用户授予访问权限,请将 Principal 密钥替换为用户指定的密钥,而不是 root。例如,对于用户配置文件 Dave,请使用 arn:aws:iam::123456789123:user/Dave

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

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

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

  • 账户 A 中的存储桶策略必须授予对账户 B 所担任角色的访问权限。

  • 账户 A 中的 Amazon KMS 密钥策略必须授予对账户 B 中用户所担任角色的访问权限。

  • 账户 B 担任的 Amazon 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:::DOC-EXAMPLE-BUCKET/*", "Principal": { "AWS": [ "111122223333" ] } } ] }
从账户 a 中的 Amazon KMS 密钥策略向账户 b 中的用户授予访问权限
  1. 在账户 A 的 Amazon KMS 密钥策略中,向账户 B 所担任的角色授予执行以下操作的权限:

    • kms:Encrypt

    • kms:Decrypt

    • kms:ReEncrypt*

    • kms:GenerateDataKey*

    • kms:DescribeKey

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

    { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowUseOfTheKey", "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 中,使用 Amazon Web Services Management Console 策略视图查看密钥策略。

  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.aws.amazon.com/iam/ 开启 IAM 控制台。

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

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

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

    以下示例语句授予 IAM 角色对存储桶 DOC-EXAMPLE-BUCKET 执行 s3:GetObjects3:PutObject 操作的访问权限:

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

    注意

    如果账户 B 所担任的 IAM 角色已经具有管理员访问权限,则您无需从用户的 IAM policy 授予对密钥的访问权限。

    以下示例语句授予 IAM 角色使用密钥 arn:aws:kms:us-west-2: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:us-west-2:123456789098:key/111aa2bb-333c-4d44-5555-a111bb2c33dd" } ] }

跨账户访问存储桶对象

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