CloudFormation 资源创建(如果不存在)
Posted
技术标签:
【中文标题】CloudFormation 资源创建(如果不存在)【英文标题】:CloudFormation Resource Creation if not exist 【发布时间】:2019-07-26 14:58:31 【问题描述】:我想使用 CloudFormation 创建 Route53 HostedZone,因此我想检查 Route53 中有关 HostedZone 的一些信息是否存在。
在我的案例逻辑中,我需要检查资源是否存在,忽略资源创建。我该如何处理这个问题。
我的 CloudFormation 模板如下所示。
"myDNSRecord" :
"Type" : "AWS::Route53::RecordSet",
"Properties" :
"HostedZoneName" : "Ref" : "HostedZoneResource" ,
"Comment" : "DNS name for my instance.",
"Name" :
"Fn::Join" : [ "", [
"Ref" : "Ec2Instance", ".",
"Ref" : "AWS::Region", ".",
"Ref" : "HostedZone" ,"."
] ]
,
"Type" : "A",
"TTL" : "900",
"ResourceRecords" : [
"Fn::GetAtt" : [ "Ec2Instance", "PublicIp" ]
]
【问题讨论】:
【参考方案1】:这并不完全是您需要的答案。但总的来说,您可以为此使用Conditions
。在您的模板中,您在Conditions
部分定义您的条件并使用它有条件地创建资源。例如
Parameters:
EnvironmentSize:
Type: String
Default: Micro
AllowedValues:
- Micro
- Small
- Medium
- AuroraCluster
Conditions:
isntAuroraCluster:
!Not [!Equals [!Ref EnvironmentSize, "AuroraCluster"]]
DBInstance:
Type: AWS::RDS::DBInstance
Condition: isntAuroraCluster
Properties:
DBInstanceClass: !FindInMap [InstanceSize, !Ref EnvironmentSize, DB]
<Rest of properties>
这里我的RDS DBinstance
仅在我的environment size
不是AuroraCluster
时创建。
如果您没有找到更好的解决方案,您可以将其作为用户输入(无论是否创建记录集)并将其用作创建资源的条件。希望对您有所帮助。
【讨论】:
在我的情况下,我可能会从用户那里获得有关资源创建的参数。【参考方案2】:执行此操作的最佳方法是执行以下操作:
-
创建支持 lambda 的自定义资源
使用 lambda 检查您的资源是否存在,具体取决于返回的标识符
使用cloudformation条件检查返回的标识符的值,然后相应地创建或不创建资源。
您可以使用 !GetAtt 获取自定义资源的返回值
有关自定义资源的更多信息,请访问 AWS 网站:
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cfn-customresource.html【讨论】:
你在这方面取得过成功吗?据我所知,您不能像您建议的那样在模板的条件块中引用资源。 @ScottieMc 我不认为他在暗示,但我可能是错的。我对类似的东西也有类似的需求...我有一个带有 apistage 的 apigw2 模板,我希望该阶段始终构建,但仅适用于具有单个名称的单个 api。【参考方案3】:您可以尝试使用 AWS::NoValue 来编排特定资源的创建
https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/pseudo-parameter-reference.html
以下内容来自 LambdaFunction 的变量创建
Conditions:
IsProd: !Equals [!Ref Env, "production"]
Environment:
Variables:
USER: !If [IsProd, !GetAtt ...., Ref: AWS::NoValue]
【讨论】:
以上是关于CloudFormation 资源创建(如果不存在)的主要内容,如果未能解决你的问题,请参考以下文章