代码之家  ›  专栏  ›  技术社区  ›  akourt

AWS Lamdbas使用CloudFront分布域作为环境变量

  •  0
  • akourt  · 技术社区  · 5 年前

    我正在使用各种AWS组件以及一些自定义函数创建一个新的堆栈。我的堆栈定义了 AWS::CloudFront::Distribution 发布时要创建的分发 sam 部署命令运行。我想得到发行版的域名,并使用它作为我的两个函数的环境变量。在这里阅读文档

    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
    

    问题是,我仍然无法检索域名使用它作为一个环境变量 !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
    
    0 回复  |  直到 5 年前
        1
  •  0
  •   akourt    5 年前

    结束这个问题,因为问题已经解决了。原来SAM模板配置是正确的,但我引用的系统环境变量的键错误,导致返回值为空。

    在代码级别纠正这个错误解决了这个问题,并且看起来像我最初使用的方式引用域名一样工作得很好。