Следующий сценарий облачной информации настраивает метод шлюза 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/*'
Я попробую это и обновлю
@ Майкл-sqlbot. Я добавил попытку сделать то, что вы предложили, но по-прежнему приводит к "Доступ запрещен"
Просто для всех, кто приходит сюда с аналогичной проблемой, другой возможной причиной отказа в доступе является зашифрованный объект в ведре s3 - роль, которую вы предоставляете шлюзу API, должна иметь разрешения на использование KMS и определенный ключ.





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