gpt4 book ai didi

amazon-web-services - CloudFormation,在 DependsOn 上应用条件

转载 作者:行者123 更新时间:2023-12-03 14:14:58 24 4
gpt4 key购买 nike

我需要做的任务是让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:If 中的 Fn:GetAtt 来实现此目的。 使用 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 info 之后创建的,则下面的堆栈可能无法工作,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" }
}
}

更新:现在已将其记录在相关堆栈的文档中 (Fn::GetAtt)。感谢 idoimaging 在评论中指出这一点。 https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-attribute-dependson.html

关于amazon-web-services - CloudFormation,在 DependsOn 上应用条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34607476/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com