Попытка переместить все файлы из одного сегмента S3 в другой, используя node.js и exec + aws cli - PullRequest
0 голосов
/ 05 июня 2019

Я не сильный кодер, но пытаюсь создать функцию Lambda, используя node.js , который запускается через Lambda cron один раз в день, чтобы перемещать файлы из корзины S3 в «архивную» корзину.

Пробовал разные методы

sudo nodejs -e "console.log(require('./index').handler({}));"

Мой вывод с локальной машины:

Running MyApp
Source mybucket
Target mybucket-archive
Account test
undefined

Вот мой код:

var aws = require('./node_modules/aws-sdk');
var s3 = new aws.S3();

console.log('Running myapp');
console.log(JSON.stringify(context.invokedFunctionArn).split(':')[4]);
var AccountNumber = (JSON.stringify(context.invokedFunctionArn).split(':')[4]);
if(AccountNumber == '123456789000') { SourceBucket = 'mybucket-test'; }     //test account
if(AccountNumber == '198765432101') { SourceBucket = 'mybucket-prod'; }  //prod account

var targetBucket = SourceBucket+"-archive"       

//Debug?
console.log("Source", SourceBucket);
console.log("Target", targetBucket);
console.log("Account", AccountNumber);

exports.handler = function () {  
//  var exec = require('child_process').exec;
    const exec = require('child_process').exec;
    exec("aws s3 mv s3://", +SourceBucket+ "/incoming/test/ s3://" +targetBucket+ "/incoming/test/ --recursive"), (err, stdout, stderr) => {
    //exec(echo 'hello world'), (err, stdout, stderr) => {
      if (err) {
        // node couldn't execute the command
        console.log(err);
        return;
      }

      // the *entire* stdout and stderr (buffered)
      console.log(`stdout: ${stdout}`);
      console.log(`stderr: ${stderr}`);
      }
    };

Я ожидаю, что вызывается aws cli и перемещает файлы из основного сегмента в архивный.

Мы ожидаем, что в день будет загружаться только 10-20 небольших текстовых файлов размером 1 КБ, поэтому мы ожидаем, что это должно выполняться в соответствии с требованиями Lambda. Это должно выполняться через лямбда-крон, так как события s3 используются в других лямбдах.

1 Ответ

0 голосов
/ 05 июня 2019

Для перемещения файлов из одной корзины s3 в другую мы можем использовать aws-sdk, который является SDK Javascript. Рекомендации: https://aws.amazon.com/sdk-for-node-js/ https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html

const AWS = require('aws-sdk');


const s3 = new AWS.S3({
  // Input the region that you are using here.
  region: 'eu-west-1',
});

exports.handler = async (event, context) {
  const sourceBucket = 'bucket-1';
  const destinationBucket = 'bucket-2';
  const files = await s3
    .listObjects({
      Bucket: sourceBucket,
    })
    .promise();

  return Promise.all(
    files.Contents.map(async content => {
      await s3
        .copyObject({
          Bucket: destinationBucket,
          CopySource: `/${sourceBucket}/${content.Key}`,
          Key: content.Key,
        })
        .promise();

      return s3
        .deleteObject({
          Bucket: sourceBucket,
          Key: content.Key,
        })
        .promise();
    })
  );
}

Вы также можете сделать это, используя aws cli и child process. Ошибка в вашем коде в том, что у вас есть «,» перед SourceBucket, когда вы пытаетесь добавить команду. :-) Так что команда никогда не выполнялась.

async function handler(event, context) {
  const SourceBucket = 'bucket-1';
  const targetBucket = 'bucket-2';
  const exec = require('child_process').exec;
  console.log(
    'aws s3 mv s3://'
    +SourceBucket +
      '/ s3://' +
      targetBucket +
      '/ --recursive'
  );
  exec(
    'aws s3 mv s3://'
    +SourceBucket +
      '/ s3://' +
      targetBucket +
      '/ --recursive'
  ),
    (err, stdout, stderr) => {
      //exec(echo 'hello world'), (err, stdout, stderr) => {
      if (err) {
        // node couldn't execute the command
        console.log(err);
        return;
      }

      // the *entire* stdout and stderr (buffered)
      console.log(`stdout: ${stdout}`);
      console.log(`stderr: ${stderr}`);
    };
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...