【问题标题】:Access Denied while querying S3 files from AWS Athena within Lambda in different account在不同账户的 Lambda 中从 AWS Athena 查询 S3 文件时访问被拒绝
【发布时间】: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中?

标签: amazon-web-services amazon-s3 aws-lambda amazon-iam amazon-athena


【解决方案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-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 中的架构。
  • 等一下,这令人困惑,哪个帐户有哪个服务。请创建一个新问题,因为这与此问题的内容有所不同。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-30
  • 2020-10-21
  • 2022-01-27
  • 1970-01-01
  • 2021-05-19
  • 2019-02-23
  • 2018-05-19
相关资源
最近更新 更多