I am starting a series on Hands-on AWS CloudFormation in which I will be creating AWS Cloudformation templates starting from basics and building it up. This is the first article as part of that series.
First we need to understand basic terminologies.
AWS CloudFormation is a service that helps you model and set up your AWS resources so that you can spend less time managing those resources and more time focusing on your applications that run in AWS. You create a template that describes all the AWS resources that you want (like EC2 instances or RDS DB instances), and AWS CloudFormation takes care of provisioning and configuring those resources for you.
Infrastructure as Code is the process of provisioning and managing your cloud resources by writing a template file that is both human readable, and machine consumable. For AWS the built-in choice for Infrastructure as Code is AWS CloudFormation.
Template is a JSON or YAML formatted text file. AWS CloudFormation uses these templates as blueprints for building your AWS resources.
Stacks. When you use AWS CloudFormation, you manage related resources as a single unit called a stack. First, you declare all your infrastructure in a template. Then your resources are mapped to the stack. Stack is an end product. It instantiates all specified resources in AWS. You create, update, and delete a collection of resources by creating, updating, and deleting stacks. Remember, all the resources in a stack are defined by the stack's AWS CloudFormation template.
Change sets. If you need to make changes to the running resources in a stack, you update the stack. Before making changes to your resources, you can generate a change set, which is a summary of your proposed changes. Change sets allow you to see how your changes might impact your running resources, especially for critical resources, before implementing them.
I've screenshotted this image from lecture by
Andrew Brown, ExamPro. You can watch this very short (under 3 mins) video to understand a template structure (also I'd highly recommend to watch a whole course if you want to get AWS Certified Solutions Architect – Associate certification).
We are going to create a simple CloudFormation template and provision a new S3 bucket.
YAML-based templates use less punctuation and should be substantially easier to write and to read. They also allow the use of comments. That is why we will go with YAML.
Let's open any code editor such as Visual Studio Code. Create a new "1-Basics.yaml" file. And add the following code:
# create a new S3 bucket Resources: MyS3Bucket: # logical ID Type: 'AWS::S3::Bucket' Properties: BucketName: jon-snow-bucket Tags: # list of tags - Key: CloudFormationLab Value: JonSnow
Template describes a single resource - AWS S3 bucket named 'jon-snow-bucket'.
Note, each resource will have a Logical ID (resource logical name) and a Physical ID (id assigned by AWS after resource creation). Think of Logical IDs as being used to reference resources within AWS CloudFormation template and Physical IDs being used to identify resources outside of AWS CloudFormation templates after they have been created.
Log in to AWS Console, search for CloudFormation service. Click on "Create stack"
Upload your template file
Give a name to your stack
Add a tag for your stack :)
Review the stack and click on "Create stack"
Here you go! (wait couple of seconds and click on refresh button to get the updated list of events)
Click on "Resources" tab to see the list of newly created resources
As you see, a new S3 bucket named 'job-snow-bucket' has been created by AWS CloudFormation. Once you click on bucket's physical ID you will be navigated to Amazon S3:
You might be charged for running resources. That is why it is important to clean all provisioned resources once you are done with the stack. By deleting a stack, all its resources will be deleted as well.
Your newly created S3 bucket should no longer exist:
In this article, we spotlight just a tip of the tip of the CloudFormation iceberg, but this should give you an understanding of how to create template and stack.
The next article in the series will show how to use Intrinsic functions.