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 资源创建(如果不存在)的主要内容,如果未能解决你的问题,请参考以下文章

VPC 内部的 CloudFormation?

在 CloudFormation 模板中否定条件

无法创建 CloudFormation 堆栈 [关闭]

具有多种资源的 Cloudformation 模板

cloudformation 未创建某些资源

创建没有资源的 CloudFormation 堆栈