Переопределение конфигурации AWS S3 putBucketLifecycleConfiguration

#amazon-s3 #aws-lambda

#amazon-s3 #aws-lambda

Вопрос:

Пожалуйста, примите во внимание следующее:

 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 , но вместо этого существует только одно правило для последнего элемента в массиве.

Кто-нибудь может объяснить почему? Идентификатор отличается для каждой итерации.

Ответ №1:

Это потому, что 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> управление) управление жизненным циклом

Комментарии:

1. Спасибо, это идеальный ответ! Я думал, что каждая конфигурация жизненного цикла может иметь несколько правил.