AWS Lamdbas использует домен распределения CloudFront в качестве переменной среды - PullRequest
2 голосов
/ 11 марта 2020

Я создаю новый стек, используя различные компоненты AWS, а также несколько пользовательских функций. Мой стек определяет распределение AWS::CloudFront::Distribution, которое будет создано при запуске команды sam deploy. Я хотел бы получить доменное имя дистрибутива и использовать его в качестве переменной среды для двух моих функций. Читая документацию здесь

https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cloudfront-distribution.html

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

!GetAtt <logical_id>.DomainName

Таким образом, мы пошли дальше и сделали это в одной из моих функций:

 RenameAsset:
    Type: 'AWS::Serverless::Function'
    Properties:
      CodeUri: 'rename-asset/build/distributions/rename-asset-1.0.0-SNAPSHOT.zip'
      Handler: 'fts.assetiq.renamer.AssetRenamer::handleRequest'
      Role: !GetAtt LambdaExecutionRole.Arn
      Environment:
        Variables:
          PUBLIC_CDN_NAME: !GetAtt AssetIQDistribution.DomainName
      Events:
        RenameAssetEvent:
          Type: Api
          Properties:
            RestApiId: !Ref AssetIQApi
            Path: '/assetiq/assets'
            Method: put

Проблема в том, что я все еще не могу получить имя домена, использую его как env var. Я пробовал несколько других альтернатив (например, использование !Sub вместо !GetAtt), но, похоже, ничего не работает. Может кто-нибудь пролить некоторый свет на это. Для справки моя конфигурация дистрибутива следующая:

  CloudFrontOriginAccessIdentity:
    Type: 'AWS::CloudFront::CloudFrontOriginAccessIdentity'
    Properties:
      CloudFrontOriginAccessIdentityConfig:
        Comment: 'Asset-IQ Origin Identity'

  AssetIQDistribution:
    Type: AWS::CloudFront::Distribution
    Properties:
      DistributionConfig:
        Origins:
          - DomainName: !GetAtt S3Bucket.DomainName
            Id: !Sub S3-assetiq-${ApplicationStage}
            S3OriginConfig:
              OriginAccessIdentity:
                Fn::Sub: 'origin-access-identity/cloudfront/${CloudFrontOriginAccessIdentity}'
        Enabled: 'true'
        Comment: "asset iq cloudfront distribution"
        Logging:
          IncludeCookies: 'false'
          Bucket: assetiq-logs.s3.amazonaws.com
          Prefix: assetiq-logs_
        DefaultCacheBehavior:
          Compress: 'true'
          AllowedMethods:
            - GET
            - HEAD
            - OPTIONS
          TargetOriginId: !Sub S3-assetiq-${ApplicationStage}
          ForwardedValues:
            QueryString: 'false'
          ViewerProtocolPolicy: redirect-to-https
        PriceClass: PriceClass_100
        ViewerCertificate:
          CloudFrontDefaultCertificate: 'true'
        IPV6Enabled: false

1 Ответ

0 голосов
/ 13 марта 2020

Закрытие вопроса, поскольку проблема была решена. Оказывается, конфигурация шаблона SAM была правильной, но я ссылался на системную переменную среды с неверным ключом, в результате чего возвращалось нулевое значение.

Исправление этого на уровне кода решило проблему, и, похоже, обращение к имени домена способ, которым я делал изначально, работает довольно хорошо.

...