Динамически применять теги к стекам AWS CloudFormation - PullRequest
0 голосов
/ 28 октября 2019

Я искал способ динамически применять теги к ресурсу AWS CloudFormation Stack. Я не мог найти правильный ответ. Ниже приведен мой ресурс стека CloudFormation.

AWSTemplateFormatVersion: '2010-09-09' 
Parameters: 
 ami:
  Type: String
 instanceType:
  Type: String
 blockdevice:
  Type: String
Resources: 
 ec2Stack: 
  Type: AWS::CloudFormation::Stack 
  Properties: 
   TemplateURL: !Sub "${s3ArtifactPath}/ec2/ec2-base-app.yml"
   Parameters:
     ami: !Ref ami
     instanceType: !Ref instanceType
     blockdevice: !Ref blockdevice
   Tags:
     - Key: sampleKey
       Value: sampleValue

Я пытался найти способ, где я передаю только список или просто указываю, что параметр - это раздел Теги . Вот что я сделал

AWSTemplateFormatVersion: '2010-09-09' 
Parameters: 
 ami:
   Type: String
 instanceType:
   Type: String
   Default: nbs
   MinLength: 3
   MaxLength: 5
 blockdevice:
   Type: String
 tagsJsonList:
   Type: String
   Default: '[{"key1":"value1"}, {"key2":"value2"}]'
Resources: 
 ec2Stack: 
     Type: AWS::CloudFormation::Stack 
     Properties: 
       TemplateURL: !Sub "${s3ArtifactPath}/ec2/ec2-base-app.yml"
       Parameters:
         ami: !Ref ami
         instanceType: !Ref instanceType
         blockdevice: !Ref blockdevice
       Tags: !Ref tagsJsonList

Я ожидал, что CloudFormation сформулирует список тегов из переменной. Цель этого заключается в том, чтобы мы могли масштабировать список, и новые пары ключ-значение тегов будут добавляться автоматически. Этот подход не сработал.

Я также попробовал следующий способ

AWSTemplateFormatVersion: '2010-09-09' 
Parameters: 
  ami:
    Type: String
  instanceType:
    Type: String
    Default: nbs
    MinLength: 3
    MaxLength: 5
  blockdevice:
    Type: String
Resources: 
  ec2Stack: 
      Type: AWS::CloudFormation::Stack 
      Properties: 
        TemplateURL: !Sub "${s3ArtifactPath}/ec2/ec2-base-app.yml"
        Parameters:
          ami: !Ref ami
          instanceType: !Ref instanceType
          blockdevice: !Ref blockdevice
        Tags:
          - Key: !Select [0, !Split ["=", !Select [0, !Split [",", !ImportValue someExport] ] ] ]
            Value: !Select [1, !Split ["=", !Select [0, !Split [",", !ImportValue someExport] ] ] ]

# someExport -->  k1=v1,k2=v2,k3=v3

  1. Одна из проблем этого подхода заключается в том, что я не могу использовать встроенную функцию Sub, чтобы сделать переменную someExportдинамический.
  2. Другая проблема заключается в том, что мне придется написать несколько операторов для операторов Key, Value для применения нескольких тегов
...