Прокси-сервер AWS ApiGateway для непубличного сегмента S3

Следующий сценарий облачной информации настраивает метод шлюза Api, который передает данные в корзину S3.

S3BucketPolicy открывает бакет для публичного доступа для чтения, но пользовательский интерфейс AWS предупреждает, что этого никогда не следует делать.

Я попытался настроить S3BucketPolicy Principal для обслуживания apigateway.amazonaws.com, но это привело к отказу в доступе.

1) Как правильно ограничить доступ ведра к функции шлюза API? (Образец YAML был бы отличным)

2) Как я могу отладить этот отказ в доступе, чтобы получить дополнительную информацию о том, почему это не удалось?

3) Где мне искать образец кода того, что должно быть очень стандартным фрагментом шаблона?

ПОПЫТКА №1 - Работает, но только если сделать S3 Bucket общедоступным, в противном случае доступ запрещен

AWSTemplateFormatVersion: 2010-09-09

Parameters:
  S3BucketName:
    Type: String
    Description: >
      Name for the S3 bucket that contains the nested templates.

Resources:
  RestAPI:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      BinaryMediaTypes: 
            - '*/*'
      Name: !Ref 'AWS::StackName'

  RestAPIRootGET:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      AuthorizationType: NONE
      HttpMethod: GET
      Integration:
        IntegrationHttpMethod: GET
        PassthroughBehavior: WHEN_NO_MATCH
        Type: HTTP_PROXY
        Uri: !Sub https://${S3BucketName}.s3.amazonaws.com/static-assets/index.html
      ResourceId: !GetAtt RestAPI.RootResourceId
      RestApiId: !Ref RestAPI
    DependsOn:
      - RestAPI

  BucketPolicy:
    Type: AWS::S3::BucketPolicy
    Properties:
      Bucket: !Ref S3BucketName
      PolicyDocument:
        Version: 2012-10-17
        Statement:
          -
            Sid: GetObject
            Effect: Allow
            Principal: "*"
            Action:
              - s3:*
            Resource:
              - !Sub 'arn:aws:s3:::${S3BucketName}/static-assets/*'

Я думаю, что, возможно, прямо сейчас нужно создать роль с доступом к корзине, а затем позволить ApiGateway взять на себя эту роль, но мне трудно найти документацию, объясняющую, как это сделать в шаблоне облачной информации. (см. также комментарий Майкла - sqlbot, предлагающий использовать свойство credentials метода)

Вот моя попытка, которая все еще терпит неудачу с отказом в доступе

ПОПЫТКА №2 - Доступ запрещен

AWSTemplateFormatVersion: 2010-09-09

Parameters:
  S3BucketName:
    Type: String
    Description: >
      Name for the S3 bucket that contains the nested templates.


Resources:

  RestAPI:
    Type: 'AWS::ApiGateway::RestApi'
    Properties:
      BinaryMediaTypes: 
            - '*/*'
      Name: !Ref 'AWS::StackName'

  RestAPIRootGET:
    Type: 'AWS::ApiGateway::Method'
    Properties:
      AuthorizationType: NONE
      HttpMethod: GET
      Integration:
        IntegrationHttpMethod: GET
        PassthroughBehavior: WHEN_NO_MATCH
        Type: HTTP_PROXY
        Uri: !Sub https://${S3BucketName}.s3.amazonaws.com/static-assets/index.html
        Credentials: !GetAtt AllowStaticAccessRole.Arn
      ResourceId: !GetAtt RestAPI.RootResourceId
      RestApiId: !Ref RestAPI
    DependsOn:
      - RestAPI
      - AllowStaticAccessRole

  AllowStaticAccessRole: 
    Type: "AWS::IAM::Role"
    Properties: 
      AssumeRolePolicyDocument: 
        Version: "2012-10-17"
        Statement: 
          - 
            Effect: "Allow"
            Principal: 
              Service: 
                - "apigateway.amazonaws.com"
            Action: 
              - "sts:AssumeRole"
      Path: "/"
      Policies: 
        - 
          PolicyName: "AllowStaticAccessPolicy"
          PolicyDocument: 
            Version: "2012-10-17"
            Statement: 
              - 
                Effect: "Allow"
                Action:
                  - s3:*
                Resource:
                  - !Sub 'arn:aws:s3:::${S3BucketName}/static-assets/*'

См. Integration->credentials и сравните с credentials. Похоже, это место для ARN роли IAM, которую API-интерфейс должен принять на себя, прежде чем связываться с S3. apigateway.amazonaws.com, вероятно, будет Principal в политике доверия этой роли, а политика роли будет предоставлять разрешения для корзины.

Michael - sqlbot 17.09.2018 14:55

Я попробую это и обновлю

GroovyDotCom 17.09.2018 18:17

@ Майкл-sqlbot. Я добавил попытку сделать то, что вы предложили, но по-прежнему приводит к "Доступ запрещен"

GroovyDotCom 17.09.2018 21:30

Просто для всех, кто приходит сюда с аналогичной проблемой, другой возможной причиной отказа в доступе является зашифрованный объект в ведре s3 - роль, которую вы предоставляете шлюзу API, должна иметь разрешения на использование KMS и определенный ключ.

stripybadger 14.05.2020 10:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
940
0

Другие вопросы по теме