Python boto3 s3 copyObject错误

Python boto3 s3 copyObject错误,python,amazon-web-services,lambda,boto3,Python,Amazon Web Services,Lambda,Boto3,我正在尝试使用lambda&boto3将文件从一个bucket复制到同一bucket中的另一个前缀,但是我一直收到一个错误: 调用CopyObject时发生错误(AccessDenied) 手术 或 调用HeadObject操作时发生错误(403):禁止 取决于我使用的复制方法 lambda函数有一个分配给它的角色,我认为它拥有所需的所有权限: { "Version": "2012-10-17", "Statement": [ { "Action": [

我正在尝试使用lambda&boto3将文件从一个bucket复制到同一bucket中的另一个前缀,但是我一直收到一个错误:

调用CopyObject时发生错误(AccessDenied) 手术

调用HeadObject操作时发生错误(403):禁止

取决于我使用的复制方法

lambda函数有一个分配给它的角色,我认为它拥有所需的所有权限:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Action": [
            "s3:HeadObject",
            "s3:ListObjects"
        ],
        "Resource": [
            "arn:aws:s3:::bucket-name",
            "arn:aws:s3:::bucket-name/*"
        ],
        "Effect": "Allow"
    },
    {
        "Action": [
            "s3:GetObject",
            "s3:PutObject",
            "s3:DeleteObject"
        ],
        "Resource": [
            "arn:aws:s3:::bucket-name/folderA/folderB/*",
            "arn:aws:s3:::bucket-name/folderC/folderD/*",
            "arn:aws:s3:::bucket-name/folderE/folderF/*"
        ],
        "Effect": "Allow"
    }
]
}
lambda函数是:

#connect to s3
s3 = boto3.resource('s3')

dirs = {
    "folderA/folderB": "folderC/folderD"        
}    

key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
etag = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['eTag'], encoding='utf-8')    
bucket = event['Records'][0]['s3']['bucket']['name']

filePathName = key.split("/")
sourceDir = filePathName[0] + "/" + filePathName[1]
fileName = filePathName[2]

sourceKey = sourceDir + "/" + fileName
source = {'Bucket': bucket, 'Key': sourceKey}
destination = dirs[sourceDir] + "/" + fileName

##########
# This option comes up with the An error occurred (AccessDenied) when calling the CopyObject operation. Error
###########
s3.Object(bucket, destination).copy_from(CopySource=source)

###########
## This option comes up with the An error occurred (403) when calling the HeadObject operation: Forbidden error
###########
s3.meta.client.copy(source, bucket, destination)
编辑: 忘了提及,如果我将角色更改为

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

我遇到了类似的问题。解决方案:
CopySource=source
中的
source
必须是从bucket root到实际文件的完整路径,而不是bucket name和key的字典。因此,我认为您的代码可能必须是:


s3.Object(bucket,destination)。从(CopySource=bucket+sourceDir)复制(CopySource)

乍一看是合理的。您是否临时授予Lambda函数s3:*对arn:aws:s3::::::*的权限,以验证在完全许可的情况下该函数是否有效?只是为了排除一些愚蠢的事情,比如错误的桶名?另外,记录不同的值,如bucket和source,以进行双重检查。是的,很抱歉忘记提及,如果我给它S3:*对于特定的bucket(不是所有bucket),它工作正常,但是当我按照上面的方法锁定它时,它不再工作并抛出这些错误。我认为这里的挑战是您正在使用高级SDK调用(copy_from和client copy)并且您不知道他们实际上在封面下进行了什么S3API调用(而且boto3没有明确记录它们)。我假设您指定的操作列表不足。您可能可以从CloudTrail或通过阅读boto3代码来发现完整的列表。例如,可能是GetBucketRoction、PutObjectTagging和对象ACL操作。您可以尝试找出哪个操作,或者添加Get*和Put*作为开始。已经尝试过了。我给出了t s3:Get*和s3:Put*在bucket和s3:*在没有Luckky的文件夹中,您应该使用arn:aws:s3:::bucket name,而不是arn:aws:s3:::bucket name/当引用bucket时。您能告诉我这是如何工作的吗?我看不到您在任何地方指定目标凭据和源凭据。这是对OP代码的修改o您可以在原始帖子中看到这些变量的定义。bucket name和key字典实际上是指定CopySource的推荐方法。参考: