In this blog, we will explore AWS CloudFormation Init and will create an example of using all the cfn-init concepts
You can check my Youtube video on this article.
Agenda
- Basics of CloudFormation::Init
- cfn-init
- cfn-signal
- cfn-hup
AWS::CloudFormation::Init
Use the AWS::CloudFormation::Init type to include metadata on an Amazon EC2 instance
AWS::CLOUDFORMATION::INIT: RESOURCE METADATA
"Resources": {
"MyInstance": {
"Type": "AWS::EC2::Instance",
"Metadata" : {
"AWS::CloudFormation::Init" : {
"config" : {
"packages" : { },
"groups" : { },
"users" : { },
"sources" : { },
"files" : { },
"commands" : { },
"services" : { }
}
}
},
"Properties": { }
}
}
Packages– Used to install the software on your instance like tomcat using (yum, apt, python, and others)
Groups– To created groups on the linux system
Users– The users key allows you to create Linux/UNIX users on your instance.
Sources-use the sources key to download files from remote locations
Files– The files key creates files based on either inline content in the template or content from a remote location (URL).
Commands- Execute any custom script or a file
Services- The services key defines which services are enabled or disabled on the instance being configured. Linux systems utilize sysvinit to support the services key
"services" : {
"sysvinit" : {
"nginx" : {
"enabled" : "true",
"ensureRunning" : "true",
"files" : ["/etc/nginx/nginx.conf"],
"sources" : ["/var/www/html"]
}
}
}
ConfigSets
By default, cfn-init helper script processes these configuration sections in the following order:
- packages,
- groups,
- users,
- sources,
- files,
- commands,
- and then services.
If you require a different order, then you can use the concept of ConfigSet.
- Defined two config Keys and then use a configset that specifies the order in which these config keys should be processed.
Install
Configure
What is cfn-init
How we can use that metadata which we have created using AWS::CloudFormation::Init
So for that we use cfn-init
helper script it reads template metadata from the AWS::CloudFormation::Init key and acts accordingly to:
- Fetch and parse metadata from AWS CloudFormation
- Install packages
- Write files to disk
- Enable/disable and start/stop services
How to call cfn-init template
You can specify a configset when you call cfn-init in your template. If you don’t specify a configset, cfn-init looks for a single config key named config.
From the UserData section you can call the cfn-init
You must pass UserData to instances in Base64 format. Thus, you call the Fn::Base64 function to convert the text-based script to a Base64 encoding.
cfn-signal
The cfn-signal helper script signals AWS CloudFormation to indicate whether Amazon EC2 instances have been successfully created or updated.
If you install and configure software applications on instances, you can signal AWS CloudFormation when those software applications are ready.
You use the cfn-signal script in conjunction with a CreationPolicy or an Auto Scaling group with a WaitOnResourceSignals update policy.
cfn-hup
The cfn-hup helper is a daemon that detects changes in resource metadata and runs user-specified actions when a change is detected. This allows you to make configuration updates on your running Amazon EC2 instances through the UpdateStack API action.
Let’s create a sample LAMP Stack
- Create a LAMP stack using a single EC2 instance and a local MySQL database for storage.
- This template demonstrates using the AWS CloudFormation bootstrap scripts to install the packages and files necessary to deploy the Apache web server, PHP and MySQL at instance launch time.
- Clone this yaml file and create a stack
Once the stack is created successfully you should be able to see all the events and access the url directly
References