使用 Lambda 函数将文件上传到另一个账户的 Amazon S3 存储桶时,为什么会出现“拒绝访问”错误?

上次更新时间:2020 年 11 月 2 日

我想使用 AWS Lambda 函数将文件上传到另一个 AWS 账户的 Amazon Simple Storage Service (Amazon S3) 存储桶,但收到“拒绝访问”错误。如何修复此问题?

简短描述

当 AWS Lambda 函数和 Amazon S3 存储桶之间的权限不完整或不正确时,您会收到“拒绝访问”错误。

若要在一个账户(账户 A)中的 Lambda 函数和另一个账户(账户 B)中的 S3 存储桶之间设置正确的权限,请按照以下步骤操作:

1.    在账户 A 中,为 Lambda 函数创建 AWS Identity and Access Management (IAM) 角色(执行角色),该角色允许函数将对象上传到 Amazon S3。

2.    在账户 B 中,更新存储桶策略以允许 Lambda 函数上传对象。

解决方法

在开始之前,请确保:

在账户 A 中,为 Lambda 函数创建 IAM 角色(执行角色),该角色允许函数将对象上传到 Amazon S3

1.    为 Lambda 函数创建 IAM 角色

2.    请记下 IAM 角色的 Amazon 资源名称 (ARN),以便在后面的步骤中使用。获取 ARN 的一种方法是运行 AWS 命令行界面 (AWS CLI) 命令 get-role

注意:如果在运行 AWS CLI 命令时遇到错误,请确保您使用的是最新版本的 AWS CLI

3.    将策略附加到 IAM 角色,该角色授予将对象 (s3:PutObject) 上传到账户 B 中的存储桶的权限。例如,此策略向角色授予 s3:PutObject 和 s3:PutObjectAcl 的权限:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
  "s3:PutObject",
  "s3:PutObjectAcl"
            ],
            "Resource": "arn:aws:s3:::AccountBBucketName/*"
        }
    ]
}

4.    将 Lambda 函数的执行角色更改为您创建的 IAM 角色。您可以通过配置函数的设置来更改执行角色。

在账户 B 中,更新存储桶策略以允许 Lambda 函数上传对象

更新存储桶策略,以便将 Lambda 函数的 IAM 角色(执行角色)的 ARN 指定为可访问操作 s3:PutObject委托人。您可以使用与以下类似的存储桶策略:

注意:此策略还授予执行角色 s3:PutObjectAcl 的权限。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::AccountA:role/AccountARole"
            },
            "Action": [
                "s3:PutObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::AccountBBucketName/*"
            ]
        }
    ]
}

这篇文章对您有帮助吗?


您是否需要账单或技术支持?