s3.具有新元数据的CopyObject失败



问题

嗨,我想在S3中上传新文件时添加元数据(CacheControl:"max-age=3600;s-maxage=3600")。因此,我制作了由S3 PUT触发的lambda代码。但是,即使代码没有错误,元数据(CacheControl)也不会添加到上载的文件中。。你能帮我吗

[在此输入图像描述][1][1] :https://i.stack.imgur.com/8MfbF.png

我的lambda代码在这里

async function retrieveNewFile(event){
const bucket = event.Records[0].s3.bucket.name;
const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/+/g, ' '));
const params = {
Bucket: bucket,
Key: key
}
console.log('* OriginData: ' + JSON.stringify(params)); 
return params;
}
async function addCacheControl(existedData){
existedData.CopySource = existedData.Bucket + '/' + existedData.Key;
existedData.CacheControl = 'max-age=3600;s-maxage=3600';
//existedData['x-amz-metadata-directive'] = 'replace';
console.log(existedData); 

await s3.copyObject(existedData).promise();
return existedData; 
}

**备注我尝试使用"putObject"而不是"copyObject",但如果使用"putObject",则代码处于循环中,因为"PUT"触发了我的lambda。(我无法为此拆分目录。所以我想使用"copyObject"之类的…)

我修改了函数,不使用"s3.copyobject",而是使用"s3.headObject":)

async function checkHeaderExist(file){
const header= await s3.headObject(file).promise();
console.log(header);
if(header.CacheControl){
return 'exist';
}else return 'no exist';
}

环顾四周,我发现了一个类似的帖子[1]。解决方案可以是检查元数据是否已更新,只有在未更新时才进行更新。这样,第一次上传对象时,它会触发lambda并放置一个新对象;第二次os触发时,它会检查对象是否已更新并关闭lambda。

[1] AWS Lambda函数和S3-仅当对象更改时才更改S3中对象的元数据

最新更新