<?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>DEV Community: Arjun Menon</title>
    <description>The latest articles on DEV Community by Arjun Menon (@arjunmenon).</description>
    <link>https://dev.to/arjunmenon</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%2F1207452%2Fdb72598e-f952-4e30-8ce7-9d2c18860399.jpg</url>
      <title>DEV Community: Arjun Menon</title>
      <link>https://dev.to/arjunmenon</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arjunmenon"/>
    <language>en</language>
    <item>
      <title>Building a Mass Emailing System Using AWS Lambda and SES</title>
      <dc:creator>Arjun Menon</dc:creator>
      <pubDate>Wed, 01 May 2024 07:00:48 +0000</pubDate>
      <link>https://dev.to/aws-builders/building-a-mass-emailing-system-using-aws-lambda-and-ses-21eo</link>
      <guid>https://dev.to/aws-builders/building-a-mass-emailing-system-using-aws-lambda-and-ses-21eo</guid>
      <description>&lt;p&gt;A mass emailing system allows businesses to reach out to customers efficiently, and building one using Amazon Web Services (AWS) can be both scalable and cost-effective. In this blog post, I'll guide you through setting up a mass emailing system using AWS Lambda, Simple Email Service (SES), and S3.&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Create an S3 Bucket
&lt;/h3&gt;

&lt;p&gt;Amazon S3 will store the CSV files containing the email addresses of the recipients.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Navigate to S3:&lt;/strong&gt; In the AWS Management Console, click on S3 under the Storage category.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create a Bucket:&lt;/strong&gt; Click on Create bucket. Name your bucket (it must be unique across AWS), select a region close to you for better performance, and then create the bucket.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Set Up AWS Simple Email Service (SES)
&lt;/h3&gt;

&lt;p&gt;AWS SES will handle the email sending operations.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Navigate to SES&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verify Your Email Address:&lt;/strong&gt; Before sending emails, SES requires verification of your ownership of the email address. On the left pane, go to &lt;strong&gt;Identities,&lt;/strong&gt; and then verify the email address you want to send from.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Important Note: As we are using SES in sandbox mode, you must manually verify each email address that you wish to send emails to before they can receive emails from your application. This is a restriction in the sandbox environment intended to prevent spam and abuse.&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add and verify all Recipient Email Addresses:&lt;/strong&gt; You can use Temp Mail for testing.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rbP-fjpI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1714545254466/2316f540-3c6f-45ef-b9b9-57319de9e70a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rbP-fjpI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1714545254466/2316f540-3c6f-45ef-b9b9-57319de9e70a.png" alt="" width="800" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Create an IAM Role for Lambda
&lt;/h3&gt;

&lt;p&gt;This role will allow your Lambda function to access AWS resources securely.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Navigate to IAM:&lt;/strong&gt; Go to IAM under Security, Identity, &amp;amp; Compliance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create a New Role:&lt;/strong&gt; Click on Roles, then Create role. Choose Lambda for the service that will use this role, then proceed to permissions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Attach Policies:&lt;/strong&gt; Add policies like AmazonSESFullAccess, AmazonS3FullAccess, and AWSLambdaExecute.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 4: Create a Lambda Function
&lt;/h3&gt;

&lt;p&gt;This function will process the CSV file and send emails.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Navigate to Lambda:&lt;/strong&gt; Go to Lambda under Compute.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create Function:&lt;/strong&gt; Choose Author from scratch, name your function, select Python 3.x for the runtime.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set Permissions:&lt;/strong&gt; Choose the IAM role you created earlier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create Function:&lt;/strong&gt; Finalize the creation of your function.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 5: Write Lambda Function Code
&lt;/h3&gt;

&lt;p&gt;The function will read from S3, parse CSV, and send emails via SES.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import boto3import csvdef lambda_handler(event, context): s3 = boto3.client('s3') ses = boto3.client('ses') bucket_name = event['Records'][0]['s3']['bucket']['name'] key = event['Records'][0]['s3']['object']['key'] response = s3.get_object(Bucket=bucket_name, Key=key) lines = response['Body'].read().decode('utf-8').split() for row in csv.DictReader(lines): ses.send_email( Source='your-verified-email@example.com', Destination={'ToAddresses': [row['email']]}, Message={ 'Subject': {'Data': 'Your Email Subject'}, 'Body': {'Text': {'Data': "Your email content"}} } )
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 6: Set Up S3 Event Trigger
&lt;/h3&gt;

&lt;p&gt;Trigger your Lambda function when a CSV file is uploaded to S3.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Select Your Function:&lt;/strong&gt; In Lambda, open your functions configuration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Add Trigger:&lt;/strong&gt; Choose S3 from the list. Configure the trigger for PUT events, and set the file prefix or suffix (like .csv).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Save:&lt;/strong&gt; Save your configuration.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 7: Test Your Setup
&lt;/h3&gt;

&lt;p&gt;Upload a CSV file with an email column to your S3 bucket and check the Lambda execution logs. Make sure the emails are being sent out successfully.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HdLpqLEG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1714545363288/b7f75b71-dbfa-4095-8e07-9823cc69215f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HdLpqLEG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1714545363288/b7f75b71-dbfa-4095-8e07-9823cc69215f.png" alt="" width="273" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JSzuB3-E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1714545344937/c3736750-f0b1-423a-aa75-d64c5aa258ce.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JSzuB3-E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1714545344937/c3736750-f0b1-423a-aa75-d64c5aa258ce.png" alt="" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Email Recieved:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FrzkwmL3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1714545572478/85e675ab-2e43-4ba6-804a-a33b3d24437d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FrzkwmL3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1714545572478/85e675ab-2e43-4ba6-804a-a33b3d24437d.png" alt="" width="800" height="543"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8M357e3I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1714545583936/6632ecfb-889b-4a51-9557-0c45add5f6e4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8M357e3I--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1714545583936/6632ecfb-889b-4a51-9557-0c45add5f6e4.png" alt="" width="800" height="568"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reminder: As we are using SES in sandbox mode, you must manually verify each email address that you wish to send emails to before they can receive emails from your application. This is a restriction in the sandbox environment intended to prevent spam and abuse.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;You've now successfully set up a basic mass emailing system using AWS. This system is not only scalable but also cost-effective, perfect for businesses looking to manage their email marketing efforts. Always ensure to comply with legal requirements and manage opt-ins and opt-outs to respect user privacy and avoid spam.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Monitoring Docker Logs Using Grafana and Prometheus</title>
      <dc:creator>Arjun Menon</dc:creator>
      <pubDate>Sun, 21 Jan 2024 14:24:01 +0000</pubDate>
      <link>https://dev.to/aws-builders/monitoring-docker-logs-using-grafana-and-prometheus-3d5f</link>
      <guid>https://dev.to/aws-builders/monitoring-docker-logs-using-grafana-and-prometheus-3d5f</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In this comprehensive tutorial, we'll guide you through the process of sending Docker logs to Grafana for effective monitoring and visualization. This setup involves launching two EC2 instances, installing Grafana on Instance 1, and Prometheus with Docker on Instance 2. By the end of this guide, you'll have a fully functional Grafana dashboard displaying Docker container metrics.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;AWS account with EC2 instances&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Basic knowledge of Linux commands&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SSH access to both EC2 instances&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Launch EC2 Instances
&lt;/h2&gt;

&lt;p&gt;Launch two EC2 instances on AWS, naming them Instance 1 and Instance 2. Ensure you have the necessary security groups, key pairs, and IAM roles configured for smooth communication.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2: Install Grafana on Instance 1
&lt;/h2&gt;

&lt;p&gt;SSH into Instance 1 and install Grafana using the following commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get updatesudo apt-get install -y software-properties-commonsudo add-apt-repository "deb https://packages.grafana.com/oss/deb stable main"wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add -sudo apt-get updatesudo apt-get install -y grafanasudo systemctl start grafana-serversudo systemctl enable grafana-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Access Grafana's web interface by navigating to &lt;code&gt;http://&amp;lt;instance_1_ip&amp;gt;:3000&lt;/code&gt; in your browser. Default login credentials are usually admin/admin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Install Prometheus and Docker on Instance 2
&lt;/h2&gt;

&lt;p&gt;SSH into Instance 2 and install Prometheus and Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get updatesudo apt-get install -y prometheus docker.io
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Configure Docker Metrics Collection
&lt;/h2&gt;

&lt;p&gt;Create a file named &lt;code&gt;daemon.json&lt;/code&gt; in &lt;code&gt;/etc/docker/&lt;/code&gt; with the following content:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{ "metrics-addr": "0.0.0.0:9323", "experimental": true}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Docker:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl restart docker
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You should now see your docker metrics by going to &lt;code&gt;&amp;lt;instance_2_ip&amp;gt;:9323/metric.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jzHwF0m4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705847008057/4fa954f7-e29c-4aea-a240-1fd110e3033e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jzHwF0m4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705847008057/4fa954f7-e29c-4aea-a240-1fd110e3033e.png" alt="" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5: Configure Prometheus for Docker Metrics
&lt;/h2&gt;

&lt;p&gt;Edit the &lt;code&gt;prometheus.yml&lt;/code&gt; file in &lt;code&gt;/etc/prometheus/&lt;/code&gt; and add a new job:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- job_name: 'docker_metrics' static_configs: - targets: ['&amp;lt;instance_2_ip&amp;gt;:9323']
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Restart Prometheus:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo systemctl restart prometheus
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verify the new job is visible in Prometheus targets.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--UzIRtJTG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705846781631/e95c15e6-0975-49a8-b4ae-42046501f30f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--UzIRtJTG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705846781631/e95c15e6-0975-49a8-b4ae-42046501f30f.png" alt="" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Configure Grafana Data Source
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Log in to Grafana.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Navigate to "Settings" &amp;gt; "Data Sources."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click "Add your first data source" and select Prometheus.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set the URL to &lt;code&gt;&amp;lt;instance_2_ip&amp;gt;:9090&lt;/code&gt; and click "Save &amp;amp; Test."&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 7: Create Grafana Dashboard
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Go to the "+" icon on the left sidebar and select "Dashboard."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click "Add new panel" and choose Prometheus as the data source.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use the sample query:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Customize the panel and dashboard as needed.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AsL8xs5t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705846670317/fa60ebb2-4f2b-4a3a-a409-82bf0b517e26.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AsL8xs5t--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705846670317/fa60ebb2-4f2b-4a3a-a409-82bf0b517e26.png" alt="" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Congratulations! You've successfully set up Grafana to visualize Docker container metrics collected by Prometheus. This comprehensive guide ensures you have a smooth experience from launching EC2 instances to creating a functional Grafana dashboard. Feel free to explore more queries and customize your dashboard for a tailored monitoring solution.&lt;/p&gt;

&lt;p&gt;Follow me on &lt;a href="https://www.linkedin.com/in/arjunmenon-devops/"&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Checkout my &lt;a href="https://github.com/ArjunMnn"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt; profile.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Deploying a Three-Tier Application with CI/CD using Jenkins, ReactJS, NodeJS, and MongoDB on Kubernetes</title>
      <dc:creator>Arjun Menon</dc:creator>
      <pubDate>Sat, 13 Jan 2024 17:17:29 +0000</pubDate>
      <link>https://dev.to/aws-builders/deploying-a-three-tier-application-with-cicd-using-jenkins-reactjs-nodejs-and-mongodb-on-kubernetes-mfo</link>
      <guid>https://dev.to/aws-builders/deploying-a-three-tier-application-with-cicd-using-jenkins-reactjs-nodejs-and-mongodb-on-kubernetes-mfo</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In this tutorial, we will guide you through the process of deploying a three-tier application on Kubernetes using ReactJS for the frontend, NodeJS for the backend, and MongoDB as the database. We'll use the provided GitHub repository and Docker containers for each tier. Additionally, we'll create Kubernetes manifest files to orchestrate the deployment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before starting, ensure you have the following prerequisites:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;AWS account with IAM administrator access.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An EC2 instance with Ubuntu in your preferred region.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;All the required code is available in &lt;a href="https://github.com/ArjunMnn/TWSThreeTierAppChallenge"&gt;this&lt;/a&gt; GitHub repository.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 1: IAM Configuration
&lt;/h2&gt;

&lt;p&gt;Create a user &lt;code&gt;eks-admin&lt;/code&gt; with AdministratorAccess and generate security credentials (Access Key and Secret Access Key).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# AWS CLI commandaws configure
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: EC2 Setup
&lt;/h2&gt;

&lt;p&gt;Launch an Ubuntu instance and SSH into it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Install AWS CLI v2
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"sudo apt install unzipunzip awscliv2.zipsudo ./aws/install -i /usr/local/aws-cli -b /usr/local/bin --update
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4: Install Docker
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt-get updatesudo apt install docker.iodocker pssudo chown $USER /var/run/docker.sock
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5: Install kubectl
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -o kubectl https://amazon-eks.s3.us-west-2.amazonaws.com/1.19.6/2021-01-05/bin/linux/amd64/kubectlchmod +x ./kubectlsudo mv ./kubectl /usr/local/binkubectl version --short --client
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6: Install eksctl
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl --silent --location "https://github.com/weaveworks/eksctl/releases/latest/download/eksctl_$(uname -s)_amd64.tar.gz" | tar xz -C /tmpsudo mv /tmp/eksctl /usr/local/bineksctl version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 7: Setup EKS Cluster
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eksctl create cluster --name three-tier-cluster --region us-west-2 --node-type t2.medium --nodes-min 2 --nodes-max 2aws eks update-kubeconfig --region us-west-2 --name three-tier-clusterkubectl get nodes
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cUK5O5B5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705154550127/a0607b79-351b-4158-95c4-8ab3beb55400.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cUK5O5B5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705154550127/a0607b79-351b-4158-95c4-8ab3beb55400.png" alt="" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 8: Clone GitHub Repository
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/ArjunMnn/TWSThreeTierAppChallengecd TWSThreeTierAppChallenge
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 9: Build Docker Images
&lt;/h2&gt;

&lt;p&gt;Build Docker images for all three tiers (frontend, backend, and MongoDB). Refer to the provided Dockerfiles in the repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 10: Create Kubernetes Manifests
&lt;/h2&gt;

&lt;p&gt;Use the provided manifest files to deploy the application on Kubernetes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create namespace workshopkubectl apply -f backend-deployment.yamlkubectl apply -f backend-service.yamlkubectl apply -f frontend-deployment.yamlkubectl apply -f frontend-service.yamlkubectl apply -f deploy.yamlkubectl apply -f secrets.yamlkubectl apply -f service.yamlkubectl apply -f full_stack_lb.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 11: Install AWS Load Balancer
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.jsonaws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document file://iam_policy.jsoneksctl utils associate-iam-oidc-provider --region=us-west-2 --cluster=three-tier-cluster --approveeksctl create iamserviceaccount --cluster=three-tier-cluster --namespace=kube-system --name=aws-load-balancer-controller --role-name AmazonEKSLoadBalancerControllerRole --attach-policy-arn=arn:aws:iam::626072240565:policy/AWSLoadBalancerControllerIAMPolicy --approve --region=us-west-2sudo snap install helm --classichelm repo add eks https://aws.github.io/eks-chartshelm repo update ekshelm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=my-cluster --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controllerkubectl get deployment -n kube-system aws-load-balancer-controllerkubectl apply -f full_stack_lb.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--O1Gn9J5d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705154824872/49dd99f0-92db-4953-9f06-7915f1bc6750.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--O1Gn9J5d--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705154824872/49dd99f0-92db-4953-9f06-7915f1bc6750.png" alt="" width="800" height="247"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 12: Test the Application
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Access the Application
&lt;/h3&gt;

&lt;p&gt;Open your web browser and navigate to the DNS of the AWS Load Balancer. This will take you to the frontend of your three-tier application.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--idF0UyH2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705154873593/23f26a39-c350-4f55-9cb6-07817d90f43c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--idF0UyH2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705154873593/23f26a39-c350-4f55-9cb6-07817d90f43c.png" alt="" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Create Tasks
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;On the frontend, you should see the application interface.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click around and interact with the application, creating tasks to test the functionality.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Verify MongoDB Entries
&lt;/h3&gt;

&lt;p&gt;To ensure that entries are being added to the MongoDB database, follow these steps:&lt;/p&gt;

&lt;h4&gt;
  
  
  Access MongoDB Shell
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Example SSH commandkubectl exec -it -n workshop &amp;lt;mongodb-pod-name&amp;gt; -- mongo
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Check Database and Collection
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;use tododb.tasks.find()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bN8beaOE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705155496318/83764b6a-e588-46ae-81ce-8efde59eca93.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bN8beaOE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705155496318/83764b6a-e588-46ae-81ce-8efde59eca93.png" alt="" width="800" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This will show you the entries in the &lt;code&gt;tasks&lt;/code&gt; collection of the &lt;code&gt;todo&lt;/code&gt; database. You should see the tasks you created through the application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 13: Configure Jenkins for CI/CD
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Configure AWS Credentials
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In Jenkins, go to "Manage Jenkins" &amp;gt; "Manage Credentials."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under the "Stores scoped to Jenkins" section, click on "(global)".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new credentials:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Configure Kubeconfig Credential
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In Jenkins, go to "Manage Jenkins" &amp;gt; "Manage Credentials."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under the "Stores scoped to Jenkins" section, click on "(global)".&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add new credentials:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Note: Kubeconfig file is in the path &lt;code&gt;/home/ubuntu/.kube/config.&lt;/code&gt; Download it to your local using scp.&lt;/p&gt;

&lt;h3&gt;
  
  
  Create a Jenkins Pipeline Job
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In Jenkins, click on "New Item."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose "Pipeline" and give your job a name.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under the "Pipeline" section, select "Pipeline script from SCM."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set the SCM to Git and provide your repository URL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the "Script Path," specify the path to your Jenkinsfile (e.g., &lt;code&gt;Jenkinsfile&lt;/code&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Save the job.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Trigger the Pipeline
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Make a change in your GitHub repository, commit, and push.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Jenkins should automatically detect the change and trigger the pipeline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Monitor the Jenkins dashboard for the progress of each stage in the pipeline.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 14: Verify CI/CD Deployment
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Check AWS ECR
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open the AWS ECR console.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verify that the images for the frontend and backend have been pushed successfully.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Check Kubernetes Deployment
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Open your Kubernetes dashboard or use the following command:
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl --kubeconfig=/path/to/kubeconfig get deployments -n workshopkubectl --kubeconfig=/path/to/kubeconfig get services -n workshopkubectl --kubeconfig=/path/to/kubeconfig get pods -n workshop
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Verify that the frontend and backend deployments are running.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Make a Change in GitHub
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Make another change in your GitHub repository, commit, and push.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Jenkins should automatically trigger the pipeline again.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aWzyx-r8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705165593381/00a07881-0215-4127-8058-aa65eee36104.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aWzyx-r8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705165593381/00a07881-0215-4127-8058-aa65eee36104.png" alt="" width="351" height="87"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QZIJJWec--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705165696187/d0c4e788-3ea7-46c2-813c-c17c3d6e3e58.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QZIJJWec--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705165696187/d0c4e788-3ea7-46c2-813c-c17c3d6e3e58.png" alt="" width="800" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Verify Updated Deployment
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Check the AWS ECR console for new image versions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Monitor the Jenkins dashboard for the progress of each stage in the updated pipeline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Verify that the changes reflect in your Kubernetes deployment.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IK7ql2rG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705165646113/a6f4c9a6-e2d7-46d5-9f1c-0263379b8d4c.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IK7ql2rG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1705165646113/a6f4c9a6-e2d7-46d5-9f1c-0263379b8d4c.png" alt="" width="800" height="384"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;If you can access the application through the DNS and see the tasks you created in the MongoDB database, congratulations! You have successfully deployed and tested your three-tier application on Kubernetes.&lt;/p&gt;

&lt;p&gt;Remember to clean up your resources after testing by deleting the EKS cluster and any associated resources to avoid incurring unnecessary costs. Use the following command:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;eksctl delete cluster --name three-tier-cluster --region us-west-2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This will delete the EKS cluster and associated resources.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>CI/CD Pipeline using AWS CodeCommit, Codebuild, CodeDeploy and CodePipeline</title>
      <dc:creator>Arjun Menon</dc:creator>
      <pubDate>Thu, 28 Dec 2023 12:47:51 +0000</pubDate>
      <link>https://dev.to/aws-builders/cicd-pipeline-using-aws-codecommit-codebuild-codedeploy-and-codepipeline-5he0</link>
      <guid>https://dev.to/aws-builders/cicd-pipeline-using-aws-codecommit-codebuild-codedeploy-and-codepipeline-5he0</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Welcome to this comprehensive guide where we'll walk through the process of creating a CI/CD pipeline for deploying a Todo List web app using AWS DevOps services. This tutorial is designed to be beginner-friendly, providing detailed steps for setting up CodeCommit, CodeBuild, CodeDeploy, and CodePipeline. We'll be installing Nginx and deploying a Todo List web app on an EC2 instance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;

&lt;p&gt;All the required code is available at &lt;a href="https://github.com/ArjunMnn/AWS-devops-cicd.git"&gt;this repository&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Setting Up CodeCommit
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create a CodeCommit Repository:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create IAM User and Generate Credentials:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Clone Repository Locally:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create Project Files:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git add .git commit -m "Initial commit"git push origin main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Configuring CodeBuild
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Create a Build Project:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# buildspec.yamlversion: 0.2phases: install: commands: - echo Installing Nginx... - sudo apt-get update - sudo apt-get install nginx -y build: commands: - echo Build started on `date` - cp index.html /var/www/html/ - cp styles.css /var/www/html/ - cp app.js /var/www/html/ - cp appspec.yml /var/www/html/ post_build: commands: - echo Restarting Nginx...artifacts: files: - index.html - appspec.yml - scripts/** - app.js - styles.css
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configure Artifacts:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Run the Build:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ReMvkO7o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703765629394/c269ddde-563a-48b6-897b-1bd52c5fc8a7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ReMvkO7o--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703765629394/c269ddde-563a-48b6-897b-1bd52c5fc8a7.png" alt="" width="800" height="305"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--cHBAAV6E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703765654228/b8822dc5-3267-41dd-ad08-36a364c4ab57.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--cHBAAV6E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703765654228/b8822dc5-3267-41dd-ad08-36a364c4ab57.png" alt="" width="800" height="254"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3: Implementing CodeDeploy
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create CodeDeploy Application:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create Deployment Group:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install CodeDeploy Agent on EC2 Instance:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/bash # This installs the CodeDeploy agent and its prerequisites on Ubuntu 22.04. sudo apt-get update sudo apt-get install ruby-full ruby-webrick wget -y cd /tmp wget https://aws-codedeploy-us-east-1.s3.us-east-1.amazonaws.com/releases/codedeploy-agent_1.3.2-1902_all.deb mkdir codedeploy-agent_1.3.2-1902_ubuntu22 dpkg-deb -R codedeploy-agent_1.3.2-1902_all.deb codedeploy-agent_1.3.2-1902_ubuntu22 sed 's/Depends:.*/Depends:ruby3.0/' -i ./codedeploy-agent_1.3.2-1902_ubuntu22/DEBIAN/control dpkg-deb -b codedeploy-agent_1.3.2-1902_ubuntu22/ sudo dpkg -i codedeploy-agent_1.3.2-1902_ubuntu22.deb systemctl list-units --type=service | grep codedeploy sudo service codedeploy-agent status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Create appspec.yaml and Scripts:&lt;/strong&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;appspec.yaml:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# appspec.yamlversion: 0.0os: linuxfiles: - source: / destination: /var/www/html/hooks: AfterInstall: - location: scripts/install_nginx.sh timeout: 300 runas: root ApplicationStart: - location: scripts/start_nginx.sh timeout: 300 runas: root
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;install_nginx.sh&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# scripts/install_nginx.sh#!/bin/bashapt-get updateapt-get install nginx -y
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;start_nginx.sh&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# scripts/start_nginx.sh#!/bin/bashservice nginx start
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build and Deploy:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configure EC2 Role:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Restart CodeDeploy Agent:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9476IHor--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703765608441/a886524c-7b22-44f4-8a39-f83a0d47ff27.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9476IHor--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703765608441/a886524c-7b22-44f4-8a39-f83a0d47ff27.png" alt="" width="800" height="265"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Setting Up CodePipeline
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Configure CodePipeline:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Xh7q_GFA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703765497088/80f2748d-f92c-48da-bff9-ef683808fd25.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Xh7q_GFA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703765497088/80f2748d-f92c-48da-bff9-ef683808fd25.png" alt="" width="800" height="717"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create Pipeline:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--vOPR2FFj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703765984454/1767a1b5-faa9-4012-ab97-7c89ca7555ad.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--vOPR2FFj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703765984454/1767a1b5-faa9-4012-ab97-7c89ca7555ad.png" alt="" width="800" height="582"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test the Web App:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eng2w4oh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703765580343/0fe7a58a-db3d-4323-b6a4-341c2a2e108d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eng2w4oh--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703765580343/0fe7a58a-db3d-4323-b6a4-341c2a2e108d.png" alt="" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Congratulations! You've successfully set up a CI/CD pipeline for deploying a Todo List web app using AWS DevOps tools. This tutorial has covered each step in detail, providing you with a solid foundation for implementing similar projects in the future.&lt;/p&gt;

&lt;p&gt;Follow me on &lt;a href="https://www.linkedin.com/in/arjunmenon-devops/"&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Checkout my &lt;a href="https://github.com/ArjunMnn"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt; profile.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Deploying a Todo App on AWS ECS with ECR</title>
      <dc:creator>Arjun Menon</dc:creator>
      <pubDate>Mon, 25 Dec 2023 13:44:55 +0000</pubDate>
      <link>https://dev.to/aws-builders/deploying-a-todo-app-on-aws-ecs-with-ecr-438d</link>
      <guid>https://dev.to/aws-builders/deploying-a-todo-app-on-aws-ecs-with-ecr-438d</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;In the world of cloud computing, deploying applications has become more efficient and scalable. Amazon Web Services (AWS) provides a range of services that enable developers to easily deploy and manage their applications. In this step-by-step guide, we'll walk through the process of deploying a Todo app on AWS ECS (Elastic Container Service) using ECR (Elastic Container Registry). This tutorial assumes you have a basic understanding of AWS services and have an AWS account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1: Set Up an EC2 Instance
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Launch an EC2 instance with Amazon Linux or any other suitable Amazon Machine Image (AMI).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;SSH into the instance.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ssh -i your-key.pem ec2-user@your-instance-ip
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 2: Clone the Todo App Repository
&lt;/h2&gt;

&lt;p&gt;Clone the Todo app repository from your version control system (e.g., GitHub).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/your-username/todo-app.gitcd todo-app
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 3: Set Up ECR Repository
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Navigate to the AWS Management Console and open the Elastic Container Registry (ECR).&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new repository named &lt;code&gt;node-app&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--djuXRkN6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703511171469/e928a615-1bd5-4d8d-87fc-c7169c641e14.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--djuXRkN6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703511171469/e928a615-1bd5-4d8d-87fc-c7169c641e14.png" alt="" width="800" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4: Install Docker and AWS CLI on EC2 Instance
&lt;/h2&gt;

&lt;p&gt;Install Docker and the AWS CLI on your EC2 instance.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update -ysudo apt install docker.iosudo usermod -a -G docker ubuntucurl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"unzip awscliv2.zipsudo ./aws/install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5: Authenticate Docker with ECR
&lt;/h2&gt;

&lt;p&gt;Run the following command to retrieve an authentication token and authenticate your Docker client with your ECR registry.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/u1o8l9k6
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6: Build and Push Docker Image to ECR
&lt;/h2&gt;

&lt;p&gt;Build your Docker image and push it to the ECR repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker build -t node-app .docker tag node-app:latest public.ecr.aws/u1o8l9k6/node-app:latestdocker push public.ecr.aws/u1o8l9k6/node-app:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 7: Create ECS Cluster
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Navigate to ECS in the AWS Management Console.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a new cluster named &lt;code&gt;node-todo-cluster&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose Fargate as the launch type.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I8JVuyuE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703511284959/dc30802f-734b-47ba-b053-2b418a4faefa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I8JVuyuE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703511284959/dc30802f-734b-47ba-b053-2b418a4faefa.png" alt="" width="800" height="137"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 8: Create Task Definition and Deploy
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Create a new task definition named &lt;code&gt;node-todo-app-task-definition&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the task definition and click on "Deploy," then "Run Task."&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QEAE43-Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703511330000/424cd335-80be-4f76-8371-4bd23e6c0181.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QEAE43-Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703511330000/424cd335-80be-4f76-8371-4bd23e6c0181.png" alt="" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ujhlx2gS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703511342831/fe4e4f07-6e65-4b34-a77b-ca62a0f355a4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ujhlx2gS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703511342831/fe4e4f07-6e65-4b34-a77b-ca62a0f355a4.png" alt="" width="800" height="176"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 9: Check the App
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Once the task is running, note the public IP of your Fargate instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open a web browser and navigate to &lt;code&gt;&amp;lt;public-ip&amp;gt;:8000&lt;/code&gt; to check if the Todo app is running.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s9_P9YEK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703511392237/93e55d7c-1601-4b29-afe3-165145467460.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s9_P9YEK--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703511392237/93e55d7c-1601-4b29-afe3-165145467460.png" alt="" width="800" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--VbJG9r90--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703511423775/a22325b7-c56f-42b9-b7f0-002af8a84063.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--VbJG9r90--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703511423775/a22325b7-c56f-42b9-b7f0-002af8a84063.png" alt="" width="800" height="274"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Congratulations! You have successfully deployed a Todo app on AWS ECS using ECR. This step-by-step guide covered setting up an EC2 instance, cloning the Todo app repository, configuring ECR, installing Docker and AWS CLI, building and pushing a Docker image, creating an ECS cluster, defining tasks, and finally deploying and checking the app. This workflow provides a scalable and efficient way to deploy containerized applications on AWS.&lt;/p&gt;

&lt;p&gt;Follow me on &lt;a href="https://www.linkedin.com/in/arjunmenon-devops/"&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Checkout my &lt;a href="https://github.com/ArjunMnn"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt; profile.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Deploying a Game with AWS Elastic Beanstalk</title>
      <dc:creator>Arjun Menon</dc:creator>
      <pubDate>Sat, 23 Dec 2023 06:53:04 +0000</pubDate>
      <link>https://dev.to/aws-builders/deploying-a-game-with-aws-elastic-beanstalk-ed7</link>
      <guid>https://dev.to/aws-builders/deploying-a-game-with-aws-elastic-beanstalk-ed7</guid>
      <description>&lt;h2&gt;
  
  
  Introduction
&lt;/h2&gt;

&lt;p&gt;Welcome to this step-by-step tutorial on deploying a game using AWS Elastic Beanstalk. In this guide, we will walk through the process of creating an application, setting up a web server environment, and deploying a Dockerized game using Elastic Beanstalk.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;Before you begin, make sure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;An AWS account with the necessary permissions.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Docker installed on your local machine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A Dockerfile for your game setup.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1: Login to the AWS Console
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Open your web browser and navigate to the &lt;a href="https://aws.amazon.com/"&gt;AWS Management Console&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Log in with your AWS account credentials.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 2: Search for the Elastic Beanstalk Service
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the AWS Management Console, use the search bar at the top and type "Elastic Beanstalk."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on the Elastic Beanstalk service in the search results.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 3: Create a New Application
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;In the Elastic Beanstalk dashboard, click "Create Application."&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 4: Select Web Server Environment
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Choose the type of environment that will host your application. Here, we select the web server environment.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 5: Name the Application
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Provide a name for your application.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ZzypQAph--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703313152361/7245123b-9fee-4fc4-924e-84abcb7ffe99.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ZzypQAph--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703313152361/7245123b-9fee-4fc4-924e-84abcb7ffe99.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" alt="" width="800" height="639"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 6: Name Environment and Add Description
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Assign a name to the environment and include a brief description.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You can leave the domain name blank for an auto-generated value.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 7: Choose Docker Platform
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Select the Managed Platform and specify Docker as the platform type.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 8: Upload Docker File
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Opt for "Upload your code" and upload the Dockerfile you've created. Here's an example Dockerfile:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   FROM ubuntu:22.04 RUN apt-get update RUN apt-get install -y nginx zip curl RUN echo "daemon off;" &amp;gt;&amp;gt;/etc/nginx/nginx.conf RUN curl -o /var/www/html/master.zip -L https://github.com/ArjunMnn/2048-game/archive/refs/heads/master.zip RUN cd /var/www/html/ &amp;amp;&amp;amp; unzip master.zip &amp;amp;&amp;amp; mv 2048-game-master/* . &amp;amp;&amp;amp; rm -rf 2048-game-master master.zip EXPOSE 80 CMD ["/usr/sbin/nginx", "-c", "/etc/nginx/nginx.conf"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Jm7S_3Fr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703313393244/a92f6ef8-f42c-400d-a032-bc2bccdc1bae.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Jm7S_3Fr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703313393244/a92f6ef8-f42c-400d-a032-bc2bccdc1bae.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" alt="" width="707" height="482"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 9: Select Free Tier Eligible Option
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Choose the option that falls under the AWS Free Tier to ensure cost-effective deployment.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 10: Configure Service Access
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TSaD9PQJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703313512248/aafaa6e5-b7be-48b5-8d0a-82ed807e1738.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TSaD9PQJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703313512248/aafaa6e5-b7be-48b5-8d0a-82ed807e1738.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" alt="" width="800" height="622"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 11: Review and Submit
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Review the settings and click "Create" to confirm the deployment.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Step 12: Initiate Environment Creation
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;The process of creating the environment will begin. Wait for the deployment to complete.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iFjbatsJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703313866743/8cbd4291-dcc3-4778-a2f6-03265ce20693.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iFjbatsJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703313866743/8cbd4291-dcc3-4778-a2f6-03265ce20693.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" alt="" width="800" height="365"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 13: Load the Domain
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;After successful environment creation, access your game using the provided domain.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JQl-txtx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703313793145/e1676f33-527d-4437-aad6-93f0c0f1fc20.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JQl-txtx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1703313793145/e1676f33-527d-4437-aad6-93f0c0f1fc20.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" alt="" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Congratulations! You have successfully deployed a game using AWS Elastic Beanstalk. Your game should now be accessible via the provided domain, providing a scalable and cost-effective hosting solution.&lt;/p&gt;

&lt;p&gt;Follow me on &lt;a href="https://www.linkedin.com/in/arjunmenon-devops/"&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Checkout my &lt;a href="https://github.com/ArjunMnn"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt; profile.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building a Serverless Node.js API with AWS and Serverless Framework</title>
      <dc:creator>Arjun Menon</dc:creator>
      <pubDate>Sun, 10 Dec 2023 09:25:40 +0000</pubDate>
      <link>https://dev.to/aws-builders/building-a-serverless-nodejs-api-with-aws-and-serverless-framework-ah9</link>
      <guid>https://dev.to/aws-builders/building-a-serverless-nodejs-api-with-aws-and-serverless-framework-ah9</guid>
      <description>&lt;p&gt;Welcome to this comprehensive tutorial on creating a serverless Node.js API using AWS services and the Serverless Framework. In this tutorial, we'll walk through the process of setting up a serverless project, deploying it to AWS using the Serverless Framework, and testing the APIs using Postman. The project allows you to manage tasks in a DynamoDB table, demonstrating basic CRUD operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  Prerequisites
&lt;/h2&gt;

&lt;p&gt;Before we start, make sure you have the following:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Sign up on &lt;a href="https://www.serverless.com/"&gt;serverless.com&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Node.js and npm installed. You can download them from &lt;a href="https://www.serverless.com/"&gt;nodejs.org&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Serverless Framework installed globally. Run the following command:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g serverless

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

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;AWS IAM User credentials for deployment.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Project Setup
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Clone the Project Repository
&lt;/h3&gt;

&lt;p&gt;Clone the project repository from GitHub:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/ArjunMnn/aws-node-http-api-project-dev.git

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 2: Install Dependencies
&lt;/h3&gt;

&lt;p&gt;Navigate to the project directory and install the required npm packages:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd aws-node-http-api-project-dev
npm install

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Step 3: Configure AWS Credentials
&lt;/h3&gt;

&lt;p&gt;Run the following command to configure your AWS credentials:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;serverless config credentials --provider aws --key YOUR_ACCESS_KEY --secret YOUR_SECRET_KEY

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

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;YOUR_ACCESS_KEY&lt;/code&gt; and &lt;code&gt;YOUR_SECRET_KEY&lt;/code&gt; with your AWS IAM User credentials.&lt;/p&gt;

&lt;h2&gt;
  
  
  Serverless Configuration
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;serverless.yaml&lt;/code&gt; file defines the AWS infrastructure for your serverless project. Open the &lt;code&gt;serverless.yaml&lt;/code&gt; file and replace the placeholder values in the &lt;code&gt;provider&lt;/code&gt; section with your specific AWS configuration.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;provider:
  name: aws
  runtime: nodejs14.x
  region: YOUR_AWS_REGION
  iamRoleStatements:
    - Effect: Allow
      Action:
        - dynamodb:*
      Resource:
        - arn:aws:dynamodb:YOUR_AWS_REGION:YOUR_ACCOUNT_ID:table/KaamKaro

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

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;YOUR_AWS_REGION&lt;/code&gt; and &lt;code&gt;YOUR_ACCOUNT_ID&lt;/code&gt; with your AWS region and account ID.&lt;/p&gt;

&lt;h2&gt;
  
  
  Serverless Functions
&lt;/h2&gt;

&lt;p&gt;The project consists of several functions, each handling specific API endpoints. The function code is in separate files in the &lt;code&gt;src&lt;/code&gt; directory.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;hello.js&lt;/code&gt;: Handles the root endpoint and returns a welcome message.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;kaamBharo.js&lt;/code&gt;: Adds a new task to the DynamoDB table.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;kaamDikhao.js&lt;/code&gt;: Retrieves all tasks from the DynamoDB table.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;kaamHatao.js&lt;/code&gt;: Deletes a task from the DynamoDB table.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;code&gt;kaamKhatamKaro.js&lt;/code&gt;: Updates the completion status of a task in the DynamoDB table.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  DynamoDB Table
&lt;/h2&gt;

&lt;p&gt;The &lt;code&gt;serverless.yaml&lt;/code&gt; file includes a DynamoDB table definition. Ensure that you have the necessary permissions to create a DynamoDB table in your AWS account.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;resources:
  Resources:
    KaamKaro:
      Type: AWS::DynamoDB::Table
      Properties:
        TableName: KaamKaro
        BillingMode: PAY_PER_REQUEST
        AttributeDefinitions:
          - AttributeName: id
            AttributeType: S
        KeySchema:
          - AttributeName: id
            KeyType: HASH

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

&lt;/div&gt;



&lt;h2&gt;
  
  
  Deploy the Serverless Project
&lt;/h2&gt;

&lt;p&gt;Run the following command to deploy the project to AWS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;serverless deploy

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ts6xxsZl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1702199748384/57fea4a2-d7e6-4ac2-89d6-80989bb56854.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ts6xxsZl--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1702199748384/57fea4a2-d7e6-4ac2-89d6-80989bb56854.png" alt="" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This command will package and deploy your project using AWS CloudFormation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Testing with Postman
&lt;/h2&gt;

&lt;p&gt;Use &lt;a href="https://www.postman.com/"&gt;Postman&lt;/a&gt; to test your APIs. Here are some sample requests:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GET /:&lt;/strong&gt; Retrieve a welcome message.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mLbCH8Jy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1702199807451/ad87e735-339a-46f9-8f7a-f8b1bce092af.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mLbCH8Jy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1702199807451/ad87e735-339a-46f9-8f7a-f8b1bce092af.png" alt="" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;POST /kaam:&lt;/strong&gt; Add a new task to the DynamoDB table.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--g9ypQRkS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1702199884929/21223cd6-34d3-4288-aa4f-443aa2903ef6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--g9ypQRkS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1702199884929/21223cd6-34d3-4288-aa4f-443aa2903ef6.png" alt="" width="800" height="404"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;GET /kaam:&lt;/strong&gt; Retrieve all tasks from the DynamoDB table.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;PUT /kaam/{id}:&lt;/strong&gt; Update the completion status of a task in the DynamoDB table.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;POST /kaam/{id}:&lt;/strong&gt; Delete a task from the DynamoDB table.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Congratulations! You've successfully created a serverless Node.js API using AWS and the Serverless Framework. This project serves as a foundation for building scalable and cost-effective serverless applications. Feel free to explore and extend the functionality based on your requirements.&lt;/p&gt;

&lt;p&gt;Follow me on &lt;a href="https://www.linkedin.com/in/arjunmenon-devops/"&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Check out my &lt;a href="https://github.com/ArjunMnn"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt; profile.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>A Beginner's Guide to VPC Peering in AWS: Connecting Instances Across Virtual Networks</title>
      <dc:creator>Arjun Menon</dc:creator>
      <pubDate>Thu, 07 Dec 2023 07:39:31 +0000</pubDate>
      <link>https://dev.to/arjunmenon/a-beginners-guide-to-vpc-peering-in-aws-connecting-instances-across-virtual-networks-17oi</link>
      <guid>https://dev.to/arjunmenon/a-beginners-guide-to-vpc-peering-in-aws-connecting-instances-across-virtual-networks-17oi</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Embarking on your cloud computing journey with AWS opens up a world of possibilities. One crucial aspect of managing your infrastructure efficiently is establishing connections between Virtual Private Clouds (VPCs). In this tutorial, we'll guide you through the process of setting up VPC peering, allowing seamless communication between instances in distinct VPCs.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Creating Test VPC&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Title: Setting Up the Test Environment&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create a VPC:&lt;/strong&gt; Begin by creating a VPC named "test-vpc" with the CIDR block 10.0.0.0/16. This step lays the foundation for your testing environment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iFEGB_TV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933435678/79b6e01e-6029-4c34-bff2-2c452cfa72e8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iFEGB_TV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933435678/79b6e01e-6029-4c34-bff2-2c452cfa72e8.png" alt="" width="800" height="180"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Subnet Creation:&lt;/strong&gt; Establish a subnet named "test-public-subnet" within "test-vpc" using the CIDR block 10.0.0.0/16. Subnets help organize resources within your VPC.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--wY5gqRZY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933490228/6d5d241f-528a-4f4e-a2ab-d9434180297b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--wY5gqRZY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933490228/6d5d241f-528a-4f4e-a2ab-d9434180297b.png" alt="" width="800" height="305"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Route Table Configuration:&lt;/strong&gt; Create a route table named "test-rt" associated with "test-vpc." This table will define the traffic flow within the VPC.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Internet Gateway Setup:&lt;/strong&gt; Introduce an internet gateway named "test-igw" and attach it to "test-vpc." This step enables instances within the VPC to communicate with the internet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Routing to Internet:&lt;/strong&gt; Edit the routes in the "test-rt" route table, allowing all access to the internet gateway "test-igw." This is a crucial step for outbound internet communication.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--z3X0R9ms--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933612375/c6dbcaab-8f42-4a73-b915-030f3640de0a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--z3X0R9ms--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933612375/c6dbcaab-8f42-4a73-b915-030f3640de0a.png" alt="" width="800" height="45"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Subnet Association:&lt;/strong&gt; Add the created subnet "test-public-subnet" to the route table associations. This associates the subnet with the specified route table.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AVN_x1ti--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933648424/a1ef8bf3-8c9a-446c-b4b6-371ea6481f32.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AVN_x1ti--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933648424/a1ef8bf3-8c9a-446c-b4b6-371ea6481f32.png" alt="" width="800" height="113"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;EC2 Instance Launch:&lt;/strong&gt; Launch an EC2 instance named "test-ec2-instance" within "test-vpc." Ensure to add an inbound rule for HTTP traffic and select CIDR 10.0.0.0/16.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bZtVGen6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933692390/398a8326-9ba1-45ea-9f1b-5ff662388b24.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bZtVGen6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933692390/398a8326-9ba1-45ea-9f1b-5ff662388b24.png" alt="" width="800" height="224"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Creating Prod VPC&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Title: Setting Up the Production Environment&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create a VPC:&lt;/strong&gt; Mirror the steps for the production environment. Create a VPC named "prod-vpc" with the CIDR block 172.16.0.0/16.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zaQqXgop--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933461497/ba694081-115b-446d-a40d-02c0325c9c38.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zaQqXgop--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933461497/ba694081-115b-446d-a40d-02c0325c9c38.png" alt="" width="800" height="184"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Subnet Creation:&lt;/strong&gt; Establish a subnet named "prod-public-subnet" within "prod-vpc" using the CIDR block 172.16.0.0/16.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--bOk00km_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933513563/5fea4739-86b8-4c77-8a3f-e93ba52f1fca.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--bOk00km_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933513563/5fea4739-86b8-4c77-8a3f-e93ba52f1fca.png" alt="" width="800" height="302"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Route Table Configuration:&lt;/strong&gt; Create a route table named "prod-rt" associated with "prod-vpc." This table will define the traffic flow within the production VPC.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Internet Gateway Setup:&lt;/strong&gt; Introduce an internet gateway named "prod-igw" and attach it to "prod-vpc."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Routing to Internet:&lt;/strong&gt; Edit the routes in the "prod-rt" route table, allowing all access to the internet gateway "prod-igw."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AAeowH0C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933742516/36da75ea-1c3c-47bb-8d9c-da5104726d5a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AAeowH0C--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933742516/36da75ea-1c3c-47bb-8d9c-da5104726d5a.png" alt="" width="800" height="43"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Subnet Association:&lt;/strong&gt; Add the created subnet "prod-public-subnet" to the route table associations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HE0WRkzk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933772634/8c14bfe6-083a-46aa-873f-7abebd8387f2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HE0WRkzk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933772634/8c14bfe6-083a-46aa-873f-7abebd8387f2.png" alt="" width="800" height="103"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;EC2 Instance Launch:&lt;/strong&gt; Launch an EC2 instance named "prod-ec2-instance" within "prod-vpc." Ensure to add an inbound rule for HTTP traffic and select CIDR 172.16.0.0/16.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--IeSqERYm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933794408/e2e82ad4-29f4-458c-9c50-0090195009cc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--IeSqERYm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933794408/e2e82ad4-29f4-458c-9c50-0090195009cc.png" alt="" width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Testing Isolation:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Title: Verifying VPC Isolation&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now that both environments are set up, try to ping one EC2 instance from another. As expected, the attempt will fail, highlighting the isolated nature of these VPCs.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Setting Up VPC Peering&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Title: Bridging the Gap with VPC Peering&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Create Peering Connection:&lt;/strong&gt; Navigate to the VPC dashboard and select "Peering Connections." Create a peering connection, providing names for identification, and select both VPCs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Accept Peering Connection:&lt;/strong&gt; Once the peering connection is created, accept the connection request. This step establishes a direct link between the two VPCs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FBWHpYCv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933881845/45fcb252-f82d-4826-b14e-37097444afa6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FBWHpYCv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933881845/45fcb252-f82d-4826-b14e-37097444afa6.png" alt="" width="800" height="231"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Security Group Configuration&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Title: Ensuring Secure Communication&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test EC2 Security Group:&lt;/strong&gt; Go to the security group of "test-ec2-instance" and edit inbound rules. Add rules for All ICMP IPv4, specifying CIDR blocks 10.0.0.0/16 and 172.16.0.0/16.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KqRAthH0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933929633/7fcd61ae-4643-4c0d-8aa9-80f5c759a381.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KqRAthH0--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933929633/7fcd61ae-4643-4c0d-8aa9-80f5c759a381.png" alt="" width="800" height="89"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prod EC2 Security Group:&lt;/strong&gt; Similarly, edit the inbound rules for the security group of "prod-ec2-instance." Add rules for All ICMP IPv4 with CIDR blocks 10.0.0.0/16 and 172.16.0.0/16.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zY1oAhsv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933975268/55ab499c-6039-4328-bf82-a546bbfcfeac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zY1oAhsv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701933975268/55ab499c-6039-4328-bf82-a546bbfcfeac.png" alt="" width="800" height="90"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Route Table Adjustments&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Title: Directing Traffic Across VPCs&lt;/em&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Test Route Table:&lt;/strong&gt; In the "test-rt" route table, edit routes and add a route for the peering connection to "prod-vpc" with CIDR 172.16.0.0/16. This enables traffic from "test-vpc" to reach "prod-vpc."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5AtrTyfD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701934017442/326bd426-7f16-433a-a97f-258928fa243d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5AtrTyfD--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701934017442/326bd426-7f16-433a-a97f-258928fa243d.png" alt="" width="800" height="45"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Prod Route Table:&lt;/strong&gt; Similarly, in the "prod-rt" route table, add a route for the peering connection to "test-vpc" with CIDR 10.0.0.0/16. This allows traffic from "prod-vpc" to reach "test-vpc."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ugUD5gIC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701934040175/d1654488-b7f2-4606-881f-f85b5cefb4e9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ugUD5gIC--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701934040175/d1654488-b7f2-4606-881f-f85b5cefb4e9.png" alt="" width="800" height="45"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Testing Communication&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Title: Ensuring VPC Peering Success&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;With VPC peering established and configurations in place, attempt to ping the EC2 instances across VPCs. This time, the ping should succeed, demonstrating the successful communication between instances in different VPCs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ridNfm0S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701934220362/fd389e24-0a4b-4566-8d1b-7327a46a664d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ridNfm0S--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701934220362/fd389e24-0a4b-4566-8d1b-7327a46a664d.png" alt="" width="639" height="303"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xrKi4Sp4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701934266162/b4df1548-c7a4-426b-abd1-5e2020cf233d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xrKi4Sp4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701934266162/b4df1548-c7a4-426b-abd1-5e2020cf233d.png" alt="" width="617" height="280"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In conclusion, this tutorial has walked you through the process of setting up VPC peering in AWS, connecting instances across different virtual networks. By following these steps, you've bridged the gap between isolated environments, enabling seamless communication. This fundamental skill is essential for building complex and interconnected architectures on the AWS cloud.&lt;/p&gt;

&lt;p&gt;Follow me on &lt;a href="https://www.linkedin.com/in/arjunmenon-devops/"&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Checkout my &lt;a href="https://github.com/ArjunMnn"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt; profile.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Deploying a Two-Tier Web App with MySQL on Amazon RDS</title>
      <dc:creator>Arjun Menon</dc:creator>
      <pubDate>Tue, 05 Dec 2023 14:04:21 +0000</pubDate>
      <link>https://dev.to/arjunmenon/day-4-deploying-a-two-tier-web-app-with-mysql-on-amazon-rds-48k9</link>
      <guid>https://dev.to/arjunmenon/day-4-deploying-a-two-tier-web-app-with-mysql-on-amazon-rds-48k9</guid>
      <description>&lt;p&gt;Welcome to Day 4 of our AWS mastery journey! Today, we're embarking on an exciting project - deploying a two-tier application. Tier 1 features a Dockerized web app, while Tier 2 hosts a MySQL server on Amazon RDS. Let's dive into the world of containers, AWS, and seamless cloud integration.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Setting the Stage: Unleashing the Power of Docker and AWS&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Defining Your Project:&lt;/strong&gt; Start by conceptualizing your project. Our goal is to create a two-tier application where the first tier is a Dockerized web app, and the second tier is a MySQL server hosted on Amazon RDS.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Tier 1: Dockerized Web App&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Installation:&lt;/strong&gt; Begin by installing Docker on your EC2 instance. This will be the backbone of your containerized web app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Cloning the Repository:&lt;/strong&gt; Clone &lt;a href="https://github.com/LondheShubham153/two-tier-flask-app/tree/master"&gt;this repository&lt;/a&gt; which contains the Dockerfile.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Image Creation:&lt;/strong&gt; Execute &lt;code&gt;docker build&lt;/code&gt; to create an image from your Dockerfile. This encapsulates your app and its dependencies.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Tier 2: MySQL on Amazon RDS&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Configuring Amazon RDS:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Database Instance Creation:&lt;/strong&gt; Navigate to the AWS Management Console, select Amazon RDS, and create a new database instance. Choose MySQL as the engine.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Instance Settings:&lt;/strong&gt; Define your instance details, including DB credentials, storage, and network configurations.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--sst9lEKV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701784107249/f01bef96-3a4c-44cb-8b96-df202fa7c6d3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--sst9lEKV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701784107249/f01bef96-3a4c-44cb-8b96-df202fa7c6d3.png" alt="" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Connecting EC2 to RDS:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Go to your RDS database. Scroll to the "Connected compute resources" section and add your ec2 instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rAAvSH7y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701784223323/9d4a31f5-89b9-4776-aaf7-0ef9d6e56c80.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rAAvSH7y--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701784223323/9d4a31f5-89b9-4776-aaf7-0ef9d6e56c80.png" alt="" width="800" height="126"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In your EC2 instance, run the following commands:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;4.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; # Install mysql client
 sudo apt update
 sudo apt install mysql-client

 # Connecting your ec2 instance to the rds database.
 mysql -u admin -h &amp;lt;endpoint&amp;gt; -P 3306 -p

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

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;MySQL console will open. In the MySQL console, run the following:&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;6.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; create database aws;
 CREATE TABLE messages (
     id INT AUTO_INCREMENT PRIMARY KEY,
     message TEXT
 );

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

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--yjcFOte2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701784577358/5475c83d-8da7-429c-b555-4a335c73026f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--yjcFOte2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701784577358/5475c83d-8da7-429c-b555-4a335c73026f.png" alt="" width="800" height="554"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Deployment: Bringing Your Application to Life&lt;/strong&gt;
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Running the docker container:&lt;/strong&gt; Run the docker container we created before with MySQL environment variables as below&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;2.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; sudo docker run -d -p 5000:5000 -e MYSQL_HOST=mysql -e MYSQL_USER=admin -e MYSQL_PASSWORD=admin123 -e MYSQL_DB=aws two-tier

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

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XFyTwvqv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701784753705/4535bd75-911b-4039-8bca-24ef9ca334ac.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XFyTwvqv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701784753705/4535bd75-911b-4039-8bca-24ef9ca334ac.png" alt="" width="800" height="45"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Testing the Full Setup:&lt;/strong&gt; Validate your two-tier application in the browser, by going on the URL &lt;code&gt;&amp;lt;http://ec2-public-ip&amp;gt;:5000&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rHRGl1kB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701784880208/33df214f-0796-4a12-99e9-ed34bbc344dd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rHRGl1kB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701784880208/33df214f-0796-4a12-99e9-ed34bbc344dd.png" alt="" width="800" height="222"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Conclusion&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Congratulations on successfully deploying a two-tier application on AWS! Today's journey has taken you through the intricacies of Docker, Amazon RDS, and the orchestration of cloud resources.&lt;/p&gt;

&lt;p&gt;Stay tuned for Day 5, where we'll explore advanced AWS services, propelling your cloud expertise even further!&lt;/p&gt;

&lt;p&gt;Follow me on &lt;a href="https://www.linkedin.com/in/arjunmenon-devops/"&gt;&lt;strong&gt;LinkedIn&lt;/strong&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Checkout my &lt;a href="https://github.com/ArjunMnn"&gt;&lt;strong&gt;GitHub&lt;/strong&gt;&lt;/a&gt; profile.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Building a Secure Foundation with WAF</title>
      <dc:creator>Arjun Menon</dc:creator>
      <pubDate>Sun, 03 Dec 2023 15:43:56 +0000</pubDate>
      <link>https://dev.to/arjunmenon/building-a-secure-foundation-with-waf-4n18</link>
      <guid>https://dev.to/arjunmenon/building-a-secure-foundation-with-waf-4n18</guid>
      <description>&lt;h3&gt;
  
  
  &lt;strong&gt;Introduction:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Welcome back to the 7 Days of AWS challenge! Today, we'll focus on fortifying our infrastructure with AWS Web Application Firewall (WAF). Buckle up as we delve into the essentials of WAF and embark on a hands-on project to bolster our security measures.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Understanding AWS Web Application Firewall (WAF):&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;AWS Web Application Firewall (WAF) is your shield against malicious attacks on your web applications. It allows you to create custom rules that filter and monitor HTTP and HTTPS requests. WAF works seamlessly with Amazon CloudFront and Application Load Balancers, giving you granular control over the traffic entering your applications.&lt;/p&gt;

&lt;p&gt;To get started, navigate to the AWS WAF console. Here, you can create WebACLs (Access Control Lists) to define the rules that govern which requests are allowed or denied. The rule sets include conditions such as IP addresses, geographic locations, and even custom rules based on the content of the requests.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Hands-On Project: Building a Secure Infrastructure&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Step 1 - Creating a Launch Template:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Our first step is to create a Launch Template, a powerful resource that defines the parameters for launching instances within our Auto Scaling Groups.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the EC2 Dashboard, find the "Launch Templates" section.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click "Create Launch Template" and configure the necessary settings, including the Amazon Machine Image (AMI), instance type, and storage.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the "Advanced Details" section, under "User data," paste the following script to deploy a todo list web app from a Docker image:&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;4.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; #!/bin/bash

 # Update the package list
 sudo apt-get update -y

 # Install Docker
 sudo apt-get install -y docker.io
 sudo systemctl start docker
 sudo systemctl enable docker

 # Pull the Docker image from DockerHub
 sudo docker pull arjunmmnn/todo-app:latest

 # Run the Docker container, exposing port 8001
 sudo docker run -d -p 80:8001 arjunmmnn/todo-app:latest

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

&lt;/div&gt;



&lt;ol&gt;
&lt;li&gt;Save the template.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Step 2 - Auto Scaling Group (ASG):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now, let's use the Launch Template to set up an Auto Scaling Group, ensuring our applications can handle varying workloads seamlessly.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the EC2 Dashboard, under "Auto Scaling Groups," click "Create Auto Scaling Group."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the Launch Template you created earlier.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--m3_ZgmyY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701613826407/bf2814b7-a258-4330-bf69-ff2ea16d6a6a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--m3_ZgmyY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701613826407/bf2814b7-a258-4330-bf69-ff2ea16d6a6a.png" alt="" width="800" height="754"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure scaling policies, desired capacity, and other parameters.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--5lDqEEIw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701613948556/ae819468-0cc4-43b5-aa7c-93adf03e8e03.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--5lDqEEIw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701613948556/ae819468-0cc4-43b5-aa7c-93adf03e8e03.png" alt="" width="800" height="767"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Complete the setup.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Step 3 - Application Load Balancer (ALB):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;With our Auto Scaling Group in place, it's time to distribute traffic efficiently using an Application Load Balancer.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the EC2 Dashboard, navigate to "Load Balancers" and click "Create Load Balancer."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose "Application Load Balancer" and configure the settings, including listener configurations.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add the instances from your Auto Scaling Group to the target group.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_hNt4GDH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701613905813/0df7912f-55d9-466c-96c0-e77fd82ae3da.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_hNt4GDH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701613905813/0df7912f-55d9-466c-96c0-e77fd82ae3da.png" alt="" width="800" height="758"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Securing Your Infrastructure with WAF:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Subtitle: Step 4 - Configuring WAF WebACL:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now that our infrastructure is set up lets enhance its security by configuring a WebACL in WAF.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In the AWS WAF console, go to WebACLs and click "Create WebACL."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Define the conditions for your WebACL, specifying the rules to allow or block requests.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--s8uMwMN8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701614012367/71e331e9-d8ca-409f-825f-e21d0f78317b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--s8uMwMN8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701614012367/71e331e9-d8ca-409f-825f-e21d0f78317b.png" alt="" width="800" height="403"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Associate the WebACL with your Application Load Balancer.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;By configuring a WAF WebACL, you add an additional layer of protection to your applications, safeguarding them against various cyber threats.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Subtitle: Step 5 - Testing the Todo App:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;It's time to put our todo list web app to the test. Open your web browser and navigate to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://&amp;lt;Your_Load_Balancer_DNS_Name&amp;gt;:80

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

&lt;/div&gt;



&lt;p&gt;Replace &lt;code&gt;&amp;lt;Your_Load_Balancer_DNS_Name&amp;gt;&lt;/code&gt; with the DNS name of your Application Load Balancer. If everything is configured correctly, you should see your todo list web app in action. Congratulations on successfully deploying and testing your application!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BhidMkfM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701616479078/ff636707-b5b6-4a92-af34-b49888758b07.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BhidMkfM--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1701616479078/ff636707-b5b6-4a92-af34-b49888758b07.png" alt="" width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;Conclusion:&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Congratulations! You've successfully strengthened your AWS infrastructure on Day 2 of the challenge. Understanding the nuances of AWS Web Application Firewall and implementing a secure project with launch templates, auto-scaling groups, and application load balancers are crucial steps in your AWS journey.&lt;/p&gt;

&lt;p&gt;Stay tuned for Day 3, where we'll explore more AWS services to optimize and enhance your cloud experience. Remember, each day brings us closer to mastering the art of AWS.&lt;/p&gt;

&lt;p&gt;Let's connect on &lt;a href="https://www.linkedin.com/in/arjunmenon-devops/"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Checkout my &lt;a href="https://github.com/ArjunMnn"&gt;GitHub&lt;/a&gt; profile.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Declarative CICD Pipeline with GitHub Integration, Jenkins, Docker, and Agent-Based Automation</title>
      <dc:creator>Arjun Menon</dc:creator>
      <pubDate>Wed, 22 Nov 2023 08:41:11 +0000</pubDate>
      <link>https://dev.to/arjunmenon/declarative-cicd-pipeline-with-github-integration-jenkins-docker-and-agent-based-automation-21e6</link>
      <guid>https://dev.to/arjunmenon/declarative-cicd-pipeline-with-github-integration-jenkins-docker-and-agent-based-automation-21e6</guid>
      <description>&lt;p&gt;Efficient deployment is a cornerstone of successful software development. In this tutorial, we'll guide you through the process of setting up a Jenkins pipeline to automate the deployment of your Django web application using Docker. What makes this tutorial special is the utilization of two EC2 instances a Jenkins master server and an agent server to facilitate seamless deployment.&lt;/p&gt;

&lt;h3&gt;
  
  
  Section 1: Prerequisites and Project Setup
&lt;/h3&gt;

&lt;h4&gt;
  
  
  1.1 Prerequisites:
&lt;/h4&gt;

&lt;p&gt;Before initiating the deployment process, confirm that the following prerequisites are met:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Two ec2 instances for master and agent servers.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Jenkins installed and configured on the master instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Jdk, Docker and docker-compose are installed on both instances.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A DockerHub account for storing Docker images.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Section 2: Configuring Jenkins Master and Agent
&lt;/h3&gt;

&lt;h4&gt;
  
  
  2.1 Setting Up Jenkins Master:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Access your Jenkins master server and navigate to "Manage Jenkins" -&amp;gt; "Manage Nodes and Clouds."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on "New Node" to add the agent EC2 instance.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Name the node, select "Permanent Agent," and click "OK."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Specify the necessary configurations, ensuring Docker is installed on the agent. Refer to &lt;a href="https://dev.to/arjunmenon/day-28-jenkins-agents-3lpg-temp-slug-9635052"&gt;this article&lt;/a&gt; for more details&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  2.2 Creating a New Pipeline in Jenkins:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Access Jenkins and click on "New Item."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose "Pipeline" and provide a name for your project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the pipeline configuration, select "Pipeline script from SCM."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose "Git" as the SCM, and enter your GitHub repository URL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Save the configuration.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Section 3: Building the Declarative CICD Pipeline
&lt;/h3&gt;

&lt;h4&gt;
  
  
  3.1 Modifying Jenkinsfile:
&lt;/h4&gt;

&lt;p&gt;Update your Jenkinsfile with the following steps to include agent configuration and deployment:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pipeline {
    agent { label 'dev-server' }
    stages {
        stage('code clone') {
            steps{
                echo 'cloning'
                git url: "https://github.com/ArjunMnn/django-notes-app", branch: "main"
            }
        }
        stage('build') {
            steps{
                 echo 'building'
                 sh 'docker build --no-cache -t my-note-app .'
            }
        }
        stage('push to dockerhub') {
            steps{
                echo 'pushing'
                withCredentials([usernamePassword(credentialsId:"dockerHub",passwordVariable:"dockerHubPass",usernameVariable:"dockerHubUser")]){
                    sh "docker tag my-note-app ${env.dockerHubUser}/my-note-app:latest"
                    sh "docker login -u ${env.dockerHubUser} -p ${dockerHubPass}"
                    sh "docker push ${env.dockerHubUser}/my-note-app:latest"
                }
            }
        }
        stage('deploy') {
           steps{
                echo 'deploying'
                sh "docker-compose down &amp;amp;&amp;amp; docker-compose build --no-cache &amp;amp;&amp;amp; docker-compose up -d --build"
           }
        }
    }
}

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

&lt;/div&gt;



&lt;h3&gt;
  
  
  Section 4: Configuring DockerHub Credentials
&lt;/h3&gt;

&lt;h4&gt;
  
  
  4.1 Jenkins Master:
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Navigate to "Manage Jenkins" -&amp;gt; "Manage Credentials."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Add your DockerHub credentials.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Section 5: Creating Docker Compose File
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Include a comprehensive Docker Compose file in your GitHub repository.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure services, networks, and volumes based on your Django app and any related services.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--1SH7eoCO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700638538017/30e28dcc-9f31-4354-a504-d30b38d1a929.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--1SH7eoCO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700638538017/30e28dcc-9f31-4354-a504-d30b38d1a929.png" alt="" width="635" height="270"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Section 6: Configuring GitHub Webhook
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In your GitHub repository, navigate to "Settings" -&amp;gt; "Webhooks" -&amp;gt; "Add webhook."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set the Payload URL to your Jenkins master server's webhook URL.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure the webhook to trigger on push events.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Section 7: Testing the Pipeline
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Click on build now. It should deploy the app.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--o7Yqq6bj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700638671657/c916bae6-5170-4717-851d-35ee1bab8807.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--o7Yqq6bj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700638671657/c916bae6-5170-4717-851d-35ee1bab8807.png" alt="" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--gqNDsc92--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700638609439/e9673364-d867-4d32-84a0-4bffa026d76b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--gqNDsc92--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700638609439/e9673364-d867-4d32-84a0-4bffa026d76b.png" alt="" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FZCeQjc3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700641993157/80561264-27c7-4f8f-a3e5-d930fdbc6235.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FZCeQjc3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700641993157/80561264-27c7-4f8f-a3e5-d930fdbc6235.png" alt="" width="753" height="230"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Observe Jenkins triggering the pipeline on the master server, with deployment occurring on the agent server.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--82ZRMwOy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700639034856/58e70c3c-72b3-4cfd-a5fc-0ea068c67c4d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--82ZRMwOy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700639034856/58e70c3c-72b3-4cfd-a5fc-0ea068c67c4d.png" alt="" width="339" height="128"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pKJg24qB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700642104697/d8f265e4-0444-4deb-a7d1-1689a38af9cd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pKJg24qB--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700642104697/d8f265e4-0444-4deb-a7d1-1689a38af9cd.png" alt="" width="800" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Conclusion
&lt;/h3&gt;

&lt;p&gt;You've successfully established a robust CICD pipeline for your Django web application, incorporating GitHub integration, Jenkins, Docker, and an agent-based approach. This comprehensive guide allows for easy customization to suit your specific development needs. Explore additional optimizations and enhancements to further enhance your deployment workflow. Happy coding!&lt;/p&gt;

&lt;p&gt;Let's connect on &lt;a href="https://www.linkedin.com/in/arjunmenon-devops/"&gt;LinkedIn&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Checkout my &lt;a href="https://github.com/ArjunMnn"&gt;GitHub&lt;/a&gt; profile.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Complete Jenkins CI/CD Project with GitHub Integration</title>
      <dc:creator>Arjun Menon</dc:creator>
      <pubDate>Sun, 19 Nov 2023 14:24:00 +0000</pubDate>
      <link>https://dev.to/arjunmenon/complete-jenkins-cicd-project-with-github-integration-5530</link>
      <guid>https://dev.to/arjunmenon/complete-jenkins-cicd-project-with-github-integration-5530</guid>
      <description>&lt;p&gt;Welcome to this comprehensive guide on setting up a Jenkins CI/CD pipeline for deploying a Node.js To-Do app using Docker Compose, seamlessly integrated with GitHub. This tutorial will walk you through each step, providing detailed explanations and additional information to ensure a smooth setup.&lt;/p&gt;

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

&lt;p&gt;In the ever-evolving landscape of software development, Continuous Integration and Continuous Deployment (CI/CD) have become integral components for delivering reliable and efficient applications. Jenkins, coupled with Docker and GitHub, offers a powerful solution to automate your application deployment process.&lt;/p&gt;

&lt;p&gt;This tutorial focuses on the seamless integration of Jenkins with GitHub using webhooks. With GitHub webhooks, any changes made to your repository trigger automatic deployments through Jenkins, ensuring your application is always up-to-date.&lt;/p&gt;

&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;Before we begin, ensure the following prerequisites are met:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Your ec2 instance is up and running.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Jenkins is installed and running.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Docker and Docker Compose are installed on your server.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Setting Up Jenkins Job
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 1: Create a New Freestyle Project
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Open Jenkins and Navigate to Dashboard:&lt;/strong&gt; Log in to your Jenkins instance and click on "New Item" to create a new project.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enter Project Details:&lt;/strong&gt; Provide a name for your project, such as "todo-node-app," and select the "Freestyle project" option. Click "OK" to create the project.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 2: Configure GitHub Project
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enable GitHub Project:&lt;/strong&gt; Check the "GitHub project" checkbox.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enter Project URL:&lt;/strong&gt; In the "Project URL" field, input the URL of your GitHub repository (e.g., &lt;a href="https://arjunmenon.hashnode.dev/day-24-25-complete-jenkins-cicd-project#heading-introduction"&gt;&lt;code&gt;https://github.com/ArjunMnn/node-todo-cicd/&lt;/code&gt;&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7t4db6tG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700321755680/88642c53-edb0-4691-b4dc-b06080fa31cc.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7t4db6tG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700321755680/88642c53-edb0-4691-b4dc-b06080fa31cc.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" alt="" width="800" height="335"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 3: Set Up Source Code Management
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Choose Git:&lt;/strong&gt; In the "Source Code Management" section, select "Git."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enter Repository URL:&lt;/strong&gt; Input the URL of your GitHub repository (e.g., &lt;a href="https://arjunmenon.hashnode.dev/day-24-25-complete-jenkins-cicd-project#heading-introduction"&gt;&lt;code&gt;https://github.com/ArjunMnn/node-todo-cicd.git&lt;/code&gt;&lt;/a&gt;).&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QvO9MGt3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700321789046/240666c7-ad12-4923-ac63-c19fec9c5089.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QvO9MGt3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700321789046/240666c7-ad12-4923-ac63-c19fec9c5089.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" alt="" width="800" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 4: Configure Credentials
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Generate SSH Keys:&lt;/strong&gt; On your EC2 instance, run &lt;code&gt;ssh-keygen&lt;/code&gt; to generate SSH keys. Use the generated public key for GitHub&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Add SSH Key to GitHub:&lt;/strong&gt; In GitHub settings, add a new SSH key with the generated public key.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Jenkins Credentials:&lt;/strong&gt; In Jenkins credentials section, select "SSH username with private key" in the "Kind" field. Use "github-jenkins" as the ID and "ubuntu" as the username. Enter the private key directly.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 5: Set Up Build Triggers
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Enable GitHub Hook Trigger:&lt;/strong&gt; In the "Build Triggers" section, check "GitHub hook trigger for GITScm polling." This ensures that Jenkins is triggered upon code changes in your GitHub repository.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 6: Define Build Steps
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Add Execute Shell Build Step:&lt;/strong&gt; In the "Build" section, add an "Execute shell" build step. Enter the command &lt;code&gt;docker-compose down &amp;amp;&amp;amp; docker-compose build --no-cache &amp;amp;&amp;amp; docker-compose up -d --build&lt;/code&gt; to handle Docker Compose actions.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 7: Save the Jenkins Job
&lt;/h3&gt;

&lt;p&gt;Click "Save" to store your Jenkins job configuration.&lt;/p&gt;

&lt;h2&gt;
  
  
  GitHub Webhook Configuration
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 8: GitHub Webhook Setup
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Navigate to GitHub Settings:&lt;/strong&gt; In your GitHub repository, click on "Settings" and select "Webhooks."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Add Webhook:&lt;/strong&gt; Click "Add webhook" to set up a new webhook.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 9: Configure Webhook
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Enter Payload URL:&lt;/strong&gt; In the "Payload URL" field, enter &lt;code&gt;&amp;lt;ipaddress:8080/github-webhook/&amp;gt;&lt;/code&gt;. Ensure to replace &lt;code&gt;&amp;lt;ipaddress&amp;gt;&lt;/code&gt; with the actual IP of your Jenkins server.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Set Content Type:&lt;/strong&gt; Choose "application/json" as the content type.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Save Webhook:&lt;/strong&gt; Click "Add webhook" to save your webhook configuration.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Install GitHub Integration Plugin
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Step 10: Install GitHub Integration Plugin
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Navigate to Jenkins Plugin Manager:&lt;/strong&gt; In Jenkins, go to "Manage Jenkins" &amp;gt; "Manage Plugins."&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Install Plugin:&lt;/strong&gt; In the "Available" tab, search for "GitHub Integration" and install the plugin. Restart Jenkins when prompted.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 11: Test the Jenkins Job
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Build Now:&lt;/strong&gt; Go to your Jenkins job and click "Build Now" to test if the setup is correct.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Check Console Output:&lt;/strong&gt; Monitor the build console output for any errors or issues.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Step 12: Test the Deployment
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Open Browser:&lt;/strong&gt; In your web browser, navigate to &lt;code&gt;&amp;lt;ipaddress:8000&amp;gt;&lt;/code&gt; to verify that your app is successfully deployed.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--aA3JeZNp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700322311537/4040b30b-2f06-44dc-b893-f0148852d21b.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--aA3JeZNp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700322311537/4040b30b-2f06-44dc-b893-f0148852d21b.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" alt="" width="800" height="177"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 13: Verify Webhook
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Make Changes in GitHub:&lt;/strong&gt; Make changes to your GitHub repository to test the webhook.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Check Jenkins:&lt;/strong&gt; Observe Jenkins for triggered builds and successful deployments.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Verify Deployment:&lt;/strong&gt; Confirm the changes by checking the deployed app in the browser at &lt;code&gt;&amp;lt;ipaddress:8000&amp;gt;&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--mY6fZJcp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700322319183/020e8884-b3b0-4eec-8f53-3bbc0f1e6b16.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--mY6fZJcp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://cdn.hashnode.com/res/hashnode/image/upload/v1700322319183/020e8884-b3b0-4eec-8f53-3bbc0f1e6b16.png%3Fauto%3Dcompress%2Cformat%26format%3Dwebp" alt="" width="800" height="161"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Congratulations! You've successfully configured a Jenkins CI/CD pipeline to automate the deployment of your Node.js To-Do app, integrated seamlessly with GitHub. Embrace the power of CI/CD for efficient and reliable software delivery. Happy coding! 🎉&lt;/p&gt;

&lt;p&gt;Let's connect on &lt;a href="https://www.linkedin.com/in/arjunmenon-devops/"&gt;LinkedIn&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
