Navigating AWS CloudFormation with Confidence: A SysOps Admin's Playbook
Tags: cloudinfrastructure, infrastructureascode, aws, cloud
Published: 2023-10-12 16:33:48

Anyone who has explored building cloud solutions on any cloud platform, be it AWS, GCP, or Azure, has probably come in contact with an IaC (Infrastructure as Code) tool and witnessed how it made life in the cloud better. It's like discovering a versatile magic wand in the world of tech—a wand that SysOps administrators and other professionals wave to conjure entire cloud infrastructures, automate deployments, and orchestrate resources seamlessly. Among these enchanting tools, CloudFormatiom stands tall as one of the maestros of cloud orchestration.

In this symphony of IaC mastery on AWS, CloudFormation takes centre stage, offering cloud professionals the power to compose complex cloud symphonies with elegant ease. Picture it as your conductor's baton, allowing you to harmonize infrastructure components, ensuring they play in perfect unison, all while saving you time, enhancing security, and optimizing costs. This is an article in which we journey into the heart of CloudFormation, uncovering its secrets, exploring its nuances, and discovering how it empowers SysOps administrators to craft cloud infrastructures like genius composers, transforming the way we build and manage in the cloud. So, grab your baton, and let's begin this orchestration of AWS CloudFormation's wonderful capabilities.

As a tradition in all articles I put out, I always like to start with an overview of the topic of interest. With my little tradition at the top of my mind, here is an overview of CloudFormation.

CloudFormation is a vital tool for SysOps admins and other cloud professionals as it simplifies and streamlines the management of AWS infrastructure through code. It allows you to define and provision AWS resources and their configurations using templates, which are blueprints for the cloud. This brings consistency to infrastructure management, reduces manual errors, and enhances operational efficiency.

With CloudFormation, you can easily create, configure, and control AWS resources, ensuring they match the desired specifications. This wonderful service also supports the coordination of complex deployments, ensuring resources are provisioned in the correct order. CloudFormation treats infrastructure as code, making it easy to version-control and integrate into DevOps processes(check out [this article](https://medium.com/@mistazidane/what-is-devops-4f8253e58933) by a good friend of mine to learn more about what DevOps entails).

I hope that overview was good enough for you. It is time!! Time for what you might wonder. It is time for us to jump into the "CloudFormation pool" where we will explore the intricacies of the subject starting with CloudFormation Templates and Stacks.

## Templates and Stacks
CloudFormation templates make up its backbone, serving as the building blocks for defining and provisioning resources. These templates are written in either JSON or YAML format and follow a structured, declarative approach. In a template, you specify the AWS resources you need, their properties, and their relationships within a stack, all in a human-readable code format.

One of the key advantages of CloudFormation templates is their reusability. You can create modular templates for commonly used AWS resource patterns, making it easy to maintain consistency across your infrastructure. Templates can also incorporate parameters, allowing users to customize resource configurations when creating stacks (more on stacks soon just keep going :) ) based on the template. Additionally, templates can define outputs, facilitating communication between resources or even between stacks.

Overall, CloudFormation templates enable SysOps admins and developers to codify their AWS infrastructure requirements, automate resource provisioning, and maintain version-controlled blueprints of their cloud environments. This approach enhances efficiency, reduces manual errors, and promotes best practices in managing AWS resources at scale.

In CloudFormation, stacks serve as containers for resources defined in templates. Templates as we have seen specify the AWS resources and their configurations. When you create a stack based on a template, CloudFormation reads the template and provisions the specified resources according to the defined settings. Stacks are designed to simplify resource management, allowing for easy orchestration of complex infrastructures.

Stacks also handle resource dependencies, ensuring that resources are created or updated in the correct order. They can be scoped with their own permissions and IAM roles, enabling fine-grained access control. Moreover, stacks facilitate resource clean up – when you delete a stack, CloudFormation automatically removes all associated resources. This organizational approach streamlines resource provisioning, management, and cleanup, making it a fundamental concept for SysOps admin in AWS. Let us now take a deeper look into stacks.

## Stack Creation and Updates
Creating and managing stacks in CloudFormation involves two key phases. In the initial creation phase, you start by crafting a CloudFormation template, which acts as a blueprint for resource provisioning. This template defines the resources to be created and their configurations, all articulated in JSON or YAML format. With the template ready, you can go to the AWS Management Console, access the CloudFormation service, and initiate stack creation. During this process, you upload the template, provide essential stack details such as a name and parameters, and meticulously review the configuration to ensure accuracy. Upon confirmation, CloudFormation takes over, promptly provisioning the AWS resources specified in the template.

In the subsequent management phase, you can update existing stacks to modify your infrastructure. This begins with template adjustments to reflect the desired changes. Before implementing these changes, it's wise to create a change set — a preview of the changes to be made. The stack update is then executed, and CloudFormation systematically applies the updates to the resources. To maintain control during updates, you can employ resource-specific update policies. Continuous monitoring of the update progress, along with the safety net of rollback mechanisms in case of issues, ensures a secure and controlled evolution of the AWS infrastructure. Whether creating new stacks or managing existing ones, this process-driven approach streamlines resource provisioning and maintenance, providing you with the tools needed for efficient infrastructure management.

## Stack Policies and Rollbacks
Stack policies in CloudFormation offer a robust mechanism for finely controlling updates to resources within a stack. They are defined in JSON format and allow you to specify which actions are permitted or denied for individual resources. With the ability to set permissions as "Allow" or "Deny," you can create precise policies governing who can modify resources and under what conditions.

Stack policies are especially valuable for maintaining security and stability in your infrastructure. By using these policies, you can prevent unauthorized or accidental changes to critical resources, reducing the risk of disruptions. Additionally, stack policies give you the flexibility to set conditions, ensuring that updates occur only when specific circumstances are met. While powerful, stack policies should be thoughtfully crafted to avoid overly restrictive controls, striking the right balance between security and operational flexibility.

In case of failures during stack updates, AWS CloudFormation provides a robust rollback mechanism to automatically revert the stack to its previous state, ensuring that your infrastructure remains in a consistent and stable condition. This feature safeguards your resources from any unintended or disruptive changes. They are a crucial aspect of maintaining the reliability and integrity of your infrastructure. When a failure occurs during a stack update, CloudFormation carefully tracks the changes made and the state of resources. If any part of the update fails, CloudFormation will initiate a rollback, undoing the changes made during the update process and restoring the resources to their prior configurations.

Rollback behaviours can be configured to suit your specific needs. For example, you can specify whether the entire stack should be rolled back or only the resources affected by the update failure. You can also define rollback triggers, which are custom actions to take during a rollback, allowing you to address specific situations effectively. These robust rollback capabilities help maintain the stability of your resources and minimize the potential impact of failed updates, contributing to the reliability of your infrastructure.

## Nested Stacks and Cross-Stack References
Nested stacks offer a structured approach to managing complex infrastructures. By creating parent-child relationships within templates, they allow for a hierarchical structure. Each nested stack acts as a modular unit, simplifying resource organization and code reuse. This separation of concerns not only eases the management of intricate infrastructures but also promotes better dependency management. In addy, updates and rollbacks are isolated to the specific nested stack, minimizing the scope of changes and reducing potential risks. This approach results in more streamlined and maintainable templates for SysOps admins, making it easier to handle intricate infrastructure configurations.

Referencing resources from one stack in another stack in AWS CloudFormation can be achieved using cross-stack references. This enables you to create dependencies between resources in different stacks, ensuring they are properly linked. Here's how you can reference resources across stacks:

**Export Values**: In the source stack (the stack that contains the resource you want to reference), you need to export the value of the resource. To do this, add an Export declaration to the resource's definition in the CloudFormation template. This export declaration assigns a name to the value you want to share.
```json
 "Resources": {
   "MyResource": {
     "Type": "AWS::SomeResourceType",
     "Properties": {
       "Property1": "Value1",
       "Property2": "Value2"
     }
   }
 },
 "Outputs": {
   "ExportedValueName": {
     "Description": "Description of the exported value",
     "Value": { "Fn::GetAtt": ["MyResource", "AttributeToExport"] },
     "Export": { "Name": "ExportedValueName" }
   }
 }
```

**Import Values**: In the target stack (the stack where you want to reference the resource), you can import the exported value using the Fn::Import function in the CloudFormation template. This function allows you to access the exported value by its name.


```json
 "Resources": {
   "MyOtherResource": {
     "Type": "AWS::OtherResourceType",
     "Properties": {
       "Property1": { "Fn::Import": "ExportedValueName" }
     }
   }
 }
```
**Use the Referenced Value**: In the target stack, you can now use the imported value from the source stack within the properties of other resources. In this example, "MyOtherResource" has "Property1" set to the exported value from "MyResource" in the source stack. Referencing stacks like this provides a powerful way to modularize and organize your infrastructure, promoting a structured approach to handling complex architectures.

Now unto the last piece of our CloudFormation puzzle. By this, I don't mean we have covered all there is to know about CloudFormation and this is the last thing on that list. What it means is that what we are about to look at will be the last CloudFormation intricacy covered in this article. Capish?

## Stack Set and CloudFormation Drift Detection
Stack Sets in CloudFormation provide a centralized solution for orchestrating the deployment of CloudFormation stacks across numerous AWS accounts and regions. Operating from a single management account, organizations can efficiently manage, create, and maintain consistent stacks in diverse environments. This multi-account and multi-region capability is particularly advantageous for organizations with a distributed infrastructure or global presence, ensuring that resources are provisioned uniformly and effectively.

With Stack Sets, you define the CloudFormation template and its parameters in the management account, maintaining template consistency while allowing customized parameter values in member accounts. Access control is finely tuned using IAM, allowing for secure and permission-based stack management. These Stack Sets also offer automated rollback mechanisms, reducing the need for manual intervention in case of deployment issues. This powerful feature simplifies the deployment of CloudFormation stacks at scale, streamlining infrastructure management and promoting a structured and consistent approach to resource provisioning.

Let's drift to CloudFormation drift detection 😉. Drift Detection is a feature that plays a key role in keeping resources in line with their intended configurations. It allows you to identify discrepancies between the desired state articulated in CloudFormation templates and the actual state of deployed resources. This is particularly beneficial for SysOps admins and cloud engineers responsible for maintaining infrastructure consistency, ensuring that the actual resource configurations conform to what is specified in the templates.

Drift detection can be applied to a wide range of resource types, including AWS-managed resources like EC2 instances and RDS databases, as well as custom resources defined in CloudFormation templates. When you initiate a drift detection, CloudFormation generates a comprehensive report that carefully outlines the differences or inconsistencies between the intended and actual configurations. This report serves as a valuable reference for understanding the scope of configuration drift and provides insights into the specific resources that require attention.

Once a drift is identified, you have the flexibility to choose how to remediate these differences. This might involve updating the CloudFormation stack to match the desired configurations, manually adjusting individual resources, or utilizing automation mechanisms such as AWS Systems Manager Automation documents or Lambda functions to orchestrate custom remediation workflows. Drift detection, when used proactively, serves as an essential tool for compliance monitoring, particularly in regulated industries where adherence to specific configurations is of utmost importance. By setting up periodic drift detection, you can ensure that your infrastructure remains compliant and consistent, facilitating ongoing infrastructure management and alignment with organizational and regulatory standards.

## Last Words?
To end on a positive note, CloudFormation is more than just a tool for creating and managing resources in the cloud; it's a beacon of control and orchestration in an ever-expanding digital universe. As a SysOps administrator, you hold the conductor's baton, shaping the symphony of infrastructure with precision and flair. With CloudFormation, you wield a power that transforms complexity into simplicity, chaos into order, and potential into reality. It's your backstage pass to AWS, your trusted companion in the journey of digital orchestration, and your key to orchestrating the future. As you continue to navigate the cloud's dynamic pathways, remember that CloudFormation is your guide, your partner, and your creative canvas. So, keep orchestrating, keep innovating, and keep building the future of the cloud, one stack at a time. Until next time, GoodBye!