Как правильно настроить роль выполнения IAM и политику сегмента для получения лямбда-записи в открытый сегмент чтения S3? - PullRequest
1 голос
/ 11 мая 2019

Для контекста я использую безсерверный фреймворк, поэтому происходит несколько вещей:

  • Роль создается с некоторыми прикрепленными политиками, и лямбда-функция получает ее как роль выполнения. Политики S3 (список более важных):
    • ListBucket в корзину ARN в качестве ресурса
    • GetObject, PutObject DeleteObjet в ARN корзины как ресурс с префиксом /*
  • Я создаю корзину, используя синтаксис ресурсов Cloudformation, и устанавливаю общедоступную политику чтения, чтобы использовать ее в качестве статического хоста веб-сайта.
  • Я также включаю другой оператор политики в политику сегмента S3, где я назначаю операции записи и устанавливаю роль выполнения ARN в качестве принципала.

Я получил следующий iamRoleStatements раздел:

- Effect: "Allow"
  Action:
    - "s3:ListBucket"
  Resource:
    - Fn::Join:
        - ""
        - - "arn:aws:s3:::"
          - Ref: StaticSiteBucket
- Effect: "Allow"
  Action:
    - "s3:GetObject"
    - "s3:PutObject"
    - "s3:DeleteObject"
    - "s3:GetObjectVersionTagging"
    - "s3:PutObjectVersionTagging"
  Resource:
    - Fn::Join:
        - ""
        - - "arn:aws:s3:::"
          - Ref: StaticSiteBucket
          - "/*"

Я действительно могу подтвердить, что он создает следующую политику для сгенерированной роли:

        {
            "Action": [
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::bucket-name-here"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject",
                "s3:GetObjectVersionTagging",
                "s3:PutObjectVersionTagging"
            ],
            "Resource": [
                "arn:aws:s3:::bucket-name-here/*"
            ],
            "Effect": "Allow"
        }

Имея это, я запустил лямбда-функцию для выполнения putObject над этим бакетом. Получив 'Access denied error', я подумал , что если самому ведру нужно разрешить запись , поэтому я включил оператор write в политику ведра:

StaticSiteBucket:
  Type: AWS::S3::Bucket
  Properties:
    AccessControl: PublicRead
    BucketName: ${self:service}-static-site-${self:provider.stage}
    WebsiteConfiguration:
      IndexDocument: index.html
StaticSiteBucketPolicy:
  Type: AWS::S3::BucketPolicy
  Properties:
    Bucket:
      Ref: StaticSiteBucket
    PolicyDocument:
      Statement:
        - Sid: PublicReadGetObject
          Effect: Allow
          Principal: "*"
          Action:
          - s3:GetObject
          Resource:
            Fn::Join: [
              "", [
                "arn:aws:s3:::",
                {
                  "Ref": "StaticSiteBucket"
                },
                "/*"
              ]
            ]
        - Sid: AllowLambdaRoleWrite
          Effect: Allow
          Action:
            - "s3:GetObject"
            - "s3:PutObject"
            - "s3:DeleteObject"
            - "s3:GetObjectVersionTagging"
            - "s3:PutObjectVersionTagging"
          Principal:
            AWS:
              - Fn::GetAtt: [ IamRoleLambdaExecution, Arn ]
          Resource:
            Fn::Join:
              - ""
              - - "arn:aws:s3:::"
                - Ref: StaticSiteBucket
                - "/*"

, которая генерирует следующую политику в сегменте S3:

{
    "Version": "2008-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::bucket-name-here/*"
        },
        {
            "Sid": "AllowLambdaRoleWrite",
            "Effect": "Allow",
            "Principal": {
                "AWS": "<role-arn>"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject",
                "s3:GetObjectVersionTagging",
                "s3:PutObjectVersionTagging"
            ],
            "Resource": "arn:aws:s3:::bucket-name-here/*"
        }
    ]
}

Итак, в нескольких словах я попытался:

  • Разрешение роли иметь права на запись, не повезло
  • Прикрепление разрешений на запись к этой роли из политики корзины, не повезло

Чего мне не хватает?

Ответы [ 2 ]

1 голос
/ 11 мая 2019

Некоторые идеи для рассмотрения:

  1. Принципал (lambda.amazonaws.com) в политике не требуется. Участник уже появляется в роли, которую создает безсерверный (по крайней мере по умолчанию). Скорее всего, теперь это работает, потому что вы дали ему все разрешения.
  2. Вам может понадобиться ListBucket. Не потому, что это строго необходимо, а потому, что это может маскировать другую проблему. Смотрите это отличный ответ . На самом деле, когда вы помещаете имя сегмента без звездочки в разделе ресурсов, вероятно, из-за этого.
  3. Файл маленький? Для больших файлов вы, возможно, запускаете multipart, и для этого также требуются другие разрешения пут.
  4. Вы помечаете или ставите дополнительные права доступа ACL или владельца? Это также требует дополнительных разрешений.
0 голосов
/ 12 мая 2019

Так что в моем случае, чего мне не хватало:

  • Я должен был включить getObjectTagging и putObjectTagging действия.

Для любого спохожая проблема.Прочитайте это ниже!

Извлечение уроков (я буквально потратил на это полтора дня) и осознаю, что Stackoverflow - хранилище опыта и знаний.

I 'd укажите:

  • Определите, какие операции API выполняет ваш код, а затем перейдите к документации и проверьте его.Некоторые операции воздействуют на сегменты , а другие - на объекты
  • В моем случае я мог бы отбросить любые дополнительные операторы политики в сегменте, другими словами,
  • роль выполнения - та, которая получает все необходимые полномочия.
  • Я не смог бы этого добиться, но если бы был способ получить более явный журнал ошибок, по крайней мере, в библиотеке узла aws-sdk, сэкономит кучу времени.Stacktrace было недостаточно.Предложения приветствуются.

Вот как выглядит объявление ресурса StaticSiteBucket:

- Effect: "Allow"
  Action:
    - "s3:ListBucket"
  Resource:
    - Fn::Join:
        - ""
        - - "arn:aws:s3:::"
          - Ref: StaticSiteBucket
- Effect: "Allow"
  Action:
    - "s3:GetObject"
    - "s3:PutObject"
    - "s3:DeleteObject"
    - "s3:GetObjectTagging"
    - "s3:PutObjectTagging"
  Resource:
    - Fn::Join:
        - ""
        - - "arn:aws:s3:::"
          - Ref: StaticSiteBucket
          - "/*"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...