我需要做的任务是让CDN依赖于S3存储桶.但我们希望使用现有的存储桶而不是创建新的存储桶.
这是我正在尝试的示例代码:
"Parameters" : { "UseExistingBucket" : { "Description" : "Yes/No", "Default" : "yes", "Type" : "String", "AllowedValues" : [ "yes", "no" ] } }, "Conditions" : { "CreateS3Resources" : {"Fn::Equals" : [{"Ref" : "UseExistingBucket"}, "no"]} }, "Resources" : { "StaticBucket" : { "Type" : "AWS::S3::Bucket", "Condition" : "CreateS3Resources", "Properties" : { "BucketName" : { "Fn::Join": [ "-", [ "app", { "Ref": "EnvType" }, "static" ] ] } }, "DeletionPolicy": "Retain" }, "MyStaticDistribution": { "Type": "AWS::CloudFront::Distribution", "Properties": { "DistributionConfig": { "Origins": [ { "DomainName": { "Fn::If" : [ "CreateS3Resources", { "Fn::Join": [ "-", [ "app", { "Ref": "EnvType" }, "static" ] ] }, {"Fn::GetAtt": [ "StaticBucket", "DomainName" ] } ] }, "Id": "S3Origin", } ] } }, "DependsOn": [{ "Fn::If" : [ "CreateS3Resources", { "Fn::Join": [ "-", [ "app", { "Ref": "EnvType" }, "static" ] ] }, "" ] }] } }
如果需要,请向我建议任何更多细节(至少stackoverflow确实需要更多细节,但我没有指定任何:-P)
您可以通过使用Fn:GetAtt
条件包裹来完成此操作Fn:If
.使用Fn:GetAtt意味着依赖关系,因此CloudFormation一旦到达该函数就会自动等待,就像使用DependsOn一样.
例
下面的代码片段通过有条件地检索尚未创建的嵌套堆栈的名称来显示这一点,但只有在条件UseNestedStack设置为true时才会这样做.如果UseNestedStack为false,它将不会等待,而是检索本地变量名称.
{ "Fn::If": ["UseNestedStack", { "Fn::GetAtt": ["NestedStack", "Outputs.Name"] }, { "Ref": "LocalName" }]
我怎么知道这个?(另一个例子)
遗憾的是没有官方文档正式声明这一点,但是AWS告诉我这样做,并且在他们的代码示例中,您可以看到,当订单有问题时,他们使用Fn:GetAtt.我已经尝试了很多次,每次都有效.在一个简单的堆栈上自己尝试一下.以下是我调整并自己使用的AWS lambda示例中的一些伪证明.如果在资源AMI信息之后创建AMI功能,AMI Info需要输出AMI功能,则下面的堆栈可能无法工作,因此AWS已使用Fn:GetAtt将它们链接在一起.要查看此滚动到底部并查看资源AMIInfo,您将看到它通过fn:Gett引用AMIFunction.CloudFormation看到了这一点,然后回到AMIFunction首先创建它.
"AMIInfoFunction": { "DependsOn":"SourceStack", "Type": "AWS::Lambda::Function", "Properties": { "Code": { "S3Bucket": { "Ref": "DeploymentBucket" }, "S3Key": {"Fn::Join": [ "", [ { "Ref": "ApplicationName" }, "/amilookup.zip" ] ]} }, "Handler": "amilookup.handler", "Runtime": "nodejs", "Timeout": "30", "Role": { "Fn::GetAtt" : ["LambdaExecutionRole", "Arn"] }, "VpcConfig": { "SecurityGroupIds": [ {"Ref": "InstanceSecurityGroup"}], "SubnetIds": [ {"Ref":"PrivateSubnetA"},{"Ref":"PrivateSubnetB"} ] } } }, "AMIInfo": { "Type": "Custom::AMIInfo", "Properties": { "ServiceToken": { "Fn::GetAtt" : ["AMIInfoFunction", "Arn"] }, "StackName": { "Ref":"SourceStack" } } }