| name | template-validator |
| description | Validates CloudFormation templates for syntax, security, and best practices. Use when validating CloudFormation templates, checking for security issues, or ensuring compliance with best practices. |
Template Validator
Quick Start
Validate CloudFormation templates for syntax errors, security issues, and adherence to best practices before deployment.
Instructions
Step 1: Validate template syntax
aws cloudformation validate-template \
--template-body file://template.yaml
aws cloudformation validate-template \
--template-body file://template.yaml \
--parameters ParameterKey=Param1,ParameterValue=Value1
Check for:
- Valid YAML/JSON syntax
- Required template sections
- Valid resource types
- Correct intrinsic function usage
- Parameter references
Step 2: Use cfn-lint for comprehensive checks
pip install cfn-lint
cfn-lint template.yaml
cfn-lint template.yaml --ignore-checks W
cfn-lint template.yaml --format json
cfn-lint checks:
- Template structure
- Resource properties
- Best practices
- Security issues
- Regional availability
Step 3: Security validation
Check IAM policies:
Resources:
Role:
Type: AWS::IAM::Role
Properties:
AssumeRolePolicyDocument:
Statement:
- Effect: Allow
Principal:
Service: ec2.amazonaws.com
Action: sts:AssumeRole
Policies:
- PolicyName: AppPolicy
PolicyDocument:
Statement:
- Effect: Allow
Action: s3:*
Resource: '*'
Better approach:
Policies:
- PolicyName: AppPolicy
PolicyDocument:
Statement:
- Effect: Allow
Action:
- s3:GetObject
- s3:PutObject
Resource: !Sub '${MyBucket.Arn}/*'
Check security groups:
Resources:
SecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 0.0.0.0/0
Better approach:
SecurityGroupIngress:
- IpProtocol: tcp
FromPort: 22
ToPort: 22
CidrIp: 10.0.0.0/8
Step 4: Check resource dependencies
Verify DependsOn usage:
Resources:
Instance:
Type: AWS::EC2::Instance
DependsOn: InternetGatewayAttachment
Properties:
SecurityGroupIngress:
Type: AWS::EC2::SecurityGroupIngress
Properties:
GroupId: !Ref SecurityGroup
Check for circular dependencies:
- Review all DependsOn relationships
- Check Ref and GetAtt usage
- Verify no circular references
Step 5: Validate best practices
Use specific resource names:
Resources:
WebServerSecurityGroup:
Type: AWS::EC2::SecurityGroup
Resources:
SecurityGroup1:
Type: AWS::EC2::SecurityGroup
Add descriptions:
AWSTemplateFormatVersion: '2010-09-09'
Description: Web application infrastructure with ALB and Auto Scaling
Parameters:
InstanceType:
Type: String
Description: EC2 instance type for web servers
Use tags:
Resources:
Instance:
Type: AWS::EC2::Instance
Properties:
Tags:
- Key: Name
Value: !Sub '${AWS::StackName}-WebServer'
- Key: Environment
Value: !Ref Environment
- Key: ManagedBy
Value: CloudFormation
Common Validation Checks
Syntax Validation
Valid YAML structure:
AWSTemplateFormatVersion: '2010-09-09'
Description: Template description
Parameters:
Resources:
Outputs:
Intrinsic functions:
Value: !Ref MyResource
Value: !GetAtt MyResource.Attribute
Value: !Sub '${MyResource}'
Value: Ref: MyResource
Value: !GetAtt MyResource
Security Validation
IAM policies:
- No wildcards in actions unless necessary
- Specific resources instead of '*'
- Least privilege principle
- No hardcoded credentials
Security groups:
- No 0.0.0.0/0 for sensitive ports (22, 3389, 3306, 5432)
- Specific port ranges
- Documented ingress rules
Encryption:
- Enable encryption for S3 buckets
- Enable encryption for EBS volumes
- Enable encryption for RDS instances
- Use KMS keys for sensitive data
Resource Validation
Required properties:
Resources:
Bucket:
Type: AWS::S3::Bucket
Properties:
BucketName: !Sub '${AWS::StackName}-bucket'
Valid property values:
Resources:
Instance:
Type: AWS::EC2::Instance
Properties:
InstanceType: t3.micro
ImageId: ami-12345678
Validation Tools
AWS CLI
aws cloudformation validate-template \
--template-body file://template.yaml
aws cloudformation create-change-set \
--stack-name my-stack \
--change-set-name my-changes \
--template-body file://template.yaml
aws cloudformation describe-change-set \
--stack-name my-stack \
--change-set-name my-changes
cfn-lint
cfn-lint template.yaml
cfn-lint template.yaml --ignore-checks W
cfn-lint template.yaml --regions us-east-1 us-west-2
cfn-lint template.yaml --append-rules custom-rules/
cfn-nag
gem install cfn-nag
cfn_nag_scan --input-path template.yaml
cfn_nag_scan --input-path template.yaml --deny-list-path rules.txt
TaskCat
pip install taskcat
taskcat test run
project:
name: my-project
regions:
- us-east-1
- us-west-2
tests:
default:
template: template.yaml
parameters:
InstanceType: t3.micro
Validation Checklist
Template structure:
Parameters:
Resources:
Security:
Outputs:
Best practices:
Advanced
For detailed information, see: