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