You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用JavaScript SDK v3筛选特定存储类的S3存储桶对象?

使用AWS JavaScript SDK v3实现按StorageClass筛选S3对象并批量修改存储类

首先明确:AWS CLI的--query参数是本地客户端层面的筛选,并非通过S3 API请求时直接过滤。S3的ListObjectsV2接口本身不支持在请求阶段按StorageClass筛选对象,所以你直接把筛选条件传给ListObjectsV2Command是无效的,需要在获取到所有对象列表后,在本地进行过滤。

以下是完整实现步骤及代码:

步骤1:获取所有对象并处理分页

S3返回对象列表时可能会分页(当对象数量超过MaxKeys限制时,IsTruncated会为true),需要循环调用直到获取全部对象。

步骤2:按StorageClass筛选对象

用数组的filter方法从返回的对象列表中筛选出符合目标StorageClass的项。

步骤3:批量修改对象存储类

通过复制对象到自身并指定新的StorageClass来修改存储类(这是S3修改对象存储类的标准方式)。

完整代码示例

import { S3Client, ListObjectsV2Command, CopyObjectCommand } from "@aws-sdk/client-s3";

// 初始化S3客户端
const s3Client = new S3Client({ region: "你的区域标识" });
const bucketName = "Your_Bucket";
const targetStorageClass = "GLACIER"; // 要筛选的存储类
const newStorageClass = "REDUCED_REDUNDANCY"; // 要修改为的存储类

// 获取桶内所有对象(自动处理分页)
async function getAllBucketObjects(bucket) {
  let allObjects = [];
  let continuationToken = null;

  do {
    const command = new ListObjectsV2Command({
      Bucket: bucket,
      ContinuationToken: continuationToken
    });

    const response = await s3Client.send(command);
    allObjects = [...allObjects, ...(response.Contents || [])];
    continuationToken = response.NextContinuationToken;
  } while (continuationToken);

  return allObjects;
}

// 核心逻辑:筛选+修改存储类
async function filterAndModifyObjects() {
  // 1. 获取桶内全部对象
  const allObjects = await getAllBucketObjects(bucketName);

  // 2. 按StorageClass筛选目标对象
  const filteredObjects = allObjects.filter(obj => obj.StorageClass === targetStorageClass);
  console.log(`找到${filteredObjects.length}个符合条件的对象`);

  // 3. 批量修改存储类
  for (const obj of filteredObjects) {
    const copyCommand = new CopyObjectCommand({
      Bucket: bucketName,
      Key: obj.Key,
      CopySource: `${bucketName}/${obj.Key}`,
      StorageClass: newStorageClass,
      MetadataDirective: "COPY" // 保留原对象元数据,不需要可改为"REPLACE"
    });

    try {
      await s3Client.send(copyCommand);
      console.log(`已更新对象存储类:${obj.Key}`);
    } catch (err) {
      console.error(`更新对象失败 ${obj.Key}:`, err);
    }
  }
}

// 执行逻辑
filterAndModifyObjects();

关键说明

  • S3的ListObjectsV2接口不支持在请求阶段按StorageClass筛选,CLI的--query是本地客户端过滤,并非API层面的筛选,所以你的初始写法无效。
  • 修改对象存储类需通过CopyObjectCommand实现:将对象复制到自身路径,同时指定新的StorageClass。
  • 设置MetadataDirective: "COPY"可保留原对象的元数据,若需修改元数据可改为"REPLACE"。

内容的提问来源于stack exchange,提问作者rokdd

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.01 13:05:01