web-dev-qa-db-ja.com

PyYAMLライブラリを使用してAWSCloudFormationテンプレートを解析します

AWS CloudFormationYAMLテンプレートで読み取る必要があるPyYAMLライブラリを使用してカスタムPythonアプリケーションを作成しています。

私はvalidate-templateを使用してテンプレートをテストしたため、テンプレートが有効なCloudFormationテンプレートであることを知っています。

▶ aws cloudformation validate-template --template-body 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_Inside_Sub.yaml

その後:

▶ python
Python 2.7.15 (default, Nov 27 2018, 21:40:55) 
[GCC 4.2.1 Compatible Apple LLVM 10.0.0 (clang-1000.11.45.5)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import yaml
>>> yaml.load(open('FindInMap_Inside_Sub.yaml'))

これは次のことにつながります:

yaml.constructor.ConstructorError: could not determine a constructor for the tag '!FindInMap'
  in "FindInMap_Inside_Sub.yaml", line 89, column 45

PyYAMLなどのライブラリを使用してCloudFormation YAMLファイルを解析するにはどうすればよいですか?

6
nixmind

彼らの aws-cfn-template-flip cfnテンプレートをjsonとyamlとの間で変換するプロジェクトは、良い出発点です。 yaml_loader.py スクリプトを確認してください。 yamlコンストラクターを追加する方法を示しています。下部に、次のように表示されます。

CfnYamlLoader.add_constructor(TAG_MAP, construct_mapping)
CfnYamlLoader.add_multi_constructor("!", multi_constructor)

おそらくそこにあるconstruct_mappingメソッドに興味があるでしょう。そこから、コードがどのように機能するかを確認できます。

3
Jeshan Babooa