Создание ресурса CloudFormation, если он не существует

#amazon-web-services #amazon-cloudformation #devops #infrastructure-as-code

#amazon-веб-сервисы #aws-cloudformation #devops #инфраструктура как код

Вопрос:

Я хочу создать Route53 HostedZone с CloudFormation, поэтому я хочу проверить, существует ли некоторая информация в 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>
  

Здесь my RDS DBinstance создается только в том случае, если my environment size не AuroraCluster существует.

Если вы не нашли лучшего решения, вы могли бы использовать это как пользовательский ввод (независимо от того, создавать набор записей или нет) и использовать это как условие для создания своего ресурса. Надеюсь, это поможет.

Комментарии:

1. в моем случае, вероятно, я получу параметр о создании ресурса от пользователя.

2. @ColossusMark1 Условие не обязательно должно быть просто переданным параметром. Вы когда-нибудь все это продумали?

Ответ №2:

Лучший способ сделать это — выполнить следующее:

  1. Создайте пользовательский ресурс с поддержкой lambda
  2. Проверьте с помощью lambda, существует ли ваш ресурс или нет, в зависимости от того, возвращает ли он идентификатор
  3. Используйте условия cloudformation для проверки значения возвращаемого идентификатора, а затем соответствующим образом создайте или не создавайте ресурс.

Вы можете получить возвращаемое значение пользовательского ресурса с помощью !GetAtt

Дополнительную информацию о пользовательском ресурсе можно найти на веб-сайтах AWS:

Комментарии:

1. Вам когда-нибудь это удавалось? Насколько я могу судить, вы не можете ссылаться на ресурсы в блоке условий шаблона, как вы предлагаете.

2. @ScottieMc Я вообще не думаю, что он это предлагает, но я могу ошибаться. У меня аналогичная потребность в чем-то подобном… У меня есть шаблон apigw2 с apistage, и я хочу, чтобы этап всегда создавался, но только для одного 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]