Прокси-сервер AWS ApiGateway для непубличного S3 Bucket - PullRequest
0 голосов
/ 17 сентября 2018

Следующий скрипт облачной информации устанавливает метод шлюза 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/*'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...