CloudFormationのYAMLをPyYAMLで読み込む
Published in
3 min readFeb 13, 2019
Serverless Frameworkのアプリケーションのテストコードを書く時、環境変数とかリソース名を取るためにserverless.ymlを読み込むことがある。
普通はPyYAMLを使って読み込むことで普通に読み込めるけど、Serverless FrameworkのCloudFormationの部分で、短縮記法を使った関数など(!GetAttなど) を使っている場合、以下のようなエラーがでることがある。
yaml.constructor.ConstructorError: could not determine a constructor for the tag '!GetAtt'
YAMLでは !
からはじまる文字列はタグ記法として機能が用意されているらしく、タグに対応するクラスがコンストラクターとしてパーサーに追加されていない場合、上記のようなエラーになる。
※タグを使った例は、以下の記事がわかりやすかった
http://gihyo.jp/dev/serial/01/yaml_library/0003
で、今回はYAMLのタグ機能を使いたいわけではなく、単にCloudFormationの関数の短縮機能がたまたま !
からはじまるだけなので、パーサーとしては無視したいところ。
どうすべきかと悩んでいたら、以下のIssueに、「こうやれば全部無視できるよ!」と記載があった。
yaml.add_multi_constructor('!', lambda loader, suffix, node: None)
yaml.loadする前に上記の設定を加えて、無事読み込めるようになった。この設定だとすべてのタグを無視するようになるけど、1つめの引数のtag_prefixをちゃんと設定してあげれば、本来のタグとの共存もできそう(使わないけど)