Here is a valid CloudFormation template, which can be used to successfully create a stack, and the resources and tag show up as expected:
Traceback (most recent call last):
File "<python-input-5>", line 1, in <module>
cfn_flip.dump_yaml(loaded_yaml)
~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^
File "/home/pnickerson/.local/lib/python3.13/site-packages/cfn_flip/__init__.py", line 42, in dump_yaml
return yaml.dump(
~~~~~~~~~^
data,
^^^^^
...<3 lines>...
width=config.max_col_width
^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/lib64/python3.13/site-packages/yaml/__init__.py", line 253, in dump
return dump_all([data], stream, Dumper=Dumper, **kwds)
File "/usr/lib64/python3.13/site-packages/yaml/__init__.py", line 241, in dump_all
dumper.represent(data)
~~~~~~~~~~~~~~~~^^^^^^
File "/usr/lib64/python3.13/site-packages/yaml/representer.py", line 27, in represent
node = self.represent_data(data)
File "/usr/lib64/python3.13/site-packages/yaml/representer.py", line 48, in represent_data
node = self.yaml_representers[data_types[0]](self, data)
File "/home/pnickerson/.local/lib/python3.13/site-packages/cfn_flip/yaml_dumper.py", line 107, in map_representer
return dumper.represent_mapping(TAG_MAP, value, flow_style=False)
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib64/python3.13/site-packages/yaml/representer.py", line 118, in represent_mapping
node_value = self.represent_data(item_value)
File "/usr/lib64/python3.13/site-packages/yaml/representer.py", line 48, in represent_data
node = self.yaml_representers[data_types[0]](self, data)
File "/home/pnickerson/.local/lib/python3.13/site-packages/cfn_flip/yaml_dumper.py", line 107, in map_representer
return dumper.represent_mapping(TAG_MAP, value, flow_style=False)
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib64/python3.13/site-packages/yaml/representer.py", line 118, in represent_mapping
node_value = self.represent_data(item_value)
File "/usr/lib64/python3.13/site-packages/yaml/representer.py", line 48, in represent_data
node = self.yaml_representers[data_types[0]](self, data)
File "/home/pnickerson/.local/lib/python3.13/site-packages/cfn_flip/yaml_dumper.py", line 107, in map_representer
return dumper.represent_mapping(TAG_MAP, value, flow_style=False)
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib64/python3.13/site-packages/yaml/representer.py", line 118, in represent_mapping
node_value = self.represent_data(item_value)
File "/usr/lib64/python3.13/site-packages/yaml/representer.py", line 48, in represent_data
node = self.yaml_representers[data_types[0]](self, data)
File "/home/pnickerson/.local/lib/python3.13/site-packages/cfn_flip/yaml_dumper.py", line 107, in map_representer
return dumper.represent_mapping(TAG_MAP, value, flow_style=False)
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib64/python3.13/site-packages/yaml/representer.py", line 118, in represent_mapping
node_value = self.represent_data(item_value)
File "/usr/lib64/python3.13/site-packages/yaml/representer.py", line 48, in represent_data
node = self.yaml_representers[data_types[0]](self, data)
File "/usr/lib64/python3.13/site-packages/yaml/representer.py", line 199, in represent_list
return self.represent_sequence('tag:yaml.org,2002:seq', data)
~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib64/python3.13/site-packages/yaml/representer.py", line 92, in represent_sequence
node_item = self.represent_data(item)
File "/usr/lib64/python3.13/site-packages/yaml/representer.py", line 48, in represent_data
node = self.yaml_representers[data_types[0]](self, data)
File "/home/pnickerson/.local/lib/python3.13/site-packages/cfn_flip/yaml_dumper.py", line 107, in map_representer
return dumper.represent_mapping(TAG_MAP, value, flow_style=False)
~~~~~~~~~~~~~~~~~~~~~~~~^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/lib64/python3.13/site-packages/yaml/representer.py", line 118, in represent_mapping
node_value = self.represent_data(item_value)
File "/usr/lib64/python3.13/site-packages/yaml/representer.py", line 48, in represent_data
node = self.yaml_representers[data_types[0]](self, data)
File "/home/pnickerson/.local/lib/python3.13/site-packages/cfn_flip/yaml_dumper.py", line 105, in map_representer
return fn_representer(dumper, key[4:], value[key])
File "/home/pnickerson/.local/lib/python3.13/site-packages/cfn_flip/yaml_dumper.py", line 80, in fn_representer
value = ".".join(value)
TypeError: sequence item 0: expected str instance, ODict found
"AWSTemplateFormatVersion: '2010-09-09'\nMappings:\n S3Domains:\n Bucket1:\n DomainResource: S3Bucket1\n DomainAttribute: DomainName\nTransform: AWS::LanguageExtensions\nResources:\n S3Bucket1:\n Type: AWS::S3::Bucket\n Properties:\n BucketName: my-bucket-one\n S3Bucket2:\n Type: AWS::S3::Bucket\n Properties:\n BucketName: my-bucket-two\n Tags:\n - Key: Bucket1Domain\n Value: !GetAtt 'S3Bucket1.DomainName'\n"
Here is a valid CloudFormation template, which can be used to successfully create a stack, and the resources and tag show up as expected:
AWS documentation says that
FindInMapcan be used inside ofGetAtthere: https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/intrinsic-function-reference-getatt.html#getatt-supported-functionsHowever, when I try to parse this template in a
Python 3.13.3script usingcfn-flip 1.3.0, I get an error:If I alter the template to no longer have
FindInMapinGetAtt, I can run the Python fine.