<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ashwathy Nair</title>
    <description>The latest articles on Forem by Ashwathy Nair (@ashunair).</description>
    <link>https://forem.com/ashunair</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2876775%2F0f5d2442-0cd7-4862-a7a7-613b844ca1da.jpeg</url>
      <title>Forem: Ashwathy Nair</title>
      <link>https://forem.com/ashunair</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ashunair"/>
    <language>en</language>
    <item>
      <title>Deploy Scalable VPC Architecture on AWS Cloud</title>
      <dc:creator>Ashwathy Nair</dc:creator>
      <pubDate>Sun, 30 Mar 2025 06:08:52 +0000</pubDate>
      <link>https://forem.com/ashunair/deploy-scalable-vpc-architecture-on-aws-cloud-80i</link>
      <guid>https://forem.com/ashunair/deploy-scalable-vpc-architecture-on-aws-cloud-80i</guid>
      <description>&lt;h2&gt;
  
  
  Deploy a Modular and Scalable Virtual Network Architecture with Amazon VPC.
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Pre-Requisites&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1] &lt;strong&gt;AWS Account&lt;/strong&gt;: Ensure you have an AWS account with necessary permissions (IAM Role or User with privileges).&lt;br&gt;
2] &lt;strong&gt;Source Code&lt;/strong&gt;: Prepare the web application repository hosted on GitHub/ BitBucket.&lt;br&gt;
Source Code : &lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ashunair" rel="noopener noreferrer"&gt;
        ashunair
      &lt;/a&gt; / &lt;a href="https://github.com/ashunair/VPC-Architecture" rel="noopener noreferrer"&gt;
        VPC-Architecture
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Deploy the scale the VPC architecture using AWS 
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Deploy Scalable VPC Architecture on AWS Cloud&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer nofollow" href="https://raw.githubusercontent.com/ashunair/VPC-Architecture/refs/heads/main/VPC%20Architecture.svg"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fashunair%2FVPC-Architecture%2Frefs%2Fheads%2Fmain%2FVPC%2520Architecture.svg" alt="AWS-Cloud"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;TABLE OF CONTENTS&lt;/h3&gt;
&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href="https://github.com/NotHarshhaa/DevOps-Projects/blob/master/DevOps-Project-02/README.md#goal" rel="noopener noreferrer"&gt;Goal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/NotHarshhaa/DevOps-Projects/blob/master/DevOps-Project-02/README.md#pre-requisites" rel="noopener noreferrer"&gt;Pre-Requisites&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/NotHarshhaa/DevOps-Projects/blob/master/DevOps-Project-02/README.md#pre-deployment" rel="noopener noreferrer"&gt;Pre-Deployment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/NotHarshhaa/DevOps-Projects/blob/master/DevOps-Project-02/README.md#vpc-deployment" rel="noopener noreferrer"&gt;VPC Deployment&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/NotHarshhaa/DevOps-Projects/blob/master/DevOps-Project-02/README.md#validation" rel="noopener noreferrer"&gt;Validation&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Goal&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Deploy a Modular and Scalable Virtual Network Architecture with Amazon VPC.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Pre-Requisites&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;You must be having an &lt;a href="https://aws.amazon.com/" rel="nofollow noopener noreferrer"&gt;AWS account&lt;/a&gt; to create infrastructure resources on AWS cloud.&lt;/li&gt;
&lt;li&gt;Source Code&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Pre-Deployment&lt;/h2&gt;

&lt;/div&gt;
&lt;p&gt;Customize the application dependencies mentioned below on AWS EC2 instance and create the Golden AMI.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;AWS CLI&lt;/li&gt;
&lt;li&gt;Install Apache Web Server&lt;/li&gt;
&lt;li&gt;Install Git&lt;/li&gt;
&lt;li&gt;Cloudwatch Agent&lt;/li&gt;
&lt;li&gt;Push custom memory metrics to Cloudwatch.&lt;/li&gt;
&lt;li&gt;AWS SSM Agent&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;VPC Deployment&lt;/h2&gt;

&lt;/div&gt;
&lt;ol&gt;
&lt;li&gt;Build VPC network ( 192.168.0.0/16 ) for Bastion Host deployment as per the architecture shown above.&lt;/li&gt;
&lt;li&gt;Build VPC network ( 172.32.0.0/16 ) for deploying Highly Available and Auto Scalable application servers as per the architecture shown above.&lt;/li&gt;
&lt;li&gt;Create NAT Gateway in Public Subnet and update Private Subnet associated Route Table accordingly to route the default traffic to NAT for outbound internet connection.&lt;/li&gt;
&lt;li&gt;Create Transit Gateway and associate both…&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ashunair/VPC-Architecture" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Pre-Deployment
&lt;/h2&gt;

&lt;p&gt;3] &lt;strong&gt;Golden AMI&lt;/strong&gt;: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Launch an EC2 instance with a public subnet. (Ubuntu 24.0)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohto71r7ed2a3p476p7o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fohto71r7ed2a3p476p7o.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffrc2bip3waui6y4rz8h2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffrc2bip3waui6y4rz8h2.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;4] &lt;strong&gt;Install dependencies&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Update sudo and install Apache Web server, Git, CloudWatch Agent, and AWS SSM Agent.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Install Apache Web Server:&lt;br&gt;
&lt;code&gt;sudo yum install httpd&lt;br&gt;
sudo enable systemctl httpd &lt;br&gt;
sudo start systemctl httpd&lt;/code&gt; &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4e18s048cdwe8c3z4hkm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4e18s048cdwe8c3z4hkm.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmjayy8hh9qrd1ura1yw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffmjayy8hh9qrd1ura1yw.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Install Git &lt;br&gt;
&lt;code&gt;sudo yum install git -y&lt;br&gt;
git --version&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Install CloudWatch Agent&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;□ Download the CloudWatch Agent-  &lt;code&gt;sudo yum install amazon-cloudwatch-agent&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbn8b76aiomkysmdnltnz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbn8b76aiomkysmdnltnz.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;□ Configure and start the agent: - &lt;code&gt;sudo systemctl enable amazon-cloudwatch-agent&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqfvtqhhiwulvowssd0yq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqfvtqhhiwulvowssd0yq.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;□ Save the File: Ensure the file is saved at this path: &lt;code&gt;/opt/aws/amazon-cloudwatch-agent/bin/memory_metrics.json.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fknvcz2utpnsjhq22esq3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fknvcz2utpnsjhq22esq3.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;□ Example command to copy the file:  &lt;code&gt;sudo cp /home/ubuntu/VPC-Architecture/VPC Architecture/memory_metrics.json&lt;br&gt;
 /opt/aws/amazon-cloudwatch-agent/bin/memory_metrics.json&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;□ Apply the Configuration File: If you prefer to keep the file in the original location, run:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/home/ubuntu/VPC-Architecture/VPC\Architecture/memory_metrics.json -s&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6wg6ilrezvshv1gphsi1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6wg6ilrezvshv1gphsi1.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install AWS SSM Agent&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;□ Install the AWS SSM Agent - sudo yum install amazon-ssm-agent -y&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5bufns3xj9szetyujv57.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5bufns3xj9szetyujv57.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;□ Start and check status of cloud watch service: - &lt;br&gt;
  &lt;code&gt;sudo systemctl start amazon-cloudwatch-agent&lt;/code&gt;&lt;br&gt;
  &lt;code&gt;sudo systemctl status amazon-cloudwatch-agent&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6a8m2555br0rmucx6a2g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6a8m2555br0rmucx6a2g.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to the &lt;strong&gt;CloudWatch Dashboard&lt;/strong&gt; in AWS and go to &lt;strong&gt;Metrics&lt;/strong&gt;. You should see the custom metrics created.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5fqxakgxrsmm919nxex7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5fqxakgxrsmm919nxex7.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Check the CloudWatch logs captured in amazon-cloudwatch-agent.log&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbyqd2vm2zwy3yic831mu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbyqd2vm2zwy3yic831mu.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5] &lt;strong&gt;Create AMI - Amazon Master Image&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Navigate to the AWS EC2 Dashboard.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Stopped EC2 Instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From the Actions Menu, choose:&lt;br&gt;
□ Image and templates &amp;gt; Create Image.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide the following details:&lt;br&gt;
□ Image Name: Give your AMI a descriptive name, e.g., GoldenAMI-v1.&lt;br&gt;
□ Description: Mention what this AMI includes.&lt;br&gt;
□ No Reboot: Leave unchecked (default) to ensure a clean AMI.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click Create Image and wait for the process to complete.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs50rlvys5dt6ju228qsg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs50rlvys5dt6ju228qsg.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6] &lt;strong&gt;Test the Golden AMI&lt;/strong&gt; by launching new EC2 instance with created AMI &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Launch an EC2 Instance from the Golden AMI&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Log in to your AWS Management Console.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to the EC2 Dashboard.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on Launch Instance and choose My AMIs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select your Golden AMI and configure the instance settings:&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;□  Select an instance type (e.g., t2.micro for testing).&lt;br&gt;
   □  Attach the appropriate security group.&lt;br&gt;
   □  Assign a public IP for SSH testing.&lt;br&gt;
   □  Add necessary storage if required.&lt;br&gt;
   □  Assign an IAM role that matches your AMI's requirements (e.g., SSM access).&lt;br&gt;
   □ update the user data with script in the image&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqjq8wvkw07p6756dgm3q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqjq8wvkw07p6756dgm3q.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ry39l19mtxu3h2kqosa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ry39l19mtxu3h2kqosa.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7] &lt;strong&gt;Verify Connectivity&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Connect to the instance using SSH :ssh -i "key_name.pem" &lt;a href="mailto:ubuntu@ec2-18-222-53-96.us-east-2.compute.amazonaws.com"&gt;ubuntu@ec2-18-222-53-96.us-east-2.compute.amazonaws.com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new IAM role and assign to EC2&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Access the IAM Console&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the IAM Console.&lt;/li&gt;
&lt;li&gt;Click on the "Create role" button.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Specify Trusted Entity&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select trusted entity type: Choose AWS service.&lt;/li&gt;
&lt;li&gt;Use case for other AWS service: Select EC2.&lt;/li&gt;
&lt;li&gt;Click Next.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Attach Policies&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Search for and select the following policies: &lt;em&gt;AmazonSSMManagedInstanceCore&lt;/em&gt; (required for SSM functionality)   &lt;em&gt;CloudWatchAgentServerPolicy&lt;/em&gt; (if you're using CloudWatch Agent for monitoring).&lt;/li&gt;
&lt;li&gt;Click Next.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Add Tags (Optional)&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Add any tags if required for identification or cost tracking.&lt;/li&gt;
&lt;li&gt;Click Next.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Review and Create&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Provide a Role name: Example- &lt;strong&gt;EC2_SSM_Access_Role&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Review the permissions and confirm that AmazonSSMManagedInstanceCore is included.&lt;/li&gt;
&lt;li&gt;Click Create role.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Step 6: Attach Role to the EC2 Instance&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to the &lt;strong&gt;EC2 Console&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the instance you want to associate the role with.&lt;/li&gt;
&lt;li&gt;Click Actions &amp;gt; Security &amp;gt; &lt;strong&gt;Modify IAM Role&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select the newly created IAM role (&lt;strong&gt;EC2_SSM_Access_Role&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Click Update IAM role.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flv1h5dsu3is2uslkvzc4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flv1h5dsu3is2uslkvzc4.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Setup Permission for S3 bucket&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;□ Navigate to IAM, in the dashboard select Roles.&lt;br&gt;
□ Click Create Role.&lt;br&gt;
□ Select permission policies, AmazonS3ReadOnlyAccess and other required policies&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3sd9a4ihprf76m6u8lt7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3sd9a4ihprf76m6u8lt7.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  VPC Deployment
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Create VPC network ( 192.168.0.0/16 ) for Bastion Host deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faswfihgxgnrclmkydpzt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faswfihgxgnrclmkydpzt.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a VPC network ( 172.32.0.0/16 ) to deploy scalable application servers&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxft9mfrsqfa2c9okxxht.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxft9mfrsqfa2c9okxxht.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access the VPC dashboard to display the created VPC&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg6ayc3p7qp7b2x9a7d7v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg6ayc3p7qp7b2x9a7d7v.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create Internet gateways to attach the gateways to Bastion app (ed-vpc-01)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F47pwul4rtwobmlt4l4q7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F47pwul4rtwobmlt4l4q7.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F14p3bd8ixgv4w3v8nzwu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F14p3bd8ixgv4w3v8nzwu.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a public subnet for bastion app (ed-vpc-01) and configure the subnet &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp47vq1bxzao6rhdnv60x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp47vq1bxzao6rhdnv60x.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create a two public subnet and two private subnet for application server VPC (ed-vpc-02) with IP- 172.32.0.0/16 .&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Public Subnet 1 (ed-pub-sub-01)&lt;/strong&gt;: &lt;code&gt;172.32.1.0/24&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Public Subnet 2 (ed-pub-sub-02)&lt;/strong&gt;: &lt;code&gt;172.32.2.0/24&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private Subnet 1 (ed-priv-sub-01)&lt;/strong&gt;: &lt;code&gt;172.32.3.0/24&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Private Subnet 2 (ed-priv-sub-02)&lt;/strong&gt;: &lt;code&gt;172.32.4.0/24&lt;/code&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frfd5jz0z9q08xw8qde4i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frfd5jz0z9q08xw8qde4i.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fise2j5ohixbpjmskgca0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fise2j5ohixbpjmskgca0.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgdvyfh5zaliezca9i0y6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgdvyfh5zaliezca9i0y6.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fydnn2b8zr9rd60wi5spw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fydnn2b8zr9rd60wi5spw.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create NAT Gateway(ed-nat-gw-01) in Public Subnet (ed-pub-sub-02) and update Private Subnet  associated Route Table accordingly to route the default traffic to NAT for outbound internet connection.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwg1w9r498ovtlm76mac9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwg1w9r498ovtlm76mac9.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhua1vrbsy54qdawgpimi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhua1vrbsy54qdawgpimi.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create public route table (ed-rt-vpc-01-pub) for VPC (ed-vpc-01)&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs0qc6bh0r58cqhms6mc2.png" alt=" "&gt;
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fprnen8xi9931uck092al.png" alt=" "&gt;
&lt;/li&gt;
&lt;li&gt;Create public route table (ed-rt-vpc-02-pub) for VPC (ed-vpc-02) &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3vtcqtcgdwik00fuj0wd.png" alt=" "&gt;
&lt;/li&gt;
&lt;li&gt;Create private route table (ed-vpc-02-priv-01) for VPC (ed-vpc-02)
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi4byscy6ni68axacqx7h.png" alt=" "&gt;
&lt;/li&gt;
&lt;li&gt;Subnet associated with route table (ed-rt-vpc-02-pub)
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi7mrxm1tk6jgha963dav.png" alt=" "&gt;
&lt;/li&gt;
&lt;li&gt;Subnet associated with route table (ed-rt-vpc-01-pub) 
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqlo59hjyb1lazrrt8vy1.png" alt=" "&gt;
&lt;/li&gt;
&lt;li&gt;Subnet associated with route table (ed-rt-vpc-02-pub) 
&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvr9g1yi7r2due3zj98dt.png" alt=" "&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create Internet Gateway for each VPC and Public Subnet associated Route Table accordingly to route the default traffic to IGW for inbound/outbound internet connection.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ml599xuyyup7t620asy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ml599xuyyup7t620asy.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create Transit Gateway and associate both VPCs to the Transit Gateway for private communication.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4c7hsf6dcfjw1jr1hdn4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4c7hsf6dcfjw1jr1hdn4.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F40tkk65ziqbhpiteqcpd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F40tkk65ziqbhpiteqcpd.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1p5z8f7w7dajgnz9b0zd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1p5z8f7w7dajgnz9b0zd.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create Cloudwatch Log Group with two Log Streams to store the VPC Flow Logs of both VPCs and enable Flow Logs for both VPCs and push the Flow Logs to Cloudwatch Log Groups and store the logs in the respective Log Stream for each VPC.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgaro6q42qr8o2iqcv2n7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgaro6q42qr8o2iqcv2n7.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbrrypmef92zfoljaamet.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbrrypmef92zfoljaamet.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create Security Group for bastion host allowing port 22 from public.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8u3j7q39w3kdkxqm2qz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi8u3j7q39w3kdkxqm2qz.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0686qet7vxqltkh7nwvz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0686qet7vxqltkh7nwvz.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create Target Group (tg-01) and associate it with ASG.&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7srcmxbmvm2rq6cb301i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7srcmxbmvm2rq6cb301i.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create Network Load balancer in Public Subnet and add Target Group as target.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiqzb76idonapv0w6jjo3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiqzb76idonapv0w6jjo3.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6t2d4yw4xdb7uq99uuf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe6t2d4yw4xdb7uq99uuf.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftjycivnmne3c5w93t2yr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftjycivnmne3c5w93t2yr.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create Auto Scaling Group with Min: 2 Max: 4 with two Private Subnets associated to 1a and 1b zones.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F109fpgk95kmno4ptqy9e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F109fpgk95kmno4ptqy9e.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5on5bnrqy4uyp2gv61cb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5on5bnrqy4uyp2gv61cb.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9xyvyftqvnfboj4a7paw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9xyvyftqvnfboj4a7paw.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fno5yl85lye5c1dmzps3l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fno5yl85lye5c1dmzps3l.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Update route53 hosted zone with CNAME record routing the traffic to NLB. For that initially create record in Route53 &amp;gt; Hosted Zone &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11i51rl725sfp8untvhr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F11i51rl725sfp8untvhr.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Validation
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;As DevOps Engineer login to Private Instances via Bastion Host.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frmibl8g0056rqa6zd3mq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frmibl8g0056rqa6zd3mq.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Login to AWS Session Manager and access the EC2 shell from console.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1hfal3qiw93wk3sqfgzp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1hfal3qiw93wk3sqfgzp.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqnht0l1g4q1f3h1t1k2v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqnht0l1g4q1f3h1t1k2v.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloud</category>
      <category>devops</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Automated CI/CD pipeline to deploy app on Google cloud using GKE</title>
      <dc:creator>Ashwathy Nair</dc:creator>
      <pubDate>Fri, 21 Feb 2025 21:33:16 +0000</pubDate>
      <link>https://forem.com/ashunair/automated-cicd-pipeline-to-deploy-app-on-google-cloud-using-gke-5dm4</link>
      <guid>https://forem.com/ashunair/automated-cicd-pipeline-to-deploy-app-on-google-cloud-using-gke-5dm4</guid>
      <description>&lt;p&gt;In collaboration with &lt;em&gt;Disha Patel&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction:
&lt;/h2&gt;

&lt;p&gt;This document outlines the steps required to create a Cloud CICD pipeline to deploy a containerized application on Google Kubernetes Engine (GKE) by defining two environments — staging and production. Follow these steps to set up and manage your application in a GKE environment.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Code reference:&lt;/p&gt;
&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fassets.dev.to%2Fassets%2Fgithub-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/ashunair" rel="noopener noreferrer"&gt;
        ashunair
      &lt;/a&gt; / &lt;a href="https://github.com/ashunair/CICD-Pipeline" rel="noopener noreferrer"&gt;
        CICD-Pipeline
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Google Cloud Platform based CI-CD pipeline
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;
&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Cloud CI/CD Pipeline Deployment on GKE&lt;/h1&gt;

&lt;/div&gt;
&lt;p&gt;&lt;a rel="noopener noreferrer" href="https://private-user-images.githubusercontent.com/46412699/415829335-9e034a4f-39c7-4c8e-9ebd-3ff27ec252ea.jpg?jwt=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NDMwOTE0MzksIm5iZiI6MTc0MzA5MTEzOSwicGF0aCI6Ii80NjQxMjY5OS80MTU4MjkzMzUtOWUwMzRhNGYtMzljNy00YzhlLTllYmQtM2ZmMjdlYzI1MmVhLmpwZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAzMjclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMzI3VDE1NTg1OVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWNkOGIzZTdhNmNlOTFiODExZWVkMDQzZjNlODVkYWZjNzM2MTRkZDdlNjdjM2YzZWZlYzIyNjM0Zjk3MDdiMTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.3ubG26ByKKgL0eSfULghanxN-29w0bGRLH_pBrtsB78"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fprivate-user-images.githubusercontent.com%2F46412699%2F415829335-9e034a4f-39c7-4c8e-9ebd-3ff27ec252ea.jpg%3Fjwt%3DeyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpc3MiOiJnaXRodWIuY29tIiwiYXVkIjoicmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbSIsImtleSI6ImtleTUiLCJleHAiOjE3NDMwOTE0MzksIm5iZiI6MTc0MzA5MTEzOSwicGF0aCI6Ii80NjQxMjY5OS80MTU4MjkzMzUtOWUwMzRhNGYtMzljNy00YzhlLTllYmQtM2ZmMjdlYzI1MmVhLmpwZz9YLUFtei1BbGdvcml0aG09QVdTNC1ITUFDLVNIQTI1NiZYLUFtei1DcmVkZW50aWFsPUFLSUFWQ09EWUxTQTUzUFFLNFpBJTJGMjAyNTAzMjclMkZ1cy1lYXN0LTElMkZzMyUyRmF3czRfcmVxdWVzdCZYLUFtei1EYXRlPTIwMjUwMzI3VDE1NTg1OVomWC1BbXotRXhwaXJlcz0zMDAmWC1BbXotU2lnbmF0dXJlPWNkOGIzZTdhNmNlOTFiODExZWVkMDQzZjNlODVkYWZjNzM2MTRkZDdlNjdjM2YzZWZlYzIyNjM0Zjk3MDdiMTMmWC1BbXotU2lnbmVkSGVhZGVycz1ob3N0In0.3ubG26ByKKgL0eSfULghanxN-29w0bGRLH_pBrtsB78" alt="Revised of CI_CD Pipeline"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Overview&lt;/h3&gt;

&lt;/div&gt;
&lt;p&gt;This project provides a step-by-step guide to building a Cloud CI/CD pipeline for deploying a containerized application on &lt;strong&gt;Google Kubernetes Engine (GKE)&lt;/strong&gt;. It covers the setup of &lt;strong&gt;staging and production environments&lt;/strong&gt;, ensuring smooth and automated deployments using Google Cloud services.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;Key Highlights:&lt;/h3&gt;

&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;GKE Cluster Setup&lt;/strong&gt;: Creating Kubernetes clusters for staging and production.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Artifact Registry Configuration&lt;/strong&gt;: Storing and managing Docker images.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Build Integration&lt;/strong&gt;: Automating build and deployment pipelines.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Deploy Setup&lt;/strong&gt;: Managing continuous deployment to GKE.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Skaffold for Kubernetes Automation&lt;/strong&gt;: Simplifying deployment processes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;GitHub to Cloud Build Triggers&lt;/strong&gt;: Enabling automated deployments on code commits.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This project is available on &lt;strong&gt;Devpost Blog&lt;/strong&gt;: &lt;a href="https://dev.to/ashunair/automated-cicd-pipeline-to-deploy-app-on-google-cloud-using-gke-5dm4" rel="nofollow"&gt;Documentation Link&lt;/a&gt; with detailed explanations and images to guide you through each step. For the complete implementation, refer to this &lt;strong&gt;code repository&lt;/strong&gt;: &lt;a href="https://github.com/ashunair/CICD-Pipeline.git" rel="noopener noreferrer"&gt;GitHub Repo&lt;/a&gt;.&lt;/p&gt;
&lt;/div&gt;

  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/ashunair/CICD-Pipeline" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Setup Google Cloud SDK(required if you are pushing your code from local/on-prem)
&lt;/h2&gt;

&lt;p&gt;Ensure you have Google Cloud SDK installed on your machine. This includes &lt;code&gt;gcloud&lt;/code&gt; and &lt;code&gt;kubectl&lt;/code&gt; command-line tools. Note that us-central1 is used across all the services in this project.&lt;br&gt;
Configure gcloud when using Cloud Shell&lt;br&gt;
Authenticate and set the project you want to work with using the commands: &lt;code&gt;gcloud auth login&lt;/code&gt; and &lt;code&gt;gcloud config set project [YOUR_PROJECT_ID]&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  1. Create a GKE Cluster
&lt;/h3&gt;

&lt;p&gt;Create two Kubernetes cluster in GKE using the command with different naming conventions to identify the environments:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gcloud container clusters create [CLUSTER_NAME] — zone [ZONE] — num-nodes [NUM_NODES] — machine-type e2-medium — disk-size 10GB&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gcloud container clusters create stg-pipeline  --zone us-central1-a --num-nodes 2 --machine-type e2-small  --disk-size 10GB&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft0pt985t6ze2z118xejo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft0pt985t6ze2z118xejo.png" alt="1.1" width="800" height="137"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;1.1 — Creating cluster using Cloud Shell&lt;/center&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdsiayk911hn4vj3npzix.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdsiayk911hn4vj3npzix.png" alt="1.2 — Kubernetes Clusters for Staging and Prod" width="800" height="278"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;1.2 — Kubernetes Clusters for Staging and Prod&lt;/center&gt;
&lt;h3&gt;
  
  
  2. Setup Artifact Registry
&lt;/h3&gt;

&lt;p&gt;Create a repository to store the docker images. Choose Docker in format, region should be us-central1 and keep rest as default.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1lat87qqr4kzi6n6lqo0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1lat87qqr4kzi6n6lqo0.png" alt="2.1 — Docker Artifact Repository" width="800" height="132"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;2.1 — Docker Artifact Repository&lt;/center&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9pktoehk1t8c3hue1y8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb9pktoehk1t8c3hue1y8.png" alt="2.2 — Docker Artifact Repository Metadata" width="800" height="186"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;2.2 — Docker Artifact Repository Metadata&lt;/center&gt;
&lt;h3&gt;
  
  
  3. File setup
&lt;/h3&gt;

&lt;p&gt;Create git repo for your website and follow below mentioned file structure:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;.&lt;br&gt;
└── CICD-Pipeline/&lt;br&gt;
├── Demo/&lt;br&gt;
│ └── Index.html&lt;br&gt;
├── DockerFile&lt;br&gt;
├── cloudbuild. yaml&lt;br&gt;
├── clouddeploy.yaml&lt;br&gt;
├── kubernetes.yaml&lt;br&gt;
└── skaffold.yaml&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;3.1 Create a Dockerfile:&lt;/strong&gt;&lt;br&gt;
Here is a step by step guild about how to define your Dockerfile. However, below is all we need for this project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM nginx:alpine
COPY ./demo /usr/share/nginx/html 
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;FROM nginx:alpine&lt;/code&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This sets the base image as the official &lt;strong&gt;Nginx Alpine&lt;/strong&gt; image.
&lt;/li&gt;
&lt;li&gt;Alpine is a minimal &lt;strong&gt;Linux distribution&lt;/strong&gt;, making the image &lt;strong&gt;smaller and more efficient&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;COPY ./demo /usr/share/nginx/html&lt;/code&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This copies the local &lt;code&gt;./demo&lt;/code&gt; directory (which contains &lt;strong&gt;static files&lt;/strong&gt; like HTML, CSS, JavaScript) into the &lt;strong&gt;Nginx default document root&lt;/strong&gt; at &lt;code&gt;/usr/share/nginx/html&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;EXPOSE 80&lt;/code&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This declares that the container will &lt;strong&gt;listen on port 80&lt;/strong&gt; (default HTTP port).
&lt;/li&gt;
&lt;li&gt;However, this does &lt;strong&gt;not actually publish&lt;/strong&gt; the port — it just informs Docker that this port is &lt;strong&gt;intended to be exposed&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;CMD ["nginx", "-g", "daemon off;"]&lt;/code&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This is the &lt;strong&gt;command that runs&lt;/strong&gt; when the container starts.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;nginx&lt;/strong&gt; is started with the &lt;code&gt;-g "daemon off;"&lt;/code&gt; flag to keep it &lt;strong&gt;running in the foreground&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;This prevents the container from &lt;strong&gt;exiting immediately&lt;/strong&gt;, ensuring that &lt;strong&gt;Nginx stays active&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;3.2 Create cloudbuild.yaml&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;steps:
# 1. Docker Build
- name: 'gcr.io/cloud-builders/docker'
  args: ['build', '-t', 'us-central1-docker.pkg.dev/innate-valor-451418-i0/app-repo/cicd-app:$SHORT_SHA', '.']
# 2. Docker Push
- name: 'gcr.io/cloud-builders/docker'
  args: ["push", "us-central1-docker.pkg.dev/innate-valor-451418-i0/app-repo/cicd-app:$SHORT_SHA"]

# 3. create cloud deploy pipeline 
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: 'bash'
  args:
    - '-c'
    - |
      if ! gcloud deploy delivery-pipelines describe demopipeline --region=us-central1 &amp;amp;&amp;gt; /dev/null; then
        echo "Creating Cloud Deploy pipeline..."
        gcloud deploy apply --file=clouddeploy.yaml --region=us-central1 --project=$PROJECT_ID
      else
        echo "Cloud Deploy pipeline already exists."
      fi
# 4. cloud deploy pipeline release 
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
  entrypoint: 'bash'
  args:
  - '-c'
  - &amp;gt;
    gcloud deploy releases create release-$BUILD_ID
    --delivery-pipeline=cicd-app
    --region=us-central1
    --source=./
    --images=sample-app=us-central1-docker.pkg.dev/innate-valor-451418-i0/app-repo/cicd-app:$SHORT_SHA

# 5. Logging Configuration
options:
  logging: CLOUD_LOGGING_ONLY
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Docker Build&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This step builds a Docker image from the current directory (.).
&lt;/li&gt;
&lt;li&gt;The image is tagged with a unique identifier &lt;code&gt;$SHORT_SHA&lt;/code&gt; (a short commit hash) to track different builds.
&lt;/li&gt;
&lt;li&gt;The image is stored in Artifact Registry under:
&lt;code&gt;us-central1-docker.pkg.dev/chrome-sum-415007/demopipeline/demopipeline:$SHORT_SHA&lt;/code&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Docker Push&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;This step pushes the built Docker image to google artifact registry, making it available for deployment.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create Cloud Deploy Pipeline&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Checks if the Google Cloud Deploy pipeline named &lt;code&gt;demopipeline&lt;/code&gt; exists.
&lt;/li&gt;
&lt;li&gt;If it does not exist, it creates the pipeline using &lt;code&gt;clouddeploy.yaml&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;If it already exists, it skips creation.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Create a New Release for Deployment&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates a new release in Google Cloud Deploy named &lt;code&gt;release-$BUILD_ID&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Uses the &lt;code&gt;demopipeline&lt;/code&gt; to deploy the newly built image.
&lt;/li&gt;
&lt;li&gt;References the container image from artifact registry.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Logging Configuration&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Ensures logs are stored in google cloud logging only.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;3.3 Create a clouddeploy.yaml:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 1. Delivery Pipeline Definition
apiVersion: deploy.cloud.google.com/v1beta1
kind: DeliveryPipeline
metadata:
 name: cicd-app
description: cicd-app application 
serialPipeline:
 stages:
 - targetId: staging
 - targetId: prod
---

# 2. Staging Environment Target

apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
 name: staging
description: "staging cluster"
gke:
 cluster: projects/innate-valor-451418-i0/locations/us-central1-a/clusters/stg-pipeline
---

# 3. Production Environment Target

apiVersion: deploy.cloud.google.com/v1beta1
kind: Target
metadata:
 name: prod
description: prod cluster
requireApproval: true
gke:
 cluster: projects/innate-valor-451418-i0/locations/us-central1-a/clusters/prod-pipeline
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Delivery Pipeline Definition&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defines the cloud deploy pipeline named &lt;code&gt;demopipeline&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Uses a serial pipeline (deploys sequentially).
&lt;/li&gt;
&lt;li&gt;Has two stages:
&amp;gt; &lt;strong&gt;staging&lt;/strong&gt; (first deployment stage)
&amp;gt; &lt;strong&gt;prod&lt;/strong&gt; (final production stage)
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Staging Environment Target&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defines a &lt;strong&gt;staging environment&lt;/strong&gt; in a GKE cluster.
&lt;/li&gt;
&lt;li&gt;Cluster location: &lt;code&gt;us-central1&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;This is the first step in the pipeline.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Production Environment Target&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defines the &lt;strong&gt;production environment&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Uses a separate GKE cluster in &lt;code&gt;us-central1-a&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;requireApproval: true&lt;/code&gt; → Requires manual approval before deploying to production.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;3.4 Create Kubernetes Deployment and Service yaml file&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 1. Deployment Configuration

apiVersion: apps/v1
kind: Deployment
metadata:
  name: web-app
spec:
  replicas: 2
  selector:
    matchLabels:
      app: web-app
  template:
    metadata:
      labels:
        app: web-app
    spec:
      containers:
        - name: web-app
          image: sample-app
          ports:
            - containerPort: 80
---
# 2. Service Configuration

apiVersion: v1
kind: Service
metadata:
  name: web-app
spec:
  type: LoadBalancer
  selector:
    app: web-app
  ports:
    - port: 80
      targetPort: 80
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deployment Configuration&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates a Deployment named &lt;code&gt;demopipeline&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Runs 2 replicas for high availability.
&lt;/li&gt;
&lt;li&gt;Uses label selectors (&lt;code&gt;app: demopipeline&lt;/code&gt;) to identify Pods.
&lt;/li&gt;
&lt;li&gt;Deploys a container with the name &lt;code&gt;demopipeline&lt;/code&gt;, using the image &lt;code&gt;sample-app&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Exposes port 80 inside the container for web traffic.
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Service Configuration&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Creates a Service named &lt;code&gt;demopipeline&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Exposes the application externally using a &lt;strong&gt;LoadBalancer&lt;/strong&gt;.
&lt;/li&gt;
&lt;li&gt;Routes traffic to Pods matching &lt;code&gt;app: demopipeline&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;Listens on port 80 and forwards requests to port 80 inside the Pods.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;3.5 Create Skaffold manifest file to automate Kubernetes deployments&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# 1. Skaffold Configuration Overview

apiVersion: skaffold/v2beta16
kind: Config
metadata:
  name: web-app

# 2. Build Configuration

build:
  artifacts:
  - image: sample-app
    context: .
    docker:
      dockerfile: Dockerfile
  tagPolicy:
    gitCommit: {}
  local:
    useBuildkit: false

# 3. Deployment Configuration

deploy:
  kubectl:
    manifests:
    - kubernetes.yaml

# 4. Profile Configuration (For Google Cloud Build)

profiles:
- name: gcb

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Skaffold Configuration Overview&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defines Skaffold configuration (v2beta16 API version).
&lt;/li&gt;
&lt;li&gt;The project name is &lt;code&gt;demopipeline&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Build Configuration&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;build:&lt;/strong&gt; Defines how to build the container image for the application.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;artifacts:&lt;/strong&gt; Uses the &lt;code&gt;Dockerfile&lt;/code&gt; in the current directory and builds the Docker image as &lt;code&gt;sample-app&lt;/code&gt;.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;tagPolicy:&lt;/strong&gt; Uses the Git commit hash (&lt;code&gt;gitCommit: {}&lt;/code&gt;) for tagging images, ensuring unique versions.
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;local:&lt;/strong&gt; Local Docker build.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Deployment Configuration&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uses &lt;code&gt;kubectl&lt;/code&gt; to deploy the application to Kubernetes.
&lt;/li&gt;
&lt;li&gt;Deploys the &lt;code&gt;kubernetes.yaml&lt;/code&gt; file, which likely contains a Deployment and Service definition.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Profile Configuration (For Google Cloud Build)&lt;/strong&gt;  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Defines a Skaffold profile named &lt;code&gt;gcb&lt;/code&gt; (Google Cloud Build).
&lt;/li&gt;
&lt;li&gt;Profiles allow different environments (e.g., local vs. cloud) by specifying different build and deployment settings.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Now that we have a Skaffold-based Kubernetes deployment pipeline, the next step is to &lt;em&gt;automate the build and deployment process&lt;/em&gt; using GitHub and cloud build. When code is pushed and committed to GitHub, it should automatically trigger Cloud Build, which will:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ Build the Docker image using the &lt;code&gt;cloudbuild.yaml&lt;/code&gt; file.
&lt;/li&gt;
&lt;li&gt;✅ Push the image to Google Artifact Registry.
&lt;/li&gt;
&lt;li&gt;✅ Deploy the application to Kubernetes using Google Cloud Deploy.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Set Up a Cloud Build Trigger in Google Cloud
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;4.1 Setup connection from GitHub to Cloud Build&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0022s0hmm084rkldg7or.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0022s0hmm084rkldg7or.png" alt="4.1.1 — Connecting a GitHub repository to Google Cloud Build triggers." width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;4.1.1 — Connecting a GitHub repository to Google Cloud Build triggers.&lt;/center&gt;

&lt;ul&gt;
&lt;li&gt;Go to Google Cloud Console → Navigate to Cloud Build.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;Triggers&lt;/strong&gt; → &lt;strong&gt;Create Trigger&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Select &lt;strong&gt;“Connect Repository”&lt;/strong&gt; and link your GitHub repository.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4.2 Configure the Trigger&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1l92m8t6lmz4iurnz80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu1l92m8t6lmz4iurnz80.png" alt="4.2.1" width="800" height="789"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;4.2.1 — Configuring a Cloud Build trigger in Google Cloud&lt;/center&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ys8ugsme9e9b8rjkror.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1ys8ugsme9e9b8rjkror.png" alt="4.2.2" width="800" height="134"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;4.2.2 — Cloud Build Trigger&lt;/center&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Trigger Type:&lt;/strong&gt; Push to a branch (e.g., &lt;code&gt;main&lt;/code&gt; or &lt;code&gt;dev&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Branch Filter:&lt;/strong&gt; Set it to &lt;code&gt;main&lt;/code&gt; or any specific branch.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build Configuration:&lt;/strong&gt; Choose &lt;strong&gt;“cloudbuild.yaml”&lt;/strong&gt; (it should already exist in the repo).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Service Account:&lt;/strong&gt; Use a service account with Cloud Build, Artifact Registry, and Cloud Deploy permissions.&lt;/li&gt;
&lt;li&gt;Save the trigger and test it with a sample push.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  5. Final Execution
&lt;/h3&gt;

&lt;p&gt;The setup is complete, and when new code is pushed to the selected branch (e.g., staging), it will trigger Cloud Build, which interacts with the cloudbuild.yaml file and executes the steps sequentially.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7w84fie03yi4508frqi6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7w84fie03yi4508frqi6.png" alt="5.1" width="800" height="206"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;5.1 — Cloud Build waiting for approval&lt;/center&gt;

&lt;p&gt;Here, as I have set up approval to execute the build, each time new code is committed, it will require approval before proceeding. Once approved, it will run the commands mentioned in cloudbuild.yaml. For detailed information, refer to section 3.2 above.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvhef8c6kyt789jbeeejv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvhef8c6kyt789jbeeejv.png" alt="5.2" width="800" height="228"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;5.2— Cloud Build Succeeded&lt;/center&gt;

&lt;p&gt;You will see the release in Staging here in Cloud Deploy:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmhvhpsycby28394hm80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsmhvhpsycby28394hm80.png" alt="5.3" width="800" height="187"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;5.3 — Delivery Pipeline created&lt;/center&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fodmivqi4466c4bbtgphq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fodmivqi4466c4bbtgphq.png" alt="5.4" width="800" height="296"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;5.4 — Release in Staging&lt;/center&gt;

&lt;p&gt;And with that, workload is created in GKE Cluster:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz3ag57awmhij9v06ofjy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz3ag57awmhij9v06ofjy.png" alt="5.5" width="800" height="169"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;5.5 — Workload created in GKE&lt;/center&gt;

&lt;p&gt;Inside the workload, you can see the endpoint created. Click on the IP to see your webpage(index.html in this project). &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ai77ex6qyqr39t1ktr0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F0ai77ex6qyqr39t1ktr0.png" alt="5.6" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;5.6 — Endpoint IP highlighted&lt;/center&gt;
&lt;br&gt;
Now, navigate to Cloud Deploy and you can promote it to Production. It will require an approval.

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F50dwnbpbbnnt67lm5ghm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F50dwnbpbbnnt67lm5ghm.png" alt="5.7" width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;5.7 — Getting ready for Prod Release&lt;/center&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fokwx7s40koft0gv24jja.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fokwx7s40koft0gv24jja.png" alt="5.8" width="800" height="568"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;5.8 — Approval required for Prod Release&lt;/center&gt;

&lt;p&gt;Hence after the prod environment is approved, again you can see the release in GKE Workload for Prod.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F371ioame5450hy7v3bfc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F371ioame5450hy7v3bfc.png" alt="5.9" width="800" height="168"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;5.9 — Prod release in GKE&lt;/center&gt;

&lt;p&gt;Thus, it will create another service endpoint for Prod.&lt;/p&gt;

&lt;h3&gt;
  
  
  6 Additional Steps:
&lt;/h3&gt;

&lt;p&gt;Since vulnerabilities can be introduced into the artifact during the architecture phase, we enable the Container Scanning API to scan Docker images and detect any anomalies.  &lt;/p&gt;

&lt;p&gt;Additionally, we set up monitoring alerts for the approval process when transitioning from staging (STG) to production (PROD). This includes configuring an email approval system and integrating Slack notifications for approvals.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps to add notification channel in Google Cloud using email:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open Cloud Monitoring → Go to alerting.&lt;/li&gt;
&lt;li&gt;Edit Notification Channels → Click Add New under Email.&lt;/li&gt;
&lt;li&gt;Add Email Address → Enter approval email &amp;amp; click Save.&lt;/li&gt;
&lt;li&gt;From the cloud console, go to the &lt;strong&gt;delivery pipeline&lt;/strong&gt; and select the pipeline.&lt;/li&gt;
&lt;li&gt;To configure alerts, select &lt;strong&gt;recommended alerts&lt;/strong&gt; and set appropriate required policies.&lt;/li&gt;
&lt;li&gt;Select the email channel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create Policy&lt;/strong&gt; → Alerts will now trigger email notifications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdorimq9yrgji5tdhzd68.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdorimq9yrgji5tdhzd68.png" alt="6.1" width="800" height="372"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;6.1 Creating email notification channel&lt;/center&gt;

&lt;p&gt;&lt;strong&gt;Steps to add notification channel in Google Cloud by integrating Slack:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open Cloud Monitoring → Go to alerting.&lt;/li&gt;
&lt;li&gt;Edit Notification Channels → Click Add New under &lt;strong&gt;Slack&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;This will pop-up a new window for permission to Slack app → Allow.&lt;/li&gt;
&lt;li&gt;Add Slack channel → Save.&lt;/li&gt;
&lt;li&gt;From the cloud console, go to the &lt;strong&gt;delivery pipeline&lt;/strong&gt; and select the pipeline.&lt;/li&gt;
&lt;li&gt;To configure alerts, select &lt;strong&gt;recommended alerts&lt;/strong&gt; and set appropriate required policies.&lt;/li&gt;
&lt;li&gt;Select the Slack channel.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Create Policy&lt;/strong&gt; → Alerts will now trigger Slack notifications.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F72gea6u6ed8wsaltg27r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F72gea6u6ed8wsaltg27r.png" alt="6.2" width="800" height="355"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;6.2 Permission access to Slack app via Google Cloud&lt;/center&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2st3wi51wgsfv2hj8w2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ft2st3wi51wgsfv2hj8w2.png" alt="6.3" width="709" height="728"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;6.3 Setting Slack notification channel in GCP&lt;/center&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3eciri4fbmvm6f3qetgy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3eciri4fbmvm6f3qetgy.png" alt="6.4" width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;6.4 Creating policy to set up email and Slack alerts&lt;/center&gt;

&lt;p&gt;Whenever a new commit is made to the code in the delivery pipeline, the alert notification will be sent to the email and Slack channel.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3ihan1n0n5y2ggvqhnr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy3ihan1n0n5y2ggvqhnr.png" alt="6.5" width="800" height="302"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;6.5 CI/CD pipeline approval pending to PRD&lt;/center&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexcmho2u1s211ms5jt1u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fexcmho2u1s211ms5jt1u.png" alt="6.6" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;6.6  CI/CD pipeline approval alert notification in email&lt;/center&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgavanu7njokw8nu300j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpgavanu7njokw8nu300j.png" alt="6.7" width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;center&gt;6.7  CI/CD pipeline approval alert notification in slack channel&lt;/center&gt;

&lt;p&gt;🎉&lt;em&gt;&lt;strong&gt;Phewwww&lt;/strong&gt;&lt;/em&gt; 😮‍💨... &lt;em&gt;&lt;strong&gt;the hard work paid off&lt;/strong&gt;&lt;/em&gt; 🎉  &lt;/p&gt;

&lt;p&gt;Finally, you have successfully automated your CI/CD pipeline! 🚀&lt;br&gt;&lt;br&gt;
Now sit back, grab a coffee ☕, and watch the magic happen—because from now on, your code will deploy itself 😎 &lt;/p&gt;

&lt;p&gt;Got any questions or need help troubleshooting? Drop them below! ⬇️💬&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;References:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/build/docs/configuring-builds/create-basic-configuration" rel="noopener noreferrer"&gt;Create a build configuration file&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/monitoring/support/notification-options" rel="noopener noreferrer"&gt;Create Notification Channel&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://cloud.google.com/deploy/docs/using-skaffold/getting-started-skaffold" rel="noopener noreferrer"&gt;Get Started with Skaffold in Cloud Deploy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/deploy/docs/config-files" rel="noopener noreferrer"&gt;Cloud Deploy-Configuration schema reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cloud.google.com/build/docs/configuring-notifications/configure-slack" rel="noopener noreferrer"&gt;Configure Slack notifications&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>development</category>
      <category>cloudcomputing</category>
      <category>programming</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
