#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:
Лучший способ сделать это — выполнить следующее:
- Создайте пользовательский ресурс с поддержкой lambda
- Проверьте с помощью lambda, существует ли ваш ресурс или нет, в зависимости от того, возвращает ли он идентификатор
- Используйте условия 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]