В AWS S3 putObjectTagging завершается ошибкой с AccessDenied в лямбда-функции node.js - PullRequest
0 голосов
/ 06 ноября 2018

У меня есть серверное приложение в JS, работающее в AWS lambda на node.js 8.10. Он запускается событиями S3 и создает копию недавно загруженных элементов S3 в другом сегменте с контролем версий. Лямбда-функции предоставляется роль, которая содержит следующие политики:

      {
        "PolicyName" : {"Fn::Join": ["", [{"Ref": "AWS::Region"}, "-", "S3LambdaPolicy"]]},
        "PolicyDocument": {
          "Version" : "2012-10-17",
          "Statement" : [
            {
              "Effect": "Allow",
              "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:GetBucketVersioning",
                "s3:GetObjectTagging",
                "s3:PutObject",
                "s3:PutObjectTagging",
                "s3:ListBucket",
                "s3:ListBucketVersions"
              ],
              "Resource": "arn:aws:s3:::*"
            }
          ]
        }
      }

Функция вызывает эту функцию s3 после копирования элемента в targetBucket (и ожидания его появления):

        let tagging = {
            Bucket: targetBucket,
            Key: targetKey,
            Tagging: {
                TagSet: [
                    {
                        Key: "SourceBucket",
                        Value: sourceBucket,
                    },
                    {
                        Key: "SourceKey",
                        Value: key
                    }
                ]
            }
        };
        if (data.VersionId) {
            tagging.VersionId = data.VersionId;
        }
        s3.putObjectTagging(tagging, function(err, data){
            if (err) {
                console.log(err);
            } else {
                console.log("Set the tagging to " + JSON.stringify(tagging));
            }
        });

Это всегда приводит к ошибке отказа в доступе:

2018-11-06T12: 06: 24.070Z 389637c4-e1bc-11e8-8eec-8b4d06f7596c {AccessDenied: доступ запрещен по запросу.extractError (/var/runtime/node_modules/aws-sdk/lib/services/s3.js : 577: 35) ... сообщение: «Доступ запрещен», код: «AccessDenied», регион: ноль, время: 2018-11-06T12: 06: 24.069Z, requestId: '178F863CC6FB4960', extendedRequestId: 'sYbGkGb + hgOWtWp1XPkqtoVRv2XxAg04axRAUaeF0VtMMzMYYyPMkTrwWpx3xUBF0zalKzIJAI8 =', cfId: не определено, statusCode: 403, повторяемый: ложь, retryDelay: 39.20736560394356}

Я не уверен, что мне здесь не хватает, и был бы признателен за любую помощь с этой проблемой.

Thx,

Stefan

1 Ответ

0 голосов
/ 06 ноября 2018

Сам нашел решение: так как я использую управление версиями, мне также нужно было добавить определенные политики для получения / размещения тегов на объектах с контролем версий. Так что это правило, которое работает для меня:

      {
        "PolicyName" : {"Fn::Join": ["", [{"Ref": "AWS::Region"}, "-", "S3LambdaPolicy"]]},
        "PolicyDocument": {
          "Version" : "2012-10-17",
          "Statement" : [
            {
              "Effect": "Allow",
              "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion",
                "s3:GetBucketVersioning",
                "s3:GetObjectTagging",
                "s3:GetObjectVersionTagging",
                "s3:PutObject",
                "s3:PutObjectTagging",
                "s3:PutObjectVersionTagging",
                "s3:ListBucket",
                "s3:ListBucketVersions"
              ],
              "Resource": "arn:aws:s3:::*"
            }
          ]
        }
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...