Подтвердить что ты не робот

Как добавить CloudFront перед шлюзом API

API Gateway (APIG), в то время как он использует CloudFront (CF), он не поддерживает кэширование кэша CDN. Когда я настроил дистрибутив CF для использования APIG в качестве настраиваемого источника, я получаю отказ в разрешении.

Как мне настроить CF, чтобы исправить это?

4b9b3361

Ответ 1

Пока API Gateway (APIG) не поддерживает краевое кэширование посредством внутреннего использования CloudFormation (CF), я нашел обходной путь.

Вы действительно можете поставить CF dist перед APIG, трюк в том, чтобы заставить HTTPS только "Политику протокола просмотра" И НЕ пересылать заголовок HOST, потому что APIG нужен SNI.

Я настроил свой CF "Настройки поведения кэша по умолчанию", чтобы не пересылать какие-либо заголовки, и принудительно установил "Политика протокола просмотра" в "Только HTTPS", и это работает. Надеюсь, что это помогает другим.

Вот объект ресурса CloudFormation, который имеет все необходимые настройки (Примечание: я использую соглашение <stage>--<app name> для 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

Конец 2018 обновления

  • Наконец, CloudFormation поддерживает установку протокола SSL: MinimumProtocolVersion: TLSv1.1_2016
  • Я включил эту (и многие другие) лучшие практики в проект OSS: aws-blueprint

Ответ 2

Добавление к предыдущим ответам:

важно, чтобы паттерн поведения на самом деле соответствовал "реальному" пути.


Если конечной точкой API является <id>.execute-api.<region>.amazonaws.com/stage-name/my-api

И <id>.execute-api.<region>.amazonaws.com/stage-name домен + путь - это <id>.execute-api.<region>.amazonaws.com/stage-name

Паттерн поведения должен быть my-api, my-api/*, my-api/something и т.д.


Я не знаю почему, но я думал, что шаблон пути можно использовать в качестве псевдонима, например:

https://www.example.com/random-name (random-name шаблона пути) преобразуется в домен + путь, заданный в источнике, например, <id>.execute-api.<region>.amazonaws.com/stage-name.

Это не тот случай.

Ответ 3

Если API Gateway возвращает ошибку 403 с:

Для заголовка авторизации требуется параметр "Credential". Для заголовка авторизации требуется параметр "Подпись". Для заголовка авторизации требуется параметр SignedHeaders. Заголовок авторизации требует наличия заголовка "X-Amz-Date" или "Date".

также может быть, что конечная точка источника неверна. "API-шлюз обрабатывает все ошибки несуществующих путей как ошибки 403, в которых отказано в разрешении, а не как ошибка 404". (см. эту ветку поддержки).

Я получил эту ошибку и предположил, что неправильно перенаправляю заголовок авторизации, но я просто неправильно настроил исходный путь.

Ответ 4

С запуском региональных конечных точек API Gateway в ноябре 2017 года, я считаю, что теперь оптимально использовать их с облачными дистрибутивами. Некоторые подробные инструкции по переходу с Edge Optimized API на Regional API и настройке дистрибутивов CloudFront приведены здесь:

AWS API Gateway должен предотвращать использование TLS v1