我希望从我们的S3存储桶中的所有对象中删除特定的用户定义的元数据,以消除数据重复,因为我们将元数据存储在外部.考虑到大量的对象,手动更新每个对象都是不可行的.我知道,在S3中修改对象的元数据会导致使用更新的元数据创建对象的新副本,以及新的"最后修改"日期,我对此行为很满意.

考虑到我们S3使用的规模,手动更新每个对象不是一种实用的方法.因此,我正在寻找一种使用AWS CLI自动执行此过程的方法.主要目标是:

  1. 遍历指定S3存储桶中的每个对象.
  2. 从这些对象中删除指定的用户定义的元数据,而不更改对象数据本身.
  3. 除了对元数据和"上次修改"日期进行必要的更新外,确保该过程保持原始对象的完整性.

我正在寻找有关如何构建AWS CLI命令或脚本的指导,这些命令或脚本能够高效地实现这一点,并将中断降至最低.此外,对S3中管理大规模元数据更新的最佳实践的任何见解都将非常有价值.

谢谢.

资料来源:

Editing object metadata in the Amazon S3

Working with Object Metadata: AWS S3

推荐答案

感谢@约翰·罗滕斯坦.在AWS cli命令的基础上,这就是我如何能够迭代存储桶中的所有对象并删除其用户定义的元数据的方法.

如果您希望在不完全删除的情况下对存储桶中所有对象的元数据进行更改,除了需要添加要添加到元数据中的键-值对外,这种方法仍然可以使用.请注意,它会创建对象的新副本,这意味着它只保留您在命令中添加的元数据,其余所有内容都将被删除.

    #!/bin/bash

    SOURCE_BUCKET="source bucket"
    DEST_BUCKET="dest_bucket"
    KMS_KEY_ID="kms_key_id"

    # Fetch object keys, replace tabs with newlines, and process each key for copying
    aws s3api list-objects --bucket "$SOURCE_BUCKET" --query 'Contents[].Key' --output text | tr '\t' '\n' | while read -r OBJECT_KEY
    do
      echo "Processing ${OBJECT_KEY}..."
  
      aws s3api copy-object \
    --copy-source "${SOURCE_BUCKET}/${OBJECT_KEY}" \
    --key "${OBJECT_KEY}" \
    --bucket "$DEST_BUCKET" \
    --metadata-directive REPLACE \
    --ssekms-key-id "$KMS_KEY_ID" \
    --server-side-encryption "aws:kms"
  
      if [ $? -eq 0 ]; then
        echo "Successfully copied ${OBJECT_KEY}."
      else
        echo "Error copying ${OBJECT_KEY}."
      fi
    done

Java相关问答推荐

Gmail Javi API批量处理太多请求

Annotation @ Memphier无法正常工作,并表示:class需要一个bean,但找到了2个bean:

解析Javadoc时链接的全限定类名

使用GridBagLayout正确渲染

暂停计时器

如何让DTO接受空字符串字段,但如果它们不为空,则应用JPA验证?

在Spring Boot中使用哪个Java类来存储创建时间戳?

S,要对Java复制构造函数深度克隆所有属性进行单元测试,最可靠的方法是什么?

没有使用Lombok生成的参数

如何在太阳系模拟器中添加月球?

如何使用Criteria Builder处理一对多关系中的空值?

如何在@CsvSource中传递空格作为值

FETCH类型设置为LAZY,但它仍会发送第二个请求

为什么创建Java动态代理需要接口参数

我该如何为我的类编写getter和setter方法?

Java List有一个在一个位置添加多个元素的方法,但我找不到一个在一个位置删除多个元素的方法

根据应用程序 Select 的语言检索数据

使用@ExceptionHandler的GlobalExceptionHandler还是来自服务器的REST应答的ResponseEntity?

获取401未经授权,即使在标头中设置了浏览器名称和cookie

在java中使用SevenZip.openArchive方法后无法删除文件