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

2 分钟阅读
0

当我使用 AWS Lambda 函数将文件上传到 Amazon Simple Storage Service (Amazon S3) 存储桶时,出现“访问被拒绝”错误。Amazon S3 存储桶位于另一个 AWS 账户中。 

简短描述

如果 Lambda 函数和 Amazon S3 存储桶之间的权限不完整或不正确,则 Lambda 会返回访问被拒绝错误。

要在一个账户(账户 1)的 Lambda 函数和另一个账户(账户 2)的 S3 存储桶之间设置权限,请执行以下操作:

  1.     (在账户 1 中)创建一个 Lambda 执行角色,允许 Lambda 函数将对象上传到 Amazon S3。

  2.     (在账户 2 中)修改 S3 存储桶的存储桶策略,以允许 Lambda 函数将对象上传到存储桶。

解决方法

**重要信息:**以下解决方案要求在一个 AWS 账户中使用 Lambda 函数,在另一个账户中使用 S3 存储桶

将文件上传到 S3 存储桶的 Lambda 函数的示例代码(Python 版本 3.8)

import json
            import boto3

            s3 = boto3.client('s3')

            def lambda_handler(event,context):
            bucket = 'AccountBBucketName'
            transactionToUpload = {}
            transactionToUpload['transactionId'] = '12345'
            transactionToUpload['type'] = 'PURCHASE'
            transactionToUpload['amount'] = 20
            transactionToUpload['customerId'] = 'CID-1111'

            filename = 'CID-1111'+'.json'
            uploadByteStream = bytes(json.dumps(transactionToUpload).encode('UTF-8'))
            s3.put_object(Bucket=bucket, Key=filename, Body=uploadByteStream, ACL='bucket-owner-full-control')
            print("Put Complete")

**注意:**在上传请求中传递存储桶拥有者完全控制 ACL 之前,请确认存储桶上的 ACL 未停用。在 S3 存储桶的所有权设置中执行此操作。有关更多信息,请参阅控制对象的所有权和禁用存储桶的 ACL

(在账户 1 中)创建 Lambda 执行角色以允许 Lambda 函数将对象上传到 Amazon S3

  1.     为您的 Lambda 函数创建 AWS Identity and Access Management (AWS IAM) 角色

  2.     复制 IAM 角色的 Amazon 资源名称 (ARN)

**注意:**在更新 S3 存储桶的存储桶策略之前,必须获取 IAM 角色的 ARN。要获取 IAM 角色的 ARN,有一种方法是运行 AWS 命令行界面 (AWS CLI) get-role 命令。如果您在运行 AWS CLI 命令时出现错误,请确保您使用的是最新版本的 AWS CLI

3.    向 IAM 角色附加一个策略,该策略授权将对象 (s3:PutObject) 上传到账户 2 中的存储桶。

向 IAM 角色授予 s3:PutObject 和 s3:PutObjectAcl 权限的 IAM 策略示例

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

4.    将您的 Lambda 函数的执行角色更改为您创建的 IAM 角色。有关说明,请参阅配置 Lambda 函数选项

(在账户 2 中)修改 S3 存储桶的存储桶策略,以允许 Lambda 函数将对象上传到存储桶

更新存储桶策略,使其将 Lambda 执行角色的 ARN 指定为有权访问 s3:PutObject 操作的委托人

允许 Lambda 函数将对象上传到存储桶的 S3 存储桶策略示例

**注意:**以下策略还向 Lambda 函数的执行角色授予 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/*",
            "Condition": {
            "StringEquals": {
            "s3:x-amz-acl": "bucket-owner-full-control"
            }
            }
            }
            ]
            }

相关信息

如何解决来自 Amazon S3 的 403“访问被拒绝”错误?

AWS 官方
AWS 官方已更新 1 年前