AWS Лямбда не копирует файлы из одного сегмента s3 в другой в облаке, но в локальном работает - PullRequest
1 голос
/ 10 января 2020

Я хочу использовать лямбда-функцию для копирования содержимого из одного сегмента в другой. Это лямбда, которую я создал:

'use strict';

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

var srcBucket = "bkctFrom";
var destBucket = "bkctTo";

module.exports.hello = async event => {  
  var params = {
    Bucket: srcBucket
   };
   await s3.listObjects(params, function(err, data) {
    if (err){
      console.log(err, err.stack);
    }
    else{
      var cont = data['Contents'];
      var key="";
      for (let [key, value] of Object.entries(cont)) {
        key = value['Key'];
        s3.copyObject({
          CopySource: srcBucket + '/' + key,
          Bucket: destBucket,
          Key: key
        },
        function (copyErr,copyData){
          if(copyErr){console.log(copyErr);}
          else{console.log(copyData);}
        }
        );
      }
    }
  });
};

Эта функция работает хорошо, когда я запускаю локально: sls invoke local -f hello, все содержимое копируется из корзины bkctFrom в bkctTo.

Но когда я внедряю в aws, это не работает. Журнала ошибок нет, получен только результат выполнения.

enter image description here enter image description here

На локальном компьютере вместо null я получаю информацию о файлах, вставленных в корзину.

Это политика, которую я использую для создания роли для этой лямбды:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "ListSourceAndDestinationBuckets",
            "Effect": "Allow",
            "Action": [
                "s3:ListBucket",
                "s3:ListBucketVersions"
            ],
            "Resource": [
                "arn:aws:s3:::bkctFrom",
                "arn:aws:s3:::bkctTo"
            ]
        },
        {
            "Sid": "SourceBucketGetObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": "arn:aws:s3:::bkctFrom/*"
        },
        {
            "Sid": "DestinationBucketPutObjectAccess",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::bkctTo/*"
        }
    ]
}

Я использую без сервера, и это .yml:

service: updaterepobucket
provider:
  name: aws
  runtime: nodejs12.x
  stage: dev
  region: us-west-2


functions:
  hello:
    handler: handler.hello
#    events:
#      - http:
#          path: users/create
#          method: get

Я обновляю роль вручную в консоли aws: enter image description here Здесь у них есть другое имя (только тест).

И даже если я установлю полный доступ к S3, он все равно не будет рабочее: enter image description here

Если это работает из моего локального, но не работает из облака, вывод, что, возможно, есть что-то, связанное с разрешениями. Но я не знаю, чего не хватает в этой политике. Есть предположения?

1 Ответ

0 голосов
/ 10 января 2020

Две вещи:

a. Мне не понятно, как вы ссылаетесь на политику из файла serverless.yml. Я бы порекомендовал вам обратиться к вашей политике, используя раздел iamManagedPolicies (подробнее см. https://serverless.com/framework/docs/providers/aws/guide/iam/)

b. В любом случае, разрешений может быть недостаточно. См. AWS статью «Почему я не могу скопировать объект между двумя корзинами Amazon S3?»: https://aws.amazon.com/premiumsupport/knowledge-center/s3-troubleshoot-copy-between-buckets/

Надеюсь, это поможет

...