使用对流层形成云,如何将“发射时传播”添加到标签

Posted

技术标签:

【中文标题】使用对流层形成云,如何将“发射时传播”添加到标签【英文标题】:Using troposphere for cloud formation, how do I add "propagate at launch" to tags 【发布时间】:2015-02-23 23:38:12 【问题描述】:

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

       "Tags": ["Key":"Name", "Value":"MyTagName", 
                "Key":"Version", "Value":"123456"]

但我需要生成

       "Tags":["Key":"Name", "Value":"MyTagName", "PropagateAtLaunch":"true",
               "Key":"Version", "Value":"123456", "PropagateAtLaunch":"true"]

适用的脚本部分是:

    asg = autoscaling.AutoScalingGroup("MyASG")
    asg.Tags = Tags(Name = "MyTagName", Version = "123456")
    t.add_resource(asg)

【问题讨论】:

您是否测试过以下内容? asg.Tags = Tags(Name = "MyTagName", Version = "123456", "PropagateAtLaunch" = "true") 不幸的是,它看起来会添加第三个列表元素"Key": "PropogateAtLaunch", "Value": "true" 【参考方案1】:

---- 更新 ---

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

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

你可以这样使用它:

    asg.Tags = autoscaling.Tags(Name = 'MyTagName', Version = '123456')

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

    asg.Tags = autoscaling.Tags(Name = 'MyTagName', Version = '123456', 
      NonPropagatedTag=('fail',False))

NonPropagatedTag 标记不会被传播(惊喜!)并且值为“失败”。


上一个答案:

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

它为您提供三个选择:

漫长而艰难的方式:ASG 标记列表(在对流层中)只是具有三个键的 python 字典列表:名称、值和 PropagateAtLaunch。所以你的代码看起来像:

asg.Tags= ['Key':'Name','Value':'MyTagName','PropagateAtLaunch':'true', 
  'Key':'Version','Value':'123456','PropagateAtLaunch':'true']

是的,丑陋的。

稍微短一点:你可以使用 autoscaling.Tag 辅助类来代替 dicts,它接受 3 个参数:标签键、标签值、传播。你必须编码:

asg.Tags= [autoscaling.Tag('Name','MyTagName','true'),
  autoscaling.Tag('Version','123456','true')]

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

使用另一个帮助类,生成 ASG 特定的标签列表。我刚刚在 troposphere 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

现在,你可以这样使用它:

    asg.Tags = TagsASG(Name = 'MyTagName', Version = '123456')

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

    asg.Tags = TagsASG(Name = 'MyTagName', Version = '123456', 
      NonPropagatedTag=('fail',False))

NonPropagatedTag 标记不会被传播(惊喜!)并且值为“失败”。

【讨论】:

选项 2(autoscaling.Tag)就像一个魅力。谢谢你。选项 3 看起来是更好的解决方案,但我想我会等到应用拉取请求。 已经合并到master分支。希望答案对您有所帮助,如果是这样,请不要忘记投票... :)

以上是关于使用对流层形成云,如何将“发射时传播”添加到标签的主要内容,如果未能解决你的问题,请参考以下文章

如何从 WCF 打印数组的值以形成标签?

使用 dom Javascript 添加新创建的标签和输入文本以形成表单?

是否可以将查询参数传递给 Django % url % 模板标签?

根据请求计数使用云形成自动扩展

如何将用户输入参数传递给我的云函数?

如何使用 yaml 格式文件在 serverless.yml 中编写嵌套 IF,同时将其用于云形成?