Cloudformation (13) (1)

Deploy AWS Configuration Along With Security Group And AutoScaling Group Using CloudFormation

Welcome back to the series of AWS Cloudformation For Beginners πŸ‘¨πŸ»β€πŸ’». In this blog we create launch configuration along with security group and autoscaling group.

If you are a beginner and want to start your journey towards infra-as-code developer as part of your devops role buckle up πŸš΄β€β™‚οΈ and lets get started and understand core cloudformation concepts by implementing it…🎬

🎨 Diagrammatic Representation 🎨

image.png

🌟Deploy Auto Scaling Group With Launch Config🌟

In this we are going to create launch configuration for our autoscaling with properties Image ID and Instance Type as mandatory properties.
πŸ”³Β Parameters:-
✦ PublicSubnets :- Using CommaDelimitedList parameters we can create a list of values of type string and pass it to arguments as a list.

Parameters:
  PublicSubnets:
    Type: CommaDelimitedList
    Description: The list of SubnetIds in your Virtual Private Cloud (VPC)
    Default: <subnet id 1>, <subnet id 2> #You can add multiple subnet ids here

πŸ”³Β Resources
✦ ASGSecurityGroup:- Creating Security group and enabling ingress with http and ssh port.
βž– GroupName:- This property is used to mention security group name.
βž– GroupDescription:- This property is used to mention security group description and its mandatory property for this resource.
βž– SecurityGroupIngress:- This property is used to add ingress rules for [udp/tcp] ports enabled secured access to your resources.
βž– Tags:- One of the most important property used in all resources. Alaways make sure to attach tags for all your resources.
✦ AsgConfig:- This resource is used to create pre-configured instance configuration which is later used by autoscaling group to deploy instances.
βž– ImageId:- This property is used to mention EC2 image ID based on which you want to launch your EC2 Instance.
βž– InstanceType:- This property is used to mention which type of instance you want to launch smal/medium/large based on your requirement.
βž– SecurityGroupIds:- This property is used to add list of security group you want to attach to your EC2 instance for enabling access control based on your security requirements.
βž– User Data: User data is user data/commands that you can specify at the time of launching your instance. These data/command executes after your EC2 instance starts. You don’t need to SSH into your EC2 instance and run those command one by one. Rather all you need is to specify the whole script in the user data section and they get executed once your instance boots up. You can use AWS CloudFormation to automatically install, configure, and start applications on Amazon EC2 instances. Doing so enables you to easily replicate deployments and update existing installations without connecting directly to the instance, which can save you a lot of time and effort.

Resources:
  ASGSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupName: AllowEC2TrafficForASG
      GroupDescription: Enable SSH access and HTTP access on the inbound port for launch configuration
      VpcId: <vpc id>  #Make sure this is same vpc id where your autoscaling group will launch
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 80
          ToPort: 80
          CidrIp: 0.0.0.0/0
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: 0.0.0.0/0
      Tags:
        - Key: Name
          Value: ASGSecurityGroup
  AsgConfig:
    Type: AWS::AutoScaling::LaunchConfiguration
    Properties:
      InstanceType: t2.micro
      SecurityGroups:
      - !Ref ASGSecurityGroup
      ImageId: "ami-04505e74c0741db8d"
      UserData:
        Fn::Base64: 
          !Sub |
            #!/bin/bash
            sudo su
            sudo apt-get update -y
            sudo apt-get install -y apache2
            sudo ufw allow -y 'Apache'
            sudo systemctl start apache2
            sudo systemctl enable apache2
            echo Hello Viewers from $(hostname -f) > /var/www/html/index.html

✦ AsgGroup:- This resource is used to launch autoscaling group to by using pre-defined launch configuration to achieve high availability.
βž– VPCZoneIdentifier:- Here you will have to define availability zones/subnetIds in which you want your instances to be launched and autoscaled.
βž– MinSize:- This is mandatory parameter and you need to define the min number of instances which should always be running as part of this autoscaling group.
βž– MaxSize:- This is mandatory parameter and you need to define the max number of instances till which autoscaling group can expand based on multiple scenarios.
βž– Tags:- One of the most important property used in all resources. Alaways make sure to attach tags for all your resources.

 AsgGroup:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      VPCZoneIdentifier: !Ref PublicSubnets
      LaunchConfigurationName: !Ref AsgConfig
      MinSize: '1'
      MaxSize: '2'
      HealthCheckGracePeriod: 300
      MaxInstanceLifetime: 2592000
      Tags:
        - Key: Name
          Value: AsgGroup
Β 

πŸ”³Β Outputs: Its always a best practice to print output for your resources.
✦ outputASGSecurityGroup:- Id of security group created for autoscaling launch configuration.
✦ outputAsgConfig:- Id for autoscaling launch configuration.
✦ outputAsgGroup:- Id for autoscaling group.

Outputs: 
  outputASGSecurityGroup: 
    Description: Id of security group created for autoscaling launch configuration
    Value: !Ref ASGSecurityGroup
  outputAsgConfig: 
    Description: Id for autoscaling launch configuration
    Value: !Ref AsgConfig
  outputAsgGroup: 
    Description: Id for autoscaling group
    Value: !Ref AsgGroup

πŸ”ŠΒ To view github code clickΒ here

NACL.png

1️⃣ Lets validate our template πŸ‘¨β€πŸ’»

aws cloudformation validate-template --template-body file://<file path>

2️⃣ After successful template verification lets create stack using our template πŸ‘¨β€πŸ’»

aws cloudformation create-stack --stack-name asglaunchconfig --template-body file://<file path>

3️⃣ Check if the stack we created via template is completed successfully πŸ‘¨β€πŸ’»

aws cloudformation list-stack-resources --stack-name asglaunchconfig

4️⃣ Describe stack and its resources to view its properties πŸ‘¨β€πŸ’»

aws cloudformation describe-stacks --stack-name asglaunchconfig
aws cloudformation describe-stack-resources --stack-name asglaunchconfig

5️⃣ Check events for stack formation πŸ‘¨β€πŸ’»

aws cloudformation describe-stack-events --stack-name asglaunchconfig

ELB (2).png

NACL (1).png

❗️❗️Important AWS Documentation To Be Viewed❗️❗️

⛔️ AWS::AutoScaling::LaunchConfiguration
⛔️ Supported AWS-specific parameter types
⛔️ AWS::AutoScaling::AutoScalingGroup
⛔️ AWS::EC2::SecurityGroup

πŸ₯πŸ₯ Conclusion πŸ₯πŸ₯

In this blog I have covered 3 resources in which we will create
✦ Security group for Autoscaling.
✦ Launch Configuration for EC2 instances with Userdata.
✦ Autoscaling group deployment with launch configuration created.
I have used AWS CLI command to deploy these template and trust me AWS CLI is the realtime hero and I would suggest you to get acquainted towards it. Going forward I will be releasing further parts to this CloudFormation journey

πŸ“’Β Stay tuned for my next blog…..

So, did you find my content helpful? If you did or like my other content, feel free to buy me a coffee. Thanks

Dheeraj_Pic1 (2)

Author - Dheeraj Choudhary

I am an IT Professional with 11+ years of experience specializing in DevOps & Build and Release Engineering, Software configuration management in automating, build, deploy and release. I blog about AWS and DevOps on my YouTube channel, which focuses on content such as, AWS, DevOps, open source, AI-ML and AWS community activities.

RELATED ARTICLES

Comments are closed.