在不同账户的 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-ABucket-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-BAWS 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同账户不同地域资源访问(ses到lambda)

如何配置 AWS lambda 函数以对不同 aws 子账户中的 dynamodb 表执行 crud 操作?

在 AWS 中从 Lambda 启动 shell 脚本

如何在 Python 中从 AWS 中的 lambda 函数返回二进制数据?

在 aws lambda 中在 python 中从 ANSI 转换为 UTF-8

AWS CloudFormation:如何为 Lambda 代码指定来自另一个 AWS 账户的存储桶?