Nearly every service AWS offers can be enumerated and configured using CloudFormation. For simple syntax checking, JSON is a great format. The available tools for working with CloudFormation templates in IDEs or browser editors is steadily growing, and AWS has released their own visual editing tool which allows less-experienced users to quickly create an environment template and deploy it using CloudFormation. For more advanced users, CloudFormation templates are a powerful and complete means of deploying entire environments in AWS.
CloudFormation does not always receive the very latest features for every AWS service when they are launched. This diminishes the effectiveness of this tool for describing and building entire environments from CloudFormation templates, which can increase the time it takes to perform a rebuild or recovery.
Manage your templates in a revision control (source control) system.
Ensure any iterative changes or extensions to existing configuration (e.g. new security group rules, new systems, everything really) make it into the appropriate CloudFormation template.
Make use of variable declarations and run-time template inputs: do not hard-code resource names or other attributes. You never know when you will want to stand up an exact copy of your environment, and name-space conflicts will prevent you from doing that with CloudFormation!
If you have a production environment which leverages more than 1-2 AWS services, but lack hands-on experience with CloudFormation, definitely enlist the expertise of an AWS Certified consultant or an Amazon Partner Network member who has deployed production environments with CloudFormation before.
Do not try to enumerate an entire environment in a single template. Instead, use at least one template per AWS service: have a template file solely for each type of resource such as RDS, EC2, VPCs. Subnets and security groups within a VPC should go in the template for that VPC (keep dependent resources together in a single template). If you have resources which may be changed or replaced frequently, separate them from resources that change little and absolutely keep templates for database systems separate from all other resource types.
CloudFormation permits the teams we work with to track changes to an environment's infrastructure as code, and provides a simple disaster recovery mechanism in cases where resources might be mistakenly or maliciously deleted. Strictly enforcing infrastructure configuration changes in CloudFormation means we never have to worry about whether a change will persist, and lets us quickly re-deploy entire environments "from scratch" with minimal effort.