#amazon-web-services #amazon-ec2 #amazon-cloudformation
#amazon-web-services #amazon-ec2 #aws-cloudformation
Вопрос:
У меня довольно неприятная проблема, которую я не могу решить, и я сделаю все возможное, чтобы объяснить.
Работает следующий сокращенный пример, в котором я могу ссылаться на параметр и назначать группы безопасности своему экземпляру с помощью свойства SecurityGroupIds:
"Parameters" : {
"pDefaultSg" : {
"Description" : "AWS2 VPC default security groups",
"Type" : "List<AWS::EC2::SecurityGroup::Id>",
"Default" : "sg-245xxxxx,sg-275xxxxx,sg-235xxxxx"
}
}
"Resources" : {
"ec2Instance" : {
"Type" : "AWS::EC2::Instance",
"Properties" : {
"SecurityGroupIds" : { "Ref" : "pDefaultSg" }
}
}
Проблема возникает, когда я также хочу добавить второе значение к свойству SecurityGroupIds, ссылающемуся на ресурс группы безопасности, созданный в том же шаблоне:
"Resources" : {
"ec2Instance" : { ...
"SecurityGroupIds" : [ { "Ref" : "pDefaultSg" }, { "Fn::GetAtt" : "sgDb", "GroupId" } ],
....
"sgDb" : {
"Type" : "AWS::EC2::SecurityGroup",
"Properties" : { ...
Затем я не могу избежать следующей ошибки, вызывающей откат стека Cloudformation:
Значение свойства SecurityGroupIds должно иметь тип Список строк
Я был бы очень признателен за любые указания.
Большое спасибо
Ответ №1:
Проблема в том, что при pDefaultSg
доступе через Ref
встроенную функцию она возвращает список, поэтому ваше SecurityGroupIds
свойство выглядит так
[["sg-245xxxxx","sg-275xxxxx","sg-235xxxxx"],"sg-1234DB"]
Решение состоит в том, чтобы изменить ваше SecurityGroupIds
свойство Fn::Join
pDefaultSg
списка на строку, разделенную запятыми, за которой следует sgDb
:
"SecurityGroupIds": [
{"Fn::Join":
[",",
{"Ref": "pDefaultSg"}
]
},
{ "Fn::GetAtt" : ["sgDb", "GroupId"] }
]
Комментарии:
1. Большое спасибо и очень похоже на то, чего я пытался достичь, хотя теперь я получаю «Параметр groupName не может использоваться с параметром subnet». Не существует простого способа отладки cloudformation, который сделал бы его более увлекательным 🙂 Еще раз спасибо
2. Спасибо, я думаю, это отвечает на ваш первоначальный вопрос;) один из способов помочь в тестировании шаблонов — запустить
aws cloudformation validate-template --template-body file://${file}
Я не уверен, чего вы пытаетесь достичь с помощью приведенной выше ошибки, может быть, вы могли бы опубликовать ее как отдельный вопрос с дополнительной информацией? Спасибо3. Это, безусловно, так, и я ценю вашу помощь, если я не смогу решить последующую проблему, я отправлю другой вопрос. Просто для добавления, validate-template проверяет только JSON, и такие проблемы возникают только при создании экземпляра.