使用 Python 加载 CloudFormation YAML

Posted

技术标签:

【中文标题】使用 Python 加载 CloudFormation YAML【英文标题】:Loading CloudFormation YAML using Python 【发布时间】:2017-04-26 14:57:19 【问题描述】:

我有一组 YAML AWS Cloud Formation 模板,我最近从 JSON 转换而来。

使用JSON 时,我能够加载这些模板并使用jinja 对其进行转换,以从中生成一些降价文档。我正在尝试在 python 中对YAML 做同样的事情。

我在使用 YAML 标签的 cloudformation 模板中使用速记函数语法。例如

Properties:
  MinSize: !Ref ClusterSize
  MaxSize: !Ref ClusterSize

当尝试使用ruamel.yaml 包加载这些标签时,构造函数会失败,因为它无法处理标签,因为它不了解标签。

有没有办法解决这个问题,以便我能够加载 YAML 文档,以便检索/查询输出和资源?

【问题讨论】:

什么是“输出”和“资源”? 【参考方案1】:

您误认为ruamel.yaml 无法处理标签。但是当然你必须提供关于如何处理任何未知标签的信息,它无法猜测你想用!Ref加载什么样的数据:

import ruamel.yaml

yaml_str = """\
Properties:
  MinSize: !Ref ClusterSize
  MaxSize: !Ref ClusterSize
"""


class Blob(object):
    def update(self, value):
        self.value = value

    def __str__(self):
        return str(self.value)


def my_constructor(self, node):
    data = Blob()
    yield data
    value = self.construct_scalar(node)
    data.update(value)

ruamel.yaml.SafeLoader.add_constructor(u'!Ref', my_constructor)

data = ruamel.yaml.safe_load(yaml_str)
print('data', data['Properties']['MinSize'])

打印:

ClusterSize

如果您想摆脱许多不同的标签,并且不关心“一切都是字符串”,您也可以这样做:

import ruamel.yaml

yaml_str = """\
Properties:
  MinSize: !Ref ClusterSize
  MaxSize: !Ref ClusterSize
  SizeList:
     - !abc 1
     - !xyz 3
"""


def general_constructor(loader, tag_suffix, node):
    return node.value


ruamel.yaml.SafeLoader.add_multi_constructor(u'!', general_constructor)


data = ruamel.yaml.safe_load(yaml_str)
print(data)

给出:

'Properties': 'SizeList': ['1', '3'], 'MinSize': 'ClusterSize', 'MaxSize': 'ClusterSize'

(请注意,标量 13 被加载为字符串而不是普通整数)

【讨论】:

感谢 Anthon,我并不是要暗示 ruamel.yaml 无法处理标签 - 我只是不知道这些标签的行为和实现,因为我不知道如何指定他们我无法加载 YAML。它们的标签比 !Ref 更多,有些是接受列表和其他类型 - 有没有办法可以忽略标签,或将它们视为字符串,或者这在更基本的层面上不起作用? 如果一切都可以是一个字符串,那么这相对简单,有点不幸的是,到目前为止,您已经减少了示例 YAML,以至于看起来您只有一个这样的标签并且只有嵌套的字典。我会更新答案。

以上是关于使用 Python 加载 CloudFormation YAML的主要内容,如果未能解决你的问题,请参考以下文章

如何在 CloudFormation 中将字符串列表作为参数传递?

使用Python获取网站加载时间

使用 Python 将 Pub/Sub 消息加载到 BigQuery

使用 Python 加载 CloudFormation YAML

尝试在 python 中正确加载和使用 dll 文件

使用 Python 请求测量网站加载时间