I am writing a custom Python application using the PyYAML library that needs to read in AWS CloudFormation YAML templates.
I know the templates are valid CloudFormation templates, because I tested them using validate-template:
▶ aws cloudformation validate-template --template-body file://cloudformation.yml
When I try to read them using the PyYAML library, however, I get errors like:
yaml.scanner.ScannerError: mapping values are not allowed here
and
could not determine a constructor for the tag "!Sub"
and others.
By way of example, I try this AWS example template:
▶ curl -s \
https://raw.githubusercontent.com/awslabs/aws-cloudformation-templates/master/aws/services/CloudFormation/FindInMap_Inside_Sub.yaml \
-o FindInMap_Inside_Sub.yaml
And then:
▶ 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'))
Which leads to:
yaml.constructor.ConstructorError: could not determine a constructor for the tag '!FindInMap'
in "FindInMap_Inside_Sub.yaml", line 89, column 45
How can I parse a CloudFormation YAML file using a library like PyYAML or others?