|PyPI version|
|Code Issues|
|codecov|
|Build Status|
cfnjsontoyaml
=============
Convert JSON CloudFormation templates to the new YAML syntax. This
includes converting all ``Fn::*`` and ``Ref`` JSON functions to ``!*``
yaml node type functions.
In addition, cfnjsontoyaml tries to make a best guess at when
``Fn::Join`` functions should automatically be converted to ``!Sub``.
Convert Long JSON to compact YAML
---------------------------------
This utility not only converts from JSON to yaml, it will use the new
short yaml syntax, and attempt to convert ``Fn::Join`` to ``!Sub``,
resulting in shorter, more compact syntax.
For example, and IAM role can be converted from 127 lines of JSON
cloudformation to 30 lines of yaml.
.. figure:: docs/images/diagram.png
:alt: docs/images/diagram.png
docs/images/diagram.png
Usage
-----
``cfn-json-to-yaml`` reads either from standard in, or takes the first
argument as the template to ingest and prints the yaml converted
template to stdout.
::
$ pip install cfnjsontoyaml
$ cat my_template.json | cfn-json-to-yaml
Examples
--------
APIGateway Method with lambda proxy
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In some cases, we can halve the number of lines, while still maintaining
readability. Here, we convert 48 lines of JSON to 19 lines of YAML. ####
JSON
::
{
"Resources": {
"MappingReferenceMethod": {
"Type": "AWS::ApiGateway::Method",
"DependsOn": [
"LambdaInvokePermissionMappingReference"
],
"Properties": {
"RestApiId": {
"Ref": "RestApi"
},
"ResourceId": {
"Ref": "MappingReferenceResource"
},
"HttpMethod": "POST",
"AuthorizationType": "NONE",
"ApiKeyRequired": true,
"RequestParameters": {
"method.request.header.x-api-key": true
},
"Integration": {
"Type": "AWS_PROXY",
"Uri": {
"Fn::Join": [
"",
[
"arn:aws:apigateway:",
{
"Ref": "AWS::Region"
},
":lambda:path/2015-03-31/functions/",
{
"Fn::GetAtt": [
"LambdaFunctionMappingReference",
"Arn"
]
},
"/invocations"
]
]
},
"IntegrationHttpMethod": "POST",
"PassthroughBehavior": "when_no_templates"
}
}
}
}
}
YAML
^^^^
::
---
Resources:
MappingReferenceMethod:
Type: AWS::ApiGateway::Method
Properties:
ApiKeyRequired: true
AuthorizationType: NONE
HttpMethod: POST
Integration:
IntegrationHttpMethod: POST
PassthroughBehavior: when_no_templates
Type: AWS_PROXY
Uri: !Sub "arn:aws:apigateway:${AWS::Region}:lambda:path/2015-03-31/functions/${LambdaFunctionMappingReference.Arn}/invocations"
RequestParameters:
method.request.header.x-api-key: true
ResourceId: !Ref "MappingReferenceResource"
RestApiId: !Ref "RestApi"
DependsOn:
- LambdaInvokePermissionMappingReference
Problems
--------
There are a wide range of combinations for functions in cloudformation.
If you come across a template which does not render correctly, please
try and isolate the fragment of json which is causing issues, and create
an `issue in
github <https://github.com/drewsonne/cfn-json-to-yaml/issues/new>`__ .
If you'd like to be a bit more helpful, you can fork the repository,
create a branch, and add a json/yaml snippet to
https://github.com/drewsonne/cfn-json-to-yaml/tree/master/tests/resources/fragments
with the next sequential number. The smaller the json/yaml snippet you
can provide the quicker I can fix it. :-)
.. |PyPI version| image:: https://badge.fury.io/py/cfnjsontoyaml.svg
:target: https://badge.fury.io/py/cfnjsontoyaml
.. |Code Issues| image:: https://www.quantifiedcode.com/api/v1/project/b6d9757c91b64831ba12fd7cf53332de/badge.svg
:target: https://www.quantifiedcode.com/app/project/b6d9757c91b64831ba12fd7cf53332de
.. |codecov| image:: https://codecov.io/gh/drewsonne/cfn-json-to-yaml/branch/master/graph/badge.svg
:target: https://codecov.io/gh/drewsonne/cfn-json-to-yaml
.. |Build Status| image:: https://travis-ci.org/drewsonne/cfn-json-to-yaml.svg?branch=master
:target: https://travis-ci.org/drewsonne/cfn-json-to-yaml