Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 使用PyYAML库解析AWS CloudFormation模板_Amazon Web Services_Yaml_Amazon Cloudformation_Pyyaml - Fatal编程技术网

Amazon web services 使用PyYAML库解析AWS CloudFormation模板

Amazon web services 使用PyYAML库解析AWS CloudFormation模板,amazon-web-services,yaml,amazon-cloudformation,pyyaml,Amazon Web Services,Yaml,Amazon Cloudformation,Pyyaml,我正在使用PyYAML库编写一个自定义Python应用程序,该库需要在AWS CloudFormation YAML模板中读取 我知道这些模板是有效的CloudFormation模板,因为我使用validate template对它们进行了测试: ▶ aws cloudformation验证模板--模板正文file://cloudformation.yml 但是,当我尝试使用PyYAML库读取它们时,会出现如下错误: yaml.scanner.ScannerError:此处不允许映射值 及 无

我正在使用PyYAML库编写一个自定义Python应用程序,该库需要在AWS CloudFormation YAML模板中读取

我知道这些模板是有效的CloudFormation模板,因为我使用validate template对它们进行了测试:

▶ aws cloudformation验证模板--模板正文file://cloudformation.yml
但是,当我尝试使用PyYAML库读取它们时,会出现如下错误:

yaml.scanner.ScannerError:此处不允许映射值

无法确定标记“!Sub”的构造函数

等等

作为示例,我尝试以下AWS示例模板:

▶ curl-s\
https://raw.githubusercontent.com/awslabs/aws-cloudformation-templates/master/aws/services/CloudFormation/FindInMap_Inside_Sub.yaml \
-o FindInMap_in_Sub.yaml
然后:

▶ python
Python 2.7.15(默认值,2018年11月27日,21:40:55)
[GCC 4.2.1达尔文兼容苹果LLVM 10.0.0(clang-1000.11.45.5)]
有关详细信息,请键入“帮助”、“版权”、“信用证”或“许可证”。
>>>进口yaml
>>>yaml.load(打开('FindInMap_Inside_Sub.yaml'))
这导致:

yaml.constructor.ConstructorError:无法确定标记“”的构造函数!FindInMap'
在“FindInMap_in_Sub.yaml”第89行第45列中
如何使用PyYAML或其他库解析CloudFormation YAML文件?

他们将cfn模板转换为json和YAML的项目是一个很好的起点。 示例检查脚本。 它显示了如何添加yaml构造函数。 在底部,您将看到:

CfnYamlLoader.add_constructor(TAG_MAP, construct_mapping)
CfnYamlLoader.add_multi_constructor("!", multi_constructor)
您可能会对那里的
construct\u mapping
方法感兴趣。从这里,您可以看到代码是如何工作的。

可以使用项目附带的库

安装库:

▶ pip安装cfn\U翻转
那么,在模板中读取的最简单Python可能是:

#/usr/bin/env python
进口yaml
从cfn_工具导入加载_yaml、转储_yaml
text=open('./FindInMap_Inside_Sub.yaml')。read()
数据=加载(文本)
打印(转储文件(数据))
这个库并没有真正的文档化,但其中也有各种方法用于定制值得探索的输出格式。

我遇到了一些问题,因为它会自动将我的CF模板转换为长格式。所以任何
!Ref Thing
调用正在转换为字典映射

如果要匹配
input.template
文件的原始输入,请使用以下命令:

从cfn\u工具导入加载\u yaml
进口cfn_flip.yaml_自卸车
进口yaml
将open('input.template')作为f:
raw=f.read()
数据dict=加载yaml(原始)
将open('output.template','w')作为f:
dumper=cfn\u flip.yaml\u dumper.get\u dumper(clean\u-up=False,long\u-form=False)
原始=yaml.dump(
数据目录,
翻车机=翻车机,
默认\u流\u样式=False,
允许\u unicode=True
)
f、 写入(原始)
您还可以将
clean\u up=False
更改为
True
,以执行一些智能格式设置,这在我的例子中非常有效


在运行cfncli工具并在模板上看到正确的简短输出后,我发现了这一点。然后我用它作为参考,并遵循代码路径。

非常感谢您提供这些信息。我找到了另一个解决我的具体问题的方法,但它们可能会在其他自动化问题上帮助我。事实上,我真正的问题是为AWS cfn模板找到一个解决方案参数覆盖AWS服务目录中的无服务器应用程序部署(工件和包),通过一个基础设施系统,我使用aws管理和CI/CD工具进行了设置。我最终决定使用AWS Systems Manager参数存储将基础结构与配置和参数分开。但我将使用您在另一个阶段中指出的这些工具,我打算写一篇完整的文章,介绍我所做的工作以及遇到的问题……这篇文章在哪里;)?谢谢你!您知道如何使构造函数的变量保持在同一行吗?例如,即使使用了这个,我仍然没有得到我想要的结果:
-!FindInMap[PrivateLink,端点,子网1]
。相反,我得到的是
-!FindInMap
然后它删除一行并传递其余变量
-PrivateLink-EndPoint-SubnetId1
这两种方式在功能上应该是等效的@Daniel,在cloudformation yaml中,这两种方式都被视为列表。但不,我不知道有什么办法。但我不会费心去调查,因为这只是一种风格