调用 CopyObject 操作时发生错误 (AccessDenied):拒绝访问

时间:2021-01-07 09:13:14

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

在 AWS Lambda 中运行 Python 代码时使用 boto3 的 copy_object 方法时出现此错误。

AWS Lambda 代码

import json
import boto3

def lambda_handler(event, context):
    some_binary_data = b'Here we have some data'
    client = boto3.client("s3")

    # Upload - Working
    client.put_object(Body=some_binary_data, Bucket='test', Key="upload/binary_1.txt")
    
    # Copy - Working
    s3 = boto3.resource('s3')
    copy_source = {
        'Bucket': 'test',
        'Key': 'upload/binary_1.txt'
    }
    s3.meta.client.copy(copy_source, 'test', 'upload/binary_1_copied.txt')

    # Copy - NOT WORKING  
    # Access Denied even after adding GetObjectTagging and PutObjectTagging permissions in the policy

    client.copy_object(Bucket="test", CopySource="upload/binary_1.txt", Key="upload/binary_1_copied.txt")

    # Delete - Working
    client.delete_object(Bucket="test", Key="upload/binary_1.txt")
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!')
    }

我将此策略(称为 JSON)用于分配给我的 lambda 函数的角色。

{
"Version": "2012-10-17",
"Statement": [
    {
        "Sid": "VisualEditor0",
        "Effect": "Allow",
        "Action": [
            "s3:ReplicateObject",
            "s3:PutObject",
            "s3:GetObject",
            "s3:GetObjectTagging",
            "s3:ListBucket",
            "s3:PutObjectTagging",
            "s3:DeleteObject",
            "s3:PutObjectAcl"
        ],
        "Resource": [
            "arn:aws:s3:::test/*",
            "arn:aws:s3:::test"
        ]
    },
    {
        "Sid": "VisualEditor1",
        "Effect": "Allow",
        "Action": "s3:ListAllMyBuckets",
        "Resource": "*"
    }
]
}

注意 - S3-Bucket 当前包含上传/binary_1.txt 文件

1 个答案:

答案 0 :(得分:1)

如果 test 是您不能使用的实际存储桶名称。存储桶名称在所有 AWS 账户和区域中必须唯一。来自docs

<块引用>

Amazon S3 存储桶名称全球唯一,并且命名空间由所有 AWS 账户共享。这意味着在创建存储桶后,在删除存储桶之前,任何 AWS 区域中的其他 AWS 账户都无法使用该存储桶的名称。

因此您会访问被拒绝,因为 test 存储桶属于其他人。您必须确保您的存储桶名称是唯一的,并且未被其他任何人使用。