<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Bernard Chika Uwaezuoke</title>
    <description>The latest articles on Forem by Bernard Chika Uwaezuoke (@donhadley22).</description>
    <link>https://forem.com/donhadley22</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%2F1077992%2Fc68445db-79e3-411a-a3f8-555e92e383d6.jpeg</url>
      <title>Forem: Bernard Chika Uwaezuoke</title>
      <link>https://forem.com/donhadley22</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/donhadley22"/>
    <language>en</language>
    <item>
      <title>A Real-World Serverless Appointment Booking Backend on AWS</title>
      <dc:creator>Bernard Chika Uwaezuoke</dc:creator>
      <pubDate>Mon, 12 Jan 2026 23:02:56 +0000</pubDate>
      <link>https://forem.com/donhadley22/a-real-world-serverless-appointment-booking-backend-on-aws-dc4</link>
      <guid>https://forem.com/donhadley22/a-real-world-serverless-appointment-booking-backend-on-aws-dc4</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;From “Hello World” to a Real-World, Production-Ready System&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Introduction: From Demo to Impact.
&lt;/h2&gt;

&lt;p&gt;Most tutorials stop at &lt;em&gt;“Hello from Serverless API!”&lt;/em&gt;&lt;br&gt;
That is useful as a starting point, but it doesn’t solve a real problem.&lt;/p&gt;

&lt;p&gt;In the real world, businesses do not need “Hello World.”&lt;br&gt;
They need &lt;strong&gt;customers booked&lt;/strong&gt;, &lt;strong&gt;schedules organized&lt;/strong&gt;, and &lt;strong&gt;systems that scale without breaking&lt;/strong&gt;.&lt;br&gt;
In this blog, we’ll take a &lt;strong&gt;simple AWS Lambda + API Gateway setup&lt;/strong&gt; and evolve it into a &lt;strong&gt;Smart Appointment Booking &amp;amp; Management API&lt;/strong&gt;. A serverless backend that could realistically power a clinic, salon, or consulting business.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No servers.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;No infrastructure headaches.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Just clean, scalable cloud architecture.&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Problem Definition
&lt;/h2&gt;

&lt;p&gt;Most small service-based businesses often face:&lt;br&gt;
• Manual appointment booking&lt;br&gt;
• Double bookings&lt;br&gt;
• No automated reminders&lt;br&gt;
• Poor visibility into schedules&lt;br&gt;
Hiring engineers to manage servers is expensive.&lt;br&gt;
This is where serverless architecture shines.&lt;/p&gt;
&lt;h2&gt;
  
  
  The Serverless Solution Architecture
&lt;/h2&gt;

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

&lt;ul&gt;
&lt;li&gt;Active AWS account&lt;/li&gt;
&lt;li&gt;Basic understanding of serverless architecture&lt;/li&gt;
&lt;li&gt;Knowledge of Python or Node.js&lt;/li&gt;
&lt;li&gt;Familiarity with REST APIs and HTTP methods&lt;/li&gt;
&lt;li&gt;Basic understanding of authentication (JWT)&lt;/li&gt;
&lt;li&gt;Fundamental AWS IAM concepts&lt;/li&gt;
&lt;li&gt;Ability to use API testing tools (Postman or cURL)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Now let's dive in!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 1: Creating the Core Lambda Function
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Create the Lambda Function
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Sign into AWS Console &lt;a href="https://signin.aws.amazon.com" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Search for and select &lt;strong&gt;Lambda&lt;/strong&gt; in the global search bar.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Click on the &lt;strong&gt;Create a function&lt;/strong&gt; button. &lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Author from scratch&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure:&lt;br&gt;
o   Function Name: &lt;em&gt;AppointmentAPI&lt;/em&gt;&lt;br&gt;
o   Runtime: &lt;em&gt;Python 3.x&lt;/em&gt;&lt;br&gt;
o   Execution Role: Create new role with basic permissions&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Create Function&lt;/strong&gt; as shown in the images below.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lviwx86rqan51x006eg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9lviwx86rqan51x006eg.png" alt="lambda function" width="800" height="279"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  2. Basic Lambda Handler (Foundation)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Go to the &lt;strong&gt;Code&lt;/strong&gt; section of the function you just created and replace the body of code there with the code below.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import json

def lambda_handler(event, context):
    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": "Appointment API is running"
        })
    }

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

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Click on the &lt;strong&gt;Deploy&lt;/strong&gt; button to deploy the function.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Click on the &lt;strong&gt;Test&lt;/strong&gt; button and Create an &lt;strong&gt;Event&lt;/strong&gt; to test your function, then click the &lt;strong&gt;Test&lt;/strong&gt; button as shown below.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;The function ran successfully!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshkmefq6ei3527r0pjb4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fshkmefq6ei3527r0pjb4.png" alt="Success" width="800" height="228"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 2: Exposing the API with API Gateway
&lt;/h2&gt;
&lt;h3&gt;
  
  
  1. Create REST API
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Search for and select &lt;strong&gt;API Gateway&lt;/strong&gt; in the global search bar.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Click Create API&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose &lt;strong&gt;REST API&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Regional&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select &lt;strong&gt;Security Policy&lt;/strong&gt; &lt;em&gt;(as shown in the image below)&lt;/em&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on &lt;strong&gt;Create API&lt;/strong&gt; button&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Resource name: appointments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Path: /&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Inside the created API Resource, click on the &lt;strong&gt;Create method&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Add the following methods:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;strong&gt;Method&lt;/strong&gt;&lt;/th&gt;
&lt;th&gt;&lt;strong&gt;Purpose&lt;/strong&gt;&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;POST&lt;/td&gt;
&lt;td&gt;Create appointment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GET&lt;/td&gt;
&lt;td&gt;Fetch appointments&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;PUT&lt;/td&gt;
&lt;td&gt;Update appointment&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;DELETE&lt;/td&gt;
&lt;td&gt;Cancel appointment&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;em&gt;Each method integrates with the same Lambda function.&lt;/em&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  Steps to Create a &lt;strong&gt;Method&lt;/strong&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;For a POST /appointments method:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Select the /appointments resource&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click Actions → Create Method&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose POST&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Toggle the switch for &lt;strong&gt;Lambda proxy integration&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set Integration type to &lt;strong&gt;Lambda Function&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable Lambda Proxy Integration &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Choose your region and select your Lambda (AppointmentAPI)&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Create method&lt;/strong&gt;.&lt;/p&gt;

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

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbt7jp4vl63yhijg4z9mh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbt7jp4vl63yhijg4z9mh.png" alt="Post method 3" width="800" height="271"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;What it does: Creates a new appointment entry (writes to DynamoDB).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;For a GET /appointments method *&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Repeat the same steps, but choose GET:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;/appointments → Actions → Create Method → GET&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integration type: Lambda Function&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable Lambda Proxy Integration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select the same Lambda function&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Create method&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;What it does: Returns appointments (for a user or provider).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For a PUT /appointments method.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Repeat again for PUT:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;/appointments → Actions → Create Method → PUT&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrate with the same Lambda&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable Lambda Proxy Integration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Create method&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;What it does: Updates an appointment (reschedule, status update, etc.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For a DELETE /appointments method.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Repeat for DELETE:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;/appointments → Actions → Create Method → DELETE&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Integrate with same Lambda&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enable Lambda Proxy Integration&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Create method&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;What it does: Cancels an appointment (soft delete recommended, by setting status = canceled).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The four CRUD Methods.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcu0i2svorx1ruggqvq5l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcu0i2svorx1ruggqvq5l.png" alt="CRUD Methods" width="800" height="341"&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h2&gt;
  
  
  Step 3: Designing the Data Model (DynamoDB)
&lt;/h2&gt;

&lt;p&gt;Before we write a single line of booking logic, we need to get the data model right. In serverless systems, your database design is everything, because your API performance, cost, and scalability depend on it.&lt;/p&gt;

&lt;p&gt;For this &lt;strong&gt;Smart Appointment Booking API&lt;/strong&gt;, we’ll use &lt;strong&gt;Amazon DynamoDB&lt;/strong&gt;: a fully managed NoSQL database designed for fast reads/writes at massive scale.&lt;/p&gt;
&lt;h3&gt;
  
  
  Setting up the DynamoDB Table
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Open DynamoDB&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Search for and select &lt;strong&gt;Lambda&lt;/strong&gt; in the global search bar.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Click DynamoDB → Tables → Create table&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. Create the Appointments Table&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
On &lt;strong&gt;Create table&lt;/strong&gt; pane, enter:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Table details&lt;/p&gt;

&lt;p&gt;Table name: Appointments&lt;/p&gt;

&lt;p&gt;Partition key (PK): &lt;code&gt;userId&lt;/code&gt; (Type: String)&lt;/p&gt;

&lt;p&gt;Sort key (SK): &lt;code&gt;appointmentId&lt;/code&gt; (Type: String) &lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;3. Choose Table Settings&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Under Table settings, choose On-demand (Pay per request)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is best for MVPs and unpredictable traffic&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Create table&lt;/strong&gt; button. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;4. Add a Global Secondary Index (GSI) for Fast Lookups&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;This is optional, but it’s what makes your API feel “real” when you need queries like:&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Show all appointments on a date”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Show all booked appointments”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;“Show all appointments by service type”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Create a GSI for date&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Open the Appointments table&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to Indexes tab&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click Create index&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Index details&lt;/p&gt;

&lt;p&gt;Partition key: &lt;code&gt;date&lt;/code&gt; (String)&lt;/p&gt;

&lt;p&gt;Sort key (optional): &lt;em&gt;time&lt;/em&gt; (String)&lt;/p&gt;

&lt;p&gt;Index name: &lt;code&gt;date-time-index&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Leave other configurations as default&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click Create index&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

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

&lt;p&gt;&lt;em&gt;Now you can query: “All appointments on 2026-02-20, sorted by time.”&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Give Lambda Permission to Use DynamoDB&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Lambda won’t be able to read/write until IAM allows it.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Go to &lt;strong&gt;Lambda&lt;/strong&gt; → our function &lt;strong&gt;(AppointmentAPI)&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open &lt;strong&gt;Configuration&lt;/strong&gt; → &lt;strong&gt;Permissions&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the Execution role (opens IAM)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click Add permissions → Attach policies&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Attach one of these:&lt;/p&gt;

&lt;p&gt;Quick (broad, good for learning) but goes against the &lt;strong&gt;Least Privilege Principle&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;AmazonDynamoDBFullAccess&lt;/p&gt;

&lt;p&gt;Better (recommended for real projects):&lt;/p&gt;

&lt;p&gt;Create a custom policy allowing only:&lt;/p&gt;

&lt;p&gt;dynamodb:PutItem&lt;/p&gt;

&lt;p&gt;dynamodb:GetItem&lt;/p&gt;

&lt;p&gt;dynamodb:UpdateItem&lt;/p&gt;

&lt;p&gt;dynamodb:DeleteItem&lt;/p&gt;

&lt;p&gt;dynamodb:Query&lt;/p&gt;

&lt;p&gt;dynamodb:Scan (optional)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;However, for purpose of this demo, we will use the first option 
(AmazonDynamoDBFullAccess).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Lambda Permission (IAM Role)&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fquy6enofjgufexgwntn5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fquy6enofjgufexgwntn5.png" alt="Lambda Role" width="800" height="331"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Attach Policy (AmazonDynamoDBFullAccess)&lt;/em&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5i0q3pmjhnbmrlmmkod6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5i0q3pmjhnbmrlmmkod6.png" alt="IAM Permission" width="800" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on &lt;strong&gt;Add permission&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Step 4: Booking an Appointment (Business Logic)
&lt;/h2&gt;

&lt;p&gt;Now that &lt;strong&gt;DynamoDB&lt;/strong&gt; is ready and &lt;strong&gt;API Gateway&lt;/strong&gt; routes requests to &lt;strong&gt;Lambda&lt;/strong&gt;, we are ready to build the real booking engine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here is what we will implement:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;POST /appointments to creates a new booking&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Validates required fields&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Generates a unique appointmentId&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Writes the appointment into DynamoDB&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Returns a clean JSON response&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  1. Lambda: Read the Incoming Request
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;When API Gateway triggers Lambda (proxy mode), the body arrives as a string under event["body"].&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What Lambda Receives &lt;/li&gt;
&lt;li&gt;event["httpMethod"] → "POST"&lt;/li&gt;
&lt;li&gt;event["path"] → "/appointments"&lt;/li&gt;
&lt;li&gt;event["body"] → JSON string&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  2. Implement Appointment Booking Logic (Python)
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Create appointment + store in DynamoDB&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Since our &lt;strong&gt;DynamoDB table&lt;/strong&gt; is named &lt;strong&gt;Appointments&lt;/strong&gt; and has keys:&lt;br&gt;
&lt;strong&gt;userId&lt;/strong&gt; (PK), &lt;strong&gt;appointmentId&lt;/strong&gt; (SK)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to the Lambda function and add the body of codes below:
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import json
import os
import uuid
import boto3
from datetime import datetime

dynamodb = boto3.resource("dynamodb")
TABLE_NAME = os.environ.get("APPOINTMENTS_TABLE", "Appointments")
table = dynamodb.Table(TABLE_NAME)

def lambda_handler(event, context):
    method = event.get("httpMethod")
    path = event.get("path")

    # Route: POST /appointments
    if method == "POST" and path == "/appointments":
        return handle_create_appointment(event)

    return response(404, {"error": "Route not found"})

def handle_create_appointment(event):
    # In a real system, userId comes from Cognito JWT claims.
    # For now, we’ll hardcode a sample user.
    user_id = "user_123"

    # Parse JSON body
    try:
        body = json.loads(event.get("body") or "{}")
    except json.JSONDecodeError:
        return response(400, {"error": "Invalid JSON body"})

    service = body.get("service")
    date = body.get("date")
    time = body.get("time")

    # Validate required fields
    missing = [k for k in ["service", "date", "time"] if not body.get(k)]
    if missing:
        return response(400, {"error": f"Missing fields: {', '.join(missing)}"})

    # Basic input validation (light but helpful)
    if not is_valid_date(date):
        return response(400, {"error": "Invalid date format. Use YYYY-MM-DD"})
    if not is_valid_time(time):
        return response(400, {"error": "Invalid time format. Use HH:MM (24h)"})

    appointment_id = f"apt_{uuid.uuid4().hex[:10]}"
    item = {
        "userId": user_id,
        "appointmentId": appointment_id,
        "service": service,
        "date": date,
        "time": time,
        "status": "BOOKED",
        "createdAt": datetime.utcnow().isoformat() + "Z"
    }

    # Write to DynamoDB
    table.put_item(Item=item)

    # Return response
    return response(201, {
        "appointmentId": appointment_id,
        "status": "BOOKED"
    })

def response(status_code, body):
    return {
        "statusCode": status_code,
        "headers": {
            "Content-Type": "application/json"
        },
        "body": json.dumps(body)
    }

def is_valid_date(date_str):
    try:
        datetime.strptime(date_str, "%Y-%m-%d")
        return True
    except Exception:
        return False

def is_valid_time(time_str):
    try:
        datetime.strptime(time_str, "%H:%M")
        return True
    except Exception:
        return False

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

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;Click on Deploy&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  3. Configure Lambda Environment Variable
&lt;/h3&gt;

&lt;p&gt;&lt;em&gt;Instead of hardcoding table name.&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Navigate to &lt;strong&gt;Lambda&lt;/strong&gt; → &lt;strong&gt;our function&lt;/strong&gt; (AppointmentAPI) → &lt;strong&gt;Configuration&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;On the left pane, click on &lt;strong&gt;Environment variables&lt;/strong&gt; → Edit and &lt;strong&gt;Add environment variable&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;Key: APPOINTMENTS_TABLE&lt;/p&gt;

&lt;p&gt;Value: Appointments&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click &lt;strong&gt;Save&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Go to API Gateway, click on our API (AppointmentRestAPI), on the left pane, under &lt;strong&gt;API: AppointmentRestAPI&lt;/strong&gt;&lt;br&gt;
click on &lt;strong&gt;Stages&lt;/strong&gt;, click on &lt;strong&gt;Create stage&lt;/strong&gt;. Enter the following details:&lt;br&gt;
Stage name: prod&lt;br&gt;
Deployment: select date and time from the draw-down.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leave others as default and click the &lt;strong&gt;Create stage&lt;/strong&gt; button.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Then click on deploy using the created stage (prod)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Lambda Triggers API Routes&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to our Lambda function, click on &lt;strong&gt;API Gateway&lt;/strong&gt; under the &lt;strong&gt;AppointmentAPI&lt;/strong&gt; and click on configuration.
To see the triggers (The four routes of POST, GET, PUT and DELETE)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Using cURL&lt;br&gt;
&lt;em&gt;Replace the URL with your API Gateway Invoke URL:&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;(In Windows PowerShell)&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Invoke-RestMethod `
  -Method POST `
  -Uri "https://8cjba7n9wb.execute-api.us-east-1.amazonaws.com/prod/appointments" `
  -ContentType "application/json" `
  -Body '{"service":"haircut","date":"2026-02-20","time":"14:00"}'

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response in PowerShell&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Table item in DynamoDB table&lt;/strong&gt;&lt;br&gt;
Go to DynamoDB, click on our table and find the new item posted there by the Lambda function, triggered by the API.&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;&lt;strong&gt;At this point, we’ve built a real booking engine.&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Step 5: Set Notifications &amp;amp; Reminders (SNS + SES)
&lt;/h2&gt;

&lt;p&gt;Bookings are pointless if people forget them. Real systems reduce no-shows with instant confirmations and scheduled reminders.&lt;/p&gt;

&lt;p&gt;So, let's add:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;SNS for SMS alerts&lt;/li&gt;
&lt;li&gt;SES for email confirmations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Triggers for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Booking confirmation (immediate)&lt;/li&gt;
&lt;li&gt;24-hour reminder (scheduled)&lt;/li&gt;
&lt;li&gt;Cancellation alert (immediate)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  SMS Notifications with Amazon SNS
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1. Create (or choose) an SNS setup for SMS&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to Amazon SNS in AWS Console&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the left menu, click Text messaging (SMS) (if shown)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Scroll down to SMS preferences (or click Edit SMS preferences if shown) as shown in the images below.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Set:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Default message type → Transactional&lt;/p&gt;

&lt;p&gt;Monthly spending limit → set a small amount (e.g. 1 or 5 USD)&lt;/p&gt;

&lt;p&gt;Click Save changes&lt;/p&gt;

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

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

&lt;p&gt;&lt;em&gt;In many regions you can send SMS directly without creating a topic (you publish to a phone number).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Test SMS directly from the SNS console (optional but recommended)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the same screen, click Publish text message (top right)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Enter:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Phone number → your phone number (with country code, e.g. +1...)&lt;/li&gt;
&lt;li&gt;Message → Test SMS from Appointment API&lt;/li&gt;
&lt;li&gt;Click Publish message&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F07vekz2lifmu7mmohnur.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F07vekz2lifmu7mmohnur.png" alt="varify" width="800" height="247"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;If you receive the SMS, SNS is working correctly.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Allow your Lambda to send SMS&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to AWS Lambda&lt;/li&gt;
&lt;li&gt;Open your function (e.g. AppointmentAPI)&lt;/li&gt;
&lt;li&gt;Go to Configuration → Permissions&lt;/li&gt;
&lt;li&gt;Click the Execution role (opens IAM)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Attach this policy:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AmazonSNSFullAccess &lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Scroll down and click &lt;strong&gt;Add permissions&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Lambda can now send SMS.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Send SMS from Lambda (this is all you need)&lt;/strong&gt;&lt;br&gt;
Add the body of code below to our Lambda code:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import boto3

sns = boto3.client("sns")

def send_sms(phone_number, message):
    sns.publish(
        PhoneNumber=phone_number,
        Message=message
    )

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Response (Booking confirmation)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;send_sms(
    "+15551234567",
    "Booking confirmed: Haircut on 2026-02-20 at 14:00"
)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;5. When SMS is triggered&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Booking confirmation&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;After successful POST /appointments&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
Cancellation alert&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;After DELETE /appointments or status update to canceled&lt;/p&gt;
&lt;/blockquote&gt;

&lt;ul&gt;
&lt;li&gt;
24-hour reminder&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Sent from a scheduled Lambda (step no includede here)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Epilogue: Completing the Journey to a Full SaaS Backend
&lt;/h2&gt;

&lt;p&gt;What we’ve built throughout this blog is a solid foundation, a functional, real-world serverless backend capable of handling bookings, persistence, and user-facing workflows. But modern SaaS systems don’t stop at functionality alone. They mature through security, reliability, deployment discipline, and cost awareness.&lt;/p&gt;

&lt;p&gt;To evolve this solution into a fully production-grade SaaS backend, the following layers naturally complement what we have already covered:&lt;/p&gt;

&lt;h3&gt;
  
  
  Securing the API with Authentication
&lt;/h3&gt;

&lt;p&gt;Adding authentication ensures that every request is trusted and every action is tied to an authenticated identity. This is where user isolation, role-based access, and data protection come into play, which is critical for any real application handling customer data.&lt;/p&gt;

&lt;h3&gt;
  
  
  Monitoring &amp;amp; Reliability
&lt;/h3&gt;

&lt;p&gt;Visibility is what turns a working system into a reliable one. By introducing monitoring, logs, and alerts, the system becomes observable, debuggable, and resilient under real traffic and failure scenarios.&lt;/p&gt;

&lt;h3&gt;
  
  
  Deployment Strategy
&lt;/h3&gt;

&lt;p&gt;A proper deployment strategy, separating development, staging, and production environments, that allows changes to be released safely and confidently. This transforms the project from a single deployment into a system that can evolve continuously.&lt;/p&gt;

&lt;h3&gt;
  
  
  Cost Breakdown: Why Serverless Wins
&lt;/h3&gt;

&lt;p&gt;Understanding the cost model completes the architectural picture. With serverless, you pay only for usage, scale automatically with demand, and eliminate idle infrastructure—making this approach especially powerful for startups and growing businesses.&lt;/p&gt;

&lt;h3&gt;
  
  
  The Final Result
&lt;/h3&gt;

&lt;p&gt;When these layers are added on top of the system we have built, the result is a complete SaaS-ready backend:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Secure&lt;/li&gt;
&lt;li&gt;Scalable&lt;/li&gt;
&lt;li&gt;Production-ready&lt;/li&gt;
&lt;li&gt;Business-focused&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This architecture is not theoretical. It is directly applicable to real industries and real customers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This system could power:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clinics managing patient appointments&lt;/li&gt;
&lt;li&gt;Salons handling bookings and reminders&lt;/li&gt;
&lt;li&gt;Consultants scheduling client sessions&lt;/li&gt;
&lt;li&gt;Repair services coordinating visits and follow-ups&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Closing Thought
&lt;/h2&gt;

&lt;p&gt;The true value of serverless architecture isn’t just removing servers, it is in enabling teams to focus on business logic, user experience, and growth instead of infrastructure. What we have built here is not an endpoint, but a platform, one that can be extended, secured, observed, and scaled into a real product.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;That is the difference between a tutorial and a real SaaS system.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>lambda</category>
      <category>programming</category>
      <category>serverless</category>
    </item>
    <item>
      <title>AWS Lightsail in Action: Launching and Scaling Your Web Server Efficiently.</title>
      <dc:creator>Bernard Chika Uwaezuoke</dc:creator>
      <pubDate>Sun, 20 Apr 2025 17:03:23 +0000</pubDate>
      <link>https://forem.com/donhadley22/aws-lightsail-in-action-launching-and-scaling-your-web-server-efficiently-2pn6</link>
      <guid>https://forem.com/donhadley22/aws-lightsail-in-action-launching-and-scaling-your-web-server-efficiently-2pn6</guid>
      <description>&lt;h1&gt;
  
  
  Description
&lt;/h1&gt;

&lt;p&gt;Deploy a Java web app to AWS Lightsail using Jenkins for CI/CD. Learn how to launch, automate, and scale your app with this hands-on tutorial.&lt;/p&gt;

&lt;p&gt;Are you looking for a fast, affordable, and beginner-friendly way to deploy your Java app to the cloud?&lt;/p&gt;

&lt;h2&gt;
  
  
  In this guide, you'll learn how to:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Launch an AWS Lightsail instance&lt;/li&gt;
&lt;li&gt;Use Jenkins to build and deploy a containerized Java web application&lt;/li&gt;
&lt;li&gt;Scale your application smartly&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Introduction
&lt;/h1&gt;

&lt;h2&gt;
  
  
  AWS Lightsail
&lt;/h2&gt;

&lt;p&gt;AWS Lightsail is a lightweight Virtual Private Server (VPS) service by Amazon Web Services, perfect for developers and small teams looking to deploy applications without diving into complex AWS configurations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Key Features of AWS Lightsail
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Straightforward Pricing with Predictable Costs
&lt;/h4&gt;

&lt;p&gt;One of Lightsail’s biggest advantages is its flat-rate pricing model. Unlike EC2’s pay-as-you-go model, Lightsail bundles compute resources, SSD storage, and data transfer into fixed monthly plans, starting as low as $5/month. This makes budgeting easier, especially for developers working on side projects or small teams managing costs without sacrificing performance.&lt;/p&gt;

&lt;h4&gt;
  
  
  Quick Instance Setup and Pre-configured Applications
&lt;/h4&gt;

&lt;p&gt;Starting with AWS Lightsail is incredibly easy. Users can launch a virtual machine (instance) in just a few clicks. You can choose your preferred operating system (Linux or Windows) or select from a range of pre-configured application stacks such as WordPress, Node.js, LAMP, and more. This allows developers to skip lengthy server setup processes and get their applications online faster.&lt;/p&gt;

&lt;h4&gt;
  
  
  Built-in Networking and Management Tools
&lt;/h4&gt;

&lt;p&gt;Lightsail includes several built-in tools to simplify server management. Users can easily assign static IPs, configure DNS settings, manage firewalls, and even integrate load balancers for high availability setups. These features are accessible via a user-friendly web interface, which removes the need for complex networking configurations typically associated with EC2 or other AWS infrastructure.&lt;/p&gt;

&lt;h4&gt;
  
  
  Snapshots, Backups, and High Availability
&lt;/h4&gt;

&lt;p&gt;Data protection and recovery are made simple through Lightsail’s snapshot feature. You can create snapshots of your instances and storage volumes either manually or automatically. These snapshots can be used to restore data quickly or clone environments for testing or scaling. Lightsail also supports high availability by allowing load balancer integration and deploying across different availability zones.&lt;/p&gt;

&lt;h4&gt;
  
  
  Seamless Migration to EC2
&lt;/h4&gt;

&lt;p&gt;When your project outgrows Lightsail’s capabilities, migrating to EC2 is straightforward. Lightsail offers a built-in export tool that converts your instance into an EC2-compatible AMI. This makes it easy to transition to a more flexible and powerful AWS environment while maintaining your application setup and configurations.&lt;/p&gt;

&lt;h3&gt;
  
  
  Ideal Use Cases
&lt;/h3&gt;

&lt;p&gt;AWS Lightsail is best suited for lightweight workloads and projects that require quick deployment and minimal maintenance. It is ideal for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Hosting blogs, portfolios, and e-commerce websites&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Running small-scale web applications and APIs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Creating development or staging environments&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Deploying MVPs (Minimum Viable Products)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Students or beginners learning server deployment&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Prerequisites
&lt;/h1&gt;

&lt;p&gt;Please ensure you have the following before we begin:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An AWS account&lt;/li&gt;
&lt;li&gt;Jenkins installed (locally or remotely)&lt;/li&gt;
&lt;li&gt;Apache Maven installed (locally or remotely)&lt;/li&gt;
&lt;li&gt;A Java project (using Maven or Gradle)&lt;/li&gt;
&lt;li&gt;Docker installed (locally or remotely)&lt;/li&gt;
&lt;li&gt;Basic familiarity with terminal commands&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Step 1: Create a Lightsail Instance
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
Visit &lt;a href="https://lightsail.aws.amazon.com/" rel="noopener noreferrer"&gt;AWS Lightsail&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Click &lt;strong&gt;Create instance&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select your instance location. For this project, I chose &lt;strong&gt;Virginia&lt;/strong&gt; &lt;code&gt;us-east-1&lt;/code&gt; region.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
Choose your instance image; this is the operating system.

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Platform:&lt;/strong&gt; Linux/Unix&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Blueprint:&lt;/strong&gt; OS-only (Ubuntu)
For this demo, I chose Ubuntu distribution of Linux operating system without any &lt;strong&gt;Apps&lt;/strong&gt; added.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
Pick an instance plan from (as low as $5/month). This is one of the major benefits of the &lt;strong&gt;AWS Lightsail&lt;/strong&gt; it removes the unpredictability of cloud costs and allows small businesses to operate within a tight budget.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
Give your instance a unique name; this will enable you to identify it, and then click on the &lt;strong&gt;Create Instance&lt;/strong&gt; button to launch it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;The instance starting&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on the Instance icon to see the details&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
Download the &lt;code&gt;.pem&lt;/code&gt; private SSH key. You need this to connect to the instance from an SSH agent or terminal. For this project, we connected directly from the Lightsail management console.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Click on the &lt;strong&gt;Networking&lt;/strong&gt; tab and scroll down to &lt;strong&gt;IPv4 Firewall&lt;/strong&gt; under it click on &lt;strong&gt;Add rule&lt;/strong&gt;. This will open a pane to configure inbound rule. Under &lt;strong&gt;Application&lt;/strong&gt;, select &lt;strong&gt;Custom&lt;/strong&gt;, for &lt;strong&gt;Protocol&lt;/strong&gt; select &lt;strong&gt;TCP&lt;/strong&gt; and &lt;strong&gt;Port or range&lt;/strong&gt; enter &lt;strong&gt;8080&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h1&gt;
  
  
  Step 2: Connect to Your Instance
&lt;/h1&gt;

&lt;p&gt;Use the command below if you are connecting from a command line.&lt;br&gt;
&lt;code&gt;ssh -i ~/Downloads/lightsail.pem ubuntu@your-lightsail-ip&lt;/code&gt;&lt;br&gt;
For this project, I will be connecting from the Lightsail console.&lt;/p&gt;

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

&lt;p&gt;&lt;em&gt;The Ubuntu Lightsail Instance Terminal&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Once connected, run the following commands to update the server and install &lt;strong&gt;Java&lt;/strong&gt; and &lt;strong&gt;Docker&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y

sudo apt install -y default-jdk

java -version  

sudo apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg lsb-release

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] \
  https://download.docker.com/linux/ubuntu \
  $(lsb_release -cs) stable" | \
  sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null

sudo apt update

sudo apt install -y docker-ce docker-ce-cli containerd.io

docker --version
sudo systemctl status docker

sudo usermod -aG docker $USER
newgrp docker  

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

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Checking Java Version&lt;/em&gt;&lt;/p&gt;

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

&lt;h1&gt;
  
  
  Step 3: Deploy the Application
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Clone the Project Repository:&lt;/strong&gt;
Clone the sample Java application repository from GitHub. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;git clone https://github.com/Donhadley22/practice-java-app.git&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;This repository contains a basic Java project, Dockerfile and Jenkinsfile. These will be used to build a Docker image, test, and deploy the application to AWS Lightsail.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here is the Jenkinsfile:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pipeline {
  agent any
     tools {
    maven 'maven-3.9.9'
  }

  environment {
    DOCKER_IMAGE          = 'donhadley/peabsmartapp'
    DOCKERFILE            = 'Dockerfile'
    DOCKER_REGISTRY       = 'index.docker.io/v1'
    DOCKER_CREDENTIALS_ID = 'dockerhub-creds'
    DOCKER_TAG            = "${env.BUILD_NUMBER}"
    LS_INSTANCE_ID       = 'i-05d37916155efbc80'
    LS_REGION            = 'us-east-1'
    SSH_CREDENTIALS_ID    = 'ec2-ssh-key'
    LS_USER              = 'ubuntu'
    LS_HOST              = '52.87.109.141'
    CONTAINER_NAME        = 'peabsmart-app'
    HOST_PORT             = 80
    CONTAINER_PORT        = 8080
  }

  stages {

    stage('Checkout') {
      steps {
        echo 'Checking out code...'
        checkout scm
      }
    }

    stage('Package') {
      steps {
        echo 'Building the Java project and packaging WAR...'
          sh 'mvn clean package'
  }
}

stage('Test') {
      steps {
        echo 'Running tests...'
         sh 'mvn test'
      }
    }
    stage('Build') {
      steps {
        echo 'Building Docker image...'
        script {
          docker.build("${DOCKER_IMAGE}:${DOCKER_TAG}", "-f ${DOCKERFILE} .")
        }
      }
    }

    stage('Push') {
      steps {
        echo 'Pushing Docker image to Docker Hub...'
        script {
          docker.withRegistry('https://index.docker.io/v1/', "${DOCKER_CREDENTIALS_ID}") {
          docker.image("${DOCKER_IMAGE}:${DOCKER_TAG}").push()
      }
    }
  }
}


    stage('Deploy') {
      steps {
        echo 'Deploying to AWS EC2...'
        script {
          sshagent([SSH_CREDENTIALS_ID]) {
            sh """
              ssh -o StrictHostKeyChecking=no ${EC2_USER}@${EC2_HOST} \\
              'docker pull ${DOCKER_IMAGE}:${DOCKER_TAG} &amp;amp;&amp;amp; \
              docker stop ${CONTAINER_NAME} || true &amp;amp;&amp;amp; \
              docker rm ${CONTAINER_NAME} || true &amp;amp;&amp;amp; \
              docker run -d --name ${CONTAINER_NAME} -p ${HOST_PORT}:${CONTAINER_PORT} ${DOCKER_IMAGE}:${DOCKER_TAG}'
             """

          }
        }
      }
    }
  }

  post {
    success {
      echo "✅ Deployed successfully to EC2 🎉"
    }
    failure {
      echo "❌ Deployment failed. Please check the logs for details."
    }
  }
}
// This Jenkinsfile is a declarative pipeline that automates the process of building, testing, and deploying a Dockerized Java application to an AWS instance. It includes stages for checking out the code, building the Docker image, running tests, pushing the image to Docker Hub, and deploying it to the Lightsail instance. The pipeline uses environment variables for configuration and SSH credentials for secure access to the instance.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Make sure the Jenkins server has:&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Access to your .pem key&lt;/p&gt;

&lt;p&gt;Maven installed&lt;/p&gt;

&lt;p&gt;Correct permissions on the Lightsail instance&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Setting-up the Jenkins Pipeline job:&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Login to Jenkins with your credentials, and on the &lt;strong&gt;Dashboard&lt;/strong&gt; click on &lt;strong&gt;New item&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On your &lt;strong&gt;New item&lt;/strong&gt; pane, enter the pipeline job name, select &lt;strong&gt;Multibranch Pipeline&lt;/strong&gt; and click &lt;strong&gt;OK&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On the pipeline &lt;strong&gt;Configuration&lt;/strong&gt; pane under &lt;strong&gt;General&lt;/strong&gt;, enter the &lt;strong&gt;Display Name&lt;/strong&gt; and &lt;strong&gt;Description&lt;/strong&gt; of your pipeline job.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Scroll down to the &lt;strong&gt;Branch Sources&lt;/strong&gt; and select &lt;strong&gt;GitHub&lt;/strong&gt;, enter your GitHub credentials (Username and access token), and select it. Also paste the &lt;strong&gt;GitHub HTTP URL&lt;/strong&gt; under &lt;strong&gt;Repository HTTPS URL&lt;/strong&gt; for this project.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Click on the &lt;strong&gt;Validate&lt;/strong&gt; button to ensure the credential is okay and Jenkins can access the repository in GitHub.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;In &lt;strong&gt;Build Configuration&lt;/strong&gt;, under &lt;strong&gt;Mode&lt;/strong&gt;, enter by Jenkinsfile and Script Path Jenkinsfile. In most cases Jenkins does these automatically.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Click Save and Jenkins will scan the Repository to find the Jenkinsfile.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Go to the Jenkins &lt;strong&gt;Dashboard&lt;/strong&gt;, Click on the pipeline you just created and select &lt;strong&gt;Build now&lt;/strong&gt;. This will trigger the job to run the various stages declared in the Jenkinsfile.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;h1&gt;
  
  
  Step 4: Access Your Java App
&lt;/h1&gt;

&lt;p&gt;Once deployed, visit:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;http://&amp;lt;your-lightsail-ip&amp;gt;:8080&lt;/code&gt;&lt;br&gt;
Your Java app should now be live! &lt;br&gt;
Make use of the Public IP Address of your Lightsail instance.&lt;/p&gt;

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

&lt;h1&gt;
  
  
  Scale Smartly with AWS Lightsail
&lt;/h1&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Scale with Confidence!&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
These are Lightsail features that grow with you and your business,&lt;br&gt;
&lt;strong&gt;Add Snapshots&lt;/strong&gt; for &lt;strong&gt;Backup&lt;/strong&gt; and &lt;strong&gt;Disaster Recovery&lt;/strong&gt;.&lt;br&gt;
Snapshots in Amazon Lightsail allow you to create point-in-time backups of your instances, databases, and block storage disks. These snapshots can be used to restore your resources in case of data loss or to create new resources based on the snapshot.​&lt;/p&gt;

&lt;h2&gt;
  
  
  How to create a snapshot
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
Navigate to the &lt;strong&gt;Lightsail&lt;/strong&gt; console.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Select your** Instance**.&lt;/p&gt;

&lt;p&gt;Go to the &lt;strong&gt;Snapshots&lt;/strong&gt; tab.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Create snapshot&lt;/strong&gt;, provide a name, and &lt;strong&gt;confirm&lt;/strong&gt;.​&lt;/p&gt;

&lt;p&gt;You can also enable automatic snapshots to have Lightsail create daily backups during a specified time window. ​&lt;/p&gt;

&lt;h2&gt;
  
  
  Use a Load Balancer for High Availability
&lt;/h2&gt;

&lt;p&gt;Lightsail Load Balancers distribute incoming traffic across multiple instances, enhancing the availability and fault tolerance of your application. They automatically perform health checks and route traffic only to healthy instances.​&lt;/p&gt;

&lt;h3&gt;
  
  
  Steps to set up a load balancer
&lt;/h3&gt;

&lt;p&gt;In the Lightsail console, go to the &lt;strong&gt;Networking&lt;/strong&gt; tab.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Create Load Balancer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Assign a name and select the region.&lt;/p&gt;

&lt;p&gt;Attach your instances to the load balancer.​&lt;/p&gt;

&lt;p&gt;This setup ensures that your application remains accessible even if one or more instances fail. ​This is only applicable when you have at least two or more Lightsail instances running same application.&lt;/p&gt;

&lt;h2&gt;
  
  
  Attach Additional Storage Blocks
&lt;/h2&gt;

&lt;p&gt;As your data grows, you might need more storage. Lightsail Block Storage allows you to attach additional SSD-backed storage disks to your instances.​&lt;/p&gt;

&lt;h3&gt;
  
  
  To add and attach a storage disk
&lt;/h3&gt;

&lt;p&gt;In the Lightsail console, select your &lt;strong&gt;instance&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Go to the &lt;strong&gt;Storage&lt;/strong&gt; tab and click &lt;strong&gt;Create disk&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Specify the disk size and name.&lt;/p&gt;

&lt;p&gt;After creation, attach the disk to your instance.&lt;/p&gt;

&lt;p&gt;Connect to your instance via SSH to format and mount the new disk. ​&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Lightsail Containers for Docker Apps
&lt;/h2&gt;

&lt;p&gt;Lightsail Container Services enable you to deploy and manage containerized applications without managing the underlying infrastructure. You can push your Docker images directly or use images from public registries.​&lt;/p&gt;

&lt;h3&gt;
  
  
  Deploying a containerized application
&lt;/h3&gt;

&lt;p&gt;In the Lightsail console, navigate to &lt;strong&gt;Containers&lt;/strong&gt; on the left pane.&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Create container service&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Define the service &lt;strong&gt;name&lt;/strong&gt;, &lt;strong&gt;power&lt;/strong&gt;, and &lt;strong&gt;scale&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Add your container by specifying the image and deployment settings.&lt;/p&gt;

&lt;p&gt;Deploy the service and access it via the provided endpoint. ​&lt;/p&gt;

&lt;h2&gt;
  
  
  Seamless Migration to EC2 or ECS
&lt;/h2&gt;

&lt;p&gt;When your application outgrows Lightsail's capabilities, you can migrate to Amazon EC2 or Amazon ECS for more advanced features.​&lt;/p&gt;

&lt;h3&gt;
  
  
  Migrating to EC2:
&lt;/h3&gt;

&lt;p&gt;Create a snapshot of your Lightsail instance.&lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;Snapshots&lt;/strong&gt; tab, select the snapshot and click &lt;strong&gt;Export&lt;/strong&gt; to &lt;strong&gt;Amazon EC2&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Follow the prompts to create an Amazon Machine Image (AMI) in EC2.&lt;/p&gt;

&lt;p&gt;Launch a new EC2 instance using the exported AMI. ​&lt;/p&gt;

&lt;p&gt;This process allows you to retain your application's configuration and data while transitioning to a more scalable environment.​&lt;/p&gt;

&lt;h1&gt;
  
  
  Summary
&lt;/h1&gt;

&lt;p&gt;In this guide, you learned how to deploy and manage a Java application using Amazon Lightsail, integrating essential DevOps practices for scalability and reliability.​&lt;/p&gt;

&lt;p&gt;You began by launching a Lightsail instance, selecting the appropriate operating system and instance plan tailored to your application's needs. This process provided you with a virtual private server equipped with a static IP, enabling consistent access and management.​&lt;/p&gt;

&lt;p&gt;Next, you configured a Jenkins pipeline job on your existing Jenkins server, integrating it with your GitHub repository containing the application code and Jenkinsfile. This setup enabled automated builds and deployments, ensuring that code changes are efficiently tested and deployed.​&lt;/p&gt;

&lt;p&gt;You then deployed your Java application as a Docker image to the server. By containerizing your application, you ensured consistency across development and production environments, simplified dependency management, and facilitated scalability.​&lt;br&gt;
Jenkins&lt;/p&gt;

&lt;p&gt;To prepare for future growth and ensure high availability, you explored scaling strategies. This included adding snapshots for backup and disaster recovery, using load balancers to distribute traffic across multiple instances, attaching additional storage blocks to accommodate growing data needs, and leveraging Lightsail Containers for deploying Dockerized applications. These features empower you to scale your application seamlessly and maintain uptime during peak usage.​&lt;/p&gt;

&lt;p&gt;Finally, you learned about the seamless migration path from Lightsail to more advanced AWS services like EC2 or ECS. This transition allows you to leverage a broader set of tools and configurations as your application's requirements evolve.​&lt;/p&gt;

&lt;p&gt;By following this guide, you've established a robust foundation for deploying, managing, and scaling your Java application in the cloud, ensuring resilience and adaptability in a dynamic digital landscape.&lt;/p&gt;

&lt;h1&gt;
  
  
  Ready to Elevate Your DevOps Journey?
&lt;/h1&gt;

&lt;p&gt;I hope this guide has provided you with valuable insights into deploying and managing your Java application using Amazon Lightsail. If you have any questions, need further clarification, or have suggestions for future topics, feel free to reach out.​&lt;/p&gt;

&lt;p&gt;Stay connected by following my blog for more tutorials and updates. Your feedback and engagement are always welcome!&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>java</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Configure a project and repository structure to support secure pipelines in Azure DevOps</title>
      <dc:creator>Bernard Chika Uwaezuoke</dc:creator>
      <pubDate>Mon, 31 Mar 2025 18:00:19 +0000</pubDate>
      <link>https://forem.com/donhadley22/configure-a-project-and-repository-structure-to-support-secure-pipelines-in-azure-devops-43lc</link>
      <guid>https://forem.com/donhadley22/configure-a-project-and-repository-structure-to-support-secure-pipelines-in-azure-devops-43lc</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2pq61ufiflobxqtwo2r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy2pq61ufiflobxqtwo2r.png" alt="Image description" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>devops</category>
      <category>security</category>
      <category>cicd</category>
    </item>
    <item>
      <title>Let’s Hack the Cloud: Cost-Reduction Strategies Across the Cloud Space. (AWS Lambda as a case study)</title>
      <dc:creator>Bernard Chika Uwaezuoke</dc:creator>
      <pubDate>Sun, 26 Jan 2025 14:30:47 +0000</pubDate>
      <link>https://forem.com/donhadley22/lets-hack-the-cloud-cost-reduction-strategies-across-the-cloud-space-aws-lambda-as-a-case-study-1l75</link>
      <guid>https://forem.com/donhadley22/lets-hack-the-cloud-cost-reduction-strategies-across-the-cloud-space-aws-lambda-as-a-case-study-1l75</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Introduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Cloud computing has revolutionized how businesses manage and scale their operations. However, with great flexibility comes the challenge of managing costs effectively. For companies navigating the cloud space, cost optimization is not just an operational necessity but a competitive advantage.&lt;br&gt;
In this blog, we’ll discuss some proven strategies for reducing cloud costs and dive deep into the transformative role of Lambda Functions in cutting infrastructure expenses.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;The Importance of Cloud Cost Optimization&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The cloud offers scalable, pay-as-you-go pricing, but companies often face ballooning costs due to:&lt;br&gt;
• Over-provisioned resources.&lt;br&gt;
• Idle or underutilized infrastructure.&lt;br&gt;
• Lack of visibility into resource consumption.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost optimization in the cloud is critical for:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt; Improving ROI on cloud investments.&lt;/li&gt;
&lt;li&gt; Ensuring scalability without excessive expenses.&lt;/li&gt;
&lt;li&gt; Allowing startups and enterprises alike to focus budgets on innovation rather than overhead.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Role of Serverless Computing in Cost Optimization&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What is Serverless Computing?&lt;/strong&gt;&lt;br&gt;
Serverless computing allows developers to build and deploy applications without managing underlying infrastructure. In serverless, the cloud provider automatically provisions and scales resources as needed, and users are billed only for the execution time of their code.&lt;br&gt;
One of the most popular serverless offerings is &lt;strong&gt;AWS Lambda&lt;/strong&gt;, but other cloud providers offer equivalents:&lt;br&gt;
• Azure Functions (Microsoft Azure)&lt;br&gt;
• Google Cloud Functions (Google Cloud Platform)&lt;br&gt;
• Cloud Run (Google Cloud for containerized workloads)&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Lambda Functions: A Game-Changer for Cost Reduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What Are Lambda Functions?&lt;/strong&gt;&lt;br&gt;
Lambda functions are small units of compute that execute code in response to triggers or events. They run only when needed, making them highly efficient for a wide range of use cases.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;How Lambda Functions Reduce Cloud Costs&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;1.    Pay-Per-Use Pricing Model:&lt;/strong&gt;&lt;br&gt;
Unlike traditional infrastructure where you pay for allocated resources regardless of usage, Lambda charges only for the actual time your code runs (measured in milliseconds). For example, running a virtual machine 24/7 costs significantly more than triggering a Lambda function 1,000 times per day for a few milliseconds each time.&lt;br&gt;
&lt;strong&gt;2.    Elimination of Idle Resources:&lt;/strong&gt;&lt;br&gt;
In traditional setups, servers are often idle during off-peak hours, wasting money. Lambda scales automatically with workload demands, ensuring you never pay for unused capacity.&lt;br&gt;
&lt;strong&gt;3.    Simplified Infrastructure:&lt;/strong&gt;&lt;br&gt;
Lambda reduces the need for complex infrastructure. By abstracting server management, it saves costs associated with maintaining and monitoring VMs or container clusters.&lt;br&gt;
&lt;strong&gt;4.    Integration with Other Cloud Services:&lt;/strong&gt;&lt;br&gt;
Lambda seamlessly integrates with cloud services like S3, DynamoDB, and API Gateway, creating cost-efficient workflows without additional orchestration tools.&lt;br&gt;
&lt;strong&gt;5.    Reduced Maintenance Costs:&lt;/strong&gt;&lt;br&gt;
No patching, updates, or hardware replacement. Lambda eliminates the operational overhead and associated costs of maintaining traditional servers.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Use Cases Where Lambda Excels in Cost Reduction&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1.    Data Processing:&lt;/strong&gt;&lt;br&gt;
Transforming or analyzing logs stored in S3 buckets.&lt;br&gt;
&lt;strong&gt;Cost-Saving Aspect:&lt;/strong&gt; Instead of provisioning an EC2 instance to continuously run processing jobs, Lambda triggers only when new data arrives.&lt;br&gt;
&lt;strong&gt;2.    Event-Driven Applications:&lt;/strong&gt;&lt;br&gt;
 Auto-scaling customer notification services.&lt;br&gt;
&lt;strong&gt;Cost-Saving Aspect:&lt;/strong&gt; Scale dynamically based on the number of notifications, reducing costs during low activity periods.&lt;br&gt;
&lt;strong&gt;3.    Microservices:&lt;/strong&gt;&lt;br&gt;
Building microservices architecture with APIs.&lt;br&gt;
&lt;strong&gt;Cost-Saving Aspect:&lt;/strong&gt; Each service runs independently, scaling and billing separately, preventing over-provisioning.&lt;br&gt;
&lt;strong&gt;4.    Scheduled Tasks:&lt;/strong&gt;&lt;br&gt;
Running periodic jobs like backups or system checks.&lt;br&gt;
&lt;strong&gt;Cost-Saving Aspect:&lt;/strong&gt; Replace always-on cron jobs with Lambda functions triggered at specified intervals.&lt;br&gt;
&lt;strong&gt;5.    Application Prototypes:&lt;/strong&gt;&lt;br&gt;
 Building and testing proof-of-concept applications.&lt;br&gt;
&lt;strong&gt;Cost-Saving Aspect:&lt;/strong&gt; Start small with minimal costs, scaling up only when the application reaches production.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Best Practices to Maximize Cost Savings with Lambda&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1.    Right-Sizing Memory Allocation:&lt;/strong&gt;&lt;br&gt;
Choose the appropriate memory size for your Lambda functions to avoid overpaying for unnecessary capacity.&lt;br&gt;
&lt;strong&gt;2.    Optimize Function Duration:&lt;/strong&gt;&lt;br&gt;
Streamline your code to reduce execution time, minimizing the cost per invocation.&lt;br&gt;
&lt;strong&gt;3.    Use Reserved Concurrency:&lt;/strong&gt;&lt;br&gt;
For predictable workloads, reserve concurrency limits to control costs and ensure availability.&lt;br&gt;
&lt;strong&gt;4.    Monitor Usage with AWS Cost Explorer:&lt;/strong&gt;&lt;br&gt;
Continuously track Lambda usage patterns and costs to identify optimization opportunities.&lt;br&gt;
&lt;strong&gt;5.    Leverage AWS Free Tier:&lt;/strong&gt;&lt;br&gt;
Take advantage of Lambda’s free tier, which provides 1 million requests and 400,000 GB-seconds of compute time per month.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Beyond Lambda: General Cloud Cost Optimization Tips&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;1.    Auto-Scaling:&lt;/strong&gt;&lt;br&gt;
Enable auto-scaling for resources like EC2 instances and Kubernetes clusters to handle varying workloads efficiently.&lt;br&gt;
&lt;strong&gt;2.    Use Spot and Reserved Instances:&lt;/strong&gt;&lt;br&gt;
Leverage spot instances for non-critical workloads and reserved instances for predictable workloads.&lt;br&gt;
&lt;strong&gt;3.    Monitor and Optimize Storage:&lt;/strong&gt;&lt;br&gt;
Regularly audit and remove unused snapshots and use lifecycle policies for S3 storage.&lt;br&gt;
&lt;strong&gt;4.    Rightsize Resources:&lt;/strong&gt;&lt;br&gt;
Continuously evaluate and resize over-provisioned resources using tools like Azure Advisor or AWS Compute Optimizer.&lt;br&gt;
&lt;strong&gt;5.    Implement Budgets and Alerts:&lt;/strong&gt;&lt;br&gt;
Set cost budgets and configure alerts to prevent unexpected overspending.&lt;/p&gt;

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

&lt;p&gt;Reducing cloud costs doesn’t mean sacrificing performance or scalability, it’s about leveraging the right tools and strategies. Lambda functions, with their pay-per-use model and automatic scaling, exemplify how serverless computing can dramatically cut infrastructure expenses.&lt;br&gt;
By adopting a thoughtful approach to cloud resource management, companies can strike the perfect balance between cost and efficiency, ensuring sustainable growth in the cloud era.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Let’s hack the cloud together!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>cloudcomputing</category>
      <category>lambda</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Configuring Agent Pools and Understanding Pipeline Styles in Azure DevOps</title>
      <dc:creator>Bernard Chika Uwaezuoke</dc:creator>
      <pubDate>Mon, 05 Feb 2024 09:48:54 +0000</pubDate>
      <link>https://forem.com/donhadley22/configuring-agent-pools-and-understanding-pipeline-styles-in-azure-devops-540p</link>
      <guid>https://forem.com/donhadley22/configuring-agent-pools-and-understanding-pipeline-styles-in-azure-devops-540p</guid>
      <description>&lt;p&gt;&lt;em&gt;&lt;strong&gt;This blog is inspired by a Microsoft Lab with similar tittle&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;INTRODUCTION&lt;/strong&gt;&lt;br&gt;
Welcome to our latest exploration into the dynamic realm of Azure DevOps! In today's blog post, we delve into the crucial aspects of configuring agent pools and unravel the intricacies of pipeline styles. Navigating the ever-evolving landscape of DevOps requires a deep understanding of these fundamental components, and we're here to guide you through the process.&lt;/p&gt;

&lt;p&gt;Whether you're a seasoned DevOps engineer or just starting your journey, mastering the configuration of agent pools and comprehending various pipeline styles is essential for streamlining your development workflows. Join us as we unravel the mysteries behind these integral concepts, providing insights, best practices, and actionable tips to empower your Azure DevOps journey. Let's embark on this knowledge-packed expedition together!&lt;/p&gt;

&lt;p&gt;The post will cover the creation and management of agent pools, as well as an understanding of different pipeline styles. It will also discuss the significance of these concepts in the context of DevOps practices and their impact on the efficiency of software delivery.&lt;/p&gt;

&lt;p&gt;Let start by defining the relevant concepts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure DevOps&lt;/strong&gt; &lt;br&gt;
Azure DevOps is an end-to-end software development platform that supports Agile, DevOps, and other continuous development practices. It provides a range of tools and services for requirements and project management, version control, automated builds, testing, release management, and reporting. Azure DevOps aims to help teams create and improve products at a faster pace than traditional software development approaches, fostering a collaborative culture and integrating with a variety of other tools and services. In simple terms, it's a comprehensive solution that enables teams to efficiently manage the entire software development lifecycle, from planning and coding to testing and deployment, all in one place.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is agent pool and its use in Azure DevOps?&lt;/strong&gt;&lt;br&gt;
An agent pool is a collection of one or more agents that can be used to run builds and deployments in Azure DevOps. Agents are the machines that execute the tasks defined in pipelines. Agent pools are used to organize agents based on their capabilities, such as operating system, software, or hardware configurations. This allows teams to manage and allocate resources more efficiently and to ensure that the right agents are used for the right jobs. Agent pools can be created and managed from the Azure DevOps organization or project settings. They can be used in both build and release pipelines and can be either self-hosted or provided by Microsoft as hosted agents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure DevOps Pipelines&lt;/strong&gt;&lt;br&gt;
Azure DevOps Pipeline is a service that allows you to automatically build, test, and deploy your code to various platforms and cloud environments. It supports continuous integration (CI) and continuous delivery (CD) practices, enabling you to automate the entire software delivery process. Azure Pipelines can be used with any language or platform, and it provides cloud-hosted agents for building and deploying applications. It offers features such as parallel jobs, native container support, and flexible deployments to Kubernetes, serverless, or virtual machines. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pipelines Configurations Supported by Azure DevOps&lt;/strong&gt;&lt;br&gt;
Azure DevOps supports YAML-based pipelines and classic UI-based pipelines configurations. The classic UI allows users to define and manage pipelines using a graphical interface, which can be a preferred option for those who are not familiar with or prefer not to use YAML syntax. However, Microsoft has been encouraging the use of YAML pipelines due to their portability, version control integration, and ease of sharing. &lt;/p&gt;

&lt;p&gt;In this exercise, we will be using the YAML-based pipeline editor, which is a tool provided by Azure DevOps to author and edit pipelines using YAML syntax.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Azure Account with subscription&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Microsoft Edge or an Azure DevOps supported browser.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Set up an Azure DevOps organization&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Git for Windows &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Visual Studio Code. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Objectives&lt;/strong&gt;&lt;br&gt;
By the time you conclude this learning journey with us, you will be able to do the following in Azure DevOps:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Implement YAML-based pipelines. &lt;/li&gt;
&lt;li&gt;Implement self-hosted agents.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Here we go!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Setting up an Azure DevOps Organization&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Login to Azure portal at &lt;code&gt;www.portal.azure.com&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the global search bar, type in &lt;strong&gt;Azure DevOps&lt;/strong&gt; select &lt;strong&gt;Azure DevOps Organizations&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;One the Azure DevOps Home page, click on &lt;strong&gt;My Azure DevOps Organizations&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On the &lt;strong&gt;Azure DevOps Organizations&lt;/strong&gt; page, click on &lt;strong&gt;Create new organization&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxlicolj9dtpd8hccewtv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxlicolj9dtpd8hccewtv.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
This will take you to a new Signup page, click on the &lt;strong&gt;Continue&lt;/strong&gt; button if you do not wish to switch directory.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;On the next page, enter a globally unique organization name, the location you intend to host your projects and the authentication character displayed.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;We can see the new organization we created and can now start creating our projects. &lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 2: Create a New Project&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Here we will be creating a project named &lt;strong&gt;eShopOnWeb&lt;/strong&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Enter the project name and click on &lt;strong&gt;Create project&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Our project landing page!&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Step 3: Import our project files from a Git repository to Azure DevOps&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the project landing page, on the left pane under your project name, click on &lt;strong&gt;Repos&amp;gt;Files&lt;/strong&gt;, &lt;strong&gt;Import a Repository&lt;/strong&gt;. Select &lt;strong&gt;Import&lt;/strong&gt;. &lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On the Import a Git Repository window, paste the URL of the Git repository where your application is located. For this exercise, we will be using a project provided by &lt;strong&gt;Microsoft&lt;/strong&gt;. Here is the URL &lt;code&gt;https://github.com/MicrosoftLearning/eShopOnWeb.git&lt;/code&gt; and click &lt;strong&gt;Import&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;The project in Azure DevOps Repos Environment&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;CONFIGURE A YAML-BASED PIPELINE&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Create an Azure DevOps YAML pipeline&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create a template-based Azure DevOps YAML pipeline.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the EShopOnWeb project page, in the vertical navigational pane on the left side, click &lt;strong&gt;Pipelines&lt;/strong&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click the &lt;strong&gt;Create Pipeline&lt;/strong&gt; button - if you don’t have any other pipelines created yet or click &lt;strong&gt;New pipeline&lt;/strong&gt; to create an additional new one.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On the &lt;strong&gt;Where is your code?&lt;/strong&gt; pane, click &lt;strong&gt;Azure Repos Git&lt;/strong&gt;. Since we have imported the code there.
_You can select other locations based on where you have your code. _&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On the Select a repository pane, click &lt;strong&gt;EShopOnWeb&lt;/strong&gt;. Which is our project.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On the &lt;strong&gt;Configure your pipeline&lt;/strong&gt; pane, click &lt;strong&gt;Existing Azure Pipelines YAML File&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On the &lt;strong&gt;Select an existing YAML file&lt;/strong&gt;, select &lt;strong&gt;main&lt;/strong&gt; for the Branch, and &lt;strong&gt;/.ado/eshoponweb-ci-pr.yml&lt;/strong&gt; for the Path and click &lt;strong&gt;Continue&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;This sample pipeline is a basic .NET application Build pipeline, which does the following:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A single Stage: Build&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A single Job: Build&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;3 tasks within the Build Job:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dotnet Restore&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dotnet Build&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dotnet Publish&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

resources:
  repositories:
    - repository: self
      trigger: none

stages:
- stage: Build
  displayName: Build .Net Core Solution
  jobs:
  - job: Build
    pool:
      vmImage: ubuntu-latest
    steps:
    - task: DotNetCoreCLI@2
      displayName: Restore
      inputs:
        command: 'restore'
        projects: '**/*.sln'
        feedsToUse: 'select'

    - task: DotNetCoreCLI@2
      displayName: Build
      inputs:
        command: 'build'
        projects: '**/*.sln'

    - task: DotNetCoreCLI@2
      displayName: Test
      inputs:
        command: 'test'
        projects: 'tests/UnitTests/*.csproj'

    - task: DotNetCoreCLI@2
      displayName: Publish
      inputs:
        command: 'publish'
        publishWebProjects: true
        arguments: '-o $(Build.ArtifactStagingDirectory)'


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

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;On the &lt;strong&gt;Review your pipeline YAML&lt;/strong&gt; pane, click the down-facing caret symbol next to the &lt;strong&gt;Run&lt;/strong&gt; button, click &lt;strong&gt;Save&lt;/strong&gt;.
This action creates the &lt;strong&gt;pipeline&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;The created pipeline&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;MANANGE AZURE DEVOPS AGENT POOLS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Configure an Azure DevOps self-hosting agent&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In the Azure DevOps portal, in the upper right corner of the Azure DevOps page, click the &lt;strong&gt;User settings&lt;/strong&gt; icon, depending on whether or not you have preview features turned on, you should either see a &lt;strong&gt;Security&lt;/strong&gt; or &lt;strong&gt;Personal access tokens&lt;/strong&gt; item in the menu, if you see Security, click on that, then select Personal access tokens. On the Personal Access Tokens pane, and click &lt;strong&gt;+ New Token&lt;/strong&gt;.&lt;/p&gt;

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

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

&lt;ul&gt;
&lt;li&gt;On the &lt;strong&gt;Create a new personal access token&lt;/strong&gt; pane, click the &lt;strong&gt;Show all scopes&lt;/strong&gt; link and, specify the following settings and click &lt;strong&gt;Create&lt;/strong&gt; (leave all others with their default values):&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;Name = EShopOnWeb&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Scope (custom defined) = **Agent Pools** (show more scopes option below if needed)&lt;/code&gt;&lt;br&gt;
&lt;code&gt;Permissions = **Read and manage**&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the Success pane, copy the value of the personal access token to Clipboard and click the &lt;strong&gt;Close&lt;/strong&gt; button.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the &lt;strong&gt;Personal Access Token&lt;/strong&gt; pane of the Azure DevOps portal, click &lt;strong&gt;Azure DevOps&lt;/strong&gt; symbol in the upper left corner and then click &lt;strong&gt;Organization settings&lt;/strong&gt; label in the lower left corner.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;To the left side of the &lt;strong&gt;Overview&lt;/strong&gt; pane, in the vertical menu, in the &lt;strong&gt;Pipelines&lt;/strong&gt; section, click &lt;strong&gt;Agent pools&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On the &lt;strong&gt;Agent pools&lt;/strong&gt; pane, in the upper right corner, click &lt;strong&gt;Add pool&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On the &lt;strong&gt;Add agent pool&lt;/strong&gt; pane, in the &lt;strong&gt;Pool type&lt;/strong&gt; dropdown list, select *&lt;strong&gt;*Self-hosted, in the Name text box, type **proj-2420-pool&lt;/strong&gt; and then click &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Back on the Agent pools pane, click the entry representing the newly created &lt;strong&gt;proj-2420-pool&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the Jobs tab of the &lt;strong&gt;proj-2420-pool&lt;/strong&gt; pane, click the &lt;strong&gt;New agent&lt;/strong&gt; button.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On the &lt;strong&gt;Get the agent&lt;/strong&gt; pane, ensure that the &lt;strong&gt;Windows&lt;/strong&gt; and &lt;strong&gt;x64&lt;/strong&gt; tabs are selected, and click &lt;strong&gt;Download&lt;/strong&gt; to download the zip archive containing the agent binaries to download it into the local **Downloads*8 folder within your user profile.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;To Register the Agent&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start Windows PowerShell as administrator and in the &lt;strong&gt;Administrator: Windows PowerShell&lt;/strong&gt; console run the following lines to create the &lt;strong&gt;C:\agent&lt;/strong&gt; directory and extract the content of the downloaded archive into it. By running these lines of code:&lt;/li&gt;
&lt;/ul&gt;

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

cd \
mkdir agent ; cd agent
$TARGET = Get-ChildItem "$Home\Downloads\vsts-agent-win-x64-*.zip"
Add-Type -AssemblyName System.IO.Compression.FileSystem



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

&lt;/div&gt;

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

&lt;ul&gt;
&lt;li&gt;In the same &lt;strong&gt;Administrator: Windows PowerShell&lt;/strong&gt; console, run the following to configure the agent:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;.\config.cmd&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;-Follow the prompt, specify the values of the following settings:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Enter server URL = https://dev.azure.com/Project-24201&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;That's the URL of your Azure DevOps organization, in the format &lt;a href="https://dev.azure.com/**organization_name**" rel="noopener noreferrer"&gt;https://dev.azure.com/**organization_name**&lt;/a&gt;, where &lt;strong&gt;organization_name&lt;/strong&gt; represents the name of your Azure DevOps organization.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Enter authentication type (press enter for PAT) = **Enter**&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Enter personal access token = **The access token you recorded earlier in this task**&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Enter agent pool (press enter for default) = **proj-2420-pool**&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Enter agent name = **az400m03-vm0**&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Enter work folder (press enter for _work) = **Enter**&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;(Only if shown) Enter Perform an unzip for tasks for each step. (press enter for N)   WARNING: only press **Enter** if the message is shown&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If the above prompt is not displayed, then continue with your configuration.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Enter run agent as service? (Y/N) (press enter for N) = **Y**&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;enter enable SERVICE_SID_TYPE_UNRESTRICTED (Y/N) (press enter for N) = **Y**&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Enter User account to use for the service (press enter for NT AUTHORITY\NETWORK SERVICE) = **Enter**&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Enter whether to prevent service starting immediately after configuration is finished? (Y/N) (press enter for N) = **Enter**&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;At the end of registering the agent, you will get successful notification as shown below.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Back to the Azure DevOps portal&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the web browser window displaying the Azure DevOps portal, in the upper left corner, click the &lt;strong&gt;Azure DevOps&lt;/strong&gt; label.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;From the list of projects, click the tile representing your &lt;strong&gt;EShopOnWeb&lt;/strong&gt; project.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On the &lt;strong&gt;EShopOnWeb&lt;/strong&gt; pane, in the vertical navigational pane on the left side, in the &lt;strong&gt;Pipelines&lt;/strong&gt; section, click &lt;strong&gt;Pipelines&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On the &lt;strong&gt;Recent&lt;/strong&gt; tab of the &lt;strong&gt;Pipelines&lt;/strong&gt; pane, select &lt;strong&gt;EShopOnWeb&lt;/strong&gt; and, on the &lt;strong&gt;EShopOnWeb&lt;/strong&gt; pane, select &lt;strong&gt;Edit&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Here we provide the detail of the new agent we registered to the &lt;strong&gt;YAML-based CI&lt;/strong&gt; pipeline. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the &lt;strong&gt;EShopOnWeb&lt;/strong&gt; edit pane, in the existing YAML-based pipeline, replace line 13 which says &lt;strong&gt;vmImage: ubuntu-latest&lt;/strong&gt; designating the target agent pool with the newly created self-hosted agent pool.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On the &lt;strong&gt;EShopOnWeb&lt;/strong&gt; edit pane, in the upper right corner of the pane, click &lt;strong&gt;Save and Run&lt;/strong&gt;. This will automatically trigger the build based on this pipeline.&lt;/li&gt;
&lt;/ul&gt;

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

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

&lt;p&gt;You can check the option to &lt;strong&gt;Enable system diagnostic&lt;/strong&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;In the Azure DevOps portal, in the vertical navigational pane on the left side, in the Pipelines section, click &lt;strong&gt;Pipelines&lt;/strong&gt;. Depending on your system setup, the pipeline might prompt you for permissions. Click &lt;strong&gt;Permit&lt;/strong&gt; to allow the pipeline to run.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
On the &lt;strong&gt;Recent&lt;/strong&gt; tab of the &lt;strong&gt;Pipelines&lt;/strong&gt; pane, click the &lt;strong&gt;EShopOnWeb&lt;/strong&gt; entry, on the &lt;strong&gt;Runs&lt;/strong&gt; tab of the &lt;strong&gt;EShopOnWeb&lt;/strong&gt; pane, select the most recent run, on the &lt;strong&gt;Summary&lt;/strong&gt; pane of the run, scroll down to the bottom, in the &lt;strong&gt;Jobs&lt;/strong&gt; section, click &lt;strong&gt;Phase 1&lt;/strong&gt; and monitor the job until its successful completion.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;When the process concludes, you will be notified of the status of your pipeline as successfully built.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Thank you for your time, kindly subscribe and follow our page for more insightful articles.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>devops</category>
      <category>cloudcomputing</category>
      <category>microservices</category>
    </item>
    <item>
      <title>S3crets Unveiled: A Painless Guide to Hosting Your First Static Website on AWS.</title>
      <dc:creator>Bernard Chika Uwaezuoke</dc:creator>
      <pubDate>Fri, 02 Feb 2024 21:22:36 +0000</pubDate>
      <link>https://forem.com/donhadley22/s3crets-unveiled-a-painless-guide-to-hosting-your-first-static-website-on-aws-5i3</link>
      <guid>https://forem.com/donhadley22/s3crets-unveiled-a-painless-guide-to-hosting-your-first-static-website-on-aws-5i3</guid>
      <description>&lt;p&gt;&lt;strong&gt;INTRODUCTION&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Welcome to the enchanting realm of Cloud Hosting! If the mere thought of launching a website feels like deciphering an alien language, fear not. In this step-by-step journey, we'll unravel the mystery of hosting a static website on AWS S3, transforming the seemingly complex into a seamless symphony of digital creation. Picture it as your backstage pass to the CloudCraft Chronicles, where we'll guide you with clarity, unraveling the S3crets to effortlessly elevate your web presence. Embrace the magic of simplicity as we embark on this adventure together, turning novices into cloud virtuosos!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PREREQUISITES&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;AWS Account:&lt;/strong&gt; Ensure you have an active AWS account. If you don't have one yet, fear not! You can do that for free on &lt;br&gt;
&lt;code&gt;www.aws.amazon.com&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Basic Web Files:&lt;/strong&gt; Have your static website files ready. Whether it's a portfolio, blog, or a simple landing page, make sure your HTML, CSS, and other assets are set to go.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Curiosity and Eagerness:&lt;/strong&gt; The most important prerequisites! Bring along your curiosity and eagerness to learn. We're here to make this journey enjoyable and enlightening, even for the absolute beginner.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Now that our toolkit is prepped, let's set the stage for our CloudCraft Chronicles and unlock the door to AWS S3 hosting magic!&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;STEP 1: login to your AWS account&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Go to your web browser and enter this URL: &lt;code&gt;https://aws.amazon.com/console/&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on &lt;strong&gt;sign in to the console&lt;/strong&gt; button.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Select to sign in as a &lt;strong&gt;Root user&lt;/strong&gt; if you own the account, otherwise, if given access by an organization or a third party, the select &lt;strong&gt;IAM user&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Provide your accout email and click the &lt;strong&gt;Next&lt;/strong&gt; button.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jkbzaez1rosou67w4fg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7jkbzaez1rosou67w4fg.png" alt="Image description" width="571" height="588"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Provide your password and click on &lt;strong&gt;sign in&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fky4j16x5tvl7bq0fbnbk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fky4j16x5tvl7bq0fbnbk.png" alt="Image description" width="555" height="441"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;STEP 2: Creating an S3 Bucket&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the global search bar at the top of your home page, type &lt;strong&gt;s3&lt;/strong&gt; and select &lt;strong&gt;s3&lt;/strong&gt; from the auto-dropdown. &lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On the &lt;strong&gt;S3&lt;/strong&gt; page, click on &lt;strong&gt;Create bucket&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;On the box &lt;strong&gt;AWS Region&lt;/strong&gt; box, dropdown and select the region you want to host your static website.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leave it in &lt;strong&gt;General purpose&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then enter a globally unique bucket name in the box &lt;strong&gt;Bucket name&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
Scroll down on same page.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Leave the default &lt;strong&gt;ACL disabled&lt;/strong&gt; option.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Uncheck the &lt;strong&gt;Block all public access&lt;/strong&gt; option.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;A warning massage will be disblayed intimating you of the implication of making the bucket public, acknowledge it, leave other configurations as default and continue to the base of the page to click on the &lt;strong&gt;Create bucket&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdl43dt6278fkhh97vul4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdl43dt6278fkhh97vul4.png" alt="Image description" width="800" height="343"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;em&gt;The created &lt;strong&gt;project-2420&lt;/strong&gt; S3 bucket and message confirming its successful creation.&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;STEP 3: Uploading our Static web files to the S3 Bucket&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Click on the created bucket &lt;strong&gt;project-2420&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;On the bucket page, click on &lt;strong&gt;Upload&lt;/strong&gt; button. This will open a pane that you can use to navigate to your resources in your local environment.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;add files&lt;/strong&gt; or &lt;strong&gt;add folder&lt;/strong&gt; depending on how your web resources are saved.
For this demonstration, we will be using &lt;strong&gt;add folder&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;We will be uploading our resources from our local desktop.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3o7uazgb3zpi2r8npjl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe3o7uazgb3zpi2r8npjl.png" alt="Image description" width="668" height="199"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5bxefq0ji38m8mxjcr8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff5bxefq0ji38m8mxjcr8.png" alt="Image description" width="800" height="501"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;The uploaded files&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;index.html&lt;/strong&gt; and the &lt;strong&gt;error.html&lt;/strong&gt; or in this instance &lt;strong&gt;404.html&lt;/strong&gt;. They are the primary pages that display on the website.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Scroll to the bottom of the page and click the &lt;strong&gt;Upload&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwmm2qa6qotfj3wyaw5kc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwmm2qa6qotfj3wyaw5kc.png" alt="Image description" width="800" height="328"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Files uploaded successfully.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;STEP 4: Configure the Static Website&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We go back to the &lt;strong&gt;project-2420&lt;/strong&gt; S3 bucket page by clicking on &lt;strong&gt;Close&lt;/strong&gt; button and click on the &lt;strong&gt;permission&lt;/strong&gt; &lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Scroll down on the opened page and click on &lt;strong&gt;Edit&lt;/strong&gt; button by &lt;strong&gt;Bucket policy&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Input the policy below in the editor with your bucket name replacing the place holder. (We got the policy from AWS documentation on S3 static website hosting)
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject"
            ],
            "Resource": [
                "arn:aws:s3:::Bucket-Name/*"
            ]
        }
    ]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Click on &lt;strong&gt;Save changes&lt;/strong&gt; button at the base of the page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You will get a notification that the policy change was successful.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The click on &lt;strong&gt;property&lt;/strong&gt; on the same &lt;strong&gt;project-2420&lt;/strong&gt; bucket page.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Scroll down to the base of the page and on &lt;strong&gt;Static website hosting&lt;/strong&gt;, click &lt;strong&gt;Edit&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Select &lt;strong&gt;Enable&lt;/strong&gt; option for &lt;strong&gt;Static website&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This will extend the pane, exposing boxes for you to input your &lt;strong&gt;index.html&lt;/strong&gt; and &lt;strong&gt;error.html&lt;/strong&gt; configurations.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Leave other configurations as default and click &lt;strong&gt;Save Changes&lt;/strong&gt; button at the base of the page.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You will get this notification of success.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;At the base of the page, we can see our static website bucket endpoint which we can use to access it over a browser.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Copy the endpoint and use it to view the static website.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw47a4uxs2robuoa2r04k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw47a4uxs2robuoa2r04k.png" alt="Image description" width="800" height="434"&gt;&lt;/a&gt;&lt;br&gt;
               &lt;em&gt;The webpage displayed&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cleanup to avoid careless Charges&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Click on the &lt;strong&gt;Action&lt;/strong&gt; button on the &lt;strong&gt;project-2420&lt;/strong&gt; bucket page. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select empty bucket, enter &lt;strong&gt;permanently delete&lt;/strong&gt; in the provided box and click the &lt;strong&gt;Empty&lt;/strong&gt; button.&lt;br&gt;
You will get a notification indicating that the content of the bucket has been deleted.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Then click on the &lt;strong&gt;delete&lt;/strong&gt; button on the &lt;strong&gt;project-2420&lt;/strong&gt; bucket page. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You will be prompted to enter the bucket name in the provided box. This action will activate the &lt;strong&gt;Delete bucket&lt;/strong&gt; button. Click on the &lt;strong&gt;Delete bucket&lt;/strong&gt; button and the bucket will be deleted.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;CONCLUSION&lt;/strong&gt;&lt;br&gt;
As our CloudCraft Chronicles come to a close, take a moment to marvel at the digital masterpiece you've crafted in the AWS S3 cloudscape. From a novice navigating the unknown, you've emerged as a virtual virtuoso, orchestrating your static website with finesse.&lt;/p&gt;

&lt;p&gt;Remember, the magic of hosting extends beyond technology; it's about empowering your ideas to soar in the vast expanse of the internet. Whether you're a hobbyist, entrepreneur, or dream-weaver, your corner of the web is now a reality.&lt;/p&gt;

&lt;p&gt;As you embark on your digital journey, may the CloudCraft Chronicles be a guiding star, illuminating the path to endless possibilities. The curtain may fall on this blog, but your story in the cloud has just begun. &lt;/p&gt;

&lt;p&gt;Until our next adventure, happy hosting, and may your digital dreams continue to unfold!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Please subscribe and follow our blog&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>staticwebapps</category>
      <category>s3</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Building a Custom VPC Infrastructure in AWS with Terraform.</title>
      <dc:creator>Bernard Chika Uwaezuoke</dc:creator>
      <pubDate>Tue, 16 Jan 2024 04:19:55 +0000</pubDate>
      <link>https://forem.com/donhadley22/building-a-custom-vpc-infrastructure-in-aws-with-terraform-p3j</link>
      <guid>https://forem.com/donhadley22/building-a-custom-vpc-infrastructure-in-aws-with-terraform-p3j</guid>
      <description>&lt;p&gt;&lt;strong&gt;INTRODUCTION&lt;/strong&gt;&lt;br&gt;
Amazon Web Services (AWS) provides a robust set of tools to manage cloud infrastructure, and Terraform enhances this capability by enabling Infrastructure as Code (IaC). In this article, we will explore how to use Terraform to create a custom &lt;strong&gt;VPC (Virtual Private Cloud)&lt;/strong&gt; in AWS, complete with an &lt;strong&gt;internet gateway&lt;/strong&gt;, a &lt;strong&gt;route table&lt;/strong&gt;, &lt;strong&gt;public&lt;/strong&gt; and &lt;strong&gt;private subnets&lt;/strong&gt;, &lt;strong&gt;security groups&lt;/strong&gt;, &lt;strong&gt;network interfaces&lt;/strong&gt;, and &lt;strong&gt;EC2 instances&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;PREREQUISITES&lt;/strong&gt;&lt;br&gt;
Before embarking on the journey of creating a custom VPC infrastructure in AWS using Terraform, ensure you have the following in place:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. AWS Account:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Create an AWS account if you don't have one already. Navigate to the AWS Console at &lt;code&gt;www.aws.amazon.com&lt;/code&gt; to set up your account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;2. AWS CLI and Credentials:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Install the AWS Command Line Interface (CLI) on your local machine. You can download it here.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Configure your AWS credentials using the &lt;code&gt;aws configure&lt;/code&gt; command.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ensure your credentials have the necessary permissions to create and manage resources.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;3.Terraform Installation:&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Download and install the latest version of Terraform on your local machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Text Editor or Integrated Development Environment (IDE):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Choose a text editor or IDE of your preference for editing Terraform configuration files. Popular choices include VSCode, Sublime Text, or Atom.&lt;br&gt;
&lt;em&gt;(For this demonstration, we will be using VSCode.)&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Basic Understanding of AWS Services:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Familiarize yourself with basic AWS concepts, including &lt;strong&gt;VPC&lt;/strong&gt;, &lt;strong&gt;subnetting&lt;/strong&gt;, &lt;strong&gt;internet gateways&lt;/strong&gt;, &lt;strong&gt;security groups&lt;/strong&gt;, and &lt;strong&gt;EC2 instances&lt;/strong&gt;. This foundational knowledge will help you design an infrastructure that meets your specific requirements.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;6. SSH Key Pair:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Generate an SSH key pair if you plan to access your EC2 instances. This key pair will be used when creating EC2 instances in your Terraform configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;7. Knowledge of Terraform Basics:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Understand the fundamental concepts of Terraform, such as providers, resources, variables, and modules. Refer to the official Terraform documentation at &lt;code&gt;https://developer.hashicorp.com/terraform/docs&lt;/code&gt; for guidance.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;8. Customization:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Modify the provided Terraform configuration according to your specific needs. Update variables like &lt;strong&gt;cidr_block&lt;/strong&gt;, &lt;strong&gt;availability_zone&lt;/strong&gt;, &lt;strong&gt;key_name&lt;/strong&gt;, and &lt;strong&gt;ami&lt;/strong&gt; with values suitable for your project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;9. Security Considerations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Be mindful of security best practices. Restrict inbound and outbound traffic in your security groups to only the necessary ports and IP ranges.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Let dive right in!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;STEP 1: CREATE YOUR WORKING DIRECTORY AND CONFIGURATION FILES&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Go to your &lt;strong&gt;Git Bash&lt;/strong&gt; interface and type this command &lt;code&gt;cd Desktop&lt;/code&gt; to navigate to the location you want to create the folder. In this very instance, we are creating it at the &lt;strong&gt;Desktop&lt;/strong&gt;.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create a Directory (folder). Type the following command &lt;code&gt;mkdir &amp;lt;folder name&amp;gt;&lt;/code&gt;to create the directory.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftr4b2znhh4jsn8c44t8k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftr4b2znhh4jsn8c44t8k.png" alt="Image description" width="672" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Navigate to the directory you just created using the &lt;code&gt;cd command&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;While in the directory, use the command &lt;code&gt;code .&lt;/code&gt; to open the VScode IDE. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv1hu9ibhgiaurlumk3wx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv1hu9ibhgiaurlumk3wx.png" alt="Image description" width="773" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgw2te1mtmv4zhuh450dt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgw2te1mtmv4zhuh450dt.png" alt="Image description" width="290" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Create'main.tf' and &lt;code&gt;provider.tf&lt;/code&gt; files.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbb3vev49ommq2r8k327.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwbb3vev49ommq2r8k327.png" alt="Image description" width="684" height="174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;STEP 2: CONFIGURE AWS ACCESS AND PROVIDER&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Run the following commands: &lt;code&gt;aws --version&lt;/code&gt; to confirm your version of &lt;strong&gt;aws-cli&lt;/strong&gt; and &lt;code&gt;aws configure&lt;/code&gt; to provide your AWS credentials in your &lt;strong&gt;VScode terminal&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The credentials:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AWS Access Key ID [****************ZYAS]:
AWS Secret Access Key [****************6H9/]: 
Default region name [us-east-1]: 
Default output format [json]: 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjqwnnnaf0gcpvnbhgdea.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjqwnnnaf0gcpvnbhgdea.png" alt="Image description" width="779" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Go to the official Terraform site &lt;code&gt;https://registry.terraform.io/providers/hashicorp/aws/latest/docs&lt;/code&gt; to get your Terraform codes to customize for your deployment.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the &lt;strong&gt;provider.tf&lt;/strong&gt; file, paste the &lt;strong&gt;AWS Provider&lt;/strong&gt; configuration code, then save.&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~&amp;gt; 5.0"
    }
  }
}

# Configure the AWS Provider
provider "aws" {
  region = "us-east-1"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpyh5syorgvg5jr226l90.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpyh5syorgvg5jr226l90.png" alt="Image description" width="326" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Then run the &lt;code&gt;terraform init&lt;/code&gt; command to initialize Terraform. This command will create a folder containing terraform plugins and a &lt;code&gt;.terraform.lock.hcl&lt;/code&gt; file, indicating that your environment is ready to apply your deployments.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;STEP 3 DEFINE THE VPC, INTERNET GATEWAY, AND ROUTE TABLE&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to the &lt;code&gt;main.tf&lt;/code&gt; file and start declaring the resources you want provisioned using the &lt;strong&gt;HashiCorp Configuration Language (HCL)&lt;/strong&gt;.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create a VPC
resource "aws_vpc" "main-vpc" {
  cidr_block       = "10.0.0.0/16"
  instance_tenancy = "default"

  tags = {
    Name = "main-vpc"
  }
}

# Create an Internet Gateway
resource "aws_internet_gateway" "classgw" {
  vpc_id = aws_vpc.main-vpc.id

  tags = {
    Name = "classgw"
  }
}

# Create a Route Table
resource "aws_route_table" "classRT" {
  vpc_id = aws_vpc.main-vpc.id

  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.classgw.id
  }
}

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

&lt;/div&gt;


&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6niikbb17owrir3h682h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6niikbb17owrir3h682h.png" alt="Image description" width="789" height="593"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Run the commands &lt;code&gt;terraform init&lt;/code&gt;, &lt;code&gt;terraform validate&lt;/code&gt;, &lt;code&gt;terraform plan&lt;/code&gt; and &lt;code&gt;terraform apply&lt;/code&gt; in sequence to provision the resources. You can choose to do this in batches, as we are doing here, or run the commands after declaring all your resources.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8e6i5esunty0zz7ecpaa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8e6i5esunty0zz7ecpaa.png" alt="Image description" width="630" height="413"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Output of &lt;code&gt;terraform plan&lt;/code&gt; command&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_internet_gateway.classgw will be created        
  + resource "aws_internet_gateway" "classgw" {
      + arn      = (known after apply)
      + id       = (known after apply)
      + owner_id = (known after apply)
      + tags     = {
          + "Name" = "classgw"
        }
      + tags_all = {
          + "Name" = "classgw"
        }
      + vpc_id   = (known after apply)
    }

  # aws_route_table.classRT will be created
  + resource "aws_route_table" "classRT" {
      + arn              = (known after apply)
      + id               = (known after apply)
      + owner_id         = (known after apply)
      + propagating_vgws = (known after apply)
      + route            = [
          + {
              + carrier_gateway_id         = ""
              + cidr_block                 = "0.0.0.0/0"
              + core_network_arn           = ""
              + destination_prefix_list_id = ""
              + egress_only_gateway_id     = ""
              + gateway_id                 = (known after apply)
              + ipv6_cidr_block            = ""
              + local_gateway_id           = ""
              + nat_gateway_id             = ""
              + network_interface_id       = ""
              + transit_gateway_id         = ""
              + vpc_endpoint_id            = ""
              + vpc_peering_connection_id  = ""
            },
        ]
      + tags_all         = (known after apply)
      + vpc_id           = (known after apply)
    }

  # aws_vpc.main-vpc will be created
  + resource "aws_vpc" "main-vpc" {
      + arn                                  = (known after apply)
      + cidr_block                           = "10.0.0.0/16"
      + default_network_acl_id               = (known after apply)
      + default_route_table_id               = (known after apply)
      + default_security_group_id            = (known after apply)
      + dhcp_options_id                      = (known after apply)
      + enable_dns_hostnames                 = (known after apply)
      + enable_dns_support                   = true
      + enable_network_address_usage_metrics = (known after apply)
      + id                                   = (known after apply)
      + instance_tenancy                     = "default"
      + ipv6_association_id                  = (known after apply)
      + ipv6_cidr_block                      = (known after apply)
      + ipv6_cidr_block_network_border_group = (known after apply)
      + main_route_table_id                  = (known after apply)
      + owner_id                             = (known after apply)
      + tags                                 = {
          + "Name" = "main-vpc"
        }
      + tags_all                             = {
          + "Name" = "main-vpc"
        }
    }

Plan: 3 to add, 0 to change, 0 to destroy.

──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── 

Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Output of &lt;code&gt;terraform plan&lt;/code&gt; command&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols:
  + create

Terraform will perform the following actions:

  # aws_internet_gateway.classgw will be created
  + resource "aws_internet_gateway" "classgw" {
      + arn      = (known after apply)
      + id       = (known after apply)
      + owner_id = (known after apply)
      + tags     = {
          + "Name" = "classgw"
        }
      + tags_all = {
          + "Name" = "classgw"
        }
      + vpc_id   = (known after apply)
    }

  # aws_route_table.classRT will be created
  + resource "aws_route_table" "classRT" {
      + arn              = (known after apply)
      + id               = (known after apply)
      + owner_id         = (known after apply)
      + propagating_vgws = (known after apply)
      + route            = [
          + {
              + carrier_gateway_id         = ""
              + cidr_block                 = "0.0.0.0/0"
              + core_network_arn           = ""
              + destination_prefix_list_id = ""
              + egress_only_gateway_id     = ""
              + gateway_id                 = (known after apply)
              + ipv6_cidr_block            = ""
              + local_gateway_id           = ""
              + nat_gateway_id             = ""
              + network_interface_id       = ""
              + transit_gateway_id         = ""
              + vpc_endpoint_id            = ""
              + vpc_peering_connection_id  = ""
            },
        ]
      + tags_all         = (known after apply)
      + vpc_id           = (known after apply)
    }

  # aws_vpc.main-vpc will be created
  + resource "aws_vpc" "main-vpc" {
      + arn                                  = (known after apply)
      + cidr_block                           = "10.0.0.0/16"
      + default_network_acl_id               = (known after apply)
      + default_route_table_id               = (known after apply)
      + default_security_group_id            = (known after apply)
      + dhcp_options_id                      = (known after apply)
      + enable_dns_hostnames                 = (known after apply)
      + enable_dns_support                   = true
      + enable_network_address_usage_metrics = (known after apply)
      + id                                   = (known after apply)
      + instance_tenancy                     = "default"
      + ipv6_association_id                  = (known after apply)
      + ipv6_cidr_block                      = (known after apply)
      + ipv6_cidr_block_network_border_group = (known after apply)
      + main_route_table_id                  = (known after apply)
      + owner_id                             = (known after apply)
      + tags                                 = {
          + "Name" = "main-vpc"
        }
      + tags_all                             = {
          + "Name" = "main-vpc"
        }
    }

Plan: 3 to add, 0 to change, 0 to destroy.
aws_vpc.main-vpc: Creating...
aws_vpc.main-vpc: Creation complete after 5s [id=vpc-07733c710c0a92868]
aws_internet_gateway.classgw: Creating...
aws_internet_gateway.classgw: Creation complete after 2s [id=igw-08480f88ccaf9b886]
aws_route_table.classRT: Creating...
aws_route_table.classRT: Creation complete after 2s [id=rtb-0bed4113ba3664e06]

Apply complete! Resources: 3 added, 0 changed, 0 destroyed.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;&lt;p&gt;We will repeat the above steps until we finish provisioning our resources.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;The provisioned resources in AWS management console&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

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

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

&lt;p&gt;&lt;strong&gt;STEP 4: CREATE PUBLIC AND PRIVATE SUBNETS&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the &lt;code&gt;main.tf&lt;/code&gt; file, go ahead and declare the commands for the subnets to provision both &lt;strong&gt;public&lt;/strong&gt; and &lt;strong&gt;private subnets&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create public subnets
resource "aws_subnet" "main_pubs1" {
  vpc_id            = aws_vpc.main-vpc.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "us-east-1a"

  tags = {
    Name = "main_pubs1"
  }
}

resource "aws_subnet" "main_pubs2" {
  vpc_id            = aws_vpc.main-vpc.id
  cidr_block        = "10.0.2.0/24"
  availability_zone = "us-east-1b"

  tags = {
    Name = "main_pubs2"
  }
}

# Create private subnets
resource "aws_subnet" "main_privs1" {
  vpc_id            = aws_vpc.main-vpc.id
  cidr_block        = "10.0.3.0/24"
  availability_zone = "us-east-1c"

  tags = {
    Name = "main_privs1"
  }
}

resource "aws_subnet" "main_privs2" {
  vpc_id            = aws_vpc.main-vpc.id
  cidr_block        = "10.0.4.0/24"
  availability_zone = "us-east-1d"

  tags = {
    Name = "main_privs2"
  }
}

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

&lt;/div&gt;


&lt;p&gt;In this demonstration, we have two public and two private subnets.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;STEP 5: ASSOCIATE SUBNETS WITH THE ROUTE TABLE&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Associate public subnets with the route table
resource "aws_route_table_association" "a" {
  subnet_id      = aws_subnet.main_pubs1.id
  route_table_id = aws_route_table.classRT.id
}

resource "aws_route_table_association" "b" {
  subnet_id      = aws_subnet.main_pubs2.id
  route_table_id = aws_route_table.classRT.id
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;STEP 6:  CREATE A SECURITY GROUP&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create a security group
resource "aws_security_group" "class_SG" {
  name        = "class_SG"
  description = "Allow SSH, HTTP, HTTPS inbound traffic"
  vpc_id      = aws_vpc.main-vpc.id

  ingress {
    description = "SSH from VPC"
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    description = "HTTPS from VPC"
    from_port   = 443
    to_port     = 443
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  ingress {
    description = "HTTP from VPC"
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
     from_port   = 0
     to_port     = 0
     protocol    = "-1"
     cidr_blocks = ["0.0.0.0/0"]
   }

  tags = {
    Name = "allow_traffic"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;STEP 7: CREATE NETWORK INTERFACES&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create network interfaces for the two instances.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create network interfaces
resource "aws_network_interface" "class_NI" {
  subnet_id       = aws_subnet.main_pubs1.id
  private_ips     = ["10.0.1.50"]
  security_groups = [aws_security_group.class_SG.id]
}

resource "aws_network_interface" "main-NIC" {
  subnet_id       = aws_subnet.main_pubs2.id
  private_ips     = ["10.0.2.20"]
  security_groups = [aws_security_group.class_SG.id]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;STEP 8: ALLOCATE ELASTIC IPS AND ASSOCIATE WITH NETWORK INTERFACES&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create Elastic IPs
resource "aws_eip" "class_EIP" {
  vpc                       = true
  network_interface         = aws_network_interface.class_NI.id
  associate_with_private_ip = "10.0.1.50"
}

resource "aws_eip" "class_EIP1" {
  vpc                       = true
  network_interface         = aws_network_interface.main-NIC.id
  associate_with_private_ip = "10.0.2.20"
}

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;STEP 9: LAUNCH TWO EC2 INSTANCES&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;One in a Public Subnet and the other in a Private Subnet.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Create EC2 instances
resource "aws_instance" "class_instance" {
  ami           = "ami-0005e0cfe09cc9050"
  instance_type = "t2.micro"
  key_name      = "Don-KP"
  network_interface {
    network_interface_id = aws_network_interface.class_NI.id
    device_index         = 0
  }

  tags = {
    Name = "hello1"
  }
}

resource "aws_instance" "class_instance222" {
  ami           = "ami-0005e0cfe09cc9050"
  instance_type = "t2.micro"
  key_name      = "Don-KP"
  network_interface {
    network_interface_id = aws_network_interface.main-NIC.id
    device_index         = 0
  }

  tags = {
    Name = "hello2"
  }
}

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Resources Created&lt;/strong&gt;&lt;/p&gt;

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

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

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

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

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

&lt;p&gt;&lt;strong&gt;STEP 10: DESTROY&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use the command &lt;code&gt;terraform destroy&lt;/code&gt; to clean-up the resources provisioned to have a clean slate and avoid paying for resources not used for production. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;CONCLUSION&lt;/strong&gt;&lt;br&gt;
In this tutorial, we've walked through the process of creating a custom VPC infrastructure in AWS using Terraform. This modular approach allows for easy maintenance, scalability, and reproducibility of your cloud environment. By leveraging Terraform, you gain the benefits of Infrastructure as Code, making it simpler to manage and collaborate on complex AWS architectures.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thank you for your time!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>terraform</category>
      <category>cloudcomputing</category>
      <category>infrastructureascode</category>
    </item>
    <item>
      <title>Connecting the Dots: A Step-by-Step Guide to Azure VNet Peering with Azure CLI.</title>
      <dc:creator>Bernard Chika Uwaezuoke</dc:creator>
      <pubDate>Thu, 19 Oct 2023 23:23:29 +0000</pubDate>
      <link>https://forem.com/donhadley22/connecting-the-dots-a-step-by-step-guide-to-azure-vnet-peering-with-azure-cli-5529</link>
      <guid>https://forem.com/donhadley22/connecting-the-dots-a-step-by-step-guide-to-azure-vnet-peering-with-azure-cli-5529</guid>
      <description>&lt;h2&gt;
  
  
  INTRODUCTION
&lt;/h2&gt;

&lt;p&gt;In today's interconnected digital landscape, the ability to create secure and seamless connections between different components of your cloud infrastructure is paramount.  Azure Virtual Network (VNet) peering, one of the many powerful features offered by Microsoft Azure, enables you to achieve just that. With VNet peering, you can establish network communication between Virtual Networks in Azure, creating a unified and efficient network environment for your applications and services.&lt;/p&gt;

&lt;p&gt;But, as with any sophisticated technology, getting started with Azure VNet peering may seem daunting at first. That's where we come in! In this comprehensive guide, we'll walk you through the step-by-step process of implementing Azure VNet peering using Azure CLI, the command-line interface that offers precise control and automation capabilities for Azure services.&lt;/p&gt;

&lt;p&gt;Whether you're an Azure newcomer looking to understand the fundamentals or an experienced cloud architect seeking a refresher, this blog will provide you with the insights and practical instructions you need to create, configure, and manage Azure VNet peering like a pro.&lt;/p&gt;

&lt;p&gt;Join us as we demystify the world of Virtual Network peering, exploring the key concepts, prerequisites, and best practices. By the end of this guide, you'll be equipped with the knowledge and tools to effortlessly establish network connections across your Azure VNets, enabling your applications and services to communicate seamlessly.&lt;/p&gt;

&lt;p&gt;So, without further ado, let's dive into the exciting world of Azure VNet peering with Azure CLI and take the first step toward creating an interconnected, efficient, and resilient cloud infrastructure.&lt;/p&gt;

&lt;h2&gt;
  
  
  PREREQUISITES
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Azure Subscription&lt;/li&gt;
&lt;li&gt;Azure CLI&lt;/li&gt;
&lt;li&gt;Planning and Design&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;STEP 1: Sign into Azure Account&lt;/strong&gt; &lt;br&gt;
Login to your &lt;strong&gt;Azure account&lt;/strong&gt; through your &lt;strong&gt;Command Line Interface (CLI)&lt;/strong&gt; by typing this command &lt;code&gt;az login&lt;/code&gt; as shown in the image below then tap the &lt;strong&gt;enter&lt;/strong&gt; key to run it.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;This opens a tab in your browser, where you will be required to provide your login details.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Select the particular account you wish to deploy the resources and sign in.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A notification indicating you have been granted access to the account displays.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Your account detail is displayed on your CLI.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;STEP 2: Create a Resource Group&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A resource group is a logical grouping of Azure resources that are related to a specific application, project, or environment. It serves as a logical container for our resources in Azure and helps us in &lt;strong&gt;organization, management, access control, deletion and cleanup of our account.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We create the &lt;strong&gt;resource group&lt;/strong&gt; using this command:&lt;br&gt;
&lt;code&gt;az group create --name &amp;lt;resource group name&amp;gt; --location &amp;lt;azure region&amp;gt;&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;From the above image, it can be seen that for this exercise, we created a resource group called &lt;strong&gt;Proj-RG&lt;/strong&gt;. Which is visible on the portal (see below).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;STEP 3: Create the Virtual Networks (Vnet).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For this exercise, we will be creating two virtual networks (&lt;strong&gt;EastVNet&lt;/strong&gt; and &lt;strong&gt;WestVNet&lt;/strong&gt;).&lt;/p&gt;

&lt;p&gt;We proceed to create the virtual networks that we intend to peer. The convention is to have distinct IP address range for each Vnet to ensure that they do not overlap. Virtual networks that are to be peered should not have overlapping IP addresses.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;We use this command to create the Vnets one after the other. &lt;br&gt;
&lt;code&gt;az network vnet create --resource-group &amp;lt;resource group name&amp;gt; --name &amp;lt;Vnet name&amp;gt; --address-prefix 10.1.0.0/16 --subnet-name &amp;lt;subnet name&amp;gt; --subnet-prefix 10.1.0.0/24&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For EastVNet&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;From the above image, the IP address range for EastVnet can be seen as "10.1.0.0/16" and the subnet IP address range is "10.1.0.0/16".&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;For WestVnet&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ar4g5n6vy7k65t6mv98.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6ar4g5n6vy7k65t6mv98.png" alt="Image description"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We can use this command &lt;code&gt;az network vnet list --output table&lt;/code&gt; to verify if indeed the virtual networks were created.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;We can add an additional subnet to an existing virtual network through this command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;az network vnet create --resource-group Proj-RG --name EastVNet --address-prefix 10.2.0.0/16 --subnet-name EastSubnet1 --subnet-prefix 10.2.0.0/24&lt;/code&gt;&lt;br&gt;
This will create an aditional subnet in EastVNet.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We use this command to verify the subnets in a particular Vnet. 
&lt;code&gt;az network vnet subnet list --resource-group Proj-RG --vnet-name EastVNet --output table
&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;We can also proceed to the Azure portal to view the virtual networks we created inside the resource group (Proj-RG).&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;STEP 4: Peering the Virtual Networks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The final step is to peer the virtual networks.&lt;br&gt;
We use the following commands to achieve that.&lt;/p&gt;

&lt;p&gt;We begin by creating West to East peering. That is peering WestVNet to EastVNet.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We use this command to get the Resource ID of the EastVNet in order to perform the peering.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;az network vnet show --resource-group Proj-RG --name EastVNet --query id --out tsv&lt;br&gt;
&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;We now run this command for the peering using the EastVNet resource ID. &lt;/li&gt;
&lt;/ul&gt;

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

az network vnet peering create --name WesttoEastPeering --resource-group Proj-RG --vnet-name WestVNet --remote-vnet "/subscriptions/21b8f625-edc8-4cf1-99ec-861cfa81ecc3/resourceGroups/Proj-RG/providers/Microsoft.Network/virtualNetworks/EastVNet" --allow-vnet-access


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

&lt;/div&gt;

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

&lt;p&gt;&lt;strong&gt;Output of the command&lt;/strong&gt;&lt;/p&gt;

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

{
  "allowForwardedTraffic": false,
  "allowGatewayTransit": false,
  "allowVirtualNetworkAccess": true,
  "doNotVerifyRemoteGateways": false,
  "etag": "W/\"2a34dc33-8176-4ad6-ab9f-db94281f712f\"",
  "id": "/subscriptions/21b8f625-edc8-4cf1-99ec-861cfa81ecc3/resourceGroups/Proj-RG/providers/Microsoft.Network/virtualNetworks/WestVNet/virtualNetworkPeerings/WesttoEastPeering",
  "name": "WesttoEastPeering",
  "peeringState": "Initiated",
  "peeringSyncLevel": "RemoteNotInSync",
  "provisioningState": "Succeeded",
  "remoteAddressSpace": {
    "addressPrefixes": [
      "10.1.0.0/16"
    ]
  },
  "remoteVirtualNetwork": {
    "id": "/subscriptions/21b8f625-edc8-4cf1-99ec-861cfa81ecc3/resourceGroups/Proj-RG/providers/Microsoft.Network/virtualNetworks/EastVNet",
    "resourceGroup": "Proj-RG"
  },
  "remoteVirtualNetworkAddressSpace": {
    "addressPrefixes": [
      "10.1.0.0/16"
    ]
  },
  "resourceGroup": "Proj-RG",
  "resourceGuid": "ed95c55f-94b2-0ecd-2f52-dc24ce394fb7",
  "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
  "useRemoteGateways": false
}


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

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;To peer East to West. That is peering EastVNet to WestVNet, in order to complete the peering circuit.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We run this command again for the WestVNet to get the &lt;strong&gt;resource ID&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;az network vnet show --resource-group Proj-RG --name WestVNet --query id --out tsv&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;We can now go ahead and run the peering command to peer EastVnet to WestVnet.&lt;/li&gt;
&lt;/ul&gt;

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

az network vnet peering create --name EasttoWestPeering --resource-group Proj-RG --vnet-name EastVNet --remote-vnet "/subscriptions/21b8f625-edc8-4cf1-99ec-861cfa81ecc3/resourceGroups/Proj-RG/providers/Microsoft.Network/virtualNetworks/WestVNet" --allow-vnet-access


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

&lt;/div&gt;

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

&lt;p&gt;&lt;strong&gt;Output of the command&lt;/strong&gt;&lt;/p&gt;

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

{
  "allowForwardedTraffic": false,
  "allowGatewayTransit": false,
  "allowVirtualNetworkAccess": true,
  "doNotVerifyRemoteGateways": false,
  "etag": "W/\"32bb25f8-1dc4-4b74-af18-4a183d67f138\"",
  "id": "/subscriptions/21b8f625-edc8-4cf1-99ec-861cfa81ecc3/resourceGroups/Proj-RG/providers/Microsoft.Network/virtualNetworks/EastVNet/virtualNetworkPeerings/EasttoWestPeering",
  "name": "EasttoWestPeering",
  "peeringState": "Connected",
  "peeringSyncLevel": "FullyInSync",
  "provisioningState": "Succeeded",
  "remoteAddressSpace": {
    "addressPrefixes": [
      "10.2.0.0/16"
    ]
  },
  "remoteVirtualNetwork": {
    "id": "/subscriptions/21b8f625-edc8-4cf1-99ec-861cfa81ecc3/resourceGroups/Proj-RG/providers/Microsoft.Network/virtualNetworks/WestVNet",
    "resourceGroup": "Proj-RG"
  },
  "remoteVirtualNetworkAddressSpace": {
    "addressPrefixes": [
      "10.2.0.0/16"
    ]
  },
  "resourceGroup": "Proj-RG",
  "resourceGuid": "ed95c55f-94b2-0ecd-2f52-dc24ce394fb7",
  "type": "Microsoft.Network/virtualNetworks/virtualNetworkPeerings",
  "useRemoteGateways": false
}


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

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;We can use this command to verify the state of peering.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;az network vnet peering list --resource-group Proj-RG --vnet-name EastVNet --output table&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SOME BENEFITS OF VIRTUAL NETWORK PEERING&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Private Network Communication:&lt;/strong&gt; VNet peering enables private, low-latency communication between VNets, creating a virtual private network within Azure. This is especially useful when you want to keep network traffic within the Azure backbone, avoiding exposure to the public internet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Simplified Network Architecture:&lt;/strong&gt; VNets that are peered together can communicate as if they are part of a single network. This simplifies network architecture and eliminates the need for complex and costly VPN gateways or dedicated network appliances.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cost-Efficiency:&lt;/strong&gt; VNet peering is a cost-effective solution for interconnecting VNets. You don't incur data transfer charges within the same Azure region when using VNet peering, which can lead to significant cost savings compared to data transfer over a VPN or ExpressRoute.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Low Latency:&lt;/strong&gt; Since VNet peering traffic stays within Azure's high-speed backbone network, it results in low-latency communication, making it suitable for applications that require quick response times.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transitive Connectivity:&lt;/strong&gt; VNet peering can be transitive, allowing traffic to flow from one VNet to another through a peered VNet. This can simplify network topologies and routing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Redundancy and High Availability:&lt;/strong&gt; By peering VNets in different regions, you can create redundant network architectures for disaster recovery and high availability scenarios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Isolation:&lt;/strong&gt; Even when VNets are peered, they maintain their isolation. You can apply network security group (NSG) rules and route traffic as needed, providing granular control over communication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hybrid Scenarios:&lt;/strong&gt; VNet peering can be used in hybrid scenarios where you connect on-premises networks to Azure VNets, making it easier to extend your network infrastructure to the cloud.&lt;/p&gt;

&lt;p&gt;In conclusion, mastering the art of Azure VNet peering with Azure CLI opens up a world of possibilities for creating efficient, secure, and interconnected cloud architectures. By following the step-by-step instructions in this guide, you'll be well on your way to harnessing the full potential of Azure's networking capabilities. So, don't hesitate to dive in, explore, and embrace the power of Azure VNet peering to enhance your cloud infrastructure and take your applications to the next level. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thank you for your time and happy peering!&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>cloud</category>
      <category>beginners</category>
    </item>
    <item>
      <title>A Step-by-Step Guide on Creating a Resource Group, Virtual Network and Subnet in Azure with Terraform.</title>
      <dc:creator>Bernard Chika Uwaezuoke</dc:creator>
      <pubDate>Wed, 23 Aug 2023 01:36:42 +0000</pubDate>
      <link>https://forem.com/donhadley22/a-step-by-step-guide-on-creating-a-resource-group-virtual-network-and-subnet-in-azure-with-terraform-4b7c</link>
      <guid>https://forem.com/donhadley22/a-step-by-step-guide-on-creating-a-resource-group-virtual-network-and-subnet-in-azure-with-terraform-4b7c</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Welcome to this in-depth blog series where we unravel the art of provisioning &lt;strong&gt;Azure&lt;/strong&gt; resources using &lt;strong&gt;Terraform&lt;/strong&gt;, a powerful Infrastructure as Code (IaC) tool. In this digital era, orchestrating cloud infrastructure efficiently is paramount, and &lt;strong&gt;Terraform&lt;/strong&gt; provides the brush strokes you need to paint your Azure canvas with precision. This article will guide you through the process of creating a &lt;strong&gt;resource group&lt;/strong&gt;, a &lt;strong&gt;virtual network&lt;/strong&gt;, and a &lt;strong&gt;subnet&lt;/strong&gt; in Azure using Terraform, equipping you with the skills to architect and manage cloud resources seamlessly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Terraform?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Terraform is an &lt;strong&gt;open-source&lt;/strong&gt; infrastructure as code (IaC) tool developed by &lt;strong&gt;HashiCorp&lt;/strong&gt;. It allows you to define, manage, and provision infrastructure resources in a declarative way using configuration files. These configuration files, written in &lt;strong&gt;HashiCorp Configuration Language&lt;/strong&gt; (HCL), describe the desired state of your infrastructure components such as virtual machines, networks, storage, and other cloud services.&lt;/p&gt;

&lt;p&gt;Terraform provides a way to manage infrastructure across various cloud providers such as AWS, Azure, Google Cloud, Oracle etc. and even on-premises environments. It helps automate the process of creating, updating, and destroying resources by treating infrastructure as code, enabling you to version-control your infrastructure configurations and collaborate more effectively with your team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Some Terraform key concepts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Providers:&lt;/strong&gt; These are plugins that interface with various cloud providers' APIs. Each provider offers resource types that Terraform can manage, such as virtual machines, networks, databases, and more.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Resources:&lt;/strong&gt; These are the fundamental building blocks of your infrastructure, representing the individual components you want to manage. For example, an &lt;strong&gt;AWS instance&lt;/strong&gt; or an &lt;strong&gt;Azure virtual machine&lt;/strong&gt; might be represented as a resource.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Modules:&lt;/strong&gt; Modules allow you to encapsulate and reuse configurations. They can be thought of as reusable blueprints for creating infrastructure components.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. State:&lt;/strong&gt; Terraform maintains a state file that keeps track of the current state of your infrastructure as defined in your configuration files. This state file is used to determine the difference between the desired state and the actual state and to perform updates accordingly.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Execution Plan:&lt;/strong&gt; Terraform generates an &lt;strong&gt;execution plan&lt;/strong&gt; before making any changes to your infrastructure. This plan outlines what actions Terraform will take to reach the desired state, allowing you to review and approve changes before they are applied.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6.Apply:&lt;/strong&gt; The "&lt;strong&gt;terraform apply&lt;/strong&gt;" command is used to apply the changes defined in your configuration files to your infrastructure. It provisions or updates resources based on the execution plan.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install VScode (IDE)&lt;/li&gt;
&lt;li&gt;Install Terraform&lt;/li&gt;
&lt;li&gt;Azure Account&lt;/li&gt;
&lt;li&gt;Install WSL Ubuntu&lt;/li&gt;
&lt;li&gt;Azure CLI&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let's dive in now!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Download and install Visual Studio Code&lt;/strong&gt;&lt;br&gt;
Use the link bellow to download and install Microsoft VScode.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;https://code.visualstudio.com/download&lt;/code&gt;&lt;br&gt;
&lt;em&gt;Download MS Visual Studio Code – VSCode&lt;/em&gt;&lt;/p&gt;

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

&lt;h2&gt;
  
  
  - Select the suitable one for your operating system. We are selecting &lt;strong&gt;Windows&lt;/strong&gt; for this article. 
&lt;/h2&gt;

&lt;p&gt;Click &lt;strong&gt;Install&lt;/strong&gt;/&lt;strong&gt;Launch&lt;/strong&gt;/&lt;br&gt;
Sign in to MS Visual Studio with your Microsoft Account To create a password for the default user.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure Visual Studio to run Ubuntu terminal&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open the &lt;strong&gt;VScode&lt;/strong&gt; and click on the extension icon as shown below.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Type &lt;strong&gt;remote wsl&lt;/strong&gt; in the search bar select and then install.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Install WSL Ubuntu from Microsoft Store&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Search for Microsoft Store on your system.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In Microsoft Store, Search for, download, and INSTALL Ubuntu&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Unpack the App.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Install Terraform in your VScode&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Use the documentation in the link below to Install Terraform&lt;br&gt;
 &lt;code&gt;https://cloudlinuxtech.com/install-terraform-on-ubuntu-uninstall-terraform/&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Copy and paste these commands, one line at a time:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add -

sudo apt-add-repository "deb [arch=$(dpkg --print-architecture)] https://apt.releases.hashicorp.com
$(lsb_release -cs) main"

$sudo apt update
$sudo apt install terraform
$ terraform --version
$ which terraform
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;Click on the &lt;strong&gt;extension&lt;/strong&gt; icon by the left of your VScode search for and install these extensions indicated in the image below:&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Configure Provider (Azure)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Now download and install &lt;strong&gt;azure-cli&lt;/strong&gt; for ubuntu with these commands one after the other:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt update
sudo curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bash 
az --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Now that we are done setting-up our working environment, let's now commence the main business of deploying our resources using terraform.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploying our resources&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Create a folder on our desktop named it &lt;strong&gt;AZURE TERRAFORM1&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open the folder using VScode&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Create two files named &lt;strong&gt;provider.tf&lt;/strong&gt; and &lt;strong&gt;main.tf&lt;/strong&gt; respectively.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Click on the &lt;strong&gt;terminal&lt;/strong&gt; button on the top of the VScode to open your interface below and select the &lt;strong&gt;wsl ubuntu&lt;/strong&gt; to display your &lt;strong&gt;shell prompt&lt;/strong&gt;in order to be able to run your &lt;strong&gt;Linux&lt;/strong&gt; commands.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Go to the &lt;strong&gt;Terraform registry for Azure&lt;/strong&gt; on the link below to get your templates for deploying Azure resources.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the &lt;strong&gt;provider.tf&lt;/strong&gt; file, copy the provider configuration from the terraform registry and paste.
Then go to the terminal and initialize terraform by running this command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;terraform init&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;You will get this notification indicating that the initialization was successful.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Login to Azure by running the &lt;code&gt;az login&lt;/code&gt; command.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;This will open a &lt;strong&gt;browser tab&lt;/strong&gt; for you to provide your login credentials. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Select the appropriate account and sign-in.
&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Faknxk97xni1c21vjubvs.png" alt="Image description"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The notification below will be displayed on the browser indicating that your login was successful. &lt;/p&gt;

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

&lt;p&gt;The &lt;strong&gt;account&lt;/strong&gt; and &lt;strong&gt;subscription&lt;/strong&gt; details will be displayed in your terminal.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Go to the &lt;strong&gt;main.tf&lt;/strong&gt; file and start deploying your resources.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Provisioning a Resource Group&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Go to the Terraform Azure registry and copy a template for &lt;strong&gt;Resource group&lt;/strong&gt; by typing the &lt;strong&gt;resource group&lt;/strong&gt; in the search bar. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Customize to your preference by editing the &lt;strong&gt;values&lt;/strong&gt; of the parameters &lt;strong&gt;resource&lt;/strong&gt;, &lt;strong&gt;name&lt;/strong&gt; and &lt;strong&gt;location&lt;/strong&gt; to suite your specification. The &lt;strong&gt;unique id&lt;/strong&gt; is the element in the quotation mark after the resource. &lt;br&gt;
In this instance, the resource is &lt;strong&gt;"azurerm_resource_group"&lt;/strong&gt; we specified the unique id as &lt;strong&gt;Proj-rg&lt;/strong&gt;. The name is &lt;strong&gt;project1-RG&lt;/strong&gt; and the location is &lt;strong&gt;east us&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;When we are done defining our resource in &lt;strong&gt;HashiCorp Configuration Language&lt;/strong&gt;, we run the &lt;code&gt;terraform init&lt;/code&gt; command again to start the process of provisioning. &lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Then &lt;code&gt;terraform plan&lt;/code&gt; command, to ascertain that what we intend doing is indeed what terraform will do. &lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;We can now run the &lt;code&gt;terraform apply&lt;/code&gt; command to deploy the resource.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;We will be prompted by &lt;strong&gt;terraform&lt;/strong&gt; if we want to go ahead with the provisioning, and we type &lt;strong&gt;yes&lt;/strong&gt; to approve.&lt;/p&gt;

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

&lt;p&gt;Terraform will deploy our resource for us as specified. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;View the provisioned resource in *&lt;em&gt;Azure portal
*&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;To Provision a Virtual Network&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Now we want to create a &lt;strong&gt;Virtual Network&lt;/strong&gt; within the resource group we just created.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Go to the &lt;strong&gt;Terraform Registry for Azure&lt;/strong&gt; and copy the template for provisioning a virtual network and paste it right below the resource group code in the &lt;strong&gt;main.tf&lt;/strong&gt; file in our code editor.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Edit it to our specification as shown in the image below. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;When we are done editing to our specification, by providing the unique id &lt;strong&gt;vnet1&lt;/strong&gt;, name &lt;strong&gt;project1-network&lt;/strong&gt;, resource group &lt;strong&gt;Proj-rg&lt;/strong&gt;, location specified with the resource group unique id and the private IPv4 range &lt;strong&gt;10.0.0.0/16&lt;/strong&gt;. We conslude the process by running these same three commands one after the other to deploy the virtual network to Azure cloud.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;terraform init
terraform plan
terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;View our Virtual Network in Azure Portal.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Provisioning a subnet in our Virtual network&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;We begin by going to the terraform library again to search for &lt;strong&gt;subnet&lt;/strong&gt; and copy the desired template and place it right below the virtual network code on our editor. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We continue by providing our customized value for the parameters in the template as shown in the image below.&lt;br&gt;
In this instance, the unique id for our subnet is &lt;strong&gt;example&lt;/strong&gt; and the name is &lt;strong&gt;example-subnet&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We provide the resource group and virtual network parameters values using there unique &lt;strong&gt;Proj-rg&lt;/strong&gt; and &lt;strong&gt;vnet1&lt;/strong&gt; respectively. &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;We also provide the IPv4 address range for the subnet &lt;strong&gt;10.0.1.0/24&lt;/strong&gt;. &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;We conclude the process by running the terraform commands one after the other again.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;terraform init
terraform plan
terraform apply
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;We view our subnet in Azure portal.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;We can also see the &lt;strong&gt;address range&lt;/strong&gt; of the virtual network the resource group in the Azure portal.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Below is our module, which we can push to Github for future us and to be used by others.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Destroying our resources&lt;/strong&gt;&lt;br&gt;
As convention demands, we clean-up our cloud account by deleting resources that are no longer in use. &lt;br&gt;
To destroy our resources, using terraform, we just run the command &lt;code&gt;terraform destroy&lt;/code&gt; on out terminal and type &lt;strong&gt;yes&lt;/strong&gt; when prompted or add the argument &lt;code&gt;--auto-approve&lt;/code&gt; to approve the removal automatically.&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2fozesmvanklam9z802z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2fozesmvanklam9z802z.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
From the above images, we can see that the resources we provisioned have been destroyed.&lt;/p&gt;

&lt;p&gt;With this, we come to this guide on using terraform for Azure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
In this step-by-step guide, we've embarked on a journey into the world of cloud infrastructure provisioning with &lt;strong&gt;Terraform&lt;/strong&gt; on the &lt;strong&gt;Microsoft Azure&lt;/strong&gt; platform. We've covered the fundamentals, walked through the essential setup, and explored how to create and manage resources in a structured and efficient manner.&lt;/p&gt;

&lt;p&gt;As you venture forward, consider exploring advanced Terraform topics such as &lt;strong&gt;managing state&lt;/strong&gt;, &lt;strong&gt;handling secrets&lt;/strong&gt;, and **integrating **with other tools in the DevOps ecosystem. Remember, learning is a continuous journey, and each step you take deepens your mastery.&lt;/p&gt;

&lt;p&gt;Thank you for joining us on this exploration of Terraform and Azure. Please, feel free to share your thoughts and questions in the comments section, and remember, to subscribe and follow us for more articles like this.&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>azure</category>
      <category>vscode</category>
      <category>linux</category>
    </item>
    <item>
      <title>Deploying a Simple Application in a Container with Minikube in a Docker runtime.</title>
      <dc:creator>Bernard Chika Uwaezuoke</dc:creator>
      <pubDate>Mon, 14 Aug 2023 16:23:51 +0000</pubDate>
      <link>https://forem.com/donhadley22/deploying-a-simple-application-in-a-container-with-minikube-in-a-docker-runtime-3en8</link>
      <guid>https://forem.com/donhadley22/deploying-a-simple-application-in-a-container-with-minikube-in-a-docker-runtime-3en8</guid>
      <description>&lt;p&gt;The objective of this article is to serve as a guide to beginners who want to have basic understanding of containerization and container orchestration using Kubernetes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Introduction:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Kubernetes&lt;/strong&gt; as a container orchestration platform, has become the de facto standard for managing containerized applications at scale. While deploying applications on a real Kubernetes cluster is ideal for production environments, developers often need a local environment for testing, development, and learning purposes. &lt;strong&gt;Minikube&lt;/strong&gt; comes to the rescue as a powerful tool that enables one to run a single-node Kubernetes cluster on your local machine. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Minikube?&lt;/strong&gt;&lt;br&gt;
Minikube is an open-source tool that allows you to set up a single-node Kubernetes cluster on your local machine. It provides an environment where you can deploy, manage, and test Kubernetes applications without the need for a full-scale production cluster. Minikube is particularly useful for developers who want to experiment with Kubernetes features, test configurations, and develop applications before deploying them to a real cluster.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is Docker?&lt;/strong&gt;&lt;br&gt;
Docker is an open-source platform that automates the deployment, scaling, and management of applications inside lightweight, portable containers. &lt;strong&gt;Containers&lt;/strong&gt; are a form of &lt;strong&gt;virtualization&lt;/strong&gt; technology that allows you to package an application and its dependencies, including libraries and other configuration files, into a single unit called a container. A docker is technically a container runtime.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Install &lt;strong&gt;Docker&lt;/strong&gt; in your local environment.&lt;/li&gt;
&lt;li&gt;Install &lt;strong&gt;Minikube&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Install &lt;strong&gt;Vim&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Let us now begin the exercise proper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Deploying a Simple Application&lt;/strong&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
To deploy an application in a container, we will start by &lt;strong&gt;creating a new deployment&lt;/strong&gt; that is a &lt;strong&gt;kubernetes object&lt;/strong&gt;. This can be done using &lt;strong&gt;minikube&lt;/strong&gt;. 
We use the following command to start the minikube:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;minikube start --driver=docker&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmod1b8nfpp5msijqm2vc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmod1b8nfpp5msijqm2vc.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
Note that we do not require &lt;strong&gt;root privileges&lt;/strong&gt; to run these commands.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
We can now go ahead and create the &lt;strong&gt;deployment&lt;/strong&gt;. The name of this deployment is &lt;strong&gt;serve1&lt;/strong&gt; and the parent image is redis.
We then run the following command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kubectl create deployment serv1  --image=redis&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwpa06wovmqh96axre3pr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwpa06wovmqh96axre3pr.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
From the above image, we can see that our deployment was successfully created.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We can view the deployment we made by running the following command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kubectl get deployments&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;We can also procced to view the deployment details with the following command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kubectl describe deployment serve1&lt;/code&gt;&lt;/p&gt;

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

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

&lt;p&gt;From the above snapshots, we can see a more detailed information about our deployment, including date, time, image, ports, age and others.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We can also view the event log of our deployment by running this command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kubectl get events&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;We can also view existing items in the cluster in a usable &lt;strong&gt;YAML&lt;/strong&gt; output, to see structure of how &lt;strong&gt;serve1&lt;/strong&gt; is currently deployed. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kubectl get deployments serve1 -o yaml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Below is the output.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;donhadley23@donhadley:~$ kubectl get deployments serve1 -o yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    deployment.kubernetes.io/revision: "1"
  creationTimestamp: "2023-08-12T23:06:45Z"
  generation: 1
  labels:
    app: serve1
  name: serve1
  namespace: default
  resourceVersion: "5935"
  uid: f287eb3d-4c74-44e8-99be-6efe716dd594
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
app: serve1
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
    type: RollingUpdate
  template:
    metadata:
      creationTimestamp: null
      labels:
        app: serve1
    spec:
      containers:
      - image: redis
        imagePullPolicy: Always
        name: redis
        resources: {}
        terminationMessagePath: /dev/termination-log
        terminationMessagePolicy: File
      dnsPolicy: ClusterFirst
restartPolicy: Always
      schedulerName: default-scheduler
      securityContext: {}
      terminationGracePeriodSeconds: 30
status:
  availableReplicas: 1
  conditions:
  - lastTransitionTime: "2023-08-12T23:07:10Z"
    lastUpdateTime: "2023-08-12T23:07:10Z"
    message: Deployment has minimum availability.
    reason: MinimumReplicasAvailable
    status: "True"
    type: Available
  - lastTransitionTime: "2023-08-12T23:06:45Z"
    lastUpdateTime: "2023-08-12T23:07:10Z"
    message: ReplicaSet "serve1-5455dc4fcc" has successfully progressed.
    reason: NewReplicaSetAvailable
    status: "True"
    type: Progressing
  observedGeneration: 1
readyReplicas: 1
  replicas: 1
  updatedReplicas: 1
donhadley23@donhadley:~$
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;We can go ahead and to create a service to see more about our newly created serve1 container, but we have to enable a port in order to achieve this.
So, let’s create a deployment file with this vim command:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;vim deploymentfile.yml&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The above command will take us to our deployment file. We can go ahead and edit the file with information from a similar file in Kubernetes documentation at &lt;code&gt;https://kubernetes.io/docs/concepts/workloads/controllers/deployment/&lt;/code&gt; and also enable a port.&lt;br&gt;
Please note that we replaced the name of the app with sever1 and added the section for port, and protocol. As can be seen below.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  name: serve1
  labels:
    app: serve1
spec:
  replicas: 3
  selector:
    matchLabels:
      app: serve1
  template:
    metadata:
      labels:
        app: serve1
    spec:
      containers:
      - name: serve1
        image: redis
        ports:
        - containerPort: 80
          protocol: TCP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We save and exit from the deployment file.&lt;br&gt;
This changes was necessary to enable us run the &lt;strong&gt;service&lt;/strong&gt; successfully be enabling the &lt;strong&gt;port&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We can now run this command to replace the deployment with our new changes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kubectl replace -f deploymentfile.yml&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;We can also view the &lt;strong&gt;Pod&lt;/strong&gt; and &lt;strong&gt;Deployment&lt;/strong&gt;. Take special notice of the &lt;strong&gt;Age&lt;/strong&gt;, showing when the pod was created. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kubectl get deploy,pod&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
We can &lt;strong&gt;expose&lt;/strong&gt; the resource again, now that we have a port enabled, it should work.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kubectl expose deployment serve1&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Let us verify the service configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kubectl get service serve1&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
To view the &lt;strong&gt;Endpoint&lt;/strong&gt; which is provided by kubelet and kube-proxy. Take special notice of the current endpoint IP. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kubectl get ep serve1&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Let also look at all the pods created.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kubectl get pods&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;We can scale up the deployment. Let's start by checking the current deployment state.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kubectl get deployment serve1&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;Let scale it up from 3 to 6. &lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl scale deployment serve1 --replicas=6&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Now that we have successfully scaled our deployment, let’s check the number of pods that we have again.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kubectl get deployment serve1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fen4re6ua3am2f49xdji3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fen4re6ua3am2f49xdji3.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
We have six now!&lt;/p&gt;

&lt;p&gt;View the current endpoints. There will be six now.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;kubectl get ep serve1&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;We can also use &lt;strong&gt;o-wide&lt;/strong&gt; command to view the IP addresses the running pods&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kubectl get pod -o wide&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
Now that we are done with our journey of discovery on Kubernetes, it's time to clean up, by deleting our deployment.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kubectl delete deployment serve1&lt;/code&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Let's verify!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;kubectl get deployment serve1&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;We then stop the &lt;strong&gt;minikube&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;minikube stop&lt;/code&gt;&lt;/p&gt;

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

&lt;p&gt;Hope this guide is simplified enough and you have a better grasp of how &lt;strong&gt;Kubernetes&lt;/strong&gt; functions.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thank you for reading! Please do well to follow our page and subscribe too&lt;/strong&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>An overview of Azure serverless services with special focus on Azure Logic App.</title>
      <dc:creator>Bernard Chika Uwaezuoke</dc:creator>
      <pubDate>Wed, 19 Jul 2023 19:11:29 +0000</pubDate>
      <link>https://forem.com/donhadley22/an-overview-of-azure-serverless-services-with-special-focus-on-azure-logic-app-3e7b</link>
      <guid>https://forem.com/donhadley22/an-overview-of-azure-serverless-services-with-special-focus-on-azure-logic-app-3e7b</guid>
      <description>&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;PREAMBLE&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In this blog, we will take a review of Azure serverless services with the intent of understanding its components and methodology. We will go further by examining the major difference between two core Azure's serverless services of &lt;strong&gt;Function App&lt;/strong&gt; and &lt;strong&gt;Logic App&lt;/strong&gt;. Then conclude by creating a &lt;strong&gt;Logic app workflow&lt;/strong&gt; in Azure and document our steps in a repository in GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;WHAT IS AZURE SERVERLESS?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Azure Serverless is a cloud computing model provided by Microsoft Azure that allows you to build and run applications without managing the underlying infrastructure. With Azure Serverless, you can focus on writing code and developing your application logic without worrying about server provisioning, scaling, or maintenance.&lt;/p&gt;

&lt;p&gt;Azure provides several serverless services that enable you to build scalable and event-driven applications. Some key serverless services in Azure include:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure Functions App:&lt;/strong&gt; Azure Functions is a serverless compute service that allows you to write code in various programming languages, such as C#, Java, Python, and JavaScript, and execute these codes in response to events or triggers. Functions can be used for various scenarios like data processing and automation.&lt;/p&gt;

&lt;p&gt;There is also &lt;strong&gt;Azure Durable Functions&lt;/strong&gt; which is an extension of Azure Functions that allows you to write stateful workflows and coordination logic using an orchestrator pattern. It helps in building long-running, scalable, and reliable serverless applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure Logic Apps:&lt;/strong&gt; Azure Logic Apps is a serverless workflow orchestration service that helps you build business process automation and integrate systems, services, and applications together. It provides a visual designer to create workflows by connecting pre-built connectors and triggers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure Event Grid:&lt;/strong&gt; Azure Event Grid is an event routing service that simplifies the development of event-based applications. It can route events from various Azure services and custom sources to subscribers, which can be Azure Functions, Logic Apps, webhooks, or any other HTTP endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure App Service:&lt;/strong&gt; Azure App Service is a fully managed platform for building and hosting web applications. It supports multiple programming languages and frameworks and provides built-in DevOps capabilities. App Service offers both serverless and dedicated compute options, allowing you to choose based on your application's needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Summary&lt;/strong&gt;&lt;br&gt;
Azure Serverless services provide automatic scaling, pay-per-use pricing models, built-in integration with other Azure services, and easy deployment and management through Azure Portal, CLI, or other development tools. These services enable developers to focus on writing code and delivering value without worrying about the underlying infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;DIFFERENCE BETWEEN AZURE FUNCTION APP AND AZURE LOGIC APP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Azure Function app&lt;/strong&gt; and &lt;strong&gt;Azure Logic app&lt;/strong&gt; are both serverless services provided by Microsoft Azure, but their difference is in the purposes they serve and their capabilities.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here is a breakdown of the key differences between the two&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Compute vs Workflow Orchestration:&lt;/strong&gt; While Azure Function app is primarily focused on compute, where it allows you to write code (functions) in various programming languages and execute them in response to events or triggers. &lt;br&gt;
The Azure Logic app on the other hand focuses on workflow orchestration and integration of various systems, services, and applications.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Event-Driven Triggers:&lt;/strong&gt; Both apps support event-driven triggers.   However, Logic App triggers are often tied to external events, such as receiving an email, receiving a message from a service bus, or monitoring a specific folder in a storage account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Stateful vs Stateless:&lt;/strong&gt; While Azure Logic Apps are designed to support long-running and stateful workflows. Azure Function Apps on the other hand are stateless by default.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. Developer focused vs Networking focused:&lt;/strong&gt; Azure Functions are designed to empower developers to write and deploy codes quickly. Logic Apps offer a wide range of connectors that allow you to interact with various services and systems, both within Azure and outside Azure network.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CREATING A CONSUMPTION WORKFLOW IN AZURE LOGIC APP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Here, we will be creating a consumption workflow in multi-tenant Azure Logic Apps with the Azure portal.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Steps&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Consumption logic app resource that's hosted in multi-tenant Azure Logic Apps.&lt;/li&gt;
&lt;li&gt;Select the blank logic app workflow template.&lt;/li&gt;
&lt;li&gt;Add a trigger that specifies when to run the workflow.&lt;/li&gt;
&lt;li&gt;Add an action that performs a task after the trigger fires.&lt;/li&gt;
&lt;li&gt;Run your workflow.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;An Azure account and subscription.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An email account from a service that works with Azure Logic Apps, such as Office 365 Outlook or Outlook.com.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 1 Create a Consumption logic app resource&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Sign into Azure portal using this URL &lt;code&gt;https://portal.azure.com/&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Type and select &lt;strong&gt;logic app&lt;/strong&gt; in the search bar at the top of the page.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On the Logic apps page and toolbar, select &lt;strong&gt;Add&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On the Create Logic App pane, choose your logic app resource's plan type first. That way, only the options for that plan type appear.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
Then provide &lt;strong&gt;Azure subscription name&lt;/strong&gt;, &lt;strong&gt;Resource Group&lt;/strong&gt;, &lt;strong&gt;Logic App name&lt;/strong&gt;, &lt;strong&gt;Region&lt;/strong&gt; and select &lt;strong&gt;No&lt;/strong&gt; for &lt;strong&gt;Enable log analytics&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
Click &lt;strong&gt;Review + Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;On the validation page that appears, confirm all the information that you provided, and select &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Step 2 Select the blank logic app workflow template&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;After Azure successfully deploys your logic app resource, select &lt;strong&gt;Go to resource&lt;/strong&gt;. &lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Scroll down past the video and the section named &lt;strong&gt;Start with a common trigger.&lt;/strong&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under &lt;strong&gt;Templates&lt;/strong&gt;, select &lt;strong&gt;Blank Logic App&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;In the designer, under the search box, select &lt;strong&gt;All&lt;/strong&gt;. In the search box, enter &lt;strong&gt;rss&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;In the &lt;strong&gt;trigger&lt;/strong&gt;, provide the following information:
&lt;strong&gt;The RSS feed URL&lt;/strong&gt;, &lt;strong&gt;Publish Date&lt;/strong&gt;, &lt;strong&gt;How often do you want to check for items?&lt;/strong&gt; and &lt;strong&gt;Frequency&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For this purpose of this article, we are using the Fox News Network's RSS feed bellow. &lt;br&gt;
href="&lt;a href="https://www.foxnews.com/story/foxnews-com-rss-feeds%22%3E" rel="noopener noreferrer"&gt;https://www.foxnews.com/story/foxnews-com-rss-feeds"&amp;gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Minimize the trigger.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Then save your workflow, by going to the designer toolbar and click on &lt;strong&gt;Save&lt;/strong&gt;.
This step instantly publishes your logic app workflow live in the Azure portal. However, the trigger only checks the RSS feed without taking any other actions. So, you need to add an action to specify what you want to happen when the trigger fires.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Step 3: Add an action&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Following a trigger, an &lt;strong&gt;action&lt;/strong&gt; is any subsequent step that runs some operation in the workflow. Any &lt;strong&gt;action&lt;/strong&gt; can use the &lt;strong&gt;outputs&lt;/strong&gt; from the &lt;strong&gt;previous step&lt;/strong&gt;, which can be the &lt;strong&gt;trigger&lt;/strong&gt; or another &lt;strong&gt;action&lt;/strong&gt;. You can choose from many different actions, include multiple actions up to the limit per workflow, and even create different action paths.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Under the &lt;strong&gt;When a feed item is published trigger&lt;/strong&gt;, select &lt;strong&gt;New step&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Under the Choose an operation search box, select &lt;strong&gt;All&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the search box, enter send an email. To filter the Actions list to a specific app or service, select the icon for that app or service first.&lt;br&gt;
For this exercise, we selected &lt;strong&gt;Outlook.com&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzqksx2bwu5qcmfj3ntge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzqksx2bwu5qcmfj3ntge.png" alt="Image description"&gt;&lt;/a&gt;&lt;br&gt;
You can now more easily find and select the action that you want. Here, we are selecting &lt;strong&gt;Send an email&lt;/strong&gt;.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;If your selected email service prompts you to sign in and authenticate your identity, complete that step now.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Choose an email address.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Click on the &lt;strong&gt;Accept&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;From the &lt;strong&gt;Add dynamic content list&lt;/strong&gt;, under &lt;strong&gt;When a feed item is published&lt;/strong&gt;, select &lt;em&gt;Feed title&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The feed title is a trigger output that references the title for the RSS item. Your email uses this output to show the RSS item's title.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;
In the &lt;strong&gt;dynamic content list&lt;/strong&gt;, if no outputs appear from the &lt;strong&gt;When a feed item is published trigger&lt;/strong&gt;, next to the action's header, select &lt;strong&gt;See more&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
In the Body box, enter email body content.
For this article, the body includes the following properties, descriptive text for each property. To add blank lines in an edit box, press &lt;strong&gt;Shift + Enter.&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When you're done, the email subject looks like the following.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fu7omfhgdfqnnk0u702ba.png" alt="Image description"&gt;
&lt;/h2&gt;

&lt;p&gt;Save your workflow. On the designer toolbar, select &lt;strong&gt;Save&lt;/strong&gt;.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Step 4: Run your workflow&lt;/strong&gt;&lt;br&gt;
To check that the workflow runs correctly, we can wait for the trigger to check the RSS feed based on the specified schedule. Or we can manually run the workflow from the designer toolbar.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Let us run the workflow manually.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on &lt;strong&gt;Run Trigger&lt;/strong&gt; on the tool bar menu, then select &lt;strong&gt;Run&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;If the RSS feed has new items, your workflow sends an email for each new item. Otherwise, your workflow waits until the next interval to check the RSS feed again.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A successful manual run.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Screenshot of an email from the workflow.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Step 5: Troubleshoot problems&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Check your email account's junk or spam folder, in case the message was incorrectly filtered.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure the RSS feed you're using has published items since the last scheduled or manual check.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Checking the Logic App for activity from Azure portal&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to &lt;strong&gt;Overview&lt;/strong&gt; on your logic app by clicking on it. &lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;You can also check activities on your app by clicking on &lt;strong&gt;Resource group&lt;/strong&gt; to display activities that has taken place within it.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Step 6: Clean up resources&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whenever you provisioned resources for learning purpose on any cloud platform, the best practice is to delete as soon as possible. We do this here by deleting the &lt;strong&gt;resource group&lt;/strong&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the Azure search box, enter resource groups, and select &lt;strong&gt;Resource groups&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;Find and select your logic app's resource group. On the &lt;strong&gt;Overview&lt;/strong&gt; pane, select &lt;strong&gt;Delete resource group&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;When the confirmation pane appears, enter the resource group name, and select &lt;strong&gt;Delete&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Hope this article help you understand Azure serverless services and an indept knowledge on the Logic App service.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thank you for your time. Please subscribe and follow my page for more blogs of this nature&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>azure</category>
      <category>beginners</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>A guide on how to build, deploy and operate a Function App in Azure and push the App file to a repository on GitHub.</title>
      <dc:creator>Bernard Chika Uwaezuoke</dc:creator>
      <pubDate>Thu, 13 Jul 2023 14:22:08 +0000</pubDate>
      <link>https://forem.com/donhadley22/a-guide-on-how-to-build-deploy-and-operate-a-function-app-in-azure-and-push-the-app-file-to-a-repository-on-github-1e0a</link>
      <guid>https://forem.com/donhadley22/a-guide-on-how-to-build-deploy-and-operate-a-function-app-in-azure-and-push-the-app-file-to-a-repository-on-github-1e0a</guid>
      <description>&lt;p&gt;&lt;strong&gt;This blog is expected to serve as a guide to beginners' who may be interested in learning the basics of how to build and operate a serverless applications on an end-to-end platform.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Do you wish to deliver more value to the core of your business by minimizing the time and resources you spend on infrastructure-related requirements? This may be a perfect starting point for you to learn how to use fully managed, end-to-end Azure serverless solutions to boost developer productivity, optimize resources, and accelerate the pace of innovation in your organization.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We will build and deploy on Azure a function app calculator that uses http trigger to sum-up variables x and y whose values must be integers and returns their sum.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisites&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Azure Account.&lt;/li&gt;
&lt;li&gt;Download and install Visual Studio.&lt;/li&gt;
&lt;li&gt;GitHub Account.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Roadmap&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a Function App using Azure portal.&lt;/li&gt;
&lt;li&gt;Code and build the function using Visual Studio.&lt;/li&gt;
&lt;li&gt;Push Function to Azure from Visual Studio.&lt;/li&gt;
&lt;li&gt;Test the Function App on your browser.&lt;/li&gt;
&lt;li&gt;Push the function file to GitHub and document with README.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Here we go!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: Create a Function App using Azure portal&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Login to &lt;strong&gt;Azure Portal&lt;/strong&gt; using the URL &lt;code&gt;https://portal.azure.com/&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Type and select &lt;strong&gt;Function App&lt;/strong&gt; on the search bar at the top of the page.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--f464JQJR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cgkafu2ukrd58onwjd3p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--f464JQJR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cgkafu2ukrd58onwjd3p.png" alt="Image description" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On the &lt;strong&gt;Function app&lt;/strong&gt; page, click on &lt;strong&gt;Create&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--hd6RT6Gg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7qs8t04u3wm0c9wz0vwj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--hd6RT6Gg--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7qs8t04u3wm0c9wz0vwj.png" alt="Image description" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Under &lt;strong&gt;Basic&lt;/strong&gt;, you can see &lt;strong&gt;Project details&lt;/strong&gt; enter your &lt;strong&gt;Subscription&lt;/strong&gt;, &lt;strong&gt;Resource group&lt;/strong&gt; and &lt;strong&gt;Function app name&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--xwLZx8MO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bww8tvtgrl9zp7a21yhe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--xwLZx8MO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bww8tvtgrl9zp7a21yhe.png" alt="Image description" width="800" height="289"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Moving further down the same page, select &lt;strong&gt;Code&lt;/strong&gt; as what you are deploying, chose &lt;strong&gt;.NET&lt;/strong&gt; as the &lt;strong&gt;Runtime stack&lt;/strong&gt;, select &lt;strong&gt;Version&lt;/strong&gt; and &lt;strong&gt;Region&lt;/strong&gt;. Under &lt;strong&gt;Operating System&lt;/strong&gt;, chose &lt;strong&gt;Windows&lt;/strong&gt;. Then click on &lt;strong&gt;Review + create&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Hav2RlEA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cpxgbcreg5q0gvzwugdk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Hav2RlEA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cpxgbcreg5q0gvzwugdk.png" alt="Image description" width="797" height="562"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Summary of your &lt;strong&gt;configuration&lt;/strong&gt;, click &lt;strong&gt;Create&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jyG4A4hz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/74s72inzz7sb3sysvfyb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jyG4A4hz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/74s72inzz7sb3sysvfyb.png" alt="Image description" width="723" height="580"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deployment is in progress!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--V9orMqIj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/umm420hb3ptcjjbeus3q.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--V9orMqIj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/umm420hb3ptcjjbeus3q.png" alt="Image description" width="800" height="336"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Your deployment is complete! Click on &lt;strong&gt;Go to resource&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HaLFvypu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9wgo8l7zgwebmom3zm0r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HaLFvypu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9wgo8l7zgwebmom3zm0r.png" alt="Image description" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;Overview&lt;/strong&gt; of your &lt;strong&gt;Function app&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--2Ta3S8oG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jn88h34vfeiqgcrbv9zx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--2Ta3S8oG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jn88h34vfeiqgcrbv9zx.png" alt="Image description" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Code and build the function using Visual Studio.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Open your &lt;strong&gt;Visual Studio&lt;/strong&gt; and click on &lt;strong&gt;Create a new project&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--kZENEVIz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/14wm83mzgv5brxdurpdo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--kZENEVIz--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/14wm83mzgv5brxdurpdo.png" alt="Image description" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On &lt;strong&gt;Create a new project&lt;/strong&gt; page, type Azure in the search bar and select &lt;strong&gt;Azure Functions&lt;/strong&gt; from the displayed list.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--XPksNxn5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/155o1mero9cvxj9060t5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--XPksNxn5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/155o1mero9cvxj9060t5.png" alt="Image description" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On &lt;strong&gt;Configure your new project&lt;/strong&gt; enter &lt;strong&gt;Project name&lt;/strong&gt; and the same name will appear in the &lt;strong&gt;Solution name&lt;/strong&gt;, select &lt;strong&gt;Location&lt;/strong&gt; if you wish of leave it on the default location and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7CeA7-kr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mlp07zxsnmkdvurlfbmf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7CeA7-kr--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mlp07zxsnmkdvurlfbmf.png" alt="Image description" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On &lt;strong&gt;Additional information&lt;/strong&gt;, select &lt;strong&gt;.NET 6.0&lt;/strong&gt; under &lt;strong&gt;Functions worker&lt;/strong&gt;, &lt;strong&gt;Http trigger ** under **Functions&lt;/strong&gt; and &lt;strong&gt;Authorization level&lt;/strong&gt; should be &lt;strong&gt;Function&lt;/strong&gt;. Then click   &lt;strong&gt;Create&lt;/strong&gt; button.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--p5yBPsDZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z0wh0vp187rnb0p8nk22.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--p5yBPsDZ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/z0wh0vp187rnb0p8nk22.png" alt="Image description" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The &lt;strong&gt;Code editor&lt;/strong&gt;. Here is where we edit the code function template by changing &lt;strong&gt;public static class&lt;/strong&gt; and the function name to &lt;strong&gt;Sum&lt;/strong&gt;. We leave the &lt;strong&gt;trigger&lt;/strong&gt; unchanged since it is already a Http trigger. We also leave the &lt;strong&gt;Log Information&lt;/strong&gt; and delete the others, replacing them with this lines of code
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;int x =int.Parse(req.Query["x"]);

int y =int.Parse(req.Query["y"]);

int result = x + y;

return new OkobjectResult(result);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;from line 21 - 25&lt;/strong&gt; &lt;br&gt;
We check our notifications and make sure our code is error-free. Then click on &lt;strong&gt;Build&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0rCImmcI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e3hb5a5sfa6ol5iullsh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0rCImmcI--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e3hb5a5sfa6ol5iullsh.png" alt="Image description" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building in progress!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l031WpHb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fspikoxmbumhrlb3r3h5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l031WpHb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fspikoxmbumhrlb3r3h5.png" alt="Image description" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building Completed and ready for publishing.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8IXoeLHT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7c5p9xebrgesmrnzttk5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8IXoeLHT--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7c5p9xebrgesmrnzttk5.png" alt="Image description" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Push Function to Azure from Visual Studio.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Click on &lt;strong&gt;Build&lt;/strong&gt; button at the top of the page and select &lt;strong&gt;Publish section&lt;/strong&gt; button on the displayed list.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Under &lt;strong&gt;Publish&lt;/strong&gt; &lt;strong&gt;Target&lt;/strong&gt; select &lt;strong&gt;Azure&lt;/strong&gt; and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--996_l2Yi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9p8t4vq37ddzxm6qqpue.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--996_l2Yi--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/9p8t4vq37ddzxm6qqpue.png" alt="Image description" width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On &lt;strong&gt;Specific target&lt;/strong&gt;, select &lt;strong&gt;Azure Function App (Windows)&lt;/strong&gt; and click &lt;strong&gt;Next&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8t3UGQj_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oeocgo70r76n6fkn156t.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8t3UGQj_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/oeocgo70r76n6fkn156t.png" alt="Image description" width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;On &lt;strong&gt;Select existing or create a new Azure Function&lt;/strong&gt;.
Select the &lt;strong&gt;Resource Group&lt;/strong&gt; of the Function app you created earlier in Azure portal by clicking on it. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YzrHh8Zc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7kqk70j6c87infv951oq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YzrHh8Zc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7kqk70j6c87infv951oq.png" alt="Image description" width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Then select the Azure function app that you created earlier and click on &lt;strong&gt;Finish&lt;/strong&gt; button bellow.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--tjXw9QCs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cw9xrrdluwtijee5b3z8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--tjXw9QCs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cw9xrrdluwtijee5b3z8.png" alt="Image description" width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Publish profile creation progress&lt;/strong&gt; click &lt;strong&gt;Close&lt;/strong&gt; when it is done. &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--NxGYhf_O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1pokaym42utrh4kccqge.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--NxGYhf_O--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1pokaym42utrh4kccqge.png" alt="Image description" width="800" height="561"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ready to Publish!&lt;/strong&gt; Click on &lt;strong&gt;Publish&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--S9rqeRUV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w9bj1l5frnmad9e36jnz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--S9rqeRUV--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w9bj1l5frnmad9e36jnz.png" alt="Image description" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Published Successfully&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KBsqQdH2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iekiagtvjje87zcyb6b7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KBsqQdH2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/iekiagtvjje87zcyb6b7.png" alt="Image description" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Test the Function App on your browser.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go back to the &lt;strong&gt;Azure portal&lt;/strong&gt; and click on your &lt;strong&gt;Function app&lt;/strong&gt; to open the &lt;strong&gt;Overview&lt;/strong&gt; page. Copy the URL and paste it into your browser.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WPny17yv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2b3j9uf5wml5v2midmqy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WPny17yv--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2b3j9uf5wml5v2midmqy.png" alt="Image description" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your Function App is running!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pZ9XBvKs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3bi1z6acqaxzsmqsajnm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pZ9XBvKs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3bi1z6acqaxzsmqsajnm.png" alt="Image description" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;To test the Function&lt;/strong&gt;, click on the function name &lt;strong&gt;Sum&lt;/strong&gt;  under &lt;strong&gt;Functions&lt;/strong&gt; on your function app &lt;strong&gt;Overview&lt;/strong&gt; page. This will open the &lt;strong&gt;Function&lt;/strong&gt; page. Then click on &lt;strong&gt;Get Function Url&lt;/strong&gt; and copy the displayed Url.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--N9wfRd1Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ywtof9vzewhy4rmcvunw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--N9wfRd1Q--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ywtof9vzewhy4rmcvunw.png" alt="Image description" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Paste the copied Url into your browser and provide values for the &lt;strong&gt;Function Variables x and y&lt;/strong&gt;. To provide the values, at the end of the Url in the browser, where you have this symbol &lt;strong&gt;==&lt;/strong&gt; enter the values in this format &lt;strong&gt;&amp;amp;x=500&amp;amp;y=300&lt;/strong&gt; hit &lt;strong&gt;enter&lt;/strong&gt;. This will trigger the &lt;strong&gt;Function&lt;/strong&gt; to run and return a result which is the sum of the two values we provided, in this instance, &lt;strong&gt;800&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--nTGJomsX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3k4kn9owml7w839e7fad.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--nTGJomsX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3k4kn9owml7w839e7fad.png" alt="Image description" width="800" height="417"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 5: Push the function file to GitHub and document with README.&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go back to the &lt;strong&gt;Visual Studio&lt;/strong&gt;, at the bottom extreme left of the &lt;strong&gt;Successfully published&lt;/strong&gt; page of the &lt;strong&gt;Function&lt;/strong&gt;, click on &lt;strong&gt;Select Repository&lt;/strong&gt; this will give you options, select &lt;strong&gt;Git&lt;/strong&gt; and the page bellow will be opened &lt;strong&gt;Create a Git repository&lt;/strong&gt;. Complete the page accordingly.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LNhfuTr6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wq0vxoufqthtziit0ylz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LNhfuTr6--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wq0vxoufqthtziit0ylz.png" alt="Image description" width="800" height="426"&gt;&lt;/a&gt;&lt;br&gt;
Decide to either make the repository &lt;strong&gt;Private&lt;/strong&gt; or Public by ticking accordingly as shown. Then click &lt;strong&gt;Create and Push&lt;/strong&gt; button. This will create a repository of Github and push the Function files to it.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to your Github account and view the &lt;strong&gt;repository&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--KK_sMIbk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p8t0nmri87cojqpgogry.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--KK_sMIbk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/p8t0nmri87cojqpgogry.png" alt="Image description" width="800" height="396"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Inside the repo&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--JCpesrMm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wk91fdkimihmcoocz89p.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--JCpesrMm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wk91fdkimihmcoocz89p.png" alt="Image description" width="800" height="319"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Mbjt9FCj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gjlp2a05gtx4volqcmv3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Mbjt9FCj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gjlp2a05gtx4volqcmv3.png" alt="Image description" width="800" height="611"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Click on the &lt;strong&gt;README&lt;/strong&gt; file and edit. Remember to format your README for readability, use headers and bullet points, and include any relevant code snippets or screenshots to make it easier for users to follow along and understand your Azure serverless application.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The &lt;strong&gt;README&lt;/strong&gt; documentation of our application.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--myLSzwt---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dkosqy5e6fo0f6f7we2w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--myLSzwt---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dkosqy5e6fo0f6f7we2w.png" alt="Image description" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--eH6PVEa3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nzuvoachxdytv7saetto.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--eH6PVEa3--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nzuvoachxdytv7saetto.png" alt="Image description" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--AyHC9fm5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/750pfa21d51qotah9jbz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--AyHC9fm5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/750pfa21d51qotah9jbz.png" alt="Image description" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--0uDNfazO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1psjy4nanxpj92mm5o0f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--0uDNfazO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1psjy4nanxpj92mm5o0f.png" alt="Image description" width="800" height="408"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Q4cVz7f5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0nfzh79h27nor5rkd90d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Q4cVz7f5--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/0nfzh79h27nor5rkd90d.png" alt="Image description" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Thank you for reading!&lt;/strong&gt;&lt;/p&gt;

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