使用对流层进行云形成,如何在标签上添加“启动时传播”

efr*_*dom 7 python aws-cloudformation aws-cli troposphere

我正在使用python模块对流层在我的云形成模板中生成标签。当前脚本生成:

       "Tags": [{"Key":"Name", "Value":"MyTagName"}, 
                {"Key":"Version", "Value":"123456"}]
Run Code Online (Sandbox Code Playgroud)

但我需要产生

       "Tags":[{"Key":"Name", "Value":"MyTagName", "PropagateAtLaunch":"true"},
               {"Key":"Version", "Value":"123456", "PropagateAtLaunch":"true"}]
Run Code Online (Sandbox Code Playgroud)

适用的脚本部分为:

    asg = autoscaling.AutoScalingGroup("MyASG")
    asg.Tags = Tags(Name = "MyTagName", Version = "123456")
    t.add_resource(asg)
Run Code Online (Sandbox Code Playgroud)

hue*_*ois 4

- -更新- -

该功能已添加到主分支,我只是留下我之前的答案以供参考,以防您无法访问最新版本的对流层(即如果您不克隆存储库)。您仍然可以在代码中使用短函数(第三个选项),但它仍然可以工作。

“标签”帮助类(来自对流层模块)无法生成 ASG 标签列表(键/值/传播),只能生成基本标签列表(键/值 - 例如对于 EC2)。您可以改用troposphere.autoscaling.Tags类,它模仿最新的类,并添加了“propagate”属性。

你可以这样使用它:

    asg.Tags = autoscaling.Tags(Name = 'MyTagName', Version = '123456')
Run Code Online (Sandbox Code Playgroud)

您的所有标记都将 PropagateAtLaunch 属性设置为“true”。如果你想要一个不同的 PropagateAtLaunch 属性,只需这样写:

    asg.Tags = autoscaling.Tags(Name = 'MyTagName', Version = '123456', 
      NonPropagatedTag=('fail',False))
Run Code Online (Sandbox Code Playgroud)

NonPropaatedTag 标记将不会被传播(令人惊讶!)并且值为“失败”。


之前的回答:

您不能使用“Tags”帮助程序类(来自对流层模块)生成 ASG 标签列表(键/值/传播),只能生成基本标签列表(键/值)。快速查看源代码将告诉您原因(https://github.com/cloudtools/troposphere/blob/master/troposphere/ init .py

它为您提供了三个选择:

  • 漫长而艰难的方法:ASG 标签列表(在对流层中)只是一个包含三个键的 Python 字典列表:Name、Value 和 PropagateAtLaunch。所以你的代码将如下所示:

    asg.Tags= [{'Key':'Name','Value':'MyTagName','PropagateAtLaunch':'true'}, 
      {'Key':'Version','Value':'123456','PropagateAtLaunch':'true'}]
    
    Run Code Online (Sandbox Code Playgroud)

    是的,丑陋。

  • 稍微短一点:您可以使用 autoscaling.Tag 帮助器类代替字典,它需要 3 个参数:标签键、标签值、传播。你必须编写代码:

    asg.Tags= [autoscaling.Tag('Name','MyTagName','true'),
      autoscaling.Tag('Version','123456','true')]
    
    Run Code Online (Sandbox Code Playgroud)

    如果您没有很多标签,或者只是在一个地方使用它,那也没关系。但是 Tags 帮助器类非常好......

  • 使用另一个帮助器类来生成 ASG 特定标记列表。我刚刚在对流层 github 存储库上为这个小补充做了一个拉取请求:

    class TagsASG(troposphere.AWSHelperFn):
        defaultPropagateAtLaunch=True
        manyType=[type([]), type(())]
    
        def __init__(self, **kwargs):
            self.tags = []
            for k, v in sorted(kwargs.iteritems()):
                if type(v) in self.manyType:
                  propagate=str(v[1]).lower()
                  v=v[0]
                else:
                  propagate=str(self.defaultPropagateAtLaunch).lower()
                self.tags.append({
                    'Key': k,
                    'Value': v,
                    'PropagateAtLaunch':propagate,
                })
    
        def JSONrepr(self):
            return self.tags
    
    Run Code Online (Sandbox Code Playgroud)

现在,您可以像这样使用它:

    asg.Tags = TagsASG(Name = 'MyTagName', Version = '123456')
Run Code Online (Sandbox Code Playgroud)

您的所有标记都将 PropagateAtLaunch 属性设置为“true”。如果你想要一个不同的 PropagateAtLaunch 属性,只需这样写:

    asg.Tags = TagsASG(Name = 'MyTagName', Version = '123456', 
      NonPropagatedTag=('fail',False))
Run Code Online (Sandbox Code Playgroud)

NonPropaatedTag 标记将不会被传播(令人惊讶!)并且值为“失败”。