name domain custom cloudfront and amazon-web-services cdn amazon-cloudfront aws-api-gateway

amazon web services - domain - ¿Cómo se agrega CloudFront frente a API Gateway?



api gateway set custom domain name (2)

API Gateway (APIG), mientras usa CloudFront (CF), no admite caché de CDN. Cuando configuré una distribución de CF para utilizar APIG como el origen personalizado, obtengo un error de permiso denegado.

¿Cómo configuro CF para arreglar esto?


Hasta API Gateway (APIG) admite caché de borde mediante su uso interno de CloudFormation (CF), he encontrado una solución alternativa.

De hecho, puede poner CF dist frente a APIG, el truco es forzar HTTPS solo "Política de protocolo de visor" Y no reenviar el encabezado HOST porque APIG necesita SNI.

Configuré mi CF "Configuración predeterminada de comportamiento de caché" para no reenviar encabezados, y forcé "Política de protocolo de visor" a "HTTPS solamente" y funciona. Espero que esto ayude a otros.

Aquí hay un objeto de recurso de CloudFormation que tiene toda la configuración requerida (Nota: utilizo la convención <stage>--<app name> 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 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 :

  1. OriginProtocolPolicy a https-only
  2. ¡Ahora usando YML!
  3. Más ejemplos preparados para la producción (solo SSL, DomainName no codificado, encabezado personalizado para verificar las solicitudes a través de CloudFront, CustomErrorResponses , Edge Gzip, Caching OPTIONS )

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. Curiosamente, "API Gateway trata todos los errores de rutas inexistentes como 403 errores denegados de permiso en lugar de un error 404 no encontrado". (mira este hilo de soporte ).

Obtuve este error y asumí que estaba reenviando incorrectamente el encabezado Authorization, pero simplemente configuré mal la ruta de origen.