首页 > 解决方案 > AWS S3 putBucketLifecycleConfiguration overwiting

问题描述

请考虑以下几点:

const prefixes = ['prefix1', 'prefix2']
for (let documentPrefix of prefixes) {
    const params = {
        Bucket: process.env.DOCUMENT_BUCKET,
        LifecycleConfiguration: {
          Rules: [
            {
              Expiration: { Days: process.env.NUMBER_OF_DAYS },
              ID: documentPrefix,
              Status: 'Enabled',
              Filter: {
                Prefix: `${documentPrefix}/`,
              },
              NoncurrentVersionExpiration: {
                NoncurrentDays: process.env.NUMBER_OF_DAYS,
              },
            },
          ],
        },
      };

      console.log(`Creating lifecycle rule with params: ${JSON.stringify(params)}`);
      await s3.putBucketLifecycleConfiguration(params).promise();
}

我希望我的存储桶中的每个项目都有一个生命周期规则,prefixes但数组中的最后一个项目只有一个规则。

谁能解释为什么?每次迭代的 ID 都不同。

标签: amazon-s3aws-lambda

解决方案


这是因为putBucketLifecycleConfiguration是一个 PUT 操作,它通过创建新配置来覆盖以前的生命周期设置。

所以解决方法是一次发送所有需要的规则

const AWS = require('aws-sdk');
const s3 = new AWS.S3();
    
const prefixes = ['prefix1', 'prefix2'];
    
const rules = prefixes.map(documentPrefix => {
    return {
        Expiration: { Days: process.env.NUMBER_OF_DAYS },
        ID: documentPrefix,
        Status: 'Enabled',
        Filter: {
            Prefix: `${documentPrefix}`,
        },
        NoncurrentVersionExpiration: {
            NoncurrentDays: process.env.NUMBER_OF_DAYS,
        }
     }
});
    
async function run() {
    const params = {
        Bucket: process.env.DOCUMENT_BUCKET,
        LifecycleConfiguration: {
            Rules: rules
        },
    };
    console.log(`Creating lifecycle rule with params: ${JSON.stringify(params)}`);
    await s3.putBucketLifecycleConfiguration(params).promise();
}

run();

结果,最终应用了两条规则(s3 bucket > management)生命周期管理


推荐阅读