【发布时间】:2020-06-23 14:02:57
【问题描述】:
我正在使用各种 AWS 组件以及一些自定义函数创建一个新堆栈。我的堆栈定义了一个AWS::CloudFront::Distribution 分发,当sam deploy 命令运行时要创建。我想获取发行版的域名并将其用作我的两个函数的环境变量。在此处阅读文档
声明应该能够通过这样做来使用分发的域名:
!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