在不同账户中执行 Athena 查询后无法查看 S3 存储桶中的结果?
Unable to view results in S3 bucket after executing Athena query in different account?
我有两个账户:账户A和账户B。
我正在账户 A 中执行 Athena 查询,并希望将查询结果填充到账户 B 的 S3 存储桶中。
我已经在一个帐户中无数次地测试了执行此操作的脚本,因此我的代码没有任何问题。 Athena中的查询历史也表明我的代码已经运行成功,所以一定是权限问题。
我能够在账户 B 中看到一个包含 CSV 文件和查询结果的对象(正如预期的那样),但由于某种原因无法打开或下载它来查看内容。当我尝试这样做时,我只看到 XML 代码:
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
在文件属性中,我在 Server-side encryption settings
和 You don't have permission to get object ACL
下看到 Unknown Error
,并显示一条关于不允许 s3:GetObjectAcl
操作的消息。
我已尝试通过账户 B 中的存储桶策略为账户 A 和账户 B 授予完全 S3 权限,如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "This is for Account A",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::iam-number-account-a:root"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket-name",
"arn:aws:s3:::my-bucket-name/*"
]
},
{
"Sid": "This is for Account B",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::iam-number-account-b:root"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket-name",
"arn:aws:s3:::my-bucket-name/*"
]
}
]
}
可能导致我的问题的其他一些存储桶(账户 B)配置设置:
默认加密:禁用
阻止 public 访问:关闭所有内容
对象所有权:首选存储桶所有者
访问控制列表:
存储桶所有者 - 账户 B:对象(列表、写入)、存储桶 ACL(读取、写入)
外部账户 - 账户 A:对象(写入)、存储桶 ACL(写入)
如果有人可以帮助确定我的问题以及我需要解决的问题,我们将不胜感激。几个小时以来,我一直在努力寻找解决方案。
在属于不同 AWS 账户的 Amazon S3 存储桶中创建对象时的一个常见问题是对象 'owner' 仍然是原始账户。在 Amazon S3 中复制对象时,可以通过指定 ACL=bucket-owner-full-control
.
来解决此问题
然而,这在使用 Amazon Athena 创建文件时可能是不可能的。
查看其他类似的 Whosebug 问题:
- How to ensure that Athena result S3 object with bucket-owner-full-control - Stack Overflow
一些解决方法可能是:
- 写入账户 A 中的 S3 存储桶并使用存储桶策略向账户 B 授予读取访问权限,或
- 写入账户 A 中的 S3 存储桶并让 S3 触发 AWS Lambda 函数将对象复制到账户 B 中的存储桶,同时指定
ACL=bucket-owner-full-control
、 或
- 向账户 B 中的 IAM 用户或角色授予对源数据的访问权限,以及 运行 来自账户 B 的 Athena 查询,以便账户 B 写入 'output' 存储桶
CTAS 查询默认具有 bucket-owner-full-control
ACL,用于通过 Athena 进行跨账户写入
我有两个账户:账户A和账户B。
我正在账户 A 中执行 Athena 查询,并希望将查询结果填充到账户 B 的 S3 存储桶中。
我已经在一个帐户中无数次地测试了执行此操作的脚本,因此我的代码没有任何问题。 Athena中的查询历史也表明我的代码已经运行成功,所以一定是权限问题。
我能够在账户 B 中看到一个包含 CSV 文件和查询结果的对象(正如预期的那样),但由于某种原因无法打开或下载它来查看内容。当我尝试这样做时,我只看到 XML 代码:
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
在文件属性中,我在 Server-side encryption settings
和 You don't have permission to get object ACL
下看到 Unknown Error
,并显示一条关于不允许 s3:GetObjectAcl
操作的消息。
我已尝试通过账户 B 中的存储桶策略为账户 A 和账户 B 授予完全 S3 权限,如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "This is for Account A",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::iam-number-account-a:root"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket-name",
"arn:aws:s3:::my-bucket-name/*"
]
},
{
"Sid": "This is for Account B",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::iam-number-account-b:root"
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket-name",
"arn:aws:s3:::my-bucket-name/*"
]
}
]
}
可能导致我的问题的其他一些存储桶(账户 B)配置设置:
默认加密:禁用
阻止 public 访问:关闭所有内容
对象所有权:首选存储桶所有者
访问控制列表:
存储桶所有者 - 账户 B:对象(列表、写入)、存储桶 ACL(读取、写入)
外部账户 - 账户 A:对象(写入)、存储桶 ACL(写入)
如果有人可以帮助确定我的问题以及我需要解决的问题,我们将不胜感激。几个小时以来,我一直在努力寻找解决方案。
在属于不同 AWS 账户的 Amazon S3 存储桶中创建对象时的一个常见问题是对象 'owner' 仍然是原始账户。在 Amazon S3 中复制对象时,可以通过指定 ACL=bucket-owner-full-control
.
然而,这在使用 Amazon Athena 创建文件时可能是不可能的。
查看其他类似的 Whosebug 问题:
- How to ensure that Athena result S3 object with bucket-owner-full-control - Stack Overflow
一些解决方法可能是:
- 写入账户 A 中的 S3 存储桶并使用存储桶策略向账户 B 授予读取访问权限,或
- 写入账户 A 中的 S3 存储桶并让 S3 触发 AWS Lambda 函数将对象复制到账户 B 中的存储桶,同时指定
ACL=bucket-owner-full-control
、 或 - 向账户 B 中的 IAM 用户或角色授予对源数据的访问权限,以及 运行 来自账户 B 的 Athena 查询,以便账户 B 写入 'output' 存储桶
CTAS 查询默认具有 bucket-owner-full-control
ACL,用于通过 Athena 进行跨账户写入