<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Busa Ayim-Odu</title>
    <description>The latest articles on DEV Community by Busa Ayim-Odu (@busa).</description>
    <link>https://dev.to/busa</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%2F2065361%2Fc7f8ce98-f1ac-4ed7-8265-acd6a8d6183d.jpg</url>
      <title>DEV Community: Busa Ayim-Odu</title>
      <link>https://dev.to/busa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/busa"/>
    <language>en</language>
    <item>
      <title>Deploying a Scalable, Secure Web App on AWS with Full CI/CD &amp; Observability Part 1</title>
      <dc:creator>Busa Ayim-Odu</dc:creator>
      <pubDate>Tue, 24 Jun 2025 08:56:42 +0000</pubDate>
      <link>https://dev.to/busa/deploying-a-scalable-secure-web-app-on-aws-with-full-cicd-observability-part-1-1fh2</link>
      <guid>https://dev.to/busa/deploying-a-scalable-secure-web-app-on-aws-with-full-cicd-observability-part-1-1fh2</guid>
      <description>&lt;h2&gt;
  
  
  Project Goal (Why It Matters to a Business):
&lt;/h2&gt;

&lt;p&gt;Use AWS, GitHub Actions, Docker, and Terraform to create a scalable, production grade web application that demonstrates how DevOps enhances user experience, security, cost effectiveness, and deployment speed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project Setup:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Frontend and backend clones and Dockerization&lt;/li&gt;
&lt;li&gt;Create AWS infrastructure (EC2, ECR, IAM) using Terraform.&lt;/li&gt;
&lt;li&gt;Move the application from CI/CD to EC2.&lt;/li&gt;
&lt;li&gt;Use GitHub Actions to set up a CI/CD pipeline.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Establish cost controls and logging.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Step 1&lt;br&gt;
&lt;strong&gt;Clone the Repo &amp;amp; Open in VS Code&lt;/strong&gt;&lt;br&gt;
Run this command:&lt;br&gt;
cd ~&lt;br&gt;
git clone &lt;a href="https://gitlab.com/cloud-devops-assignments/spring-boot-react-example.git" rel="noopener noreferrer"&gt;https://gitlab.com/cloud-devops-assignments/spring-boot-react-example.git&lt;/a&gt;&lt;br&gt;
cd spring-boot-react-example&lt;br&gt;
code .&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%2Fjjvzd94372fww3jlqluy.jpeg" 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%2Fjjvzd94372fww3jlqluy.jpeg" alt="Vs code" width="448" height="434"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Step 2&lt;br&gt;
&lt;strong&gt;I will create the backend and frontend directories now.&lt;/strong&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%2Famidildiown0jl4zd9am.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%2Famidildiown0jl4zd9am.png" alt="Vs code2" width="670" height="612"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Step 3&lt;br&gt;
I’ll be organizing the project by placing each file and directory into the appropriate backend or frontend folder. Additionally, I’ll create separate Dockerfiles for both the backend and frontend to ensure each part of the application can be containerized effectively.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I accidentally deleted the backend folder while organizing files and setting up the Dockerfile. Thankfully, I hadn’t committed the changes yet, so I can either recover it or start fresh. In this case, I’ve decided to start over by deleting the spring-boot-react-example folder and re-cloning the project. Just close VS Code, open Git Bash, and run the commands shown in the image below.&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%2Ft45rhp4wjgj08wq2tksr.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%2Ft45rhp4wjgj08wq2tksr.png" alt="error" width="800" height="322"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now I’ll go ahead and manually open the project folder in VS Code and follow the initial setup steps:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;File → Open Folder → spring-boot-react-example
&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%2Flv9d9a29y9u3pg6mntzr.png" alt="VS Code" width="344" height="710"&gt;
Everything is now set up. Just a heads-up, you might run into a few errors as you go, and some may require you to create extra files. Don’t worry, I’ll walk you through what each file does, why it’s needed, and how it fits into the project.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;-Step 4&lt;br&gt;
Remember I created the dockerfiles for both the backend and frontend. And also the docker compose yaml file as well as shown below.&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%2Fq8emewrlso3ap7lnh7at.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%2Fq8emewrlso3ap7lnh7at.png" alt="Backend" width="800" height="497"&gt;&lt;/a&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%2Fc4ddw9ue8jc6ugzbxtfz.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%2Fc4ddw9ue8jc6ugzbxtfz.png" alt="Frontend" width="800" height="268"&gt;&lt;/a&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%2Fsylpsx6cl23zc4havmi0.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%2Fsylpsx6cl23zc4havmi0.png" alt="docker compose" width="800" height="624"&gt;&lt;/a&gt;&lt;br&gt;
While everything is being set up, Make sure your &lt;strong&gt;Docker Desktop&lt;/strong&gt; is running.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Step 5:
Run these commands docker-compose build frontend 
docker-compose up 
&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%2Fpxsbdqjkettalr6vd0g7.png" alt="Docker frontend" width="800" height="518"&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%2Fg0hgm6olnkqr9upi1nms.png" alt="Success" width="800" height="393"&gt;
Oops! We got an error while running: Docker-compose up.
&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%2Fzcl72b00hlcjlb8silqh.png" alt="Error" width="800" height="426"&gt;
The Reason Why This Occurs:&lt;/li&gt;
&lt;li&gt;My backend and the frontend maven-plugin is used by the Spring Boot application, which automatically:&lt;/li&gt;
&lt;li&gt;Node.js + npm is downloaded within the Docker container.&lt;/li&gt;
&lt;li&gt;The React frontend is then attempted to be built as part of the MVC clean package procedure.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;However, the npm.tar.gz file is either corrupted or incomplete (most likely as a result of Docker's sluggish or unreliable network).&lt;/p&gt;

&lt;p&gt;What should we do?&lt;br&gt;
Build the frontend manually (before backend build).&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%2Fmsgvsit68vf5m9evbdmj.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%2Fmsgvsit68vf5m9evbdmj.png" alt="Frontend" width="800" height="722"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now for backend build commands: &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%2Fofxrbae374msrxkx4ppu.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%2Fofxrbae374msrxkx4ppu.png" alt="Backend error" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
Oops! We ran into another error. This one’s related to Node.js being run inside Maven it doesn’t allow the --openssl-legacy-provider flag, which causes the build to fail. Since the frontend is now decoupled and handled separately, I removed all the frontend related plugin blocks from the pom.xml, keeping only the necessary configurations for the Spring Boot backend. This helps streamline the build and avoid unnecessary errors. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Step 6&lt;br&gt;
Run this command: docker-compose build&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%2Fann0h5temoz7j6qijeky.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%2Fann0h5temoz7j6qijeky.png" alt="both" width="758" height="673"&gt;&lt;/a&gt;&lt;br&gt;
Both Frontend and Backend are built successfully.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Step 7&lt;br&gt;
Run this command: docker-compose up&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%2F9s40m3wdzxqi7f97mdip.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%2F9s40m3wdzxqi7f97mdip.png" alt="Error Port" width="757" height="675"&gt;&lt;/a&gt;&lt;br&gt;
This is an error port, Port 8080 on my host machine is already in use. We need to free up port 8080.&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%2Fz848qmkrbizor8b9ny46.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%2Fz848qmkrbizor8b9ny46.png" alt="porter" width="740" height="410"&gt;&lt;/a&gt;&lt;br&gt;
What this means is the frontend is working fine but the backend containing is not running. Most like because Docker couldn't bind port 8080, which is probably already used by something else on your system.&lt;br&gt;
Check What's Using Port 8080 (on Windows)&lt;br&gt;
Open PowerShell or CMD and run:&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%2Fw2qe56g56m3cxmqkyn46.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%2Fw2qe56g56m3cxmqkyn46.png" alt="netstat" width="800" height="59"&gt;&lt;/a&gt;&lt;br&gt;
That last number is the PID (process ID) using the port.&lt;br&gt;
Now find the program:&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%2Fv7e6pw7knl8xzf65um8w.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%2Fv7e6pw7knl8xzf65um8w.png" alt="Found it" width="728" height="211"&gt;&lt;/a&gt;&lt;br&gt;
Then force stop it (if safe):&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%2Fuy9u52ej35bpo6b3on0g.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%2Fuy9u52ej35bpo6b3on0g.png" alt="Kill" width="800" height="58"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Step 8&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%2Fjvt14bk166ogy0iunhh9.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%2Fjvt14bk166ogy0iunhh9.png" alt="Compose" width="800" height="980"&gt;&lt;/a&gt;&lt;br&gt;
Both the frontend and backend are working.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Access the Backend&lt;br&gt;
Open your browser and go to: &lt;a href="http://localhost:8080/login" rel="noopener noreferrer"&gt;http://localhost:8080/login&lt;/a&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%2Fs7wdaoqx9hits1i4h87i.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%2Fs7wdaoqx9hits1i4h87i.png" alt="Spring" width="800" height="695"&gt;&lt;/a&gt;&lt;br&gt;
A Spring Boot welcome Login page&lt;/p&gt;

&lt;p&gt;Access the Frontend&lt;br&gt;
Since your frontend container maps port 3000 → 80, open:&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%2F4evw93lhx0yh12x4fz1i.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%2F4evw93lhx0yh12x4fz1i.png" alt="Nginx" width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connect frontend to backend by adding a proxy in frontend/package.json: proxy: &lt;a href="http://backend:8080" rel="noopener noreferrer"&gt;http://backend:8080&lt;/a&gt;&lt;br&gt;
This works inside Docker Compose if the service name is backend.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Final Step:
&lt;strong&gt;Push the Docker Images to Docker Hub&lt;/strong&gt;
First, you’ll need the Docker images, which contain all the necessary components. You can see the details in the image provided:
&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%2F0xduh0ihox4my877vmhk.png" alt="docker images" width="800" height="476"&gt;
&lt;/li&gt;
&lt;li&gt;Next you are ready to push to dockerhub so everyone can see your repo.
&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%2Fxmdp52gwjxa4iykklco5.png" alt="docker tag" width="800" height="620"&gt; 
Repeat the same command for the backend as well.
&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%2F0lk43mfs97huwhcl66dn.png" alt="Backend" width="800" height="483"&gt;
Proceed to your dockerhub where you are logged in and check the images are in your repo.
&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%2Fhixk193f93pt95jz4r5u.png" alt="Excellent" width="800" height="305"&gt;
Great job! This is a big step.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Next we will &lt;strong&gt;Deploy to the Cloud (AWS ECS or EC2)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stick around more to come in the next update!.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Summary:&lt;br&gt;
I started by cloning a Spring Boot + React project and restructuring it into frontend/ and backend/ directories.  I made docker-compose.yml to run the entire application locally and wrote unique Dockerfiles for both, optimizing them with multi-stage builds. I encountered usual DevOps challenges along the road, such as permission failures, out-of-date Babel settings, JSX build problems, and missing dependencies. I resolved each of them by adjusting configuration files, upgrading dependencies, and clearing out Maven plugins. I tagged and submitted the images (busadev/react-frontend and busadev/react-backend) to my Docker Hub once both services were operating without a hitch in Docker.  I learned a lot about debugging, improved my containerization skills, and gained practical experience in organizing a DevOps process thanks to this project.  It's a modest but significant step in the direction of developing cloud-deployable, production-ready apps.&lt;/p&gt;

</description>
      <category>webapp</category>
      <category>docker</category>
      <category>vscode</category>
      <category>devops</category>
    </item>
    <item>
      <title>My First OpenStack Project: Deploying a VM with MicroStack on Ubuntu</title>
      <dc:creator>Busa Ayim-Odu</dc:creator>
      <pubDate>Wed, 11 Jun 2025 08:19:10 +0000</pubDate>
      <link>https://dev.to/busa/my-first-openstack-project-deploying-a-vm-with-microstack-on-ubuntu-2c7b</link>
      <guid>https://dev.to/busa/my-first-openstack-project-deploying-a-vm-with-microstack-on-ubuntu-2c7b</guid>
      <description>&lt;p&gt;As part of my hands-on cloud journey, I recently tackled the challenge of setting up OpenStack using MicroStack on a local Ubuntu VM running in VMware. This project helped sharpen my troubleshooting skills and gave me deeper insights into how OpenStack operates in a constrained, local environment.&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Goal
&lt;/h2&gt;

&lt;p&gt;To install and configure OpenStack (MicroStack) on Ubuntu using Snap and successfully launch a virtual machine instance from the OpenStack dashboard or CLI.&lt;/p&gt;

&lt;p&gt;Before we begin, ensure you have the following:&lt;/p&gt;

&lt;p&gt;A machine running Ubuntu 20.04 or later: This can be a physical machine, a virtual machine, or a cloud instance with at least 8 GB of RAM and 50 GB of disk space.&lt;/p&gt;

&lt;p&gt;Basic knowledge of Linux command-line operations: Familiarity with terminal commands will be beneficial.&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%2F4sh81uay87mg8dvo95ml.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%2F4sh81uay87mg8dvo95ml.png" alt="ubuntu1" width="800" height="468"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step1. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install OpenStack using MicroStack&lt;/li&gt;
&lt;li&gt;Update your system: sudo apt update &amp;amp;&amp;amp; sudo apt upgrade -y
&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%2Fjbvhrb8qjdshh14g7evk.png" alt="Ubuntu2" width="800" height="366"&gt;
&lt;/li&gt;
&lt;li&gt;Install MicroStack: sudo snap install microstack --classic&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Oop! Microstack --classic is not available but --edge is available &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Run the command: sudo snap installmicrostack --classic --edge&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%2Fpeq81bbsearcbqht0htt.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%2Fpeq81bbsearcbqht0htt.png" alt="Ubuntu2" width="800" height="201"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Initialize MicroStack: sudo microstack init --auto&lt;br&gt;
This command sets up a single-node OpenStack deployment with default configurations.&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%2Frj2mb040us8i928q8tid.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%2Frj2mb040us8i928q8tid.png" alt="Ubuntu3" width="800" height="179"&gt;&lt;/a&gt;&lt;br&gt;
The error you're seeing means that when using --auto, MicroStack requires you to specify a role: either --compute or --control.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You need to rerun the command and specify a role. If this is the first and only node (single-node setup), choose --control:&lt;br&gt;
sudo microstack init --auto --control&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%2Fa0yr0wuq7o6i75j4ql4c.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%2Fa0yr0wuq7o6i75j4ql4c.png" alt="Ubuntu4" width="800" height="267"&gt;&lt;/a&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%2Flfo8ltdn716r9p0aak74.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%2Flfo8ltdn716r9p0aak74.png" alt="Ubuntu5" width="800" height="261"&gt;&lt;/a&gt;&lt;br&gt;
Yes, running the command: sudo microstack init --auto --control&lt;br&gt;
will set up your Ubuntu VM as a single-node control plane. This setup includes the OpenStack dashboard (Horizon), the API endpoints, and compute capabilities — perfect for testing or learning.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Next we run this command: microstack.openstack endpoint list
Purpose: Shows all the service endpoints (internal, public, admin URLs) for OpenStack services.
&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%2Fk82d8hw3r3bexcwv2i6q.png" alt="Ubuntu6" width="800" height="281"&gt;
It looks for any dashboard or horizon related entries (usually under the public URL section).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Access the OpenStack Dashboard&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Retrieve the dashboard URL: sudo microstack.openstack dashboard url
Oop! I got this error.
&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%2Fwuro9yzqlh00ctczoxs7.png" alt="Ubuntu7" width="800" height="131"&gt;
openstack dashboard url is not a valid &lt;strong&gt;OpenStack CLI&lt;/strong&gt; command.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Here’s What To Do Instead (No CLI Needed for Dashboard URL):&lt;/strong&gt;&lt;br&gt;
To access the Horizon Dashboard for MicroStack:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Get Your Ubuntu VM IP Address&lt;/li&gt;
&lt;li&gt;Run this in your Ubuntu terminal:ip a
&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%2F9mxs275hm4hzxnue5vxx.png" alt="Ubuntu8" width="800" height="309"&gt;
I am looking for this information: inet 192.168.129.128
This ip 192.168.129.128 is the IP needed to access the dashboard via the browser.&lt;/li&gt;
&lt;li&gt;Visit the Dashboard in a Browser&lt;/li&gt;
&lt;li&gt;On your host machine (e.g., Windows or Mac), open a browser and go to: &lt;a href="https://192.168.129.128" rel="noopener noreferrer"&gt;https://192.168.129.128&lt;/a&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%2F6oymdsna78l8e3cdwk2y.png" alt="IP" width="800" height="361"&gt;
&lt;/li&gt;
&lt;li&gt;You Might See a Security Warning. That’s okay — the dashboard uses a self-signed certificate.&lt;/li&gt;
&lt;li&gt;Click:Advanced → Proceed (unsafe)
&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%2Frk56hpj4nm9nuqyckrvb.png" alt="Openstack" width="800" height="432"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Get the Admin Password&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In your terminal, run: sudo snap get microstack config.credentials.password
&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%2Fzbf8qoce121wa4yszf8b.png" alt="Ubuntu" width="800" height="54"&gt;
That error means the password isn’t stored under config.credentials.password, which sometimes happens with newer MicroStack versions or if initialization didn’t complete fully.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Lets Try This Instead to Get the Admin Login Credentials:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run this command: sudo cat /var/snap/microstack/common/etc/microstack.rc
&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%2Fdrqv9mshxbizjln1h9dr.png" alt="Ubuntu10" width="800" height="209"&gt;
This file often contains the exported environment variables including the username, password, project name, and OpenStack endpoint.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's try accessing the &lt;strong&gt;Horizon Dashboard&lt;/strong&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%2Fn4ten6brfi39sph4o055.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%2Fn4ten6brfi39sph4o055.png" alt="Ubuntu11" width="800" height="480"&gt;&lt;/a&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%2Fuv0iiffz5lwwpx1dsdn1.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%2Fuv0iiffz5lwwpx1dsdn1.png" alt="Ubuntu12" width="800" height="338"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Logged in with:&lt;/strong&gt; Username:admin &amp;amp; Password: from microstack.rc&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Bonus Tip (Make It Easy to Load Credentials in Terminal)&lt;/strong&gt;&lt;br&gt;
To use OpenStack CLI later, you can load the credentials with:&lt;br&gt;
source /var/snap/microstack/common/etc/microstack.rc&lt;/p&gt;

&lt;h2&gt;
  
  
  Set up a private cloud using MicroStack, launch an instance, and document access via floating IPs and Horizon dashboard.
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Step 1: Create a Key Pair (for SSH Access to VMs)&lt;/li&gt;
&lt;li&gt;Go to: Project &amp;gt; Compute &amp;gt; Key Pairs
&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%2F9gcxryky46ezr0o0slye.png" alt="Ubuntu13" width="800" height="277"&gt;
&lt;/li&gt;
&lt;li&gt;Click Create Key Pair&lt;/li&gt;
&lt;li&gt;Give it a name e.g busa-key
&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%2Fshcfaomt305umij6e7v7.png" alt="Ubuntu14" width="800" height="248"&gt;
&lt;/li&gt;
&lt;li&gt;Save the private key (.pem file) to your host machine
&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%2Foz8ug0gedl0fltzxxb70.png" alt="Ubuntu15" width="800" height="308"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Step 2: Upload an Image&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go to: Project &amp;gt; Compute &amp;gt; Images&lt;/li&gt;
&lt;/ul&gt;

&lt;ol&gt;
&lt;li&gt;Click Create Image
&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%2F0cgiiq7smwmgwmukzojp.png" alt="Ubuntu16" width="800" height="222"&gt;
Fill in:&lt;/li&gt;
&lt;li&gt;Name: ubuntu-22.04&lt;/li&gt;
&lt;li&gt;Image Source: URL or file&lt;/li&gt;
&lt;li&gt;Format: QCOW2&lt;/li&gt;
&lt;li&gt;You can use Ubuntu Cloud Image: 
&lt;a href="https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img" rel="noopener noreferrer"&gt;https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Open a browser in the Ubuntu VM, copy and paste the link above and download the Ubuntu image.&lt;/li&gt;
&lt;li&gt;Alternatively, Download the Ubuntu Cloud Image.
Open your terminal and run: wget &lt;a href="https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img" rel="noopener noreferrer"&gt;https://cloud-images.ubuntu.com/jammy/current/jammy-server-cloudimg-amd64.img&lt;/a&gt; -O ubuntu-22.04.img
&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%2Fs1x5ftu3hc9zb3rkp3wp.png" alt="Ubuntu18" width="800" height="307"&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Upload the Image to OpenStack (MicroStack)&lt;br&gt;
Now, upload it using the microstack.openstack CLI:&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%2Fuztwigd92q8p2s0xbi11.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%2Fuztwigd92q8p2s0xbi11.png" alt="ubuntu19" width="800" height="345"&gt;&lt;/a&gt;&lt;br&gt;
My image Ubuntu-22.04 has been successfully created and registered in OpenStack. The status is active, which means it's ready to be used.&lt;/p&gt;

&lt;p&gt;Let's find out if it is listed. &lt;br&gt;
Run this command: microstack.openstack image list&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%2Fp5h7hrs2x9d3mscmu4ld.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%2Fp5h7hrs2x9d3mscmu4ld.png" alt="Ubuntu20" width="800" height="163"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Yes, it is listed and as seen below in the image.
&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%2Fdfcys912l3hsw83fak5h.png" alt="Ubuntu21" width="800" height="334"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Next I am going to Launch an Instance
&lt;/h2&gt;

&lt;p&gt;I can launch on the dashboard&lt;br&gt;
&lt;strong&gt;Fill the Launch Instance Form&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instance Name: my-first-vm&lt;/li&gt;
&lt;li&gt;Count: 1&lt;/li&gt;
&lt;li&gt;Availability Zone: nova&lt;/li&gt;
&lt;li&gt;Instance Boot Source: Choose Image&lt;/li&gt;
&lt;li&gt;Image Name: Select Ubuntu-22.04&lt;/li&gt;
&lt;li&gt;Flavor: Choose m1.small &lt;/li&gt;
&lt;li&gt;Select a network, usually called external.&lt;/li&gt;
&lt;li&gt;Select a keypair to access your VM via SSH.&lt;/li&gt;
&lt;li&gt;Click &lt;strong&gt;“Launch Instance"&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Or use the terminal, it will get the same result. Run this command:&lt;br&gt;
microstack.openstack server create \&lt;br&gt;
  --flavor m1.small \&lt;br&gt;
  --image "Ubuntu-22.04" \&lt;br&gt;
  --network external \&lt;br&gt;
  --key-name microstack \&lt;br&gt;
  my-first-instance&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%2F62y1irhm80sjbbfz1zux.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%2F62y1irhm80sjbbfz1zux.png" alt="ubuntu23" width="800" height="142"&gt;&lt;/a&gt;&lt;br&gt;
I ran into an error because I didn't add my key-pair busa-key.pem. This is the correct command:&lt;br&gt;
microstack.openstack server create \&lt;br&gt;
  --flavor m1.small \&lt;br&gt;
  --image "Ubuntu-22.04" \&lt;br&gt;
  --network external \&lt;br&gt;
  --key-name busa-key \&lt;br&gt;
  my-first-instance&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%2Fdy0mv5dj2456vptbcxme.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%2Fdy0mv5dj2456vptbcxme.png" alt="ubuntu 22" width="800" height="308"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Project Summary: MicroStack/OpenStack VM Deployment on Ubuntu
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Objective&lt;/strong&gt;&lt;br&gt;
To install and configure OpenStack &lt;strong&gt;(MicroStack)&lt;/strong&gt; on Ubuntu using Snap, and successfully launch a virtual machine (VM) instance.&lt;/p&gt;

&lt;p&gt;Challenges Encountered:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Problem-&amp;gt;Network connection failed = Cause -&amp;gt; Missing DHCP and DNS = Solution -&amp;gt; Edited netplan, restarted services, added resolv.conf&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Problem -&amp;gt; Snap install errors = Cause -&amp;gt; Caused by name resolution = Solution -&amp;gt; Resolved after fixing DNS&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;What I Learned:&lt;br&gt;
This project was more than just launching a VM. I gained:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Practical knowledge of Linux networking and netplan&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;How to debug low-level connectivity issues inside VMs&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Experience installing OpenStack via Snap using MicroStack&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Confidence to work through real-world DevOps roadblocks&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;What's Next?&lt;/strong&gt;&lt;br&gt;
Now that the instance is live, I plan to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Configure floating IPs to access VMs externally&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Automate more of the setup process using scripts&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write a follow-up blog on launching applications inside the OpenStack VM&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;br&gt;
This hands-on challenge pushed me to solve real infrastructure issues—just like in production environments. If you're starting out in cloud engineering or DevOps, I highly recommend trying this locally before jumping into full OpenStack deployments in the cloud.&lt;/p&gt;

&lt;p&gt;Let me know if you’ve faced similar challenges or want to try this yourself!&lt;/p&gt;

&lt;p&gt;🧑‍💻 #OpenStack #MicroStack #Ubuntu #CloudComputing #DevOps #Linux #VMware #HandsOnCloud #BeginnersJourney&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>ubuntu</category>
      <category>devops</category>
      <category>learning</category>
    </item>
    <item>
      <title>Build a Weather Info API Gateway with AWS Lambda &amp; Open Weather Map</title>
      <dc:creator>Busa Ayim-Odu</dc:creator>
      <pubDate>Wed, 04 Jun 2025 10:50:47 +0000</pubDate>
      <link>https://dev.to/busa/build-a-weather-info-api-gateway-with-aws-lambda-open-weather-map-5dd1</link>
      <guid>https://dev.to/busa/build-a-weather-info-api-gateway-with-aws-lambda-open-weather-map-5dd1</guid>
      <description>&lt;p&gt;&lt;strong&gt;Overview:&lt;/strong&gt;&lt;br&gt;
Create a simple API that returns current weather information for a given city using AWS Lambda, API Gateway, and &lt;strong&gt;OpenWeatherMap&lt;/strong&gt; API.&lt;/p&gt;

&lt;p&gt;An &lt;strong&gt;API (Application Programming Interface)&lt;/strong&gt; is a set of rules that allows two software applications to communicate with each other.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tools &amp;amp; Skills Involved:&lt;/strong&gt;&lt;br&gt;
AWS Lambda (Python runtime)&lt;/p&gt;

&lt;p&gt;Amazon API Gateway&lt;/p&gt;

&lt;p&gt;IAM Roles &amp;amp; Permissions&lt;/p&gt;

&lt;p&gt;OpenWeatherMap API (free tier)&lt;/p&gt;

&lt;p&gt;Python (requests library)&lt;/p&gt;

&lt;p&gt;Postman or browser for testing&lt;/p&gt;

&lt;p&gt;Powershell&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1:&lt;/strong&gt; Sign Up for &lt;strong&gt;OpenWeatherMap&lt;/strong&gt;&lt;br&gt;
Go to &lt;a href="https://openweathermap.org/api" rel="noopener noreferrer"&gt;https://openweathermap.org/api&lt;/a&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%2Fo289x8ioiqm6da8vqnpp.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%2Fo289x8ioiqm6da8vqnpp.png" alt="API" width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Sign up and get your free &lt;strong&gt;API&lt;/strong&gt; key.&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%2Fzq5hu3e9cnnoimfkoqjj.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%2Fzq5hu3e9cnnoimfkoqjj.png" alt="ap2" width="800" height="598"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2:&lt;/strong&gt; Create Your Lambda Function&lt;br&gt;
Go to AWS Console &amp;gt; Lambda &amp;gt; Create Function.&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%2F0og4ttovhcrbrizpvuua.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%2F0og4ttovhcrbrizpvuua.png" alt="Api3" width="800" height="236"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose:&lt;/strong&gt; “Author from scratch”&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Runtime:&lt;/strong&gt; Python 3.x&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Name:&lt;/strong&gt; weather-api-lambda&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Click&lt;/strong&gt; create&lt;/p&gt;

&lt;p&gt;Step 3: Add Your Lambda Code&lt;br&gt;
code:&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%2Fm5hh41hqxu721zl2wvdz.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%2Fm5hh41hqxu721zl2wvdz.png" alt="API4" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4:&lt;/strong&gt; Add &lt;strong&gt;Environment Variable&lt;/strong&gt;&lt;br&gt;
Go to your &lt;strong&gt;AWS&lt;/strong&gt; Lambda function.&lt;/p&gt;

&lt;p&gt;Scroll down to &lt;strong&gt;Environment&lt;/strong&gt; variables.&lt;/p&gt;

&lt;p&gt;Click Edit, then Add environment variable:&lt;/p&gt;

&lt;p&gt;Key: &lt;strong&gt;WEATHER_API_KEY&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Value: (Your API key from &lt;strong&gt;OpenWeatherMap&lt;/strong&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%2F6dk3m26mm06y98nmgd9c.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%2F6dk3m26mm06y98nmgd9c.png" alt="API5" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 5: Add Permissions for Internet Access&lt;br&gt;
Attach an execution role with AWSLambdaBasicExecutionRole&lt;/p&gt;

&lt;p&gt;Ensure Lambda is in a VPC that allows internet access (or no VPC for easier setup).&lt;br&gt;
Check if Your Lambda Is in a VPC&lt;br&gt;
Go to the Lambda Console&lt;/p&gt;

&lt;p&gt;Open your function&lt;/p&gt;

&lt;p&gt;Scroll to the "Configuration" &amp;gt; "VPC" section&lt;/p&gt;

&lt;p&gt;If it says "Not attached to any VPC", your Lambda already has internet access&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%2F7la903xail4f6b3iqlr3.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%2F7la903xail4f6b3iqlr3.png" alt="API6" width="800" height="259"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 6: Create API Gateway&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%2Fuycrgbpai7w6l400htxi.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%2Fuycrgbpai7w6l400htxi.png" alt="Api7" width="800" height="257"&gt;&lt;/a&gt;&lt;br&gt;
Go to API Gateway &amp;gt; Create API &amp;gt; HTTP API &amp;gt; &lt;strong&gt;Click Build&lt;/strong&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%2Fy12ss0d30nzkbwxeet0s.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%2Fy12ss0d30nzkbwxeet0s.png" alt="API8" width="800" height="198"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose integration → Select &lt;strong&gt;Lambda&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Select your &lt;strong&gt;Lambda&lt;/strong&gt; function from the dropdown&lt;/p&gt;

&lt;p&gt;Click &lt;strong&gt;Next&lt;/strong&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%2F20opvwz3artbt0w0xk57.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%2F20opvwz3artbt0w0xk57.png" alt="API9" width="800" height="449"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Method: GET&lt;/p&gt;

&lt;p&gt;Resource path: /weather&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%2Fbiz9zvi5ly12apn6es49.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%2Fbiz9zvi5ly12apn6es49.png" alt="API10" width="800" height="224"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create a stage name — e.g., APIweather&lt;/p&gt;

&lt;p&gt;Click Next, then Create&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%2Fe539eftp9u5224e5svkk.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%2Fe539eftp9u5224e5svkk.png" alt="API 11" width="800" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 7: Deploy &amp;amp; Test&lt;br&gt;
Deploy the API&lt;/p&gt;

&lt;p&gt;Test your endpoint with:&lt;br&gt;
&lt;a href="https://olxheqwg4c.execute-api.us-west-2.amazonaws.com/" rel="noopener noreferrer"&gt;https://olxheqwg4c.execute-api.us-west-2.amazonaws.com/&lt;/a&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%2Femq1z1njkr0xn39i1olo.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%2Femq1z1njkr0xn39i1olo.png" alt="api12" width="800" height="224"&gt;&lt;/a&gt;&lt;br&gt;
I tested the endpoint URl and got this.&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%2Fsbrv5a28cdjrita4lypk.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%2Fsbrv5a28cdjrita4lypk.png" alt="api13" width="800" height="181"&gt;&lt;/a&gt;&lt;br&gt;
That is my base endpoint, but it doesn't tell us which route or resource path is configured. That’s why you’re getting:&lt;br&gt;
{"message":"Not Found"}&lt;br&gt;
Lets fix this error.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check Your Lambda Integration Path:&lt;/strong&gt;&lt;br&gt;
If it's an HTTP API:&lt;br&gt;
Click Routes&lt;br&gt;
You’ll see something like: ANY /weather or GET /&lt;br&gt;
Note the full path (e.g., /weather)&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%2F924lwc2vb4k0yofqcx40.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%2F924lwc2vb4k0yofqcx40.png" alt="api15" width="800" height="657"&gt;&lt;/a&gt;&lt;br&gt;
I found the error and the correct path which includes a stage name, but it's not working without it, here's exactly how to fix and use the full correct URL:&lt;br&gt;
Breakdown of Your Components&lt;br&gt;
Base endpoint: &lt;a href="https://olxheqwg4c.execute-api.us-west-2.amazonaws.com" rel="noopener noreferrer"&gt;https://olxheqwg4c.execute-api.us-west-2.amazonaws.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stage name:&lt;/strong&gt; APIweather&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Route/Path:&lt;/strong&gt; /weather-api-lambda&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query string:&lt;/strong&gt; ?city=Lagos&lt;/p&gt;

&lt;p&gt;This is the correct URL PATH:&lt;br&gt;
&lt;a href="https://olxheqwg4c.execute-api.us-west-2.amazonaws.com/APIweather/weather-api-lambda?city=Lagos" rel="noopener noreferrer"&gt;https://olxheqwg4c.execute-api.us-west-2.amazonaws.com/APIweather/weather-api-lambda?city=Lagos&lt;/a&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%2F5r3amesu52ypokwrkx41.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%2F5r3amesu52ypokwrkx41.png" alt="API16" width="800" height="96"&gt;&lt;/a&gt;&lt;br&gt;
My API Gateway is correctly connected to your Lambda function,&lt;br&gt;
But my Lambda function isn't running the weather fetching logic yet — it's still using the default "Hello from Lambda!" response.&lt;/p&gt;

&lt;p&gt;I need to replace the "Hello from Lambda!" code in your function with the weather-fetching logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open PowerShell&lt;/strong&gt;&lt;br&gt;
Press Windows + R, type powershell, and hit Enter.&lt;/p&gt;

&lt;p&gt;Create the project folder on your local computer/desktop&lt;br&gt;
mkdir lambda-weather&lt;br&gt;
cd lambda-weather&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%2Fmbcc7b7i0hg6ikcfnedg.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%2Fmbcc7b7i0hg6ikcfnedg.png" alt="Api17" width="800" height="25"&gt;&lt;/a&gt;&lt;br&gt;
Create the Python file&lt;br&gt;
&lt;strong&gt;In the same terminal:&lt;/strong&gt; notepad lambda_function.py&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%2F9vemx40v7zbvge1q63bp.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%2F9vemx40v7zbvge1q63bp.png" alt="api18" width="800" height="340"&gt;&lt;/a&gt;&lt;br&gt;
Here is the lambda code scripted inside&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%2F6lmjunzhf5q8soc6kyl3.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%2F6lmjunzhf5q8soc6kyl3.png" alt="api19" width="800" height="423"&gt;&lt;/a&gt;&lt;br&gt;
Save and close the notepad.&lt;br&gt;
Install the requests package locally&lt;br&gt;
In the same PowerShell window: pip install requests -t .&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%2F2rsowqmiaq0rpq5giti1.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%2F2rsowqmiaq0rpq5giti1.png" alt="api" width="800" height="340"&gt;&lt;/a&gt;&lt;br&gt;
Zip everything&lt;br&gt;
Still inside the lambda-weather folder: Compress-Archive -Path * -DestinationPath lambda-weather.zip&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%2F87ucm1ujg3ix5q4jutdd.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%2F87ucm1ujg3ix5q4jutdd.png" alt="api20" width="800" height="102"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Upload to Lambda&lt;/strong&gt;&lt;br&gt;
Go to &lt;strong&gt;AWS Lambda&lt;/strong&gt; console.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose&lt;/strong&gt; your function.&lt;/p&gt;

&lt;p&gt;Click Upload from → &lt;strong&gt;.zip file&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Select &lt;strong&gt;lambda-weather.zip&lt;/strong&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%2F2qaagetnyncg1bpqka9h.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%2F2qaagetnyncg1bpqka9h.png" alt="API21" width="800" height="326"&gt;&lt;/a&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%2Fdt9oowb9z7bs1d2fwro7.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%2Fdt9oowb9z7bs1d2fwro7.png" alt="API22" width="800" height="363"&gt;&lt;/a&gt;&lt;br&gt;
Click &lt;strong&gt;Deploy&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test the Function Directly (Optional)&lt;/strong&gt;&lt;br&gt;
I ran a test before setting up API Gateway:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click the Test tab in Lambda
&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%2F2xqq5gj39r5pt0rm1lbg.png" alt="API23" width="800" height="330"&gt;
&lt;/li&gt;
&lt;li&gt;If it works, you’ll see a 200 OK response with weather data.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Test the API via Browser:&lt;br&gt;
&lt;a href="https://olxheqwg4c.execute-api.us-west-2.amazonaws.com/APIweather/weather-api-lambda" rel="noopener noreferrer"&gt;https://olxheqwg4c.execute-api.us-west-2.amazonaws.com/APIweather/weather-api-lambda&lt;/a&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%2F8dx7xaymcasesqlnesuh.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%2F8dx7xaymcasesqlnesuh.png" alt="API24" width="800" height="123"&gt;&lt;/a&gt;&lt;br&gt;
There you go&lt;/p&gt;

&lt;h2&gt;
  
  
  Brief Discussion
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;What problem did I solved getting weather info:&lt;/strong&gt; I built a serverless solution to fetch real-time weather data using AWS Lambda and API Gateway. The problem was accessing weather info by city without managing servers. Now, users can get live forecasts by simply hitting a public API endpoint.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How API Gateway &amp;amp; Lambda work together:&lt;/strong&gt; API Gateway acts as the front door, receiving HTTP requests and passing them to AWS Lambda. Lambda runs backend code in response, processes the request, and sends back a result. Together, they enable scalable, serverless APIs without managing servers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How this demonstrates serverless and cloud-native skills:&lt;/strong&gt; This project shows serverless and cloud-native skills by using AWS Lambda to run code without managing servers and API Gateway to expose it as a RESTful API. It demonstrates event-driven design, scalability, cost-efficiency, and integration of cloud services.&lt;/p&gt;

&lt;p&gt;This project demonstrates the power of serverless architecture using AWS Lambda and API Gateway to build a scalable weather information API. It showcases my ability to integrate third-party APIs, handle cloud deployments, and write clean, resilient code.&lt;/p&gt;

</description>
      <category>api</category>
      <category>aws</category>
      <category>learning</category>
      <category>lambda</category>
    </item>
    <item>
      <title>VPC Traffic Flow and Security</title>
      <dc:creator>Busa Ayim-Odu</dc:creator>
      <pubDate>Sat, 17 May 2025 16:20:28 +0000</pubDate>
      <link>https://dev.to/busa/vpc-traffic-flow-and-security-49a1</link>
      <guid>https://dev.to/busa/vpc-traffic-flow-and-security-49a1</guid>
      <description>&lt;p&gt;&lt;strong&gt;VPC traffic flow and security&lt;/strong&gt; control how data moves within and outside a Virtual Private Cloud. Key components include subnets, route tables, security groups, and NACLs, ensuring secure, filtered communication between resources.&lt;/p&gt;

&lt;p&gt;Building a Virtual Private Cloud (VPC) is the first project in our networking series, and we strongly advise starting with it.  This project picks up just where the last one left off!&lt;/p&gt;

&lt;p&gt;Let's continue exploring the fundamentals of creating an Amazon Virtual Private Cloud (VPC) in VPC Traffic Flow and Security.&lt;/p&gt;

&lt;p&gt;Prepare to:&lt;br&gt;
Make a table of routes.&lt;br&gt;
👮‍♀️  Establish a security group.&lt;br&gt;
Make a network access control list, or ACL.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Step 1&lt;/strong&gt;&lt;br&gt;
Configure the fundamentals of VPC.&lt;/p&gt;

&lt;p&gt;To set up our VPC, subnet, and internet gateway, we are using the same procedures as in the first project.  Come on!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a route table&lt;/strong&gt;&lt;br&gt;
You must still instruct the resource on your public subnet on how to access the internet, even after you have built an internet gateway and connected it to your VPC.&lt;/p&gt;

&lt;p&gt;To route traffic from your resource to your internet gateway, you will need to set up route tables!&lt;/p&gt;

&lt;p&gt;In your situation, any traffic that isn't bound for another resource within your VPC is bound for the internet gateway because the sole alternative route has the destination 10.0.0.0/16!&lt;/p&gt;

&lt;p&gt;After that, the internet gateway sends this traffic to the internet, enabling communication between your resources and other networks and users.&lt;/p&gt;

&lt;p&gt;💡  A route table: what is it?&lt;br&gt;
 Consider a route table to be your subnet's resources' GPS.  A route table is a database of rules, or routes, that determine where the data in your network should travel, much like a GPS helps people find their way to their destination in a city.&lt;/p&gt;

&lt;p&gt;Because the route table instructs each subnet's traffic where to send and receive data, each subnet in your VPC must be connected to it.  For instance, the subnet of an EC2 instance hosting a web server (i.e., an EC2 instance) requires a route table that can determine how to route incoming traffic to the website.&lt;/p&gt;

&lt;p&gt;💡  What connection exists between route tables and internet gateways?&lt;br&gt;
 A subnet is considered public when it has a route in its route table that routes internet-bound traffic to the internet gateway.  This indicates that your subnet is able to connect to the internet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- In the left navigation pane, choose Route tables.&lt;/strong&gt;&lt;br&gt;
A couple of route tables!  Why are there two?&lt;/p&gt;

&lt;p&gt;Note: If there are more than two route tables visible, they were probably put up in previous projects you worked on.  To determine where each route table belongs, look to the VPC column on the far right side of the table.  Pay attention to both your VPC's route table and the default one.&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%2F4cabnvqnseym6oy4o16x.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%2F4cabnvqnseym6oy4o16x.png" alt="Traffic 1" width="800" height="127"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;- Let's rename your NextWork VPC route table so it's easier to recognise.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Make sure you have your NextWork VPC route table selected - this is the route table with a single route to 10.0.0.0/16.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Select the pencil icon in the Name column of your route table.&lt;/strong&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%2Ff9axo5riq8i1o76v4urq.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%2Ff9axo5riq8i1o76v4urq.png" alt="Traffic 2" width="800" height="336"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;- Enter the name NextWork route table.&lt;/strong&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%2Frri980pgos6hel473jou.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%2Frri980pgos6hel473jou.png" alt="Image description" width="800" height="287"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;- Select Save.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Select the Routes tab.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Choose Edit routes.&lt;/strong&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%2F8n2gbh7v5svcskavirm7.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%2F8n2gbh7v5svcskavirm7.png" alt="traffic 4" width="800" height="143"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;- Choose Add route near the bottom of the page.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Destination:  0.0.0.0/0&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The destination is 0.0.0.0/0; why is that?&lt;br&gt;
 For all IPv4 addresses, use 0.0.0.0/0!  Any traffic that doesn't match more specific routes in your route table will be sent via the default route created when you set 0.0.0.0/0 as the destination in your route table.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Target: Internet Gateway.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Select NextWork IG.&lt;/strong&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%2F14o4bomsph1jvxr5jnv5.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%2F14o4bomsph1jvxr5jnv5.png" alt="Traffic" width="800" height="178"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;- Choose Save changes.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Choose the Subnet associations tab.&lt;/strong&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%2Femiqbgnmt7x3sijxfcua.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%2Femiqbgnmt7x3sijxfcua.png" alt="Traffic 6" width="800" height="313"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;- Under the Explicit subnet associations tab, choose Edit subnet associations&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Select Public 1.&lt;/strong&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%2Fpj57a6kcqx3dvcbfiloz.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%2Fpj57a6kcqx3dvcbfiloz.png" alt="traffic 7" width="800" height="180"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;- Choose Save associations.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Since the internet gateway has connected your subnet to the Internet, it is now public!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 2&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a security group
&lt;/h2&gt;

&lt;p&gt;In this task, let's add a security group so that users can access resources in your VPC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; that we won't be creating EC2 instance in this project, but we're adding it to this diagram to illustrate a security group's scope!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- In the left navigation pane, choose Security groups. Note that this is further down the navigation pane than our other pages so far!&lt;/strong&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%2Fa698q4s8bxquzckebdi7.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%2Fa698q4s8bxquzckebdi7.png" alt="traffic 8" width="310" height="334"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Choose Create security group.&lt;/strong&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%2Fq6lpzwaaq4ddl3z4s4k1.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%2Fq6lpzwaaq4ddl3z4s4k1.png" alt="Traffic 9" width="800" height="117"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Security group name:  NextWork Security Group&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Description: A Security Group for the NextWork VPC.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- VPC: NextWork VPC&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Under the Inbound rules panel, choose Add rule.&lt;/strong&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%2F9ts8jtnyms2hd9urp6nj.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%2F9ts8jtnyms2hd9urp6nj.png" alt="traffic 10" width="800" height="421"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;- Type: HTTP&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Source: Anywhere-IPv4&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- At the bottom of the screen, choose Create security group.&lt;/strong&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%2Fmm5oz4nc2cen2kwikot9.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%2Fmm5oz4nc2cen2kwikot9.png" alt="Traffic 11" width="800" height="271"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create a Network ACL
&lt;/h2&gt;

&lt;p&gt;That's great that your VPC's traffic flow (route table) and fundamental security (security groups) are in order!&lt;/p&gt;

&lt;p&gt;Let's add a network access control list, or ACL, to your VPC to increase its security.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- In the left navigation pane, choose Network ACLs.&lt;/strong&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%2Fhh34bo7nw30b6crjppt2.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%2Fhh34bo7nw30b6crjppt2.png" alt="traffic 12" width="311" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Existing ACLs?&lt;/strong&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%2F3qb8kdup9gyqc6hnpgln.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%2F3qb8kdup9gyqc6hnpgln.png" alt="traffic 13" width="800" height="123"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose the network ACL that's associated with your Public 1 subnet, and check out the tabs for Inbound rules and Outbound rules.&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%2Fvmjn9il1b6nx77tjqibr.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%2Fvmjn9il1b6nx77tjqibr.png" alt="Traffic 14" width="800" height="414"&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%2Fnyi3i2bc2ri038wvth52.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%2Fnyi3i2bc2ri038wvth52.png" alt="Traffic 15" width="800" height="419"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;What are the meanings of the rules listed under the Inbound and Outbound rules tabs?  Similar to security groups, network ACLs determine whether data packets are permitted to enter or exit subnets based on inbound and outgoing rules:&lt;/p&gt;

&lt;p&gt;All incoming traffic is permitted to enter the Public Subnet under Rule 100 Inbound.&lt;/p&gt;

&lt;p&gt;All traffic is permitted to leave the Public Subnet under Rule 100 Outbound.&lt;/p&gt;

&lt;p&gt;Each ruleset's second line displays an asterisk (*), which serves as a catch-all rule in the event that traffic does not meet any of the preceding rules.  The asterisk rule won't really apply in our situation because Rule 100 already permits all traffic.&lt;/p&gt;

&lt;p&gt;This indicates that, unless otherwise specified, all incoming and outgoing traffic is permitted by default network ACLs.&lt;/p&gt;

&lt;p&gt;Let's replicate this setup in the console to reinforce what we've learned!  Everything we need is in your default ACL, but setting everything up from scratch is a fantastic practice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Select Create new network ACL.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Name: NextWork Network ACL&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- VPC: NextWork VPC&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Select Create network ACL.&lt;/strong&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%2F7julkiaq2tzubfcgwgzd.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%2F7julkiaq2tzubfcgwgzd.png" alt="traffic 16" width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Uncheck the default network ACL you've selected.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Select the checkbox next to NextWork Network ACL&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Select the Inbound rules tab.&lt;/strong&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%2Ftktd2o5uu8hhdi3tgarx.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%2Ftktd2o5uu8hhdi3tgarx.png" alt="traffic 17" width="800" height="397"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Select Edit inbound rules.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Select Add new rule.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Rule number: 100&lt;/strong&gt;&lt;br&gt;
💡  For what reason is the rule number 100?&lt;br&gt;
 Rule numbers determine the sequence in which rules are checked in network ACLs; lower numbers are checked first.  You can add new rules before it if necessary by starting at 100.  For instance, you can include a rule with a lower number to ensure that a certain protocol is examined first if you later want to ban it.  Otherwise, starting at 100 and adding rules with larger numbers is typical procedure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Type: All traffic.&lt;/strong&gt;&lt;br&gt;
The Protocol and Port range fields were grayed out; why?&lt;br&gt;
 You no longer need to specify protocols and port ranges because your rule will be applied to all of them when you choose "All traffic" as the traffic type.  Simple as abc!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Source: 0.0.0.0/0&lt;/strong&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%2F1y2hxnjxl928456011xz.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%2F1y2hxnjxl928456011xz.png" alt="traffic 18" width="800" height="171"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;- Click Save changes.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  For the Network ACL's outbound rules?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;- Select the Outbound rules tab.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Select Edit outbound rules.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Select Add new rule.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Rule number: 100&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Type: All traffic.&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;- Destination: 0.0.0.0/0&lt;/strong&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%2Fc4qfmaf3ffd6y07f5inr.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%2Fc4qfmaf3ffd6y07f5inr.png" alt="traffic 20" width="800" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Well, are we done yet?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Next to the Outbound rules tab, you should see the Subnet associations tab. Click on it.&lt;/strong&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%2Fto0oulkgai34j5mz8zjh.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%2Fto0oulkgai34j5mz8zjh.png" alt="traffic 21" width="800" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Well, we're not done yet.  There is nothing on the subnet associations tab!&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Under the Subnet associations tab, select Edit subnet associations.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Select your Public 1 subnet.&lt;/strong&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%2F3l3v3jdyvy9lgaxkeq0b.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%2F3l3v3jdyvy9lgaxkeq0b.png" alt="traffic 22" width="800" height="165"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;Select Save changes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Now check: do you have an Allow rule for both your inbound and outbound rules? Do you have a subnet association to Public 1?&lt;/strong&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%2Fnsjstiisc96j0ja4gn41.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%2Fnsjstiisc96j0ja4gn41.png" alt="traffic 23" width="800" height="133"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wonderful!  You've done a fantastic job configuring a working VPC.  Adding a network ACL, security group, and route table is a smart way to manage traffic flow and security.&lt;/p&gt;

&lt;p&gt;Here is a summary of your VPC setup as an added bonus.  Setting up an EC2 instance and hosting a web application in a public subnet would entail:&lt;/p&gt;

&lt;p&gt;💻 &lt;strong&gt;Client/User:&lt;/strong&gt; A user hits enter after entering your website's URL in their browser.&lt;/p&gt;

&lt;p&gt;🚪 &lt;strong&gt;Internet Gateway:&lt;/strong&gt; The user's browser sends the request to your internet gateway, NextWork IG, via the internet.&lt;/p&gt;

&lt;p&gt;🌐 &lt;strong&gt;VPC:&lt;/strong&gt; The internet gateway sends the user's request to NextWork VPC, the VPC to which it is connected.&lt;/p&gt;

&lt;p&gt;🚏 &lt;strong&gt;Route Table:&lt;/strong&gt; Traffic is routed to your EC2 instance hosting the website via your VPC's NextWork route table for your public subnet.  The user's request is added to the route table's local route.&lt;/p&gt;

&lt;p&gt;📋 &lt;strong&gt;Network ACL:&lt;/strong&gt; The request must go via the network ACL linked to your public subnet on its way to your EC2 instance.  Your request is accepted because the network ACL includes an inbound rule (rule 100) that allows traffic from any location (0.0.0.0/0).&lt;/p&gt;

&lt;p&gt;🥅 &lt;strong&gt;Public Subnet:&lt;/strong&gt; The request proceeds to your EC2 instance within your public subnet, Public 1.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Security Group:&lt;/strong&gt; NextWork Security Group, which is connected to the EC2 instance, receives the request.  The request can go through because the security group contains an incoming rule that permits HTTP traffic (Port 80) from any location (0.0.0.0/0).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;EC2 Instance:&lt;/strong&gt; Your EC2 instance, which hosts the website, receives the request.  The EC2 instance's web server prepares the response after processing the request.&lt;/p&gt;

&lt;p&gt;💻  &lt;strong&gt;Data is returned:&lt;/strong&gt; The user receives the content of the website.  Outgoing traffic passes via the network ACL, route table, VPC, security group, public subnet, and intern&lt;/p&gt;

&lt;p&gt;Well done!&lt;/p&gt;

&lt;p&gt;You just finished the project for today and created your own VPC with network ACLs, security groups, and route tables.&lt;/p&gt;

&lt;p&gt;Completed WOOOOOOOOOOOOOOO! 🙌  All hands up.&lt;/p&gt;

</description>
      <category>security</category>
      <category>vpc</category>
      <category>learning</category>
      <category>cloud</category>
    </item>
    <item>
      <title>Construct a Private Cloud Virtually</title>
      <dc:creator>Busa Ayim-Odu</dc:creator>
      <pubDate>Fri, 16 May 2025 12:38:43 +0000</pubDate>
      <link>https://dev.to/busa/construct-a-private-cloud-virtually-5274</link>
      <guid>https://dev.to/busa/construct-a-private-cloud-virtually-5274</guid>
      <description>&lt;h2&gt;
  
  
  Technical Description: Construct a Private Cloud Virtually (VPC)
&lt;/h2&gt;

&lt;p&gt;This project involves creating a secure and isolated Virtual Private Cloud (VPC) within a public cloud platform such as AWS, Azure, or GCP. It includes configuring custom IP ranges, subnets (public and private), route tables, internet and NAT gateways, and implementing Security Groups and Network ACLs for traffic control. Virtual machines are launched in appropriate subnets, with private resources accessing the internet via NAT. The setup ensures secure communication and resource segmentation. Infrastructure as Code (e.g., Terraform) may be used for automation. This project showcases essential cloud networking, security, and deployment skills.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Step 1&lt;/strong&gt;&lt;br&gt;
Create a VPC&lt;/p&gt;

&lt;p&gt;Off we go! Let's kick things off by creating a VPC.&lt;/p&gt;

&lt;p&gt;In this step, get ready to:&lt;/p&gt;

&lt;p&gt;Access the VPC console in AWS.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the AWS Management Console search field, type VPC.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select VPC from the drop down menu.&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%2Fjezv6sa8lvbp8w5tekl2.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%2Fjezv6sa8lvbp8w5tekl2.png" alt="vpc1" width="800" height="232"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In the left navigation pane, choose Your VPCs&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%2Fy4s4z4k8wusyggi9u2x9.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%2Fy4s4z4k8wusyggi9u2x9.png" alt="vpc 2" width="800" height="427"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Make sure you're on the Region that's closest to you. Use the dropdown on the top right hand corner to switch Regions.&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%2F3l2fh99g1xr8yldcl3ez.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%2F3l2fh99g1xr8yldcl3ez.png" alt="vpc3" width="754" height="416"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;You'll notice that there is already a VPC in your account!&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%2F7i7n5lsl3ypbw4o4z260.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%2F7i7n5lsl3ypbw4o4z260.png" alt="vpc 4" width="800" height="136"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose Create VPC.&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%2Few8kcx30o8i6tm4lv1wt.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%2Few8kcx30o8i6tm4lv1wt.png" alt="vpc 5" width="800" height="136"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose VPC Only.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Name tag: NextWork VPC&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IPv4 CIDR: 10.0.0.0/16&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%2F6zxl376r2saytq9mb3pd.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%2F6zxl376r2saytq9mb3pd.png" alt="vpc 6" width="800" height="556"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Create VPC to finish setting up your VPC.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;- Step 2&lt;/strong&gt;&lt;br&gt;
Establish subnets&lt;/p&gt;

&lt;p&gt;Good!  We've constructed our VPC, which is like building up a completely new city in your AWS Region.&lt;/p&gt;

&lt;p&gt;Until we divide our new city into distinct neighborhoods or regions, it is merely a vast open expanse.  To begin organizing where various resources will reside and function, you must next partition this vast area into smaller areas known as subnets.&lt;/p&gt;

&lt;p&gt;In this phase, prepare to:&lt;br&gt;
Get your VPC's subnet up and running.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;In the VPC Dashboard, under Virtual Private Cloud, choose Subnets.&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%2F303p6vt322hmv2aj9k30.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%2F303p6vt322hmv2aj9k30.png" alt="vpc 7" width="380" height="527"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ooo, there are already subnets in here!&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%2F6wefslkmukdf3zdvbttq.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%2F6wefslkmukdf3zdvbttq.png" alt="vpc 8" width="800" height="206"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose Create subnet.&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%2F630tibiwf6giuxnjg3tw.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%2F630tibiwf6giuxnjg3tw.png" alt="vpc 9" width="800" height="58"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Configure your subnet settings:&lt;br&gt;
VPC ID: NextWork VPC&lt;br&gt;
Subnet name: Public 1&lt;br&gt;
Availability Zone: Select the first Availability Zone in the list.&lt;br&gt;
IPv4 VPC CIDR block: 10.0.0.0/16&lt;br&gt;
IPv4 subnet CIDR block: 10.0.0.0/24&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%2Fdr4q8buxwx0i3u2v4rzi.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%2Fdr4q8buxwx0i3u2v4rzi.png" alt="vpc 10" width="800" height="641"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose Create subnet.&lt;br&gt;
Select the checkbox next to Public 1.&lt;br&gt;
In the Actions menu, select Edit subnet settings.&lt;/p&gt;

&lt;p&gt;Check the box next to Enable auto-assign public IPv4 address.&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%2Fpstfd4hkefjpxxbljjhv.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%2Fpstfd4hkefjpxxbljjhv.png" alt="Image description" width="800" height="374"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose Save.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Step 3&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Construct an internet gateway.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;VPC completed!&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;** Subnet completed!**&lt;/p&gt;

&lt;p&gt;This project's final step is to connect your VPC to an internet gateway.  In order for your resources to communicate outside of your private area, it is similar to constructing an internet gateway, or bridge, that connects your private city (VPC) to the outside world.&lt;/p&gt;

&lt;p&gt;In this step, get ready to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connect your VPC to the internet using a internet gateway.&lt;/li&gt;
&lt;li&gt;In the left navigation pane, choose Internet gateways.
&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%2F4nb59gvsw7rynhb66g0a.png" alt="vpc 12" width="800" height="153"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  What is an internet gateway?
&lt;/h2&gt;

&lt;p&gt;An internet gateway connects your city** (VPC) &lt;strong&gt;and the outside world **(internet)&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Internet gateways are key to making applications available on the internet. By attaching an internet gateway, your instances can access the internet and be accessible to external users.&lt;/p&gt;

&lt;p&gt;Aha! An existing internet gateway.&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%2Fcwjdr5a41cfgm394vh98.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%2Fcwjdr5a41cfgm394vh98.png" alt="vpc 13" width="800" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Choose Create internet gateway.&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%2Fhxadhc7eyar37mevuyzz.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%2Fhxadhc7eyar37mevuyzz.png" alt="vpc 14" width="800" height="138"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Configure your internet gateway settings:&lt;/li&gt;
&lt;li&gt;Name tag: NextWork IG&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Choose Create internet gateway.&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%2Fa6nfsiyhd7wc13ojw8sw.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%2Fa6nfsiyhd7wc13ojw8sw.png" alt="vpc 15" width="800" height="285"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select your newly created internet gateway and choose Actions, then Attach to VPC.&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%2Fogq95it8jnwvs1snzjlf.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%2Fogq95it8jnwvs1snzjlf.png" alt="vpc 16" width="800" height="140"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select NextWork VPC.&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%2Fprv2e7jj6qc49i9kphy8.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%2Fprv2e7jj6qc49i9kphy8.png" alt="vpc 17" width="800" height="155"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Attach internet gateway.&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%2F6drd3j12iiax8fe9mgp7.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%2F6drd3j12iiax8fe9mgp7.png" alt="vpc 18" width="800" height="165"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Well done on building an internet gateway and connecting it to your virtual private cloud!&lt;/p&gt;

&lt;p&gt;We need to demonstrate to traffic in your public subnet how to locate the internet gateway in your VPC in order to access the internet.&lt;/p&gt;

&lt;p&gt;We've just completed today's project and set up your very own virtual private cloud with Amazon VPC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon VPC&lt;/strong&gt; is a service that lets you create a private, isolated network in AWS. It’s useful because it gives full control over IP ranges, subnets, routing, and security, helping you securely run resources in the cloud.&lt;/p&gt;

&lt;h2&gt;
  
  
  Today you've learnt how to:
&lt;/h2&gt;

&lt;p&gt;☁️ Create a VPC: You've taken your first steps by setting up a Virtual Private Cloud (VPC) using Amazon VPC.&lt;/p&gt;

&lt;p&gt;🥅 Create subnets: Moving deeper into your VPC, you created subnets, which act like neighborhoods within your city, each with unique access rules. You learned the difference between public and private subnets and set up a subnet to allow instances within it to automatically receive public IP addresses, making them accessible from the internet.&lt;/p&gt;

&lt;p&gt;🚪 Set up an internet gateway: Lastly, you added an internet gateway to your VPC, acting as the main gate that allows data to flow in and out. This setup is essential for any applications that require internet access, such as web servers. You've configured the gateway and linked it to your VPC, ensuring your public instances can reach the outside world and vice versa.&lt;/p&gt;

&lt;p&gt;🚏 Bonus - configure IP addresses and CIDR blocks: You've configured your VPC with an IPv4 CIDR block, understanding that IP addresses are like street addresses for your resources! You explored how different CIDR blocks dictate the size and scale of your VPC.&lt;/p&gt;

&lt;p&gt;It's wild that all these learnings are packed in one project.&lt;/p&gt;

&lt;p&gt;Keep it up in the next project of this series on VPC Traffic Flow and Security!&lt;/p&gt;

&lt;p&gt;Cheers!&lt;/p&gt;

</description>
      <category>networking</category>
      <category>vpc</category>
      <category>aws</category>
      <category>learning</category>
    </item>
    <item>
      <title>Containerizing a Node.js Application with Docker</title>
      <dc:creator>Busa Ayim-Odu</dc:creator>
      <pubDate>Sat, 22 Mar 2025 12:59:27 +0000</pubDate>
      <link>https://dev.to/busa/containerizing-a-nodejs-application-with-docker-3oce</link>
      <guid>https://dev.to/busa/containerizing-a-nodejs-application-with-docker-3oce</guid>
      <description>&lt;p&gt;Containerizing an application allows you to package your code along with all dependencies into a portable unit called a container. This guide walks you through the process of containerizing a simple to-do list manager built with Node.js. No prior experience with JavaScript is required.&lt;/p&gt;

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

&lt;p&gt;Before getting started, ensure you have the following installed on your system:&lt;/p&gt;

&lt;p&gt;Docker Desktop (latest version)&lt;/p&gt;

&lt;p&gt;Git client (for cloning repositories)&lt;/p&gt;

&lt;p&gt;An IDE or text editor (e.g., Visual Studio Code)&lt;/p&gt;

&lt;p&gt;Step 1: Get the Application Source Code&lt;/p&gt;

&lt;p&gt;First, you need to obtain the source code for the application.&lt;/p&gt;

&lt;p&gt;Open your terminal or command prompt.&lt;/p&gt;

&lt;p&gt;Clone the repository using the following command:&lt;/p&gt;

&lt;p&gt;git clone &lt;a href="https://github.com/docker/getting-started-app.git" rel="noopener noreferrer"&gt;https://github.com/docker/getting-started-app.git&lt;/a&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%2Fhiivdvr2g0bo8w1m4vow.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%2Fhiivdvr2g0bo8w1m4vow.png" alt="docker" width="800" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Navigate to the project directory:&lt;/p&gt;

&lt;p&gt;cd getting-started-app&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%2Fof7277ha151vuy3cktlp.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%2Fof7277ha151vuy3cktlp.png" alt="Docker3" width="800" height="77"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;View the contents of the cloned repository:&lt;/p&gt;

&lt;p&gt;ls&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%2F3fhf5tejqylazq43yk5h.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%2F3fhf5tejqylazq43yk5h.png" alt="Docker 4" width="800" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should see the following files and directories:&lt;/p&gt;

&lt;p&gt;├── getting-started-app/&lt;br&gt;
│   ├── .dockerignore&lt;br&gt;
│   ├── package.json&lt;br&gt;
│   ├── README.md&lt;br&gt;
│   ├── spec/&lt;br&gt;
│   ├── src/&lt;br&gt;
│   └── yarn.lock&lt;/p&gt;

&lt;p&gt;Step 2: Create a Dockerfile&lt;/p&gt;

&lt;p&gt;A Dockerfile is a script containing instructions to build a container image.&lt;/p&gt;

&lt;p&gt;Inside the getting-started-app directory, create a new file named Dockerfile.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Navigate to the Project Directory&lt;/strong&gt;&lt;br&gt;
cd C:\Users\LAPTOP\DockerProjects\getting-started-app&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%2Fuvksxw1hu7xz2n1f9mju.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%2Fuvksxw1hu7xz2n1f9mju.png" alt="Docker5" width="800" height="50"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-Create the Dockerfile&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Run this command to create a new empty file named Dockerfile: New-Item -Path . -Name "Dockerfile" -ItemType "File"&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;-Open the Dockerfile in a Text Editor&lt;/strong&gt;&lt;br&gt;
To edit the Dockerfile, run: &lt;strong&gt;code Dockerfile&lt;/strong&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%2Fxu75f58610ic4sxi5g1o.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%2Fxu75f58610ic4sxi5g1o.png" alt="docker6" width="800" height="460"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add the following contents: Copy and paste the following into the file:&lt;/p&gt;

&lt;h1&gt;
  
  
  syntax=docker/dockerfile:1
&lt;/h1&gt;

&lt;p&gt;FROM node:lts-alpine&lt;br&gt;
WORKDIR /app&lt;br&gt;
COPY . .&lt;br&gt;
RUN yarn install --production&lt;br&gt;
CMD ["node", "src/index.js"]&lt;br&gt;
EXPOSE 3000&lt;/p&gt;

&lt;p&gt;In VS Code, press &lt;strong&gt;Ctrl + S&lt;/strong&gt; and close the file.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Verify the Dockerfile Exists&lt;/strong&gt;&lt;br&gt;
Run the following command to confirm the file was created: Get-ChildItem &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%2Fiz06ridkiabreshfn41c.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%2Fiz06ridkiabreshfn41c.png" alt="Docker 8" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should see Dockerfile listed among the files. Now you have successfully created a Dockerfile! &lt;/p&gt;

&lt;p&gt;Step 3: Build the Docker Image&lt;/p&gt;

&lt;p&gt;Open a terminal and navigate to the getting-started-app directory.&lt;/p&gt;

&lt;p&gt;Run the following command to build the image:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;docker build -t getting-started&lt;/strong&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%2F6px45dq3wxidw5dcwq1y.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%2F6px45dq3wxidw5dcwq1y.png" alt="docker9" width="800" height="493"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The -t flag tags the image as getting-started.&lt;/p&gt;

&lt;p&gt;The . at the end specifies that the Dockerfile is in the current directory.&lt;/p&gt;

&lt;p&gt;Docker will download necessary dependencies and build the image.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;- Verify the Image is Built&lt;/strong&gt;&lt;br&gt;
After the build completes, check if the image was created: docker images&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%2Fm5kldglvxuprhkc4dxwb.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%2Fm5kldglvxuprhkc4dxwb.png" alt="docker10" width="800" height="139"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You should see getting-started in the list.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step-by-Step Guide to Running Your Docker Container&lt;/strong&gt;&lt;br&gt;
Step 4: Ensure Your Image is Built&lt;br&gt;
First, confirm that your getting-started Docker image was built successfully.&lt;br&gt;
Run the following command:  docker images&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Run the Container&lt;/strong&gt;&lt;br&gt;
Now, start the container using the following command:&lt;br&gt;
docker run -d -p 127.0.0.1:3000:3000 getting-started&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%2Fh023a809411uouxu76nc.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%2Fh023a809411uouxu76nc.png" alt="docker11" width="800" height="34"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Explanation:&lt;/p&gt;

&lt;p&gt;-docker run → Starts a new container&lt;/p&gt;

&lt;p&gt;-d → Runs in detached mode (background)&lt;/p&gt;

&lt;p&gt;-p 127.0.0.1:3000:3000 → Maps port 3000 inside the container to port 3000 on your computer&lt;/p&gt;

&lt;p&gt;-getting-started → The name of the image&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open the App in Your Browser&lt;/strong&gt;&lt;br&gt;
1 Open your browser&lt;br&gt;
2 Go to &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;&lt;br&gt;
3 You should see the To-Do List App running 🎉&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%2Fst2zwxq6ftejm2kjq5ny.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%2Fst2zwxq6ftejm2kjq5ny.png" alt="docker12" width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Verify Running Containers&lt;/strong&gt;&lt;br&gt;
Check if your container is running with: docker ps&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%2F2qgcckrebnrfjisvrz1m.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%2F2qgcckrebnrfjisvrz1m.png" alt="docker 13" width="800" height="59"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stop the Container (Optional)&lt;/strong&gt;&lt;br&gt;
If you want to stop the running container, use:&lt;/p&gt;

&lt;p&gt;docker stop &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%2Fn90qdvsvjwmxt8dcyfe2.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%2Fn90qdvsvjwmxt8dcyfe2.png" alt="docker 15" width="800" height="45"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Replace  with the actual container ID from docker ps output.&lt;/p&gt;

&lt;p&gt;🎯 Summary of What You Did&lt;br&gt;
✅ Cloned a Node.js application&lt;br&gt;
✅ Created a Dockerfile&lt;br&gt;
✅ Built a Docker image&lt;br&gt;
✅ Started the app in a Docker container&lt;br&gt;
✅ Accessed the app via &lt;a href="http://localhost:3000" rel="noopener noreferrer"&gt;http://localhost:3000&lt;/a&gt;&lt;br&gt;
✅ Verified running containers&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;In addition:&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Node.js?
&lt;/h2&gt;

&lt;p&gt;🚀 Node.js is a JavaScript runtime that allows you to run JavaScript outside of the browser.&lt;/p&gt;

&lt;p&gt;🛠️ &lt;strong&gt;Key Features of Node.js&lt;/strong&gt;&lt;br&gt;
1️⃣ Built on Chrome's V8 Engine → Super fast JavaScript execution ⚡&lt;br&gt;
2️⃣ Non-blocking, Asynchronous → Handles multiple requests at once without waiting ⏳&lt;br&gt;
3️⃣ Uses JavaScript → If you know JS, you can build backend apps with Node.js easily 🏗️&lt;br&gt;
4️⃣ Lightweight &amp;amp; Scalable → Great for building APIs, microservices, and real-time apps 📡&lt;/p&gt;

&lt;p&gt;🖥️ &lt;/p&gt;

&lt;h2&gt;
  
  
  What is Node.js Used For?
&lt;/h2&gt;

&lt;p&gt;✅ Web servers &amp;amp; APIs (e.g., Express.js)&lt;br&gt;
✅ Real-time apps (e.g., chat applications, live updates)&lt;br&gt;
✅ Microservices &amp;amp; serverless computing&lt;br&gt;
✅ CLI tools &amp;amp; automation scripts&lt;/p&gt;

&lt;p&gt;🎉 Congratulations! You have successfully containerized and run an application using Docker. 🚀&lt;/p&gt;

</description>
      <category>containers</category>
      <category>docker</category>
      <category>tutorial</category>
      <category>learning</category>
    </item>
    <item>
      <title>Configure Your Cloud Infrastructure using Terraform and AWS CLI: A Step-by-Step Tutorial</title>
      <dc:creator>Busa Ayim-Odu</dc:creator>
      <pubDate>Tue, 04 Feb 2025 07:30:40 +0000</pubDate>
      <link>https://dev.to/busa/configure-your-cloud-infrastructure-using-terraform-and-aws-cli-a-step-by-step-tutorial-1gd0</link>
      <guid>https://dev.to/busa/configure-your-cloud-infrastructure-using-terraform-and-aws-cli-a-step-by-step-tutorial-1gd0</guid>
      <description>&lt;p&gt;Configure Your Cloud Infrastructure using Terraform and AWS CLI: A Step-by-Step Tutorial&lt;/p&gt;

&lt;p&gt;Introduction&lt;/p&gt;

&lt;p&gt;In this tutorial, you will learn how to set up an EC2 instance on Amazon Web Services (AWS) using Terraform and the AWS CLI. EC2 instances are virtual machines that run on AWS and are widely used in cloud infrastructure projects.&lt;/p&gt;

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

&lt;p&gt;To follow along with this tutorial, ensure you have:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Terraform CLI (version 1.2.0 or later) installed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;AWS CLI installed&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;An AWS account with the necessary credentials to create resources&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;IAM credentials configured using environment variables or AWS CLI&lt;/p&gt;

&lt;p&gt;Step 1: Configure AWS Credentials&lt;/p&gt;

&lt;p&gt;Log into your AWS portal.&lt;/p&gt;

&lt;p&gt;Click on your username in the top-right corner and select Security Credentials.&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%2Fhma4v6q4273agfw5tvlp.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%2Fhma4v6q4273agfw5tvlp.png" alt="Aws Security" width="800" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Under Access Keys, click Create access key.&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%2F3on9puly6w9yaf261zzc.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%2F3on9puly6w9yaf261zzc.png" alt="access key" width="800" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Check the "I Understand" box and click Create.&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%2Firnvqoqra1b6oq2j5nvb.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%2Firnvqoqra1b6oq2j5nvb.png" alt="create access key" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the Access Key and Secret Key.&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%2Fyu62g8gotd18avev961i.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%2Fyu62g8gotd18avev961i.png" alt="Access" width="800" height="264"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Configure AWS CLI&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open your terminal and enter&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Run these command: terraform --version&lt;/li&gt;
&lt;li&gt;Second command: aws --version
&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%2Frltc5z69y07nvce2blsv.png" alt="terraform" width="800" height="191"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Follow the prompts and enter your:&lt;/p&gt;

&lt;p&gt;AWS Access Key ID&lt;/p&gt;

&lt;p&gt;AWS Secret Access Key&lt;/p&gt;

&lt;p&gt;Default region name (e.g., us-east-1)&lt;/p&gt;

&lt;p&gt;Output format (e.g., json or table)&lt;br&gt;
&lt;strong&gt;But in this case, I left it as default&lt;/strong&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%2Fa9l74e76wnsfc9zxc7ua.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%2Fa9l74e76wnsfc9zxc7ua.png" alt="aws" width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Set Up Your Terraform Project&lt;/p&gt;

&lt;p&gt;Create a working directory and navigate into it:&lt;/p&gt;

&lt;p&gt;mkdir terraformtask&lt;/p&gt;

&lt;p&gt;cd terraformtask&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%2Fywq1wz5qi0v6tb2aimsb.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%2Fywq1wz5qi0v6tb2aimsb.png" alt="terraform" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open a new file named main.tf in a text editor and add the following configuration:&lt;/p&gt;

&lt;p&gt;terraform {&lt;br&gt;
  required_providers {&lt;br&gt;
    aws = {&lt;br&gt;
      source  = "hashicorp/aws"&lt;br&gt;
      version = "~&amp;gt; 4.16"&lt;br&gt;
    }&lt;br&gt;
  }&lt;/p&gt;

&lt;p&gt;required_version = "&amp;gt;= 1.2.0"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;provider "aws" {&lt;br&gt;
  region  = "us-west-2"&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;resource "aws_instance" "app_server" {&lt;br&gt;
  ami           = "ami-830c94e3"&lt;br&gt;
  instance_type = "t2.micro"&lt;/p&gt;

&lt;p&gt;tags = {&lt;br&gt;
    Name = "ExampleAppServerInstance"&lt;br&gt;
  }&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fia79ckczy97fritoh52j.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%2Fia79ckczy97fritoh52j.png" alt="terraform write up" width="800" height="669"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 3: Initialize Terraform&lt;/p&gt;

&lt;p&gt;Run the following command to initialize the directory and download required provider plugins:&lt;/p&gt;

&lt;p&gt;terraform init&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%2Fbvn3fko15cqvgp0fmvgn.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%2Fbvn3fko15cqvgp0fmvgn.png" alt="main.tf" width="800" height="443"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 4: Format, Validate, and Apply Configuration&lt;/p&gt;

&lt;p&gt;Before applying the configuration, format and validate the files:&lt;br&gt;
terraform fmt&lt;br&gt;
terraform validate&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%2Ffebxgxzve3rxm93bmoje.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%2Ffebxgxzve3rxm93bmoje.png" alt="terraform fmt" width="800" height="510"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If validation passes, apply the configuration:&lt;/p&gt;

&lt;p&gt;terraform apply&lt;/p&gt;

&lt;p&gt;Type yes when prompted to confirm.&lt;/p&gt;

&lt;p&gt;Step 5: Verify the Infrastructure&lt;/p&gt;

&lt;p&gt;To check the current state of your infrastructure, run:&lt;/p&gt;

&lt;p&gt;terraform show&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%2F8suv4p6iz9z7t199r65s.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%2F8suv4p6iz9z7t199r65s.png" alt="terraform" width="800" height="420"&gt;&lt;/a&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%2F4gk1xyod0gbep6uqcpzf.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%2F4gk1xyod0gbep6uqcpzf.png" alt="terraform" width="800" height="501"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This command displays the details of the provisioned resources.&lt;/p&gt;

&lt;p&gt;Conclusion&lt;/p&gt;

&lt;p&gt;Congratulations! You have successfully deployed an EC2 instance using Terraform and AWS CLI. This process is the foundation for automating cloud infrastructure deployment.&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%2Fnxnjtsiwnt08fcidvwer.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%2Fnxnjtsiwnt08fcidvwer.png" alt="Access key" width="800" height="186"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For more information, explore the Terraform Registry and the AWS Provider Documentation.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>devops</category>
      <category>learning</category>
    </item>
    <item>
      <title>NGINX Configuration for DevOps.</title>
      <dc:creator>Busa Ayim-Odu</dc:creator>
      <pubDate>Thu, 30 Jan 2025 12:45:55 +0000</pubDate>
      <link>https://dev.to/busa/nginx-configuration-for-devops-bbl</link>
      <guid>https://dev.to/busa/nginx-configuration-for-devops-bbl</guid>
      <description>&lt;p&gt;This task has two major parts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install and configure NGINX on an Ubuntu server.&lt;/li&gt;
&lt;li&gt;Write a blog article about your experience.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Part 1: Installing and Configuring NGINX&lt;br&gt;
You will install NGINX, a web server, on an Ubuntu system and configure it to serve a custom HTML page.&lt;/p&gt;

&lt;p&gt;Step 1: install NGINX.&lt;br&gt;
Open the Ubuntu terminal.&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%2Fkgj2bsvyi0or692ft8ht.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%2Fkgj2bsvyi0or692ft8ht.png" alt="Ubuntu Terminal" width="800" height="387"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Update the package lists: sudo apt update&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%2Femwt2mmy76md2t1lshuh.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%2Femwt2mmy76md2t1lshuh.png" alt="Ubuntu Update" width="800" height="518"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After performing the command sudo apt update, the programming went smoothly, except for these errors, which indicate that my Ubuntu system failed to download package index files from the required repositories. Now we will try and fix this errors with the following commands below: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ping -c 4 google.com
&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%2Fuuxgkdnzfh1ks4tf4oma.png" alt="Fixing Error" width="800" height="250"&gt;
&lt;/li&gt;
&lt;li&gt;If you receive responses like "64 bytes from...", your internet is working properly.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If not, check your network configuration.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Second Command: sudo apt update --fix-missing&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%2Fwj2l3ljh93ags9npo7fc.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%2Fwj2l3ljh93ags9npo7fc.png" alt="fix missing error" width="800" height="193"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, obviously, this error has not been cleared away, but it does impede the task in any manner. W: Failed to load &lt;a href="https://download.docker.com/linux/ubuntu/dists/noble/InRelease" rel="noopener noreferrer"&gt;https://download.docker.com/linux/ubuntu/dists/noble/InRelease&lt;/a&gt;.  Cannot wait for server fd - choose (11: Resource temporarily unavailable) [IP: 108.157.78.123 443]&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Install NGINX&lt;/strong&gt;:sudo apt install nginx -y&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%2Fongulze6u3lqngda7l46.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%2Fongulze6u3lqngda7l46.png" alt="Install Nginx" width="800" height="469"&gt;&lt;/a&gt;&lt;br&gt;
The installation went well and port 80 is already in use.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Check if NGINX is running&lt;/strong&gt;:sudo systemctl status nginx&lt;br&gt;
After running the above command I ran into the errors and I have to find a way to fix it.&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%2Fpmxj7d2gi08gb6cl7wt6.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%2Fpmxj7d2gi08gb6cl7wt6.png" alt="failed" width="800" height="266"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution: Stop the Docker Container Using Port 80&lt;/strong&gt;&lt;br&gt;
1️⃣ Find the Docker container using port 80&lt;br&gt;
Run this command: sudo docker ps&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%2F0oqoaozez3b7oh3xknq8.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%2F0oqoaozez3b7oh3xknq8.png" alt="Port" width="800" height="47"&gt;&lt;/a&gt;&lt;br&gt;
Look for the container that is exposing port 80 in the PORTS column (e.g., 0.0.0.0:80-&amp;gt;80/tcp).&lt;/p&gt;

&lt;p&gt;2️⃣ &lt;strong&gt;Stop the container&lt;/strong&gt;&lt;br&gt;
Replace  with the actual container ID from the previous command:sudo docker stop &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%2Fyx2bzhmwy7mw5xt6r3y6.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%2Fyx2bzhmwy7mw5xt6r3y6.png" alt="Stop" width="686" height="49"&gt;&lt;/a&gt;&lt;br&gt;
There was a running Nginx called b4e00baaddbb that needed to be stopped before proceeding with the task.&lt;/p&gt;

&lt;p&gt;3️⃣ &lt;strong&gt;Confirm that Docker has released port 80&lt;/strong&gt;&lt;br&gt;
Run: sudo lsof -i :80&lt;br&gt;
If nothing appears after this command, Docker has stopped using the port.&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%2Feq78texrg906b1lxtzj5.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%2Feq78texrg906b1lxtzj5.png" alt="list and Restart" width="800" height="341"&gt;&lt;/a&gt;&lt;br&gt;
4️⃣ Restart Nginx&lt;br&gt;
Now, restart Nginx and check its status:sudo systemctl restart nginx&lt;br&gt;
sudo systemctl status nginx&lt;/p&gt;

&lt;p&gt;If everything is working, it should show active (running). As shown above in the imaged pointing at the command. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable it to start on boot&lt;/strong&gt;: sudo systemctl enable nginx&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%2Fwnzlal4s5obbbmjwhlf0.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%2Fwnzlal4s5obbbmjwhlf0.png" alt="Enable" width="800" height="74"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 2: Create a Custom HTML Page&lt;br&gt;
Open the default index.html file: sudo nano /var/www/html/index.html&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%2Frw1ekbjat53dwxwyd870.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%2Frw1ekbjat53dwxwyd870.png" alt="Sudo nano" width="626" height="50"&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%2Flk6b0i3u19lxoieqqd16.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%2Flk6b0i3u19lxoieqqd16.png" alt="Write up" width="725" height="301"&gt;&lt;/a&gt;&lt;br&gt;
Save and exit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Press CTRL + X, then Y, then Enter.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Step 3: Restart NGINX&lt;br&gt;
Apply the changes:sudo systemctl restart nginx&lt;/p&gt;

&lt;p&gt;Step 4: Find Your IP Address&lt;br&gt;
Run this command: ip a&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%2Fsf9wnksgbvzbtle20x9g.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%2Fsf9wnksgbvzbtle20x9g.png" alt="IP" width="800" height="301"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 5: Test in a Browser&lt;br&gt;
Open your browser and go to: http:///&lt;br&gt;
&lt;a href="http://192.168.129.128" rel="noopener noreferrer"&gt;http://192.168.129.128&lt;/a&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%2F1cw6wot56ykfma483hai.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%2F1cw6wot56ykfma483hai.png" alt="Image description" width="800" height="82"&gt;&lt;/a&gt;&lt;br&gt;
You should see:&lt;br&gt;
"Welcome to DevOps Stage 0 - Busa Ayim-Odu/chilled_guy"&lt;/p&gt;

&lt;h2&gt;
  
  
  Challenges and Solutions
&lt;/h2&gt;

&lt;p&gt;Problems I Ran into&lt;/p&gt;

&lt;p&gt;To fix APT update issues, ensure network access and run sudo apt update --fix-missing.&lt;/p&gt;

&lt;p&gt;Port 80 is already in use. I identified and halted the running Docker container.&lt;/p&gt;

&lt;p&gt;The NGINX service fails to start: I restarted NGINX after fixing the port problem.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;How Does This Task Help My Career?&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The importance of NGINX in DevOps&lt;/p&gt;

&lt;p&gt;Web server and reverse proxy: NGINX is commonly used for website hosting and load balancing.&lt;/p&gt;

&lt;p&gt;Real-world troubleshooting: Debugging service faults is an essential DevOps skill.&lt;/p&gt;

&lt;p&gt;Hands-on experience: This assignment helped me strengthen my Linux server management skills.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reference Links&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I used the following links:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://hng.tech/hire/devops-engineers" rel="noopener noreferrer"&gt;DevOps engineers&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cloud engineers&lt;a href="https://hng.tech/hire/cloud-engineers" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This work taught me how to set up and debug web servers, which is crucial for DevOps tasks.&lt;/p&gt;

</description>
      <category>programming</category>
      <category>beginners</category>
      <category>devops</category>
      <category>learning</category>
    </item>
    <item>
      <title>Creating a Storage Bucket in AWS Using S3.</title>
      <dc:creator>Busa Ayim-Odu</dc:creator>
      <pubDate>Tue, 10 Dec 2024 21:04:47 +0000</pubDate>
      <link>https://dev.to/busa/creating-a-storage-bucket-in-aws-using-s3-4a0b</link>
      <guid>https://dev.to/busa/creating-a-storage-bucket-in-aws-using-s3-4a0b</guid>
      <description>&lt;h2&gt;
  
  
  Project: Creating a Storage Bucket in AWS Using S3
&lt;/h2&gt;

&lt;p&gt;This guide walks you through creating an AWS S3 bucket, a widely used service for scalable, durable, and secure cloud storage.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step-by-Step Instructions&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Step 1&lt;/strong&gt;: Log in to AWS Management Console
Go to the &lt;strong&gt;AWS Management Console&lt;/strong&gt;.
Enter your credentials to access your &lt;strong&gt;AWS&lt;/strong&gt; account.
&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%2F17itmix0v8lzaxgi2go0.png" alt="AWS Signing" width="800" height="512"&gt;
-&lt;strong&gt;Step 2: Navigate to S3&lt;/strong&gt;
In the &lt;strong&gt;AWS Console&lt;/strong&gt;, search for &lt;strong&gt;S3&lt;/strong&gt; in the search bar at the top.
&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%2Fdihi52xjz8kvace8bpbv.png" alt="S3" width="800" height="437"&gt;
Click on S3 to open the &lt;strong&gt;service dashboard&lt;/strong&gt;.
-&lt;strong&gt;Step 3: Create a New Bucket&lt;/strong&gt;
Click the &lt;strong&gt;"Create bucket"&lt;/strong&gt; button.
&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%2F3ji1xxel2udz3fckngbc.png" alt="Create Bucket" width="800" height="338"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Fill in the following fields:&lt;/strong&gt;&lt;br&gt;
&lt;strong&gt;Bucket Name&lt;/strong&gt;: Enter a unique name (e.g., my-storage-bucket2).&lt;br&gt;
&lt;strong&gt;AWS Region&lt;/strong&gt;: Choose the region closest to your users or application (e.g., us-east-1).&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%2F05me3j854s593alwhpsk.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%2F05me3j854s593alwhpsk.png" alt="AWS1" width="800" height="660"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure optional settings:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Block Public Access Settings: Leave the default settings for now to &lt;strong&gt;block all public access&lt;/strong&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%2Fee76nxq2ctc9jbgbfn7s.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%2Fee76nxq2ctc9jbgbfn7s.png" alt="Aws2" width="800" height="701"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Versioning: Enable this &lt;strong&gt;if&lt;/strong&gt; you want to keep multiple versions of objects for recovery.&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%2Fm7uyh7vz2d2r00qdashn.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%2Fm7uyh7vz2d2r00qdashn.png" alt="aws3" width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Encryption: Choose AES-256 or SSE-S3 for data security.&lt;br&gt;
Click &lt;strong&gt;"Create bucket"&lt;/strong&gt; at the bottom.&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%2Fb46kb4fsnjygbg8dccl7.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%2Fb46kb4fsnjygbg8dccl7.png" alt="aws4" width="800" height="350"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Step 4: Upload Objects to the Bucket&lt;/strong&gt;&lt;br&gt;
Click on the name of your newly created bucket to open it.&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%2Fa3al460bgbatllminyhb.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%2Fa3al460bgbatllminyhb.png" alt="aws5" width="800" height="356"&gt;&lt;/a&gt;&lt;br&gt;
Select &lt;strong&gt;"Upload"&lt;/strong&gt; to add files.&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%2Fv08y66ja60qve0901dbi.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%2Fv08y66ja60qve0901dbi.png" alt="aws6" width="800" height="538"&gt;&lt;/a&gt;&lt;br&gt;
Drag and drop files or browse to select them from your local machine.&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%2Fl888jdwn8xm8mti2btck.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%2Fl888jdwn8xm8mti2btck.png" alt="aws7" width="800" height="297"&gt;&lt;/a&gt;&lt;br&gt;
Click "Upload" to transfer the files to your bucket.&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%2Fci9x1fk431pum7zq476r.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%2Fci9x1fk431pum7zq476r.png" alt="aws8" width="800" height="314"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Step 5: Set Bucket Permissions &lt;strong&gt;(Optional)&lt;/strong&gt;&lt;br&gt;
Navigate to the &lt;strong&gt;Permissions tab&lt;/strong&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%2Fp7icprwv6drl4h3xt2go.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%2Fp7icprwv6drl4h3xt2go.png" alt="aws9" width="800" height="605"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select a Storage class and click &lt;strong&gt;upload&lt;/strong&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%2F3g5nth4z5g1fif5spcme.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%2F3g5nth4z5g1fif5spcme.png" alt="aws10" width="800" height="195"&gt;&lt;/a&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%2Fq353edn0i27qp8mb4q1a.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%2Fq353edn0i27qp8mb4q1a.png" alt="aws11" width="800" height="311"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Step 6: Access the Bucket and Files&lt;br&gt;
Each uploaded object gets a &lt;strong&gt;unique URL&lt;/strong&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%2Fon6cfaql6930qk17k2q6.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%2Fon6cfaql6930qk17k2q6.png" alt="aws12" width="800" height="388"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go to the Objects tab and click on an object to view its &lt;strong&gt;details&lt;/strong&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%2F3hqu4oufd1evjdqso9dg.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%2F3hqu4oufd1evjdqso9dg.png" alt="aws14" width="800" height="391"&gt;&lt;/a&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%2F40lr0k42kflhk8jk2olr.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%2F40lr0k42kflhk8jk2olr.png" alt="aws15" width="800" height="546"&gt;&lt;/a&gt;&lt;br&gt;
Creating a Presigned URL.&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%2Ft2y5344ntlv32lwu7jwi.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%2Ft2y5344ntlv32lwu7jwi.png" alt="aws16" width="800" height="365"&gt;&lt;/a&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%2Ffx35uee4xubc1e6wuj50.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%2Ffx35uee4xubc1e6wuj50.png" alt="aws17" width="800" height="781"&gt;&lt;/a&gt;&lt;br&gt;
Copy the Object &lt;strong&gt;URL&lt;/strong&gt; to share or access the file.&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%2Favw8j9jcicaotpt8cn5x.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%2Favw8j9jcicaotpt8cn5x.png" alt="aws18" width="800" height="79"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Step 7: Automate and Manage Storage &lt;strong&gt;(Optional)&lt;/strong&gt;
Lifecycle Policies: Set up rules to move objects to &lt;strong&gt;cheaper storage tiers&lt;/strong&gt; or &lt;strong&gt;delete them after a specified time&lt;/strong&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%2Ftisjbn00gaetv135pbil.png" alt="aws19" width="800" height="275"&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%2Fdragaezvqkp24y99v3nm.png" alt="aws20" width="800" height="211"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
Congratulations! You’ve successfully created and configured an AWS S3 bucket for your storage needs. S3 buckets can be used for various purposes like hosting static websites, backing up data, or storing application assets.&lt;/p&gt;

&lt;p&gt;For further exploration, try enabling features like Bucket Metrics or configuring Access Logs to monitor usage and performance. Thank you for you time!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>aws</category>
      <category>cloud</category>
    </item>
    <item>
      <title>How to Create an AWS Account, Launch a Windows EC2 Instance, and Install IIS</title>
      <dc:creator>Busa Ayim-Odu</dc:creator>
      <pubDate>Sun, 08 Dec 2024 14:46:40 +0000</pubDate>
      <link>https://dev.to/busa/how-to-create-an-aws-account-launch-a-windows-ec2-instance-and-install-iis-5dj1</link>
      <guid>https://dev.to/busa/how-to-create-an-aws-account-launch-a-windows-ec2-instance-and-install-iis-5dj1</guid>
      <description>&lt;p&gt;&lt;strong&gt;Introduction&lt;/strong&gt;&lt;br&gt;
Creating an &lt;strong&gt;EC2 instance&lt;/strong&gt; on AWS is one of the first steps to getting started with cloud computing. In this guide, you'll learn how to:&lt;/p&gt;

&lt;h2&gt;
  
  
  Create an AWS account.
&lt;/h2&gt;

&lt;p&gt;Launch a Windows EC2 instance.&lt;br&gt;
Install IIS &lt;strong&gt;(Internet Information Services)&lt;/strong&gt; on the Windows instance using the command prompt. Whether you're a beginner or someone brushing up on AWS basics, this tutorial has you covered!&lt;/p&gt;

&lt;p&gt;Step 1: Create an AWS Account&lt;br&gt;
To begin, you'll need an AWS account. Here's how:&lt;/p&gt;

&lt;p&gt;Visit the &lt;strong&gt;AWS Signup&lt;/strong&gt; Page.&lt;br&gt;
Click Create an &lt;strong&gt;AWS Account&lt;/strong&gt;.&lt;br&gt;
Fill in the required details, including:&lt;br&gt;
Email address&lt;br&gt;
Password&lt;br&gt;
Account name&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%2Fifvrluiajkpfy158obmc.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%2Fifvrluiajkpfy158obmc.png" alt="AWS" width="800" height="861"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once your account is created, sign in to the AWS Management Console.&lt;/p&gt;

&lt;p&gt;-&lt;strong&gt;Step 2&lt;/strong&gt;: Launch a &lt;strong&gt;Windows EC2 Instance&lt;/strong&gt;&lt;br&gt;
Navigate to the &lt;strong&gt;AWS Management Console&lt;/strong&gt;.&lt;br&gt;
Search for EC2 in the services search bar and click on it.&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%2Fkutxk6jsqazxkbncmver.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%2Fkutxk6jsqazxkbncmver.png" alt="EC2" width="800" height="346"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Click the Launch Instances button.&lt;/strong&gt;&lt;br&gt;
Configure your instance:&lt;br&gt;
Name: Give your instance a name (e.g., "Windows-IIS-Test").&lt;br&gt;
AMI: Choose Microsoft Windows Server (e.g., Windows Server 2019 Base).&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%2Fm8cwja0l2uvwggli51jr.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%2Fm8cwja0l2uvwggli51jr.png" alt="EC2" width="800" height="549"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Instance Type&lt;/strong&gt;: Select a type like t2.micro (free tier eligible).&lt;br&gt;
&lt;strong&gt;Key Pair&lt;/strong&gt;: Create or select an existing key pair to securely connect to your instance.&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%2Fcw4kbvvubdd15oe4vr9w.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%2Fcw4kbvvubdd15oe4vr9w.png" alt="AWS Key" width="800" height="483"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Network Settings&lt;/strong&gt;: Ensure that RDP (3389) is allowed in the security group.&lt;br&gt;
Review the settings and click Launch Instance.&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%2F6b83ybrf4j2hnolvahs0.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%2F6b83ybrf4j2hnolvahs0.png" alt="AWS Inbound" width="800" height="539"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 3: Connect to Your Windows Instance&lt;br&gt;
Once the instance is running, select it from the EC2 dashboard.&lt;br&gt;
Click Connect and select the RDP Client tab.&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%2Fdpk02k0or431qdu87mun.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%2Fdpk02k0or431qdu87mun.png" alt="AWS" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Download the Remote Desktop File and retrieve the password:&lt;br&gt;
Click Get Password and upload the private key file you downloaded earlier.&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%2Fjwdkv3seyd3q0yv0z8od.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%2Fjwdkv3seyd3q0yv0z8od.png" alt="AWS RDP" width="800" height="500"&gt;&lt;/a&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%2Fn2cjwuz3vhprzzuqm13q.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%2Fn2cjwuz3vhprzzuqm13q.png" alt="AWS" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Decrypt&lt;/strong&gt; and copy the password.&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%2Fxzvb5wlwymx5zcmk56cl.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%2Fxzvb5wlwymx5zcmk56cl.png" alt="AWS2" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use the Remote Desktop Protocol (RDP) to connect to the instance:&lt;br&gt;
Open the downloaded .rdp file in your Remote Desktop client.&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%2Fpwsa3e5lbnypz16dzyzt.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%2Fpwsa3e5lbnypz16dzyzt.png" alt="AWS RDp" width="800" height="303"&gt;&lt;/a&gt;&lt;br&gt;
Enter the username (Administrator) and the decrypted password.&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%2F64ep24y3tjf95yjlaecg.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%2F64ep24y3tjf95yjlaecg.png" alt="AWS" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Step 4: Install IIS on the Windows Instance&lt;br&gt;
Once connected to the instance, open the Command Prompt with administrative privileges.&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%2Flkyzwdgm71oidlzzvewb.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%2Flkyzwdgm71oidlzzvewb.png" alt="AWS Powershell" width="800" height="674"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run the following command to &lt;strong&gt;install IIS&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Powershell&lt;/strong&gt;&lt;br&gt;
Copy code&lt;br&gt;
&lt;strong&gt;Install-WindowsFeature -Name Web-Server -IncludeManagementTools&lt;/strong&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%2Fllg83fr2hhz24hyej5rv.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%2Fllg83fr2hhz24hyej5rv.png" alt="Installing" width="800" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This command&lt;/strong&gt;:&lt;br&gt;
Installs the IIS Web Server role on the Windows instance.&lt;br&gt;
Includes the management tools needed for configuration.&lt;br&gt;
Once the installation is complete, verify that IIS is running:&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%2Frk3bijrq28aoj4xvto4c.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%2Frk3bijrq28aoj4xvto4c.png" alt="AWS Success" width="800" height="371"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open a web browser on your instance.&lt;br&gt;
Enter &lt;strong&gt;&lt;a href="http://localhost" rel="noopener noreferrer"&gt;http://localhost&lt;/a&gt;&lt;/strong&gt; in the address bar.&lt;br&gt;
You should see the default IIS welcome page.&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%2F1e0imx5ks9cvuhczxc9b.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%2F1e0imx5ks9cvuhczxc9b.png" alt="IIS Server" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Step 5&lt;/strong&gt;: Access the IIS Server from Your Local Machine
To make the IIS server accessible from your local machine:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go to the &lt;strong&gt;EC2 Dashboard&lt;/strong&gt;.&lt;br&gt;
Edit the Security Group attached to your instance.&lt;br&gt;
Add a new inbound rule:&lt;br&gt;
Type: HTTP&lt;br&gt;
Protocol: TCP&lt;br&gt;
Port Range: 80&lt;br&gt;
Source: Anywhere (0.0.0.0/0) or your specific IP address.&lt;br&gt;
Save the changes and access your server by visiting the public IP address of your EC2 instance in your local browser:&lt;br&gt;
http://&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%2F28pls1vsiz52a8099ur3.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%2F28pls1vsiz52a8099ur3.png" alt="Local" width="800" height="389"&gt;&lt;/a&gt;&lt;br&gt;
Conclusion&lt;br&gt;
Congratulations! You've successfully:&lt;/p&gt;

&lt;p&gt;Created an &lt;strong&gt;AWS account&lt;/strong&gt;.&lt;br&gt;
Launched a Windows EC2 instance.&lt;br&gt;
Installed IIS and accessed it from your local machine.&lt;br&gt;
This setup is a great starting point for deploying Windows-based web applications in AWS. Let me know in the comments if you have questions or ideas for extending this tutorial!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>tutorial</category>
      <category>aws</category>
      <category>devops</category>
    </item>
    <item>
      <title>Creating Azure DevTest Labs!</title>
      <dc:creator>Busa Ayim-Odu</dc:creator>
      <pubDate>Mon, 25 Nov 2024 13:14:52 +0000</pubDate>
      <link>https://dev.to/busa/creating-azure-devtest-labs-31jl</link>
      <guid>https://dev.to/busa/creating-azure-devtest-labs-31jl</guid>
      <description>&lt;p&gt;&lt;strong&gt;Creating an Azure DevTest Lab&lt;/strong&gt; allows developers and testers to quickly set up and manage isolated environments for building, testing, and experimenting with applications. It provides an efficient, cost-effective solution by leveraging virtual machines and automating infrastructure setups, enabling teams to speed up their development cycles.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In azure portal search for dev test labs and select.
&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%2Fvq1cb2zd8peh7z9jewui.png" alt="Devtest" width="800" height="546"&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Click on +create.&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%2Fokrfgfg0jp20wv79jk2m.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%2Fokrfgfg0jp20wv79jk2m.png" alt="devtest" width="800" height="573"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Give your resource group a name. For example, ayimrg.&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%2Fjt95d2v5ow6rhk7t66ym.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%2Fjt95d2v5ow6rhk7t66ym.png" alt="Image description" width="800" height="484"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Select Auto -shutdown, enable it to on, input the time you want it to shut-down(9pm), activate send notification before shut-down to No.&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%2F0h0m54bq2y1pzn9ly3hu.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%2F0h0m54bq2y1pzn9ly3hu.png" alt="Shut down" width="800" height="528"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Once the review and create is successful, it will be deployed for us.&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%2Fmxwd96lx379iz6s56thb.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%2Fmxwd96lx379iz6s56thb.png" alt="Deployed" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Conclusion:&lt;br&gt;
Azure DevTest Labs simplify the process of managing development and testing environments. With features like cost management, automated deployments, and integration with other Azure services, it allows teams to focus on creating and testing applications without the complexity of managing infrastructure. By using DevTest Labs, organizations can optimize their resources while reducing costs and improving productivity.&lt;/p&gt;

&lt;p&gt;Let me know if you'd like to expand on any part or need further help!&lt;/p&gt;

</description>
      <category>beginners</category>
      <category>devops</category>
      <category>learning</category>
      <category>azure</category>
    </item>
    <item>
      <title>LINUX GUIDE USING UBUNTU</title>
      <dc:creator>Busa Ayim-Odu</dc:creator>
      <pubDate>Thu, 14 Nov 2024 17:37:13 +0000</pubDate>
      <link>https://dev.to/busa/linux-guide-using-ubuntu-41mj</link>
      <guid>https://dev.to/busa/linux-guide-using-ubuntu-41mj</guid>
      <description>&lt;p&gt;&lt;strong&gt;Linux&lt;/strong&gt; is an open-source, Unix-like operating system kernel created by Linus Torvalds in 1991. The kernel is the core part of the operating system, managing system resources and hardware interactions.&lt;/p&gt;

&lt;p&gt;This is a thorough template for an &lt;strong&gt;Ubuntu&lt;/strong&gt; learning guide that covers everything from downloading &lt;strong&gt;Multipass **to **system information&lt;/strong&gt;, &lt;strong&gt;file and directory operations&lt;/strong&gt;, &lt;strong&gt;search and locate&lt;/strong&gt;, and &lt;strong&gt;text file editing&lt;/strong&gt;. Ubuntu is a popular Linux distribution developed by Canonical. &lt;/p&gt;

&lt;p&gt;Download and configure Ubuntu Desktop: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://ubuntu.com/download/desktop" rel="noopener noreferrer"&gt;https://ubuntu.com/download/desktop&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After download follow the default setting to install.&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%2Fvl62gxzkq7zrri6tiuk2.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%2Fvl62gxzkq7zrri6tiuk2.png" alt="Ubuntu 1" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;After it has been successfully installed, it appears like this. Go ahead, configure and start running any virtual machine.&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%2F5cwjfu4dd77z8i3o803b.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%2F5cwjfu4dd77z8i3o803b.png" alt="Ubuntu 2" width="800" height="349"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;This is what it looks like once it is ready for use: To run command as an administrator (user "root"), use "sudo "&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%2F7qld1h8b4nqtvwk9239k.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%2F7qld1h8b4nqtvwk9239k.png" alt="Ubuntu 4" width="800" height="879"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  I'll now go over how to use Powershell to operate an Ubuntu virtual machine.
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;We begin by identifying the "Root user" and using this command to do so "sudo su" as seen below.
&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%2Fuumxenifbwwjqdhuj3c5.png" alt="Root User" width="800" height="74"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Navigating the file system
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;pwd: Print working directory. Shows the current path.&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%2Fyi0mufk2rwkrssr4gwgx.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%2Fyi0mufk2rwkrssr4gwgx.png" alt="HOME DIR" width="800" height="401"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ls: List directory/file content. These shows the contents in the directory/file as shown below. Although we haven't done anything but the command is important and will revisit it.&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%2Fz3gyniz18v7pvtsig13x.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%2Fz3gyniz18v7pvtsig13x.png" alt="ls" width="639" height="249"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mkdir: To create a directory/file. Make we will be create some and listing them out using the ls command.&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%2Fvcbayc4g83ekr6fecz6n.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%2Fvcbayc4g83ekr6fecz6n.png" alt="mkdir" width="800" height="309"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;ls -l: shows directory/files with detailed information.&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%2Ffvbu4jeskwguywj109b6.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%2Ffvbu4jeskwguywj109b6.png" alt="ls -l" width="773" height="497"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cd ..: Move you in and out directory level. cd as means change directory.&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%2Fvb3a61pn6e4wn3sta61p.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%2Fvb3a61pn6e4wn3sta61p.png" alt="cd .." width="800" height="535"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;To play around with firsts of commands and introduce some common commands like:&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;history: this shows you all commands carried out&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;exit: Exit the root/ or current path.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;clear: Clear the terminal&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%2Fuj5638nwexs06ucvedx7.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%2Fuj5638nwexs06ucvedx7.png" alt="Exit" width="683" height="842"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;touch: to create an empty file. touch newfile.txt&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%2Fvanxokcxdhg3j7uvfnu3.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%2Fvanxokcxdhg3j7uvfnu3.png" alt="touch" width="800" height="389"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;cp: Copy file or directory. I copied a file into directory Busaspace1 and leaving the original copy in it folder&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%2Fsdsfopk4ajk6s2f0v8hj.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%2Fsdsfopk4ajk6s2f0v8hj.png" alt="CP" width="800" height="257"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;mv: move file to different locations/paths. Just like the command "cp". Moving a file to directory Busaspace2.&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%2Fhfgnj99v7xlciidh63jf.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%2Fhfgnj99v7xlciidh63jf.png" alt="move" width="800" height="347"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rm: This command remove/delete files.&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%2Flgn7h6t87ey326mqewl6.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%2Flgn7h6t87ey326mqewl6.png" alt="rm" width="800" height="214"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;rmdir: This command remove/delete directory.&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%2Fd81dwyq5v4448z5ppvgc.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%2Fd81dwyq5v4448z5ppvgc.png" alt="rmdir" width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Viewing and Editing files
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;cat: Display the contents of a file. After editing a file using the command "vim", I used cat to show the content edited without opening the whole file
&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%2Fai7157o9hkil4w2807h5.png" alt="cat" width="800" height="342"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;vim: is an editor. Open file and allows you to edit a file after pressing the i key for insert.&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%2Fzyejzlb5edy35016oauc.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%2Fzyejzlb5edy35016oauc.png" alt="vim" width="800" height="958"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  System Information and Management
&lt;/h2&gt;

&lt;p&gt;uname -a: Display detailed information about the system&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%2F3ytnc2hscw3lat8ngbiu.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%2F3ytnc2hscw3lat8ngbiu.png" alt="uname" width="800" height="90"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;df -h: Display disk space usage.&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%2Flh41ddbguukkxt2d8qo2.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%2Flh41ddbguukkxt2d8qo2.png" alt="disk" width="800" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;free -h: Displays usage and available space&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%2F3hz7f9hekguc9ync317d.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%2F3hz7f9hekguc9ync317d.png" alt="Free" width="800" height="281"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;top: Display running process and system resource usage. And to stop it press Ctrl C if the terminal keeps running.
&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%2Firmjhqkjuxnm0o9ze1c4.png" alt="Top" width="800" height="640"&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Search and Find/Locate
&lt;/h2&gt;

&lt;p&gt;-grep [pattern or search item][file]: Search for a pattern within a file.&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%2Fqtlrths1gl0gwvwfnimd.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%2Fqtlrths1gl0gwvwfnimd.png" alt="vim2" width="800" height="958"&gt;&lt;/a&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%2Fi5pbaklafspunx9u7mqc.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%2Fi5pbaklafspunx9u7mqc.png" alt="grep" width="800" height="223"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How to quit a text editor
&lt;/h2&gt;

&lt;p&gt;![quit](&lt;a href="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/72mid4izrxay8kwns4pw.png%5C" rel="noopener noreferrer"&gt;https://dev-to-uploads.s3.amazonaws.com/uploads/articles/72mid4izrxay8kwns4pw.png\&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Task&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How does one quit a vim file?&lt;/li&gt;
&lt;li&gt;how do you list the content of a directory?&lt;/li&gt;
&lt;li&gt;what command can be used to delete the content of a directory?&lt;/li&gt;
&lt;li&gt;What command can be used to switch from a normal user to a root user?&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>beginners</category>
      <category>devops</category>
      <category>learning</category>
      <category>linux</category>
    </item>
  </channel>
</rss>
