【问题标题】:An error occurred (AccessDenied) when calling the CopyObject operation: Access Denied调用 CopyObject 操作时发生错误 (AccessDenied):访问被拒绝
【发布时间】:2021-04-13 00:17:01
【问题描述】:

在 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 文件

【问题讨论】:

  • 我猜test 不是您存储桶的实际名称?
  • 是的 test 我的 s3 存储桶的实际名称

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


【解决方案1】:

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

Amazon S3 存储桶名称全局唯一,并且命名空间由所有 AWS 账户共享。这意味着创建存储桶后,在删除该存储桶之前,该存储桶的名称不能被任何 AWS 区域中的另一个 AWS 账户使用。

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

【讨论】:

    猜你喜欢
    • 2018-07-12
    • 1970-01-01
    • 2018-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-23
    • 2020-04-02
    • 1970-01-01
    相关资源
    最近更新 更多