【问题标题】:Lambda times out while accessing S3 Bucket in another account using Boto3Lambda 在使用 Boto3 访问另一个账户中的 S3 存储桶时超时
【发布时间】:2020-02-22 18:37:56
【问题描述】:

我正在尝试使用 boto3 从我的 AWS Lambda 访问另一个账户中的 S3 存储桶。以下是我配置的步骤:
1. 在我的 Lambda 所在的账户 A 中,我创建执行角色 (Lambda-S3-SNS-VPC-Role) 并将一个 AmazonS3FullAccess 托管策略和一个内联策略附加到它:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt1489133353000",
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole"
            ],
            "Resource": [
                "arn:aws:iam::<Account-B-ID>:role/access-s3-bucket-from-lambda-in-another-acc-role"
            ]
        }
    ]
}

在我的 S3 存储桶所在的账户 B 中,我创建了一个 IAM 角色 (access-s3-bucket-from-lambda-in-another-acc-role),如下所示: - 附加 AmazonS3FullAccess 托管策略和信任关系:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::<Account-A-ID>:role/Lambda-S3-SNS-VPC-Role",
        "Service": "lambda.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

另外,在账户 B 的 S3 存储桶中,给出了以下存储桶策略

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<Account-A-ID>:role/Lambda-S3-SNS-VPC-Role"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::my-bucket-in-acc-B",
                "arn:aws:s3:::my-bucket-in-acc-B/*"
            ]
        }
    ]
}

下面是我的 Lambda 函数代码:

def lambda_handler(event, context):
    sts_connection = boto3.client('sts')

    acct_b = sts_connection.assume_role(
        RoleArn="arn:aws:iam::<Account-B-ID>:role/access-s3-bucket-from-lambda-in-another-acc-role",
        RoleSessionName="cross_acct_lambda"
    )
    print('acct_b: ',acct_b)

但在测试时,什么都没有发生,函数超时。请指导。

【问题讨论】:

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


    【解决方案1】:

    我不确定您的函数为什么会超时,但我想推荐一种不同的方法:

    • Account-A 中使用 IAM 角色 Lambda-S3-SNS-VPC-Role 运行的 Lambda 函数
    • Bucket-B in Account-B 带有允许从 Lambda-S3-SNS-VPC-Role 访问的存储桶策略(这与您在上面显示的完全一样)

    这就是你所需要的!

    无需从 Account-B 承担 IAM 角色,因为 Bucket-B 上的存储桶策略允许 Lambda 函数使用的 IAM 角色进行访问。

    【讨论】:

    • 我通过将我的 Lambda 移出 VPC 来实现它。尽管我已经创建了 SNS VPC 端点,但我不知道为什么它不能在 VPC 中工作。我现在从我的 Lambda 执行角色中删除了内联策略,并让 Lambda 正常工作,但在 VPC 之外。我需要进行更多配置以使其在 VPC 中工作吗?
    • 如果 AWS Lambda 函数连接到 VPC,它只能在以下情况下获得 Internet 访问权限:(a) 它连接到私有子网并且 (b) 公有子网中有 NAT 网关,并且私有子网路由表指向 NAT 网关。
    • 如上所述,您仍然不需要使用账户 B 中的 IAM 角色。
    • 但是我们可以通过提供 VPC Endpoint 在 VPC 中使用其他 AWS 服务。我这样做也是为了访问 SNS,这很有效。但同样不适用于 STS。
    • 如果 AWS Lambda 函数连接到 VPC,则它会自动连接到 Internet。如果函数 连接到 VPC,并且它需要访问 AWS API 端点,则它需要 NAT 网关(见上文),或者它可以使用 VPC 端点来访问 API端点,无需通过 Internet 网关。简单来说,如果您不需要 Lambda 函数专门访问 VPC 中的资源,则不要将其配置为使用 VPC。
    猜你喜欢
    • 2019-01-15
    • 2016-02-27
    • 1970-01-01
    • 2020-07-05
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-28
    相关资源
    最近更新 更多