使用 lambda 更新 amazon s3 对象元数据而不执行对象复制?
Posted
技术标签:
【中文标题】使用 lambda 更新 amazon s3 对象元数据而不执行对象复制?【英文标题】:Update amazon s3 object meta data with lambda without performing a object copy? 【发布时间】:2018-09-20 20:28:27 【问题描述】:是否可以使用 lambda 函数添加或更新 s3 对象元数据而不复制对象? This 2 year old post says that we do need to make a copy,但它已经 2 岁了,所以也许事情已经改变了?
【问题讨论】:
【参考方案1】:使用s3.headObject
方法并通过object.Metadata设置相应的元数据
我创建 lambda 并在创建新对象时将其订阅到事件:
console.log('Loading function');
const aws = require('aws-sdk');
const s3 = new aws.S3( apiVersion: '2006-03-01' );
exports.handler = async (event, context, callback) =>
console.log('Received event:', JSON.stringify(event, null, 2));
const bucket = event.Records[0].s3.bucket.name;
const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
var params =
Bucket: bucket,
Key: key,
CopySource: encodeURIComponent( bucket+"/"+key ),
Metadata:
mode: '33188',
,
MetadataDirective: 'REPLACE',
;
try
var data = await s3.copyObject(params).promise();
console.log('UPDATE SUCCESS', data);
catch (err)
console.log(err);
const message = `Error updating object $key from bucket $bucket. Make sure they exist and your bucket is in the same region as this function.`;
console.log(message);
throw new Error(message);
;
警告不要忘记:
否则会陷入死循环
【讨论】:
请注意,在 Lambda 函数的元数据部分输入的元数据将以“x-amz-meta-”为前缀。这将元数据标识为用户定义(AWS Docs:docs.aws.amazon.com/AmazonS3/latest/dev/UsingMetadata.html)。【参考方案2】:从某种意义上说,根本上没有任何改变,因为对象是不可变的,而元数据是对象的一部分。要“更改”不可变对象,需要复制和替换。
不过,S3 对象现在支持标记,这是一种不同类别的“元数据”,附加到对象而不是对象的一部分。
S3 对象标记 – 您可以将多个键值对(标签)与您的每个 S3 对象相关联,并且可以随时更改它们。标签可用于管理和控制访问、设置 S3 生命周期策略、自定义 S3 分析以及过滤 CloudWatch 指标。您可以将存储桶视为数据湖,并使用标签创建湖中对象的分类。这比使用存储桶和前缀更灵活,并且允许您在不重命名、移动或复制对象的情况下进行语义风格的更改。
— S3 Storage Managment Update, 2017-03-20
另见Difference Between Object Tags and Object Metadata?
【讨论】:
太棒了——正是我想要的——谢谢!以上是关于使用 lambda 更新 amazon s3 对象元数据而不执行对象复制?的主要内容,如果未能解决你的问题,请参考以下文章
Amazon S3 在另一个账户中触发另一个 Lambda 函数
AWS Lambda 中的 Amazon S3 waitFor()