【问题标题】:CloudFormation Resource Creation if not existCloudFormation 资源创建(如果不存在)
【发布时间】: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" ] }
    ]
  }
}

【问题讨论】:

    标签: amazon-web-services amazon-cloudformation devops infrastructure-as-code


    【解决方案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】:

    执行此操作的最佳方法是执行以下操作:

    1. 创建支持 lambda 的自定义资源
    2. 使用 lambda 检查您的资源是否存在,具体取决于返回的标识符
    3. 使用cloudformation条件检查返回的标识符的值,然后相应地创建或不创建资源。

    您可以使用 !GetAtt 获取自定义资源的返回值

    有关自定义资源的更多信息,请访问 AWS 网站:

    【讨论】:

    • 你在这方面取得过成功吗?据我所知,您不能像您建议的那样在模板的条件块中引用资源。
    • @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]
    

    【讨论】:

      猜你喜欢
      • 2017-12-22
      • 2018-02-20
      • 1970-01-01
      • 2021-04-05
      • 2021-02-12
      • 2017-06-12
      • 1970-01-01
      • 2020-09-30
      • 2018-04-16
      相关资源
      最近更新 更多