问题
嗨,我想在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中对象的元数据