Ошибка строки списка параметров, специфичных для AWS, и EC2 SecurityGroupIds

#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, и такие проблемы возникают только при создании экземпляра.