Nuestro grupo de especialistas despúes de varios días de investigación y recopilación de de datos, hemos dado con los datos necesarios, nuestro deseo es que resulte útil para ti en tu proyecto.
Solución:
Hasta que API Gateway (APIG) admita el almacenamiento en caché perimetral a través de su uso interno de CloudFront (CF), se me ocurrió una solución.
De hecho, puede poner CF dist delante de APIG, el truco es forzar HTTPS solo “Política de protocolo de visor” Y NO reenvíe el encabezado HOST porque APIG necesita SNI.
Configuré mi CF “Configuración de comportamiento de caché predeterminada” para no reenviar ningún encabezado, y forcé la “Política de protocolo del visor” a “Solo HTTPS” y funciona. Espero que esto ayude a otros.
Aquí hay un objeto de recurso de CloudFormation que tiene toda la configuración requerida (Nota: uso la convención
para StackName):
CloudFront:
Type: AWS::CloudFront::Distribution
Properties:
DistributionConfig:
Enabled: true
IPV6Enabled: true
HttpVersion: http2
Comment: !Join [ '--', [!Ref 'AWS::StackName', ' Cloud Front']]
Aliases: [!Ref CloudFrontCname]
ViewerCertificate:
AcmCertificateArn: !Ref AcmCertificateArn
SslSupportMethod: sni-only
MinimumProtocolVersion: TLSv1.1_2016
Origins:
- Id: APIGOrigin
DomainName: !Sub
- $apigId.execute-api.$AWS::Region.amazonaws.com
- apigId: !Ref ApiGatewayLambdaProxy
OriginPath: !Sub
- /$Stage
- Stage: !Select [ "0", !Split [ '--', !Ref 'AWS::StackName' ] ]
CustomOriginConfig:
# HTTPPort: 80
HTTPSPort: 443
OriginProtocolPolicy: https-only
OriginCustomHeaders:
- HeaderName: 'Verify-From-Cf'
HeaderValue: !Ref VerifyFromCfHeaderVal
DefaultCacheBehavior:
AllowedMethods: ["DELETE", "GET", "HEAD", "OPTIONS", "PATCH", "POST", "PUT"]
CachedMethods: ["GET", "HEAD", "OPTIONS"]
ForwardedValues:
Headers:
- Access-Control-Request-Headers
- Access-Control-Request-Method
- Origin
- Authorization
# - Host APIG needs to use SNI
QueryString: true
TargetOriginId: APIGOrigin
ViewerProtocolPolicy: https-only
Compress: true
DefaultTTL: 0
CustomErrorResponses:
- ErrorCachingMinTTL: 0
ErrorCode: 400
- ErrorCachingMinTTL: 1
ErrorCode: 403
- ErrorCachingMinTTL: 5
ErrorCode: 500
DNSARecord:
Type: AWS::Route53::RecordSet
Properties:
Comment: !Ref 'AWS::StackName'
Name: !Ref CloudFrontCname
Type: A
HostedZoneName: !Join ['.', [ !Select [1, !Split ['.', !Ref CloudFrontCname]], !Select [2, !Split ['.', !Ref CloudFrontCname]], '']]
AliasTarget:
HostedZoneId: !Ref Route53HostedZoneId
DNSName: !GetAtt CloudFront.DomainName
DNSAAAARecord:
Type: AWS::Route53::RecordSet
Properties:
Comment: !Ref 'AWS::StackName'
Name: !Ref CloudFrontCname
Type: AAAA
HostedZoneName: !Join ['.', [ !Select [1, !Split ['.', !Ref CloudFrontCname]], !Select [2, !Split ['.', !Ref CloudFrontCname]], '']]
AliasTarget:
HostedZoneId: !Ref Route53HostedZoneId
DNSName: !GetAtt CloudFront.DomainName
Actualizaciones de finales de 2018
- CloudFormation finalmente admite la configuración de protocolo SSL:
MinimumProtocolVersion: TLSv1.1_2016
- He integrado esta (y muchas otras) mejores prácticas en un proyecto de OSS: aws-blueprint
Agregando a respuestas anteriores:
es importante que el patrón de la ruta de comportamiento sea en realidad algo que coincida con la ruta “real”.
Si el punto final de la API es
Y el dominio de origen + la ruta es
Patrón de ruta de comportamiento tiene que sermy-api
, my-api/*
, my-api/something
, etc
No sé por qué, pero pensé que ese patrón de ruta se puede usar como alias, por ejemplo:
https://www.example.com/random-name (patrón de ruta random-name
) se resuelve en dominio + ruta establecida en origen, p. ej.
.
Ese no es el caso.
Si API Gateway devuelve un error 403 con:
El encabezado de autorización requiere el parámetro ‘Credencial’. El encabezado de autorización requiere el parámetro ‘Firma’. El encabezado de autorización requiere el parámetro ‘SignedHeaders’. El encabezado de autorización requiere la existencia de un encabezado ‘X-Amz-Date’ o ‘Date’.
también puede ser que el punto final de origen sea incorrecto. “API Gateway trata todos los errores de rutas inexistentes como 403 errores de permiso denegado en lugar de un error 404 no encontrado “(consulte este hilo de soporte).
Recibí este error y asumí que estaba reenviando incorrectamente el encabezado de Autorización, pero simplemente había configurado mal la ruta de origen.
Te invitamos a añadir valor a nuestro contenido informacional colaborando tu experiencia en las crónicas.