在不同账户的 Lambda 中从 AWS Athena 查询 S3 文件时访问被拒绝
Posted
技术标签:
【中文标题】在不同账户的 Lambda 中从 AWS Athena 查询 S3 文件时访问被拒绝【英文标题】:Access Denied while querying S3 files from AWS Athena within Lambda in different account 【发布时间】:2020-06-13 04:39:23 【问题描述】:我正在尝试从我的 Lambda 代码中查询 Athena View。为不同帐户中的 S3 文件创建 Athena 表。 Athena 查询编辑器给我以下错误:
拒绝访问(服务:Amazon S3;状态代码:403;错误代码:AccessDenied;
我尝试从我的 Lambda 代码访问 Athena View。创建了 Lambda 执行角色并在另一个账户 S3 存储桶的存储桶策略中允许该角色,如下所示:
"Version": "2012-10-17",
"Statement": [
"Effect": "Allow",
"Principal":
"AWS": "arn:aws:iam::2222222222:role/BAccountRoleFullAccess"
,
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject"
],
"Resource": "arn:aws:s3:::s3_bucket/*"
,
"Effect": "Allow",
"Principal":
"AWS": [
"arn:aws:iam::111111111:role/A-Role",
"arn:aws:iam::111111111:role/B-Role"
]
,
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::s3_bucket",
"arn:aws:s3:::s3_bucket/*"
]
]
来自 Lambda,出现以下错误:
'Status': 'State': 'FAILED', 'StateChangeReason': 'com.amazonaws.services.s3.model.AmazonS3Exception:
Access Denied (Service: Amazon S3; Status Code: 403; Error Code: AccessDenied; Request ID: 3A8953784EC73B17;
S3 Extended Request ID: LfQZdTCj7sSQWcBqVNhtHrDEnJuGxgJQxvillSHznkWIr8t5TVzSaUwNSdSNh+YzDUj+S6aOUyI=),
S3 Extended Request ID: LfQZdTCj7sSQWcBqVNhtHrDEnJuGxgJQxvillSHznkWIr8t5TVzSaUwNSdSNh+YzDUj+S6aOUyI=
(Path: s3://s3_bucket/Input/myTestFile.csv)'
此 Lambda 函数正在使用 arn:aws:iam::111111111:role/B-Role
执行角色,该角色具有对 Athena 和 S3 的完全访问权限。
请有人指导我。
【问题讨论】:
所以bucket在账户2222222222
中,而lambda在111111111
中?
【参考方案1】:
为了重现这种情况,我做了以下操作:
在Account-A
中,创建了一个Amazon S3 存储桶 (Bucket-A
) 并上传了一个CSV 文件
在 Account-B
中,创建了具有 S3 和 Athena 权限的 IAM 角色 (Role-B
)
关闭 阻止公共访问 Bucket-A
向Bucket-A
添加了一个引用Role-B
的存储桶策略:
"Version": "2012-10-17",
"Statement": [
"Effect": "Allow",
"Principal":
"AWS": "arn:aws:iam::[ACCOUNT-B]:role/role-b"
,
"Action": [
"s3:Get*",
"s3:List*"
],
"Resource": [
"arn:aws:s3:::bucket-a",
"arn:aws:s3:::bucket-a/*"
]
]
在 Account-B
中,在 Amazon Athena 控制台中手动定义了一个表
对 Athena 表运行查询。正如预期的那样,收到Access Denied
,因为我使用 IAM 用户访问控制台,而不是在 Bucket-A
的存储桶策略中定义的 IAM 角色
在Account-B
中创建了一个使用Role-B
的AWS Lambda 函数:
import boto3
import time
def lambda_handler(event, context):
athena_client = boto3.client('athena')
query1 = athena_client.start_query_execution(
QueryString='SELECT * FROM foo',
ResultConfiguration='OutputLocation': 's3://my-athena-out-bucket/'
)
time.sleep(10)
query2 = athena_client.get_query_results(QueryExecutionId=query1['QueryExecutionId'])
print(query2)
运行 Lambda 函数。它成功地从 CSV 文件返回数据。
请将您的配置与我采取的上述步骤进行比较。希望您能找到一个不同之处,让您能够通过 Athena 进行跨账户访问。
参考:Cross-account Access - Amazon Athena
【讨论】:
谢谢约翰!有效。我做了相同的配置,但不知道为什么它不起作用。我又试了一次,它成功了。 我们能否在帐户 A 中也拥有 Athena,与创建 S3 存储桶的位置相同。 Lambda 可以从不同账户调用 Athena View。 我们能否在帐户 A 中也有 Athena,与创建 S3 存储桶的位置相同? 是的,这里没有什么特殊要求。只需使用雅典娜。 Lambda 可以从不同的账户调用 Athena View 吗? 上面展示了如何使用 Lambda 在不同的账户中访问 Athena。它不会影响您在in Athena 中所做的事情。您可以在 Athena 中使用表格、视图或任何您想要的东西。 它给了我架构不存在的错误。我在账户 A 中创建了数据库,在该架构下创建了视图,并尝试从账户 B 中的 Lambda 调用视图。出现错误提示“架构不存在”。是不是因为它只在存在 Lambda 的地方搜索账户 B 中的架构。 等一下,这令人困惑,哪个帐户有哪个服务。请创建一个新问题,因为这与此问题的内容有所不同。以上是关于在不同账户的 Lambda 中从 AWS Athena 查询 S3 文件时访问被拒绝的主要内容,如果未能解决你的问题,请参考以下文章
如何配置 AWS lambda 函数以对不同 aws 子账户中的 dynamodb 表执行 crud 操作?
如何在 Python 中从 AWS 中的 lambda 函数返回二进制数据?