如何使用 Lambda 将文件从 "folder" A 复制到同一存储桶上的文件夹 B



谢谢。

我知道S3没有文件夹。但我有一个前缀,abcabc/Pdf和abcabc/BackUpPdf。问题是,当客户端上传文件到前缀abcabc/Pdf时,会触发Lambda将该文件复制到abcabc/BackUpPdf。我使用boto3

这是我在Lambda中的一部分代码,关键是保存源文件的路径

def lambda_handler(event, context):
print(event)    
print('Inside the function')

# Get the object from the event and show its content type

bucket = event['Records'][0]['s3']['bucket']['name']

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

print('Bucket: ' + bucket + ', Key: ' + key)

client.Object(bucket, 'abcabc/BackUpPdf/TestFile.pdf').copy_from(CopySource = key, ACL='public-read')

问题是,我得到一个ClientError:一个错误发生(AccessDenied)时调用CopyObject操作:AccessDenied。我认为这是因为IAM角色,所以我把S3FullAccess到lambda角色,但我仍然有同样的问题。在不同的论坛中寻找,我发现您可以像这样编辑桶的策略:

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

事实上,有一个错误。它工作了,一旦我改变指令的方式,像这样:

client.Object(bucket, 'abcabc/BackUpPdf/TestFile.pdf').copy_from(CopySource = bucket + '/' + key)

另外,在Bucket

中启用了Block所有公共访问

我认为您可能错误地将CopySource参数传递给copy_from。你可以传递一个字符串,它的形式应该是:

CopySource: `{bucket}/{key}`

或者您可以传递一个字典,如:

CopySource: {'Bucket': 'bucket', 'Key': 'key'}

你似乎传递的是字符串{key}而不是{bucket}/{key}。我建议使用字典选项,而不是字符串选项。

另一个可能的原因是您启用了S3块公共访问。这将防止使用public-readACL存储对象。注意:块公共访问可以在帐户级别或桶级别启用。

最新更新