15

我想用 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" ] }
    ]
  }
}
4

3 回答 3

5

这不完全是您需要的答案。但总的来说,您可以使用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>

此处 my RDS DBinstanceis 仅在 my environment sizeis not时创建AuroraCluster

如果您没有找到更好的解决方案,您可以将其作为用户输入(无论是否创建记录集)并将其用作创建资源的条件。希望能帮助到你。

于 2019-03-05T11:52:32.813 回答
2

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

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

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

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

于 2019-03-05T14:44:37.970 回答
0

您可以尝试使用 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]
于 2021-12-21T10:43:03.587 回答