WaitCondition Controls the Pace of AWS CloudFormation Templates


AWS’s WaitCondition can be used with CloudFormation templates to ensure required resources are running.

WaitCondition for CloudFormationAs you may already be aware, AWS CloudFormation is used for infrastructure automation by allowing you to write JSON templates to automatically install, configure, and bootstrap your applications on Amazon EC2 instances. This allows you to replicate your environment, or update an existing installation, without making a manual change to the environment, saving you a lot of time and effort.

This post focuses on the CloudFormation WaitCondition resource, which can help you to initialize and configure your environment as per your requirement.

What is WaitCondition and who needs it?

WaitCondition can be considered as a timed semaphore that pauses the execution of your CloudFormation template and waits for a number of success signals before it continues a stack creation operation. There are scenarios where you need to pause the execution of your CloudFormation stack, such as resource dependencies or user experience. Some scenarios also include:

  • As a part of user experience, you want to pause completion of the CloudFormation template and display of the output section until all resources are properly provisioned and in a working state.
  • There are resource dependencies where some additional scripts and packages on your instance must be properly configured before other AWS resources can contact them. For example, for successful backend configuration, a front end application should be in a running state.
  • An environment in which Active Directory should be in a running state before other instances perform authentication.
  • A NAT instance should be in working state before private subnet instances try to fetch packages from the outside world.

When the WaitCondition resource is created, a timer is started. The WaitCondition becomes CREATE_COMPLETE after it receives a success signal. If no signal is received before the timeout, the WaitCondition enters the CREATE_FAILED state and the stack creation is rolled back.

CloudFormation Helper Configurations

To use WaitCondition with your CloudFormation template, you must have CloudFormation helper scripts configured on your instances. These helper scripts (cfn helper) are Python scripts that help you to install, configure and start services on your Amazon EC2 instances and are part of your stack creation process. If these scripts are not already configured on your Amazon EC2 instance, they can be configured as a part of your userdata.

Syntax:

{
   "Type" : "AWS::CloudFormation::WaitCondition",
   "Properties" : {
     "Count" : String,
     "Handle" : String,
     "Timeout" : String
   }
}

“Count” sets the number of success signals AWS CloudFormation must receive before it continues the stack creation process. If the wait condition does not receive the specified number of success signals before the Timeout period expires, CloudFormation assumes that the wait condition has failed and rolls the stack back.

“Handle” is a reference to the wait condition handle used to signal this wait condition. To use a wait condition in a stack, you have to declare an AWS::CloudFormation::WaitConditionHandle resource in the stack’s template. A wait condition handle has no properties; however, a reference to a WaitConditionHandle resource resolves to a presigned URL that you can use to signal success or failure to the WaitCondition.

Syntax:

{
"Type" : "AWS::CloudFormation::WaitConditionHandle",
"Properties" : {}
}

Anytime you add a WaitCondition resource during a stack update, you must associate the wait condition with a new WaitConditionHandle resource.

“Timeout” is the time (in seconds) to wait for the number of signals that the Count property specifies. The maximum time that can be specified for this property is 12 hours (43200 seconds). If you receive a positive signal before the timeout value, it will automatically stop the timer and execution of the template will start.

CloudFormation Helper Functions

For dynamically installing and configuring your application on Amazon EC2 instances, CloudFormation provides a set of helper scripts (written in Python) that, in conjunction with the resource metadata you defined in the template, can be used to install software and start services. These helper scripts are run on the Amazon EC2 instance.

This is how AWS’s CloudFormation documentation describes these helper scripts:

  • cfn-init: Retrieves and interprets the resource metadata to install packages, create files, and start services.
  • cfn-signal: A simple wrapper to signal an AWS CloudFormation WaitCondition for synchronizing other resources in the stack when the application is ready.
  • cfn-get-metadata: A wrapper script that retrieves either all metadata that is defined for a resource or path to a specific key or a subtree of the resource metadata.
  • cfn-hup: A daemon that checks for updates to metadata and executes custom hooks when changes are detected.

CloudFormation helper scripts are already available on Amazon Linux AMIs and Amazon Windows AMIs however, if you want to use them for other linux distributions, RPM and source code is available on AWS website. These scripts can be installed as a part of userdata.

If you create your own Windows image for use with CloudFormation you must set up a Windows instance with EC2ConfigService to work with the AWS CloudFormation bootstrapping tools.

Using WaitCondition on an Amazon Linux AMI Instance

It is recommend to use the latest version of the AWS CloudFormation bootstrap scripts when you launch an Amazon Linux AMI. To ensure that happens, add a yum update –y aws-cfn-bootstrap command to the user data script, as shown in the following example (a sample template using the ‘WaitConditions’ and ‘WaitCondition Handle’ Resources):

{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
   "MyInstance": {
     "Type": "AWS::EC2::Instance",
     "Properties": {
       "DisableApiTermination": "FALSE",
       "ImageId": "AmazonLinuxAMIId",
       "InstanceType": "t2.micro",
       "KeyName": "MyKeypair",
       "Monitoring": "false",
       "UserData": { "Fn::Base64" : { "Fn::Join" : ["", [
         "#!/bin/bash -xe\n",
         "yum update -y aws-cfn-bootstrap\n",
         "# Signal the status from cfn-init\n",
         "/opt/aws/bin/cfn-signal -e 0 -r \"Instance Creation Complete\" ", { "Ref" : "WaitHandle" },
         "'\n"
       ]]}},
       "Tags": [
         {
           "Key": "Name",
           "Value": "My_Instance"
         }
       ],
       "NetworkInterfaces": [
         {
           "DeleteOnTermination": "true",
           "Description": "Primary network interface",
           "DeviceIndex": 0,
           "AssociatePublicIpAddress": "true"
         }
       ]
     }
   },
   "WaitHandle" : {
     "Type" : "AWS::CloudFormation::WaitConditionHandle"
   },
   "WaitCondition" : {
     "Type" : "AWS::CloudFormation::WaitCondition",
     "DependsOn" : "MyInstance",
     "Properties" : {
         "Handle" : { "Ref" : "WaitHandle" },
         "Timeout" : "300"
       }
     }
}
}

Using WaitCondition on an Amazon Windows AMI instance

User data execution enables you to inject scripts into the instance metadata during the first launch. By default, all Amazon Windows AMIs have user data execution enabled for the initial boot. However, if you want to use any custom Windows AMI and want to enable userdata execution then you need to follow these instructions:

  1. Launch and connect to your Windows instance.
  2. From the Start menu, click All Programs, and then click EC2ConfigService Settings.
  3. On EC2 Service Properties under the Image tab, click on Shutdown with Sysprep regardless of the setting of the User Data check box under General
  4. After running Sysprep and shutting down the instance, you can create an AMI from the image.
  5. This new image is enabled with your custom userdata executed on every boot.

The following is a sample template for a Windows Base AMI using the ‘WaitConditions’ and ‘WaitCondition Handle’ resources.

{
"AWSTemplateFormatVersion": "2010-09-09",
"Resources": {
   "MyInstance": {
     "Type": "AWS::EC2::Instance",
     "Metadata" : {
       "AWS::CloudFormation::Init" : {
         "config" : {
           "files" : {
             "c:\\cfn\\cfn-hup.conf" : {
               "content" : { "Fn::Join" : ["", [
                 "[main]\n",
                 "stack=", { "Ref" : "AWS::StackId" }, "\n",
                 "region=", { "Ref" : "AWS::Region" }, "\n"
                 ]]}
             },
             "c:\\cfn\\hooks.d\\cfn-auto-reloader.conf" : {
               "content": { "Fn::Join" : ["", [
                 "[cfn-auto-reloader-hook]\n",
                 "triggers=post.update\n",
           "path=Resources.MyInstance.Metadata.AWS::CloudFormation::Init\n",
                "action=cfn-init.exe -v -s ", { "Ref" : "AWS::StackId" },
                                                 " -r MyInstance",
                                                 " --region ", { "Ref" : "AWS::Region" }, "\n"
               ]]}
            },
            "c:\\scripts\\test.ps1" : {
               "content": { "Fn::Join" : ["", [
                 "Write-Host Hello World!\n"
               ]]}
             }
           },
           "commands" : {
             "1-run-script" : {
               "command" : { "Fn::Join" : [ "", [
                "Powershell.exe Set-ExecutionPolicy Unrestricted -force \n",
                "Powershell.exe C:\\scripts\\test.ps1"
                  ]]}}
                },
                "services": {
                   "windows": {
                      "cfn-hup": {
                                "enabled": "true",
                                "ensureRunning": "true",
                                "files": ["c:\\cfn\\cfn-hup.conf", "c:\\cfn\\hooks.d\\cfn-auto-reloader.conf"]
                                                                }
                                     }
                                                }
         }
                                }
                },
     "Properties": {
       "DisableApiTermination": "FALSE",
       "ImageId": "WindowsBaseAMIId",
       "InstanceType": "t2.micro",
       "KeyName": "MyKeypair",
       "Monitoring": "false",
       "UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
         "<script>\n",
         "cfn-init.exe -v -s ", { "Ref" : "AWS::StackName" },
         " -r MyInstance",
         " --region ", { "Ref" : "AWS::Region" }, "\n",
         "cfn-signal.exe -e 0 ", { "Fn::Base64" : { "Ref" : "WindowsServerWaitHandle" }}, "\n",
         "</script>\n"
         ]]}},
       "Tags": [
         {
           "Key": "Name",
           "Value": "CloudAcademy_Instance"
         }
       ],
       "NetworkInterfaces": [
         {
           "DeleteOnTermination": "true",
           "Description": "Primary network interface",
           "DeviceIndex": 0,
           "AssociatePublicIpAddress": "true"
         }
       ]
     }
   },
   "WindowsServerWaitHandle": {
     "Type": "AWS::CloudFormation::WaitConditionHandle"
     },
   "WindowsServerWaitCondition": {
     "Type": "AWS::CloudFormation::WaitCondition",
     "DependsOn": "MyInstance",
     "Properties": {
         "Handle": { "Ref": "WindowsServerWaitHandle" },
         "Timeout": "1800"
       }
     }
}

 WaitCondition and DependsOn

The WaitCondition CloudFormation resource might look similar to the DependsOn attribute, but they’re actually different. DependsOn controls the order in which your CloudFormation resources are created, i.e., creation of a specific resource follows another. DependsOn doesn’t wait for success or failure signals from AWS resources before moving forward. While, on the other hand, WaitCondition waits for success signals from your AWS resources and resumes the execution of the CloudFormation template. However, WaitCondition and DependsOn can work together when there is a resource creation dependency requirement.

WaitCondition is a very useful AWS feature that’s widely used for building a complete automated deployment system. For more information on CloudFormation WaitCondition resource, refer to these links :

  1. AWS::CloudFormation::WaitCondition Resource
  2. Creating WaitConditions in a template

 

Avatar

Written by

Sanket Dangi

Head of Managed Services at REAN Cloud. Before joining REAN Cloud, I was CEO and Founder of StraightArc Solutions which was later acquired by REAN Cloud. I started my career working on cloud computing. Loves to talk about DevOps, System Administration, Scalability, High Availability, Disaster Recovery and Cloud Security. Apart from work, I love to meet people, travel and watch sports.


Related Posts

Alisha Reyes
Alisha Reyes
— January 6, 2020

New on Cloud Academy: Red Hat, Agile, OWASP Labs, Amazon SageMaker Lab, Linux Command Line Lab, SQL, Git Labs, Scrum Master, Azure Architects Lab, and Much More

Happy New Year! We hope you're ready to kick your training in overdrive in 2020 because we have a ton of new content for you. Not only do we have a bunch of new courses, hands-on labs, and lab challenges on AWS, Azure, and Google Cloud, but we also have three new courses on Red Hat, th...

Read more
  • agile
  • AWS
  • Azure
  • Google Cloud Platform
  • Linux
  • OWASP
  • programming
  • red hat
  • scrum
Alisha Reyes
Alisha Reyes
— December 24, 2019

Cloud Academy’s Blog Digest: Azure Best Practices, 6 Reasons You Should Get AWS Certified, Google Cloud Certification Prep, and more

Happy Holidays from Cloud Academy We hope you have a wonderful holiday season filled with family, friends, and plenty of food. Here at Cloud Academy, we are thankful for our amazing customer like you.  Since this time of year can be stressful, we’re sharing a few of our latest article...

Read more
  • AWS
  • azure best practices
  • blog digest
  • Cloud Academy
  • Google Cloud
Avatar
Guy Hummel
— December 12, 2019

Google Cloud Platform Certification: Preparation and Prerequisites

Google Cloud Platform (GCP) has evolved from being a niche player to a serious competitor to Amazon Web Services and Microsoft Azure. In 2019, research firm Gartner placed Google in the Leaders quadrant in its Magic Quadrant for Cloud Infrastructure as a Service for the second consecuti...

Read more
  • AWS
  • Azure
  • Google Cloud Platform
Alisha Reyes
Alisha Reyes
— December 10, 2019

New Lab Challenges: Push Your Skills to the Next Level

Build hands-on experience using real accounts on AWS, Azure, Google Cloud Platform, and more Meaningful cloud skills require more than book knowledge. Hands-on experience is required to translate knowledge into real-world results. We see this time and time again in studies about how pe...

Read more
  • AWS
  • Azure
  • Google Cloud
  • hands-on
  • labs
Alisha Reyes
Alisha Reyes
— December 5, 2019

New on Cloud Academy: AWS Solution Architect Lab Challenge, Azure Hands-on Labs, Foundation Certificate in Cyber Security, and Much More

Now that Thanksgiving is over and the craziness of Black Friday has died down, it's now time for the busiest season of the year. Whether you're a last-minute shopper or you already have your shopping done, the holidays bring so much more excitement than any other time of year. Since our...

Read more
  • AWS
  • AWS solution architect
  • AZ-203
  • Azure
  • cyber security
  • FCCS
  • Foundation Certificate in Cyber Security
  • Google Cloud Platform
  • Kubernetes
Avatar
Cloud Academy Team
— December 4, 2019

Understanding Enterprise Cloud Migration

What is enterprise cloud migration? Cloud migration is about moving your data, applications, and even infrastructure from your on-premises computers or infrastructure to a virtual pool of on-demand, shared resources that offer compute, storage, and network services at scale. Why d...

Read more
  • AWS
  • Azure
  • Data Migration
Wendy Dessler
Wendy Dessler
— November 27, 2019

6 Reasons Why You Should Get an AWS Certification This Year

In the past decade, the rise of cloud computing has been undeniable. Businesses of all sizes are moving their infrastructure and applications to the cloud. This is partly because the cloud allows businesses and their employees to access important information from just about anywhere. ...

Read more
  • AWS
  • Certifications
  • certified
Avatar
Andrea Colangelo
— November 26, 2019

AWS Regions and Availability Zones: The Simplest Explanation You Will Ever Find Around

The basics of AWS Regions and Availability Zones We’re going to treat this article as a sort of AWS 101 — it’ll be a quick primer on AWS Regions and Availability Zones that will be useful for understanding the basics of how AWS infrastructure is organized. We’ll define each section,...

Read more
  • AWS
Avatar
Dzenan Dzevlan
— November 20, 2019

Application Load Balancer vs. Classic Load Balancer

What is an Elastic Load Balancer? This post covers basics of what an Elastic Load Balancer is, and two of its examples: Application Load Balancers and Classic Load Balancers. For additional information — including a comparison that explains Network Load Balancers — check out our post o...

Read more
  • ALB
  • Application Load Balancer
  • AWS
  • Elastic Load Balancer
  • ELB
Albert Qian
Albert Qian
— November 13, 2019

Advantages and Disadvantages of Microservices Architecture

What are microservices? Let's start our discussion by setting a foundation of what microservices are. Microservices are a way of breaking large software projects into loosely coupled modules, which communicate with each other through simple Application Programming Interfaces (APIs). ...

Read more
  • AWS
  • Docker
  • Kubernetes
  • Microservices
Nisar Ahmad
Nisar Ahmad
— November 12, 2019

Kubernetes Services: AWS vs. Azure vs. Google Cloud

Kubernetes is a popular open-source container orchestration platform that allows us to deploy and manage multi-container applications at scale. Businesses are rapidly adopting this revolutionary technology to modernize their applications. Cloud service providers — such as Amazon Web Ser...

Read more
  • AWS
  • Azure
  • Google Cloud
  • Kubernetes
Avatar
Stuart Scott
— October 31, 2019

AWS Internet of Things (IoT): The 3 Services You Need to Know

The Internet of Things (IoT) embeds technology into any physical thing to enable never-before-seen levels of connectivity. IoT is revolutionizing industries and creating many new market opportunities. Cloud services play an important role in enabling deployment of IoT solutions that min...

Read more
  • AWS
  • AWS IoT Events
  • AWS IoT SiteWise
  • AWS IoT Things Graph
  • IoT