使用 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 对象元数据而不执行对象复制?的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda无法删除Amazon S3对象

Amazon S3 在另一个账户中触发另一个 Lambda 函数

AWS Lambda 中的 Amazon S3 waitFor()

我可以更新现有的 Amazon S3 对象标头属性吗?

我是否需要使用随机哈希作为 Amazon S3 存储桶中对象密钥名称的前缀?

我是否需要使用随机哈希作为 Amazon S3 存储桶中对象密钥名称的前缀?