<?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: Olajide Ajisegiri</title>
    <description>The latest articles on DEV Community by Olajide Ajisegiri (@ajisegiri_ademola_681df5c).</description>
    <link>https://dev.to/ajisegiri_ademola_681df5c</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%2F2335388%2Fe8122853-dd49-4951-83e3-e586aaad92c1.jpg</url>
      <title>DEV Community: Olajide Ajisegiri</title>
      <link>https://dev.to/ajisegiri_ademola_681df5c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ajisegiri_ademola_681df5c"/>
    <language>en</language>
    <item>
      <title>"Development and Deployment of a Number Classification API with Mathematical Insights and Fun Facts". HNG task 1."</title>
      <dc:creator>Olajide Ajisegiri</dc:creator>
      <pubDate>Mon, 10 Feb 2025 00:38:11 +0000</pubDate>
      <link>https://dev.to/ajisegiri_ademola_681df5c/development-and-deployment-of-a-number-classification-api-with-mathematical-insights-and-fun-29l9</link>
      <guid>https://dev.to/ajisegiri_ademola_681df5c/development-and-deployment-of-a-number-classification-api-with-mathematical-insights-and-fun-29l9</guid>
      <description>&lt;h2&gt;
  
  
  &lt;strong&gt;Overview&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;The Number Classification API is a lightweight and efficient HTTP-based service designed to classify numbers based on their mathematical properties. This API is deployed using AWS Lambda and API Gateway, ensuring a serverless, cost-effective, and highly scalable architecture. By leveraging cloud-native technologies, the API delivers seamless performance while remaining publicly accessible, making it an ideal solution for real-time number classification and mathematical analysis.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Features&lt;/strong&gt;
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Mathematical Property Calculation:&lt;/strong&gt; Determines whether a number is prime, odd, armstrong, perfect, digit sum etc.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Fun Fact Retrieval:&lt;/strong&gt; Fetches a fun fact about the number from an external API&lt;/li&gt;
&lt;li&gt;Supports multiple number classifications in a single request.&lt;/li&gt;
&lt;li&gt;** JSON:** based responses.&lt;/li&gt;
&lt;li&gt;** CORS:**enabled for public access.&lt;/li&gt;
&lt;li&gt;** Deployment:** Must be deployed to a publicly accessible endpoint.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Architecture Diagram.&lt;/strong&gt;
&lt;/h2&gt;

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

&lt;p&gt;&lt;strong&gt;This API is deployed using:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AWS Lambda for serverless execution.&lt;br&gt;
API Gateway for exposing the endpoint.&lt;br&gt;
GitHub for version control.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technologies Used:&lt;/strong&gt;&lt;br&gt;
Python (Lambda function)&lt;br&gt;
AWS Lambda (Serverless execution)&lt;br&gt;
API Gateway (Public API exposure)&lt;br&gt;
GitHub (Version control and CI/CD)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Project Structure&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Number-Classification-API/
│-- lambda_function.py  # Main Lambda function
│-- requirements.txt    # Python dependencies
│-- README.md           # Project documentation
│-- .gitignore          # Git ignore file
└── app.py              # Python scripts
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Setting up&lt;/strong&gt;&lt;br&gt;
Create a folder for your project.&lt;/p&gt;

&lt;p&gt;Open the folder on your VScode editor.&lt;/p&gt;

&lt;p&gt;create app.py and lambda-function.py files.&lt;/p&gt;

&lt;p&gt;Open your github account and create a repository (Number-Classifier-API).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Set up Instructions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Clone the Repository&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone https://github.com/Ajisegiri123/number-classifier-api.git

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;- Change your directory to the project folder and then to your repository on your terminal.&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cd HNG-Task
cd number-classification-api
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Create and Activate Virtual Environment&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python -m venv venv
Source venv\Scripts\activate
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Install Dependencies&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pip install flask flask-cors
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F2u4nvsfpegstxuzuw301.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2u4nvsfpegstxuzuw301.jpg" alt="Image description" width="800" height="445"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create the Flask App&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Create a file called app.py in your project folder&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;from flask import Flask, request, jsonify
from flask_cors import CORS

app = Flask(__name__)
CORS(app)  # Enable CORS

# Function to check if a number is prime
def is_prime(n):
    if n &amp;lt; 2:
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

# Function to check if a number is a perfect number
def is_perfect(n):
    return n == sum(i for i in range(1, n) if n % i == 0)

# Function to check if a number is an Armstrong number
def is_armstrong(n):
    digits = [int(d) for d in str(n)]
    power = len(digits)
    return n == sum(d**power for d in digits)

# Function to generate fun facts
def get_fun_fact(n):
    if is_armstrong(n):
        return f"{n} is an Armstrong number because {' + '.join([f'{d}^{len(str(n))}' for d in str(n)])} = {n}"
    elif is_prime(n):
        return f"{n} is a prime number because it has only two divisors: 1 and itself."
    elif is_perfect(n):
        return f"{n} is a perfect number because the sum of its proper divisors equals the number."
    else:
        return f"{n} is just an interesting number!"

@app.route('/api/classify-number', methods=['GET'])
def classify_number():
    num = request.args.get('number')

    if not num or not num.isdigit():
        return jsonify({"number": num, "error": True}), 400

    num = int(num)

    response = {
        "number": num,
        "is_prime": is_prime(num),
        "is_perfect": is_perfect(num),
        "properties": ["odd" if num % 2 else "even"],
        "digit_sum": sum(int(d) for d in str(num)),
        "fun_fact": get_fun_fact(num)
    }

    if is_armstrong(num):
        response["properties"].append("armstrong")

    return jsonify(response)

if __name__ == '__main__':
    app.run(debug=True)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Function to check if a number is prime
&lt;/h1&gt;

&lt;p&gt;def is_prime(n):&lt;br&gt;
    if n &amp;lt; 2:&lt;br&gt;
        return False&lt;br&gt;
    for i in range(2, int(n ** 0.5) + 1):&lt;br&gt;
        if n % i == 0:&lt;br&gt;
            return False&lt;br&gt;
    return True&lt;/p&gt;
&lt;h1&gt;
  
  
  Function to check if a number is a perfect number
&lt;/h1&gt;

&lt;p&gt;def is_perfect(n):&lt;br&gt;
    return n == sum(i for i in range(1, n) if n % i == 0)&lt;/p&gt;
&lt;h1&gt;
  
  
  Function to check if a number is an Armstrong number
&lt;/h1&gt;

&lt;p&gt;def is_armstrong(n):&lt;br&gt;
    digits = [int(d) for d in str(n)]&lt;br&gt;
    power = len(digits)&lt;br&gt;
    return n == sum(d**power for d in digits)&lt;/p&gt;
&lt;h1&gt;
  
  
  Function to generate fun facts
&lt;/h1&gt;

&lt;p&gt;def get_fun_fact(n):&lt;br&gt;
    if is_armstrong(n):&lt;br&gt;
        return f"{n} is an Armstrong number because {' + '.join([f'{d}^{len(str(n))}' for d in str(n)])} = {n}"&lt;br&gt;
    elif is_prime(n):&lt;br&gt;
        return f"{n} is a prime number because it has only two divisors: 1 and itself."&lt;br&gt;
    elif is_perfect(n):&lt;br&gt;
        return f"{n} is a perfect number because the sum of its proper divisors equals the number."&lt;br&gt;
    else:&lt;br&gt;
        return f"{n} is just an interesting number!"&lt;/p&gt;

&lt;p&gt;@app.route('/api/classify-number', methods=['GET'])&lt;br&gt;
def classify_number():&lt;br&gt;
    num = request.args.get('number')&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;if not num or not num.isdigit():
    return jsonify({"number": num, "error": True}), 400

num = int(num)

response = {
    "number": num,
    "is_prime": is_prime(num),
    "is_perfect": is_perfect(num),
    "properties": ["odd" if num % 2 else "even"],
    "digit_sum": sum(int(d) for d in str(num)),
    "fun_fact": get_fun_fact(num)
}

if is_armstrong(num):
    response["properties"].append("armstrong")

return jsonify(response)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;if &lt;strong&gt;name&lt;/strong&gt; == '&lt;strong&gt;main&lt;/strong&gt;':&lt;br&gt;
    app.run(debug=True)&lt;/p&gt;

&lt;p&gt;Run the API Locally&lt;br&gt;
python app.py&lt;br&gt;
Image description&lt;/p&gt;

&lt;p&gt;Open your browser to test the API:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://127.0.0.1:5000/api/classify-number?number=153" rel="noopener noreferrer"&gt;http://127.0.0.1:5000/api/classify-number?number=153&lt;/a&gt;&lt;br&gt;
JSON Response&lt;/p&gt;

&lt;p&gt;Image description&lt;/p&gt;

&lt;p&gt;Deploy the API&lt;br&gt;
Create lambda_function.py&lt;/p&gt;

&lt;p&gt;import json&lt;/p&gt;

&lt;p&gt;def is_prime(n):&lt;br&gt;
    if n &amp;lt; 2:&lt;br&gt;
        return False&lt;br&gt;
    for i in range(2, int(n ** 0.5) + 1):&lt;br&gt;
        if n % i == 0:&lt;br&gt;
            return False&lt;br&gt;
    return True&lt;/p&gt;

&lt;p&gt;def is_perfect(n):&lt;br&gt;
    return n == sum(i for i in range(1, n) if n % i == 0)&lt;/p&gt;

&lt;p&gt;def is_armstrong(n):&lt;br&gt;
    digits = [int(d) for d in str(n)]&lt;br&gt;
    power = len(digits)&lt;br&gt;
    return n == sum(d**power for d in digits)&lt;/p&gt;

&lt;p&gt;def get_fun_fact(n):&lt;br&gt;
    if is_armstrong(n):&lt;br&gt;
        return f"{n} is an Armstrong number because {' + '.join([f'{d}^{len(str(n))}' for d in str(n)])} = {n}"&lt;br&gt;
    elif is_prime(n):&lt;br&gt;
        return f"{n} is a prime number because it has only two divisors: 1 and itself."&lt;br&gt;
    elif is_perfect(n):&lt;br&gt;
        return f"{n} is a perfect number because the sum of its proper divisors equals the number."&lt;br&gt;
    else:&lt;br&gt;
        return f"{n} is just an interesting number!"&lt;/p&gt;

&lt;p&gt;def lambda_handler(event, context):&lt;br&gt;
    try:&lt;br&gt;
        query_params = event.get("queryStringParameters", {})&lt;br&gt;
        num = query_params.get("number", "")&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    if not num.isdigit():
        return {
            "statusCode": 400,
            "headers": {
                "Content-Type": "application/json",
                "Access-Control-Allow-Origin": "*"
            },
            "body": json.dumps({"number": num, "error": True})
        }

    num = int(num)

    response = {
        "number": num,
        "is_prime": is_prime(num),
        "is_perfect": is_perfect(num),
        "properties": ["odd" if num % 2 else "even"],
        "digit_sum": sum(int(d) for d in str(num)),
        "fun_fact": get_fun_fact(num)
    }

    if is_armstrong(num):
        response["properties"].append("armstrong")

    return {
        "statusCode": 200,
        "headers": {
            "Content-Type": "application/json",
            "Access-Control-Allow-Origin": "*"
        },
        "body": json.dumps(response)
    }

except Exception as e:
    return {
        "statusCode": 500,
        "headers": {
            "Content-Type": "application/json",
            "Access-Control-Allow-Origin": "*"
        },
        "body": json.dumps({"error": str(e)})
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&amp;gt;Run the API Locally&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;python app.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;&amp;gt;Open your browser to test the API:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;http://127.0.0.1:5000/api/classify-number?number=153
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;JSON Response&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Deploy the API&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

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

def is_prime(n):
    if n &amp;lt; 2 or n % 1 != 0:  # Exclude negative and non-integer values
        return False
    for i in range(2, int(n ** 0.5) + 1):
        if n % i == 0:
            return False
    return True

def is_perfect(n):
    if n &amp;lt;= 0 or n % 1 != 0:  # Exclude zero and non-integers
        return False
    return n == sum(i for i in range(1, int(n)) if n % i == 0)

def is_armstrong(n):
    if n % 1 != 0:  # Only consider integers
        return False
    digits = [int(d) for d in str(abs(int(n))) if d.isdigit()]
    power = len(digits)
    return n == sum(d**power for d in digits)

def get_fun_fact(n):
    if is_armstrong(n):
        return f"{n} is an Armstrong number because {' + '.join([f'{d}^{len(str(abs(int(n))))}' for d in str(abs(int(n))) if d.isdigit()])} = {n}"
    elif is_prime(n):
        return f"{n} is a prime number because it has only two divisors: 1 and itself."
    elif is_perfect(n):
        return f"{n} is a perfect number because the sum of its proper divisors equals the number."
    else:
        return f"{n} is just an interesting number!"

def lambda_handler(event, context):
    try:
        query_params = event.get("queryStringParameters", {})
        num = query_params.get("number", "")

        try:
            num = float(num)  # Convert input to float
        except ValueError:
            return {
                "statusCode": 400,
                "headers": {
                    "Content-Type": "application/json",
                    "Access-Control-Allow-Origin": "*"
                },
                "body": json.dumps({"number": num, "error": "Invalid number"})
            }

        response = {
            "number": num,
            "is_prime": is_prime(num),
            "is_perfect": is_perfect(num),
            "properties": [],
            "digit_sum": sum(int(d) for d in str(abs(int(num))) if d.isdigit()) if num % 1 == 0 else None,
            "fun_fact": get_fun_fact(num)
        }

        # Assign correct properties
        if num % 1 == 0:  # Only process whole numbers
            response["properties"].append("odd" if int(num) % 2 else "even")
            if is_armstrong(num):
                response["properties"].append("armstrong")

        return {
            "statusCode": 200,
            "headers": {
                "Content-Type": "application/json",
                "Access-Control-Allow-Origin": "*"
            },
            "body": json.dumps(response)
        }

    except Exception as e:
        return {
            "statusCode": 500,
            "headers": {
                "Content-Type": "application/json",
                "Access-Control-Allow-Origin": "*"
            },
            "body": json.dumps({"error": str(e)})
        }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Package and Deploy to AWS Lambda&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;zip function.zip lambda_function.py
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Create an API gateway&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Choose HTTP API.&lt;/li&gt;
&lt;li&gt;Add Integration → Choose Lambda Function. &lt;/li&gt;
&lt;li&gt;Select your Lambda function (number-classifier-aPI). &lt;/li&gt;
&lt;li&gt;Enter /api/classify-number as the route. &lt;/li&gt;
&lt;li&gt;Choose GET as the method.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Then Deploy.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Test your API&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Once deployed, copy the API Gateway URL and test it in your browser&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://127.0.0.1:5000/api/classify-number?number=1895
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fewmcmxbf06eiecnv3419.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fewmcmxbf06eiecnv3419.jpg" alt="Image description" width="645" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Enable CORS in API Gateway.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Significance of the project.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This project serves as a practical platform for developing and demonstrating core DevOps competencies. Despite its simplicity, it provides hands-on experience in building, deploying, and managing a real-world application, which is highly valuable in the industry. By implementing best practices and integrating advanced DevOps techniques, the project enhances technical proficiency, making it an excellent opportunity for skill development and showcasing expertise in modern software deployment and automation.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>github</category>
      <category>api</category>
      <category>serverless</category>
    </item>
    <item>
      <title>Configuring NGINX Web Server on Amazon EC2 Instance using Ubuntu server. My Stage 0 DevOps Task</title>
      <dc:creator>Olajide Ajisegiri</dc:creator>
      <pubDate>Mon, 03 Feb 2025 21:11:50 +0000</pubDate>
      <link>https://dev.to/ajisegiri_ademola_681df5c/configuring-nginx-web-server-on-amazon-ec2-instance-using-ubuntu-server-my-stage-0-devops-task-4bpg</link>
      <guid>https://dev.to/ajisegiri_ademola_681df5c/configuring-nginx-web-server-on-amazon-ec2-instance-using-ubuntu-server-my-stage-0-devops-task-4bpg</guid>
      <description>&lt;p&gt;&lt;strong&gt;INTRODUCTION&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;In today's digital landscape, ensuring a website can handle millions of requests without crashing requires a well-optimized web server. NGINX is a widely recognized choice due to its speed, efficiency, and scalability.&lt;/p&gt;

&lt;p&gt;This post provides a comprehensive, step-by-step guide to setting up and configuring an NGINX web server on an Amazon EC2 instance running Ubuntu Server. I will walk you through the installation process and essential configurations to optimize performance.&lt;/p&gt;

&lt;p&gt;This project marks the beginning of my journey in the HNG DevOps Internship Training, where I am gaining hands-on experience in deploying and managing scalable web applications.&lt;/p&gt;

&lt;p&gt;Stay tuned as I break down the process to help you get started with NGINX on AWS!&lt;/p&gt;

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

&lt;p&gt;*Launch an Amazon EC2 Instance.&lt;/p&gt;

&lt;p&gt;Instance name:  nginx server&lt;br&gt;
AMI: Ubuntu server 24.04&lt;br&gt;
Instance type: t2 micro&lt;br&gt;
Key pair: nginx-key1&lt;br&gt;
Security group: Allow SHH traffic form anywhere&lt;br&gt;
port: Port 80 (HTTP): This allows access to your web server over 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%2F6m0huqmrkiyi3blh2y88.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6m0huqmrkiyi3blh2y88.png" alt="Image description" width="800" height="147"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connect to the EC2 instance:&lt;/p&gt;

&lt;p&gt;Connect this by selecting on your instance, click connect and use Ec2 direct connect.&lt;/p&gt;

&lt;p&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%2Fbfcgeefj1co2c4yhbpn3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbfcgeefj1co2c4yhbpn3.png" alt="Image description" width="800" height="87"&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%2Fulrjym9j8y38s993hb0b.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fulrjym9j8y38s993hb0b.png" alt="Image description" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Installation of Nginx:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pm9vswpng4qoanxul1f.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2pm9vswpng4qoanxul1f.png" alt="Image description" width="800" height="100"&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%2F4mlryh3wnnsgcl7u9ltk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4mlryh3wnnsgcl7u9ltk.png" alt="Image description" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Start and enable nginx to run on boot:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9cb6lebcs4nlbfkm2nj3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9cb6lebcs4nlbfkm2nj3.png" alt="Image description" width="800" height="110"&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%2Fbhvb1kyenhhe12shwzvn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbhvb1kyenhhe12shwzvn.png" alt="Image description" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configure the html page:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;First open the index.html 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%2Fycwwk90axin5u9pucyd0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fycwwk90axin5u9pucyd0.png" alt="Image description" width="800" height="78"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then,&lt;br&gt;
Add the html content&lt;br&gt;
Save and exist&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%2Fat3qmll73dhv5s068xed.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fat3qmll73dhv5s068xed.png" alt="Image description" width="800" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Restart the nginx server to effect the change:&lt;/strong&gt;&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Verify if the nginx web server is running:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4467ym3lnbh6u03fzfxf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4467ym3lnbh6u03fzfxf.png" alt="Image description" width="800" height="104"&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%2Fpial4kpwxetvdnrp04dw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpial4kpwxetvdnrp04dw.png" alt="Image description" width="800" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Open a web browser and verify:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjo4pynxplsz7yakhuo9v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjo4pynxplsz7yakhuo9v.png" alt="Image description" width="800" height="74"&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%2Ffe5jdwifohb1z4sbbb4s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffe5jdwifohb1z4sbbb4s.png" alt="Image description" width="800" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Challenges Faced During This Project&lt;/strong&gt;&lt;br&gt;
One of the key challenges I encountered while setting up my EC2 instance was an issue with the CIDR block configuration. Initially, I kept receiving an error message indicating that my chosen CIDR block was overlapping with an existing one. To resolve this, I had to select a different CIDR block that did not conflict with my previous configurations. This experience reinforced the importance of understanding networking fundamentals when working with cloud infrastructure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
By following these steps, you now have a fully functional NGINX web server running on your AWS EC2 instance. Mastering this process is an essential skill for developers and DevOps engineers, as it enables seamless deployment of websites, APIs, and other web applications. With NGINX's high performance and reliability, you have a strong foundation to build and scale your projects efficiently.&lt;/p&gt;

&lt;p&gt;This project has been an invaluable learning experience in my HNG DevOps Internship Training, and I look forward to exploring more advanced cloud configurations in the future. &lt;/p&gt;

&lt;p&gt;REFERENCES:&lt;br&gt;
&lt;a href="https://hng.tech/hire/devops-engineers" rel="noopener noreferrer"&gt;DevOps Engineer&lt;/a&gt;&lt;br&gt;
&lt;a href="https://hng.tech/hire/cloud-engineers" rel="noopener noreferrer"&gt;Cloud Engineers.&lt;/a&gt;&lt;br&gt;
&lt;a href="https://hng.tech/hire/infrastructure-engineers" rel="noopener noreferrer"&gt;Infrastructure Engineers.&lt;/a&gt;&lt;br&gt;
&lt;a href="https://hng.tech/hire/aws-solutions-architects" rel="noopener noreferrer"&gt;AWS Solutions Architects.&lt;/a&gt;&lt;br&gt;
&lt;a href="https://hng.tech/hire/azure-devops-engineers" rel="noopener noreferrer"&gt;Azure DevOps Engineer.&lt;/a&gt;&lt;br&gt;
&lt;a href="https://hng.tech/hire/google-cloud-engineers" rel="noopener noreferrer"&gt;Google Cloud Engineer.&lt;/a&gt;&lt;br&gt;
&lt;a href="https://hng.tech/hire/ci-cd-pipeline-engineers" rel="noopener noreferrer"&gt;CI/CD Pipeline Engineers..&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cloud</category>
      <category>html</category>
      <category>aws</category>
    </item>
  </channel>
</rss>
