【问题标题】:AWS Lamdbas use CloudFront distribution domain as environment variableAWS Lamdbas 使用 CloudFront 分配域作为环境变量
【发布时间】:2020-06-23 14:02:57
【问题描述】:

我正在使用各种 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

问题是我仍然无法检索域名,将其用作环境变量。我尝试了其他几种替代方法(例如使用!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

【问题讨论】:

  • 这是两个不同的 CF 堆栈吗?您不能使用逻辑资源引用来引用另一个堆栈中的一个资源。您可以使用跨堆栈引用 - 从第一个堆栈(Outputs)输出分发名称并将其导入第二个堆栈(!ImportValue)。
  • 你可以像- DomainName: !Select [2, !Split ["/", !GetAtt S3Bucket.WebsiteURL]]这样获取域名。当使用!GetAtt S3Bucket.WebsiteURL] 进行调用时,S3 存储桶会返回一个 URL,因此需要通过拆分 URL 来删除 https:// 前缀。您可以使用Value: !GetAtt [AssetIQDistribution, DomainName] 输出CloudFront 域名。
  • @jarmod 不同的 CF 堆栈是什么意思?
  • 这是全部在一个 CloudFormation 堆栈中,还是在一个堆栈中创建 CloudFront 资源,然后在第二个堆栈中创建剩余资源。

标签: amazon-web-services aws-lambda amazon-cloudfront


【解决方案1】:

关闭此问题,因为问题已解决。结果 SAM 模板配置是正确的,但我使用错误的键引用系统环境变量,导致返回值为空。

在代码级别更正该问题解决了问题,并且似乎以我最初的方式引用域名非常有效。

【讨论】:

    猜你喜欢
    • 2016-11-03
    • 1970-01-01
    • 2021-11-12
    • 1970-01-01
    • 2015-04-30
    • 2015-04-15
    • 1970-01-01
    • 2021-10-22
    • 2019-08-17
    相关资源
    最近更新 更多