I recommend using Troposphere instead of vanilla CF. It's a Python library that generates CF templates. It doesn't abstract out anything, so the structure ends up looking very similar to a json or yml template, but with all the conveniences of working with objects in Python.
The biggest gripe I have with CF is that it's impossible to introduce existing components into a CloudFormation stack, so any legacy infrastructure has to remain manually managed.
The biggest gripe I have with CF is that it's impossible to introduce existing components into a CloudFormation stack, so any legacy infrastructure has to remain manually managed.