Saltar al contenido

¿Cómo se agrega CloudFront frente a API Gateway?

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 .execute-api..amazonaws.com/stage-name/my-api

Y el dominio de origen + la ruta es .execute-api..amazonaws.com/stage-name

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. .execute-api..amazonaws.com/stage-name.

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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *