DependsOn 上的 AWS 云形成条件
AWS Cloud Formation Conditions on DependsOn
我正在编写一个云形成模板,并在我的堆栈中创建一个资源,这取决于环境。
因此,我检查参数(环境)的值,并基于它创建该资源(条件:ISProduction)。
但是,我的问题是,如果创建资源 (MyProductionResource),则另一个资源 (AnotherResource) 会依赖于它并需要使用另一个 (MyProductionResource) 的输出属性。
这里的代码:
Conditions:
ISProduction:
"Fn::Equals":
- !Ref Environment
- production
...
MyProductionResource:
Type: AWS::CloudFormation::Stack
Condition: ISProduction
Properties:
[.. properties..]
AnotherResource:
Type: AWS::CloudFormation::Stack
DependsOn:
- AResource
- MyProductionResource
Properties:
TemplateURL: whatever
Parameters:
AParameter: !GetAtt MyProductionResource.Outputs.SomeString
我的问题是,我希望仅当 ISProduction 为真时,AnotherResource 才依赖于 MyProductionResource。一个想法是在 DependsOn 项中添加某种条件,或任何会带来相同结果的条件。
我如何在 AWS Cloud Formation 上做到这一点?
此外,我不确定在未创建 dependsOn 列表中列出的资源时会发生什么。云形成模板会产生错误吗?我怎样才能让这个属性读取安全 !GetAtt MyProductionResource.Outputs.SomeString ?
你可以使用 !If 作为参数
AParameter: !If [ISProduction, !GetAtt MyProductionResource.Outputs.SomeString, "default value?!?"]
但不幸的是 DependsOn 不允许 Fn::If.
因此您可以创建两次资源。
AnotherProductionResource:
Type: AWS::CloudFormation::Stack
Condition: ISProduction
DependsOn:
- AResource
- MyProductionResource
Properties:
[...]
AnotherNonProductionResource:
Type: AWS::CloudFormation::Stack
Condition: ISNotProduction
DependsOn:
- AResource
Properties:
[...]
但是有这么多的假设有点违背环境应该尽可能相似的想法。那么也许你可以摆脱这整件事?
这是 "DependsOn does not allow Fn::If."
的替代方案
Conditions:
CreateConfigRecorder: !Equals [ !Ref ConfigRecorderExists, 'false' ]
Resource:
#my 1st AWS Resource
ConfigRecorder:
Condition: CreateConfigRecorder
Type: AWS::Config::ConfigurationRecorder
*more codes below*
#added, since DependsOn: !If is not possible, trigger by WaitCondition if CreateConfigRecorder is true
#Hacks: https://garbe.io/blog/2017/07/17/cloudformation-hacks/
ConfigRecorderWaitHandle:
Condition: CreateConfigRecorder
DependsOn: ConfigRecorder
Type: "AWS::CloudFormation::WaitConditionHandle"
#added, since DependsOn: !If is not possible, trigger by WaitCondition if CreateConfigRecorder is false
WaitHandle:
Type: "AWS::CloudFormation::WaitConditionHandle"
#added, since DependsOn: !If is not possible
WaitCondition:
Type: "AWS::CloudFormation::WaitCondition"
Properties:
Handle: !If [CreateConfigRecorder, !Ref ConfigRecorderWaitHandle, !Ref WaitHandle]
Timeout: "1"
Count: 0
#my 2nd AWS Resource that requires DependsOn Attribute
AWSConfigRule:
Type: AWS::Config::ConfigRule
DependsOn: WaitCondition #added, since DependsOn: !If is not possible
*more codes below*
基本上,如果我的第一个资源不存在,我的第二个资源只有 DependsOn 属性,在 运行 CFN 之前。我从:https://garbe.io/blog/2017/07/17/cloudformation-hacks/
我正在编写一个云形成模板,并在我的堆栈中创建一个资源,这取决于环境。
因此,我检查参数(环境)的值,并基于它创建该资源(条件:ISProduction)。
但是,我的问题是,如果创建资源 (MyProductionResource),则另一个资源 (AnotherResource) 会依赖于它并需要使用另一个 (MyProductionResource) 的输出属性。
这里的代码:
Conditions:
ISProduction:
"Fn::Equals":
- !Ref Environment
- production
...
MyProductionResource:
Type: AWS::CloudFormation::Stack
Condition: ISProduction
Properties:
[.. properties..]
AnotherResource:
Type: AWS::CloudFormation::Stack
DependsOn:
- AResource
- MyProductionResource
Properties:
TemplateURL: whatever
Parameters:
AParameter: !GetAtt MyProductionResource.Outputs.SomeString
我的问题是,我希望仅当 ISProduction 为真时,AnotherResource 才依赖于 MyProductionResource。一个想法是在 DependsOn 项中添加某种条件,或任何会带来相同结果的条件。
我如何在 AWS Cloud Formation 上做到这一点?
此外,我不确定在未创建 dependsOn 列表中列出的资源时会发生什么。云形成模板会产生错误吗?我怎样才能让这个属性读取安全 !GetAtt MyProductionResource.Outputs.SomeString ?
你可以使用 !If 作为参数
AParameter: !If [ISProduction, !GetAtt MyProductionResource.Outputs.SomeString, "default value?!?"]
但不幸的是 DependsOn 不允许 Fn::If.
因此您可以创建两次资源。
AnotherProductionResource:
Type: AWS::CloudFormation::Stack
Condition: ISProduction
DependsOn:
- AResource
- MyProductionResource
Properties:
[...]
AnotherNonProductionResource:
Type: AWS::CloudFormation::Stack
Condition: ISNotProduction
DependsOn:
- AResource
Properties:
[...]
但是有这么多的假设有点违背环境应该尽可能相似的想法。那么也许你可以摆脱这整件事?
这是 "DependsOn does not allow Fn::If."
的替代方案Conditions:
CreateConfigRecorder: !Equals [ !Ref ConfigRecorderExists, 'false' ]
Resource:
#my 1st AWS Resource
ConfigRecorder:
Condition: CreateConfigRecorder
Type: AWS::Config::ConfigurationRecorder
*more codes below*
#added, since DependsOn: !If is not possible, trigger by WaitCondition if CreateConfigRecorder is true
#Hacks: https://garbe.io/blog/2017/07/17/cloudformation-hacks/
ConfigRecorderWaitHandle:
Condition: CreateConfigRecorder
DependsOn: ConfigRecorder
Type: "AWS::CloudFormation::WaitConditionHandle"
#added, since DependsOn: !If is not possible, trigger by WaitCondition if CreateConfigRecorder is false
WaitHandle:
Type: "AWS::CloudFormation::WaitConditionHandle"
#added, since DependsOn: !If is not possible
WaitCondition:
Type: "AWS::CloudFormation::WaitCondition"
Properties:
Handle: !If [CreateConfigRecorder, !Ref ConfigRecorderWaitHandle, !Ref WaitHandle]
Timeout: "1"
Count: 0
#my 2nd AWS Resource that requires DependsOn Attribute
AWSConfigRule:
Type: AWS::Config::ConfigRule
DependsOn: WaitCondition #added, since DependsOn: !If is not possible
*more codes below*
基本上,如果我的第一个资源不存在,我的第二个资源只有 DependsOn 属性,在 运行 CFN 之前。我从:https://garbe.io/blog/2017/07/17/cloudformation-hacks/