<?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: nithish rodrigo</title>
    <description>The latest articles on DEV Community by nithish rodrigo (@nithish_rodrigo).</description>
    <link>https://dev.to/nithish_rodrigo</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3066274%2F28fa1af1-5890-4dca-99e7-bd3cd6a7e16e.jpg</url>
      <title>DEV Community: nithish rodrigo</title>
      <link>https://dev.to/nithish_rodrigo</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/nithish_rodrigo"/>
    <language>en</language>
    <item>
      <title>How I Connected GitHub Copilot in VS Code to GitHub Using MCP</title>
      <dc:creator>nithish rodrigo</dc:creator>
      <pubDate>Fri, 21 Aug 2026 12:18:32 +0000</pubDate>
      <link>https://dev.to/nithish_rodrigo/how-i-connected-github-copilot-in-vs-code-to-github-using-mcp-19el</link>
      <guid>https://dev.to/nithish_rodrigo/how-i-connected-github-copilot-in-vs-code-to-github-using-mcp-19el</guid>
      <description>&lt;h2&gt;
  
  
  Understanding MCP Through a Practical Example
&lt;/h2&gt;

&lt;p&gt;Recently, I’ve been learning about &lt;strong&gt;Model Context Protocol (MCP)&lt;/strong&gt; and wanted to understand it beyond the theory.&lt;/p&gt;

&lt;p&gt;Instead of just reading about MCP, I decided to try a practical integration:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Connect GitHub Copilot in VS Code to GitHub using the GitHub MCP Server.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This helped me understand how AI agents can interact with external systems and why MCP is becoming an important part of the AI ecosystem.&lt;/p&gt;




&lt;h2&gt;
  
  
  What is MCP?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;MCP (Model Context Protocol)&lt;/strong&gt; is a standardized protocol that allows AI applications and agents to communicate with external tools, services, and data sources.&lt;/p&gt;

&lt;p&gt;For example, an AI agent may need to interact with:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;GitHub&lt;/li&gt;
&lt;li&gt;Jira&lt;/li&gt;
&lt;li&gt;AWS&lt;/li&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;li&gt;Internal documentation&lt;/li&gt;
&lt;li&gt;Monitoring systems&lt;/li&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Without a standard integration mechanism, each AI application would potentially need its own custom integration for every service.&lt;/p&gt;

&lt;p&gt;MCP provides a standardized approach.&lt;/p&gt;

&lt;p&gt;A simplified architecture looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI Application / Agent
(Claude, Copilot, ChatGPT)
          │
          │ MCP Protocol
          ▼
      MCP Server
          │
          │ API / SDK / Service Integration
          ▼
External System
(GitHub, AWS, Jira, Database)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  How is MCP Similar to REST APIs?
&lt;/h2&gt;

&lt;p&gt;When I first tried to understand MCP, I compared it with a traditional REST API architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  Traditional API communication
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client
(Postman / Application)
        │
        │ HTTP
        ▼
API Server
        │
        ▼
Application / Service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example, when using the GitHub REST API, a developer might manually call an endpoint like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET /repos/{owner}/{repo}/issues
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The client needs to know:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Which API endpoint to call&lt;/li&gt;
&lt;li&gt;Which HTTP method to use&lt;/li&gt;
&lt;li&gt;Which parameters are required&lt;/li&gt;
&lt;li&gt;How authentication works&lt;/li&gt;
&lt;li&gt;How to process the response&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With MCP, the interaction can be more agent-oriented.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;AI Agent
   │
   │ MCP
   ▼
MCP Server
   │
   ▼
External Service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of manually calling an API endpoint, you can tell the AI:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Show me all open issues in this repository."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The AI agent can then determine which available tool is appropriate and use it through the MCP server.&lt;/p&gt;




&lt;h1&gt;
  
  
  My Practical Example: GitHub Copilot + GitHub MCP Server
&lt;/h1&gt;

&lt;p&gt;For this experiment, I used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Visual Studio Code&lt;/li&gt;
&lt;li&gt;GitHub Copilot&lt;/li&gt;
&lt;li&gt;GitHub MCP Server&lt;/li&gt;
&lt;li&gt;GitHub authentication&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The architecture looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Developer
    │
    ▼
VS Code
    │
    ▼
GitHub Copilot
    │
    │ MCP
    ▼
GitHub MCP Server
    │
    │ GitHub APIs / Services
    ▼
GitHub
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;GitHub Copilot acts as the AI-powered client that can use tools exposed through the MCP server.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Configure the GitHub MCP Server
&lt;/h2&gt;

&lt;p&gt;In VS Code, MCP servers can be configured using an &lt;code&gt;mcp.json&lt;/code&gt; configuration.&lt;/p&gt;

&lt;p&gt;For the remote GitHub MCP server, the configuration looks similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"servers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"github"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"http"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.githubcopilot.com/mcp/"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once configured, VS Code can connect to the MCP server.&lt;br&gt;
for more on configuration check &lt;a href="https://github.com/nithish1991/MCP-Notes.git" rel="noopener noreferrer"&gt;here&lt;/a&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Step 2: Authenticate with GitHub
&lt;/h2&gt;

&lt;p&gt;Since the MCP server needs permission to access GitHub resources, an authentication flow is required.&lt;/p&gt;

&lt;p&gt;The flow is approximately:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;VS Code
   │
   ▼
GitHub Copilot
   │
   ▼
GitHub MCP Server
   │
   │ Authentication Required
   ▼
GitHub OAuth
   │
   ▼
User Approves Access
   │
   ▼
MCP Server Can Access Authorized Resources
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;MCP defines how the AI application and MCP server communicate.&lt;/p&gt;

&lt;p&gt;Authentication and authorization determine:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Who are you, and what are you allowed to access?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h1&gt;
  
  
  Step 3: Let Copilot Use GitHub as a Tool
&lt;/h1&gt;

&lt;p&gt;After connecting the MCP server, I can ask GitHub Copilot questions such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Show me my open GitHub issues."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Get information about this repository and explain its architecture."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Or even:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Create a GitHub issue titled 'Add Terraform deployment documentation'."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Behind the scenes, the interaction looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. User
      │
      │ "Show me open issues"
      ▼

2. GitHub Copilot / AI Agent
      │
      │ Determines GitHub data is required
      ▼

3. MCP Client
      │
      │ MCP Request
      ▼

4. GitHub MCP Server
      │
      │ Interacts with GitHub
      ▼

5. GitHub
      │
      │ Returns Data
      ▼

6. GitHub MCP Server
      │
      │ MCP Response
      ▼

7. Copilot
      │
      ▼

8. User receives the result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  Tools, Resources, and Context
&lt;/h1&gt;

&lt;p&gt;One of the things that made MCP clearer for me was understanding that MCP servers can expose capabilities to AI agents.&lt;/p&gt;

&lt;p&gt;For example, an MCP server may provide &lt;strong&gt;tools&lt;/strong&gt; such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;get_repository()
list_issues()
create_issue()
get_pull_request()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It may also provide access to &lt;strong&gt;resources&lt;/strong&gt;, such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Repository information&lt;/li&gt;
&lt;li&gt;Source code&lt;/li&gt;
&lt;li&gt;Documentation&lt;/li&gt;
&lt;li&gt;Issues&lt;/li&gt;
&lt;li&gt;Pull requests&lt;/li&gt;
&lt;li&gt;Infrastructure information&lt;/li&gt;
&lt;li&gt;Logs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The AI agent can discover the capabilities available from the MCP server and use the appropriate one based on the user's request.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why I Think MCP is Interesting
&lt;/h1&gt;

&lt;p&gt;As someone working in Cloud and TechOps, I find MCP particularly interesting because I can imagine many practical use cases.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GitHub Copilot / AI Agent
           │
           ├── GitHub MCP Server
           │
           ├── AWS MCP Server
           │
           ├── Jira MCP Server
           │
           ├── Monitoring MCP Server
           │
           └── Internal Documentation MCP Server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Imagine asking an AI agent:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"A production deployment failed. Check the GitHub pull request, investigate the AWS environment, review the monitoring alerts, and create a Jira incident with your findings."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The AI agent could potentially interact with multiple systems through MCP servers.&lt;/p&gt;

&lt;p&gt;Of course, proper authentication, authorization, approval mechanisms, and security controls would be essential, especially when the agent can perform actions in production environments.&lt;/p&gt;




&lt;h1&gt;
  
  
  My Biggest Takeaway
&lt;/h1&gt;

&lt;p&gt;The easiest way I currently understand MCP is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;MCP is a standardized integration layer that allows AI agents to discover and interact with external tools and data sources.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A simplified comparison would be:&lt;br&gt;
&lt;/p&gt;

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

Developer
   │
   ▼
Application Code
   │
   ▼
REST API
   │
   ▼
External Service
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Whereas an MCP-enabled workflow can look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User
   │
   ▼
AI Agent
   │
   ▼
MCP Client
   │
   ▼
MCP Server
   │
   ▼
Tools / APIs / Data / External Services
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of building a completely custom integration for every AI application and external service, MCP provides a common protocol for connecting them.&lt;/p&gt;

</description>
      <category>mcp</category>
      <category>ai</category>
      <category>githubcopilot</category>
      <category>github</category>
    </item>
    <item>
      <title>🐳 Why Docker, Why Kubernetes and Why Did It Change DevOps Forever?</title>
      <dc:creator>nithish rodrigo</dc:creator>
      <pubDate>Mon, 03 Aug 2026 10:39:29 +0000</pubDate>
      <link>https://dev.to/nithish_rodrigo/why-docker-why-kubernetes-and-why-did-it-change-devops-forever-30k3</link>
      <guid>https://dev.to/nithish_rodrigo/why-docker-why-kubernetes-and-why-did-it-change-devops-forever-30k3</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/nithish_rodrigo/why-docker-why-kubernetes-and-why-did-it-change-devops-forever-1egh" class="crayons-story__hidden-navigation-link"&gt;🐳 Why Docker, Why Kubernetes and Why Did It Change DevOps Forever?&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/nithish_rodrigo" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3066274%2F28fa1af1-5890-4dca-99e7-bd3cd6a7e16e.jpg" alt="nithish_rodrigo profile" class="crayons-avatar__image" width="96" height="96"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/nithish_rodrigo" class="crayons-story__secondary fw-medium m:hidden"&gt;
              nithish rodrigo
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                nithish rodrigo
                
                
              
              &lt;div id="story-author-preview-content-4288730" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/nithish_rodrigo" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3066274%2F28fa1af1-5890-4dca-99e7-bd3cd6a7e16e.jpg" class="crayons-avatar__image" alt="" width="96" height="96"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;nithish rodrigo&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/nithish_rodrigo/why-docker-why-kubernetes-and-why-did-it-change-devops-forever-1egh" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 1&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/nithish_rodrigo/why-docker-why-kubernetes-and-why-did-it-change-devops-forever-1egh" id="article-link-4288730"&gt;
          🐳 Why Docker, Why Kubernetes and Why Did It Change DevOps Forever?
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/docker"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;docker&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/kubernetes"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;kubernetes&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/devops"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;devops&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/cicd"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;cicd&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
            &lt;a href="https://dev.to/nithish_rodrigo/why-docker-why-kubernetes-and-why-did-it-change-devops-forever-1egh#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              

              &lt;span class="hidden s:inline"&gt;Add&amp;nbsp;Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
    </item>
    <item>
      <title>🐳 Why Docker, Why Kubernetes and Why Did It Change DevOps Forever?</title>
      <dc:creator>nithish rodrigo</dc:creator>
      <pubDate>Sat, 01 Aug 2026 17:03:27 +0000</pubDate>
      <link>https://dev.to/nithish_rodrigo/why-docker-why-kubernetes-and-why-did-it-change-devops-forever-1egh</link>
      <guid>https://dev.to/nithish_rodrigo/why-docker-why-kubernetes-and-why-did-it-change-devops-forever-1egh</guid>
      <description>&lt;h1&gt;
  
  
  🐳 What is Docker, and Why Did It Change DevOps Forever?
&lt;/h1&gt;

&lt;p&gt;If you've worked in software development, you've probably heard this sentence at least once:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"But it works on my machine!"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;This is one of the most common problems in software development and was a major pain point before Docker became mainstream.&lt;/p&gt;

&lt;p&gt;Let's explore how Docker solved this problem and why it became a game changer for DevOps.&lt;/p&gt;




&lt;h1&gt;
  
  
  The Problem: "It Works on My Machine"
&lt;/h1&gt;

&lt;p&gt;Imagine this scenario:&lt;/p&gt;

&lt;p&gt;👨‍💻 A developer builds a new feature and tests it locally.&lt;/p&gt;

&lt;p&gt;Everything works perfectly.&lt;/p&gt;

&lt;p&gt;The code is then handed over to the QA team.&lt;/p&gt;

&lt;p&gt;❌ Suddenly, the application crashes.&lt;/p&gt;

&lt;p&gt;The developer insists:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"It works perfectly on my machine."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So what went wrong?&lt;/p&gt;

&lt;p&gt;Usually, the issue isn't the code itself. It's the environment.&lt;/p&gt;

&lt;p&gt;Some common differences include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Different operating systems&lt;/li&gt;
&lt;li&gt;Different library versions&lt;/li&gt;
&lt;li&gt;Missing dependencies&lt;/li&gt;
&lt;li&gt;Different runtime versions (Java, Python, Node.js, etc.)&lt;/li&gt;
&lt;li&gt;Different environment variables&lt;/li&gt;
&lt;li&gt;Different system configurations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Even a tiny version mismatch can cause an application to fail.&lt;/p&gt;




&lt;h1&gt;
  
  
  Enter Docker
&lt;/h1&gt;

&lt;p&gt;Docker was created to solve exactly this problem.&lt;/p&gt;

&lt;p&gt;Instead of deploying only the application code, Docker packages &lt;strong&gt;everything the application needs&lt;/strong&gt; into a single unit called a &lt;strong&gt;Docker Image&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A Docker image contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application code&lt;/li&gt;
&lt;li&gt;Runtime&lt;/li&gt;
&lt;li&gt;Required libraries&lt;/li&gt;
&lt;li&gt;Dependencies&lt;/li&gt;
&lt;li&gt;Configuration&lt;/li&gt;
&lt;li&gt;System tools&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When someone runs that image, Docker creates a &lt;strong&gt;container&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Since every container is created from the same image, every environment behaves consistently.&lt;/p&gt;

&lt;p&gt;This means:&lt;/p&gt;

&lt;p&gt;✅ Developer machine&lt;/p&gt;

&lt;p&gt;⬇️&lt;/p&gt;

&lt;p&gt;✅ QA environment&lt;/p&gt;

&lt;p&gt;⬇️&lt;/p&gt;

&lt;p&gt;✅ Staging&lt;/p&gt;

&lt;p&gt;⬇️&lt;/p&gt;

&lt;p&gt;✅ Production&lt;/p&gt;

&lt;p&gt;Everyone runs the exact same application in the exact same environment.&lt;/p&gt;




&lt;h1&gt;
  
  
  Why Docker Became So Popular
&lt;/h1&gt;

&lt;p&gt;Docker introduced several benefits that transformed software delivery.&lt;/p&gt;

&lt;h3&gt;
  
  
  Consistent Environments
&lt;/h3&gt;

&lt;p&gt;Applications behave the same across Development, QA, UAT, and Production.&lt;/p&gt;




&lt;h3&gt;
  
  
  Faster Deployments
&lt;/h3&gt;

&lt;p&gt;Instead of configuring servers manually, you simply run a Docker image.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run my-app:latest
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Deployment becomes predictable and repeatable.&lt;/p&gt;




&lt;h3&gt;
  
  
  Lightweight Virtualization
&lt;/h3&gt;

&lt;p&gt;Unlike Virtual Machines, containers share the host operating system kernel.&lt;/p&gt;

&lt;p&gt;This makes them:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Faster to start&lt;/li&gt;
&lt;li&gt;More resource-efficient&lt;/li&gt;
&lt;li&gt;Smaller in size&lt;/li&gt;
&lt;li&gt;Easier to scale&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Simplified Dependency Management
&lt;/h3&gt;

&lt;p&gt;No more installing dozens of packages manually.&lt;/p&gt;

&lt;p&gt;Everything travels together inside the image.&lt;/p&gt;




&lt;h3&gt;
  
  
  Better CI/CD Pipelines
&lt;/h3&gt;

&lt;p&gt;Docker integrates seamlessly with tools such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Jenkins&lt;/li&gt;
&lt;li&gt;GitHub Actions&lt;/li&gt;
&lt;li&gt;GitLab CI&lt;/li&gt;
&lt;li&gt;Azure DevOps&lt;/li&gt;
&lt;li&gt;AWS CodePipeline&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Build once.&lt;/p&gt;

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




&lt;h1&gt;
  
  
  But Docker Isn't Perfect
&lt;/h1&gt;

&lt;p&gt;Although Docker solved many problems, it also introduced new challenges.&lt;/p&gt;

&lt;p&gt;Containers are &lt;strong&gt;ephemeral&lt;/strong&gt;, meaning they are designed to be temporary.&lt;/p&gt;

&lt;p&gt;If a container crashes, it disappears unless something recreates it.&lt;/p&gt;

&lt;p&gt;Managing a handful of containers is easy.&lt;/p&gt;

&lt;p&gt;Managing hundreds or even thousands is a different story.&lt;/p&gt;

&lt;p&gt;Docker alone does not provide enterprise-grade capabilities such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service discovery&lt;/li&gt;
&lt;li&gt;Self-healing&lt;/li&gt;
&lt;li&gt;Automatic scaling&lt;/li&gt;
&lt;li&gt;High availability&lt;/li&gt;
&lt;li&gt;Load balancing&lt;/li&gt;
&lt;li&gt;Rolling updates&lt;/li&gt;
&lt;li&gt;Secret management&lt;/li&gt;
&lt;li&gt;Multi-node scheduling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These features become essential as applications grow.&lt;/p&gt;




&lt;h1&gt;
  
  
  This Is Where Kubernetes Comes In
&lt;/h1&gt;

&lt;p&gt;Kubernetes wasn't created to replace Docker.&lt;/p&gt;

&lt;p&gt;It was created to &lt;strong&gt;orchestrate containers&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Think of it this way:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Docker&lt;/strong&gt; creates and runs containers.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Kubernetes&lt;/strong&gt; manages them at scale.&lt;/p&gt;

&lt;p&gt;Kubernetes automatically:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Restarts failed containers&lt;/li&gt;
&lt;li&gt;Distributes traffic between containers&lt;/li&gt;
&lt;li&gt;Scales applications up or down&lt;/li&gt;
&lt;li&gt;Schedules containers across multiple servers&lt;/li&gt;
&lt;li&gt;Performs rolling updates with minimal downtime&lt;/li&gt;
&lt;li&gt;Maintains the desired state of your applications&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of manually managing containers, you simply describe the desired state, and Kubernetes continuously works to maintain it.&lt;/p&gt;




&lt;h1&gt;
  
  
  Docker + Kubernetes = Modern DevOps
&lt;/h1&gt;

&lt;p&gt;Today, Docker and Kubernetes are foundational technologies in cloud-native architectures.&lt;/p&gt;

&lt;p&gt;Together they enable teams to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Deliver software faster&lt;/li&gt;
&lt;li&gt;Reduce deployment failures&lt;/li&gt;
&lt;li&gt;Improve infrastructure consistency&lt;/li&gt;
&lt;li&gt;Scale applications with ease&lt;/li&gt;
&lt;li&gt;Increase system reliability&lt;/li&gt;
&lt;li&gt;Automate operations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These technologies have fundamentally changed how modern software is built, deployed, and managed.&lt;/p&gt;




&lt;h1&gt;
  
  
  Final Thoughts
&lt;/h1&gt;

&lt;p&gt;Docker solved one of the most frustrating problems in software development: &lt;strong&gt;environment inconsistency&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;It gave developers confidence that applications would run the same way across different environments.&lt;/p&gt;

&lt;p&gt;As organizations adopted microservices and containerized applications at scale, Kubernetes emerged to solve the operational challenges of managing large numbers of containers.&lt;/p&gt;

&lt;p&gt;Together, Docker and Kubernetes have become the backbone of modern DevOps and cloud-native engineering.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;Have you ever encountered the classic "It works on my machine" problem?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Share your experience in the comments. I'd love to hear how you solved it! 🚀&lt;/p&gt;

&lt;h1&gt;
  
  
  devops #docker #kubernetes #cloud #aws #containers #cicd #softwareengineering
&lt;/h1&gt;

</description>
      <category>docker</category>
      <category>kubernetes</category>
      <category>devops</category>
      <category>cicd</category>
    </item>
    <item>
      <title>What Really Happens When You Type a URL in Your Browser? (Explained Step-by-Step)</title>
      <dc:creator>nithish rodrigo</dc:creator>
      <pubDate>Sat, 02 May 2026 11:48:57 +0000</pubDate>
      <link>https://dev.to/nithish_rodrigo/what-really-happens-when-you-type-a-url-in-your-browser-explained-step-by-step-37nn</link>
      <guid>https://dev.to/nithish_rodrigo/what-really-happens-when-you-type-a-url-in-your-browser-explained-step-by-step-37nn</guid>
      <description>&lt;p&gt;When you type a URL like &lt;a href="http://www.google.com" rel="noopener noreferrer"&gt;www.google.com&lt;/a&gt; into your browser, a lot more happens behind the scenes than you might think.&lt;/p&gt;

&lt;p&gt;Let’s break it down step by step.&lt;br&gt;
🌐 Step 1: DNS Resolution&lt;/p&gt;

&lt;p&gt;Your browser doesn’t understand domain names—it needs an IP address.&lt;/p&gt;

&lt;p&gt;So it checks:&lt;/p&gt;

&lt;p&gt;Browser cache&lt;br&gt;
OS cache&lt;br&gt;
Router cache&lt;br&gt;
ISP DNS&lt;br&gt;
Public DNS like Google Public DNS&lt;/p&gt;

&lt;p&gt;Once resolved, you get the IP address of the server.&lt;/p&gt;

&lt;p&gt;🔗 Step 2: Establishing a TCP Connection&lt;/p&gt;

&lt;p&gt;Now your browser connects to the server using TCP.&lt;/p&gt;

&lt;p&gt;This happens via the 3-way handshake:&lt;/p&gt;

&lt;p&gt;SYN → Request to connect&lt;br&gt;
SYN-ACK → Acknowledgement from server&lt;br&gt;
ACK → Final confirmation&lt;/p&gt;

&lt;p&gt;This ensures reliable communication.&lt;/p&gt;

&lt;p&gt;🔐 Step 3: Secure the Connection (TLS/SSL)&lt;/p&gt;

&lt;p&gt;Before sending data:&lt;/p&gt;

&lt;p&gt;Server sends SSL certificate&lt;br&gt;
Browser verifies it&lt;br&gt;
Encryption is established&lt;/p&gt;

&lt;p&gt;This is why you see 🔒 in your browser.&lt;/p&gt;

&lt;p&gt;📡 Step 4: Sending HTTP Request&lt;/p&gt;

&lt;p&gt;Now the browser sends:&lt;/p&gt;

&lt;p&gt;HTTP GET request (to fetch page)&lt;br&gt;
or POST request (to send data)&lt;/p&gt;

&lt;p&gt;This happens at the Application Layer (OSI Layer 7).&lt;/p&gt;

&lt;p&gt;🌍 Step 5: Network Journey&lt;/p&gt;

&lt;p&gt;Your request travels through:&lt;/p&gt;

&lt;p&gt;Local router&lt;br&gt;
ISP&lt;br&gt;
Global internet backbone&lt;br&gt;
Undersea cables&lt;br&gt;
Data centers&lt;br&gt;
⚖️ Step 6: Load Balancer&lt;/p&gt;

&lt;p&gt;Before reaching the server:&lt;/p&gt;

&lt;p&gt;A load balancer distributes traffic&lt;br&gt;
Prevents overload&lt;br&gt;
Improves performance and availability&lt;br&gt;
🖥️ Step 7: Server Processing&lt;/p&gt;

&lt;p&gt;The backend server:&lt;/p&gt;

&lt;p&gt;Processes your request&lt;br&gt;
Fetches data&lt;br&gt;
Generates response&lt;br&gt;
🎨 Step 8: Browser Rendering&lt;/p&gt;

&lt;p&gt;Finally, your browser:&lt;/p&gt;

&lt;p&gt;Parses HTML&lt;br&gt;
Applies CSS&lt;br&gt;
Executes JavaScript&lt;/p&gt;

&lt;p&gt;And boom 💥 — the page loads!&lt;/p&gt;

&lt;p&gt;🧠 Final Thoughts&lt;/p&gt;

&lt;p&gt;What looks like a simple action actually involves:&lt;/p&gt;

&lt;p&gt;DNS resolution&lt;br&gt;
Networking&lt;br&gt;
Security&lt;br&gt;
Distributed systems&lt;br&gt;
Application processing&lt;/p&gt;

&lt;p&gt;Understanding this flow is crucial for SREs, DevOps Engineers, and Backend Developers.&lt;/p&gt;

</description>
      <category>networking</category>
      <category>devops</category>
      <category>sre</category>
    </item>
    <item>
      <title>Automated Jira Ticket Creation for AWS EC2 Scheduled Events</title>
      <dc:creator>nithish rodrigo</dc:creator>
      <pubDate>Mon, 05 Jan 2026 06:12:07 +0000</pubDate>
      <link>https://dev.to/nithish_rodrigo/automated-jira-ticket-creation-for-aws-ec2-scheduled-events-3kdb</link>
      <guid>https://dev.to/nithish_rodrigo/automated-jira-ticket-creation-for-aws-ec2-scheduled-events-3kdb</guid>
      <description>&lt;p&gt;This post describes the architecture and configuration required to automatically generate Jira Service Management (JSM) tickets in response to AWS Health notifications about scheduled EC2 instance events (e.g., reboots, instance retirements).&lt;/p&gt;

&lt;p&gt;The aim is to eliminate the manual process of reviewing and forwarding AWS notification emails to a service desk email address. With this automation, you can proactively track and resolve AWS‑initiated maintenance activities and also we can do this maintenace under our control.&lt;/p&gt;

&lt;h2&gt;
  
  
  Architecture Overview
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;AWS Health Events → EventBridge → SQS → Jira Service Management Connector&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%2Fl1h53dui1jt1ijx3rj0k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fl1h53dui1jt1ijx3rj0k.png" alt=" " width="800" height="508"&gt;&lt;/a&gt;&lt;br&gt;
At a high level:&lt;/p&gt;

&lt;p&gt;AWS Health generates events for EC2 scheduled maintenance.&lt;br&gt;
Amazon EventBridge captures and filters those events.&lt;br&gt;
An Amazon SQS queue receives the events.&lt;br&gt;
The Jira Service Management Connector consumes messages from SQS and creates issues in a JSM project.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Health Setup
&lt;/h2&gt;

&lt;p&gt;Using AWS Organizations, you can centralize scheduled AWS Health maintenance notifications for all EC2 instances across all member accounts into a single “central operations” account. From this account, events are visible in the AWS Health Dashboard and can be routed to other AWS services.&lt;/p&gt;

&lt;p&gt;To delegate AWS Health Dashboard organization view to a central account, run the following command from your AWS Organizations management (root) account:&lt;br&gt;
&lt;code&gt;aws organizations register-delegated-administrator \ --account-id &amp;lt;CENTRAL_OPERATIONS_ACCOUNT_ID&amp;gt; \ --service-principal health.amazonaws.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Replace &amp;lt;CENTRAL_OPERATIONS_ACCOUNT_ID&amp;gt; with the ID of the account where you want to centralize AWS Health events.&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS EventBridge
&lt;/h2&gt;

&lt;p&gt;EventBridge is used to capture EC2‑related AWS Health events and route them to an SQS queue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Setup Steps&lt;/strong&gt;&lt;br&gt;
In your central operations account, create an EventBridge rule, for example: aws_schedule_maintenance_event.&lt;br&gt;
Set the target of this EventBridge rule to an Amazon SQS queue that will buffer health events for downstream processing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Delivering Events to Jira Service Management via SQS&lt;/strong&gt;&lt;br&gt;
The SQS queue receives the AWS Health event payloads from EventBridge. These messages are then delivered into a Jira Service Management project using the AWS Service Management Connector for Jira Service Management (often referred to as the “AWS JSM Connector”).&lt;/p&gt;

&lt;p&gt;You can install the connector from the &lt;a href="https://marketplace.atlassian.com/apps/1221283/aws-service-management-connector-for-jsm" rel="noopener noreferrer"&gt;Atlassian Marketplace&lt;/a&gt; and configure it to read from the SQS queue and create issues in a chosen JSM project (for example, an infrastructure or operations service desk).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;High‑Level Configuration in Jira&lt;/strong&gt;&lt;br&gt;
Once the AWS JSM Connector is installed:&lt;/p&gt;

&lt;p&gt;Navigate to the AWS Service Management Connector configuration in Jira.&lt;br&gt;
Configure an AWS account connection that has permissions to read from the SQS queue and interact with the necessary AWS services.&lt;br&gt;
On the connector settings page, ensure the AWS Health integration is enabled.&lt;br&gt;
Enable the desired Jira Service Management project and configure:&lt;/p&gt;

&lt;p&gt;For details on accessing Forge‑based Jira app logs for troubleshooting, see Atlassian’s documentation: &lt;a href="https://developer.atlassian.com/platform/forge/access-app-logs/" rel="noopener noreferrer"&gt;Access app logs&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Outcome&lt;/strong&gt;&lt;br&gt;
With the above workflow implemented correctly (and with appropriate AWS and Jira configuration), AWS Health events for EC2 maintenance automatically generate Jira tickets in your chosen JSM project.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;This gives operations teams:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Proactive visibility into upcoming instance retirements and maintenance.&lt;br&gt;
A consistent ticketing trail for AWS‑initiated changes.&lt;br&gt;
The ability to track remediation work through normal incident or request workflows.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Troubleshooting&lt;/strong&gt;&lt;br&gt;
Occasionally, the connection between the SQS queue and the JSM connector can fall out of sync (for example, due to transient network or authentication issues). When that happens, EC2 Health events may accumulate in the SQS queue without being turned into Jira tickets.&lt;/p&gt;

&lt;p&gt;A typical temporary fix looks like this:&lt;/p&gt;

&lt;p&gt;Check the SQS queue&lt;br&gt;
Reset / re‑sync the connector in Jira&lt;/p&gt;

&lt;p&gt;After the connection is re‑established and the sync completes, the SQS messages should start being processed, and Jira tickets should appear for any pending EC2 instance retirement or maintenance events.&lt;/p&gt;

&lt;h2&gt;
  
  
  Future Improvements
&lt;/h2&gt;

&lt;p&gt;To make the automation more effective and user‑friendly, you can enrich the Jira tickets with additional context:&lt;/p&gt;

&lt;p&gt;Include instance names in the ticket summary or description, not just the instance ID.&lt;br&gt;
Add environment tags (e.g., prod, staging) and application identifiers to help teams quickly understand impact.&lt;br&gt;
Use a Lambda function or similar service to:&lt;/p&gt;

&lt;p&gt;Enriching tickets in this way makes automated notifications more actionable and reduces the time needed for responders to identify and remediate affected resources. &lt;/p&gt;

&lt;p&gt;Further this project is complete open source, we can create jira tickets for AWS scheduled maintenance for any AWS services using AWS health. &lt;/p&gt;

</description>
      <category>aws</category>
      <category>awshealth</category>
      <category>sqs</category>
      <category>eventbridge</category>
    </item>
    <item>
      <title>A Guide to AWS CloudFront Invalidations</title>
      <dc:creator>nithish rodrigo</dc:creator>
      <pubDate>Sat, 03 Jan 2026 11:48:19 +0000</pubDate>
      <link>https://dev.to/nithish_rodrigo/a-guide-to-aws-cloudfront-invalidations-503e</link>
      <guid>https://dev.to/nithish_rodrigo/a-guide-to-aws-cloudfront-invalidations-503e</guid>
      <description>&lt;p&gt;Static frontend website requires consistent update to the webpages as the website grows, so a classic cloud native static web content is served ususally by files uploaded to an Amazon S3 bucket which is accessed via cloudfront. A typical issue with static content is some might notice that the old version of webpage still appears when you visit your website though when there is new content is updated. This happens because of caching.&lt;/p&gt;

&lt;p&gt;To fix this, you need to perform a CloudFront Invalidation. This guide will walk you through the process step-by-step, ensuring your audience always sees the most recent version of your content.&lt;/p&gt;

&lt;p&gt;What is S3 Object Invalidation?&lt;br&gt;
Before we dive into the "how," let's look at the "why."&lt;/p&gt;

&lt;p&gt;When you use Amazon S3 to store files and Amazon CloudFront to deliver them, CloudFront stores copies of your files in "Edge Locations" around the world. This makes your website fast because the data is physically closer to your users.&lt;/p&gt;

&lt;p&gt;However, CloudFront will keep that copy until it expires (often 24 hours or more). If you upload a new version of webpage to S3, CloudFront won't know it changed. So therefore Invalidation tells CloudFront to delete its cached copies and fetch the brand-new version from S3 immediately.&lt;/p&gt;

&lt;p&gt;Step-by-Step: How to Invalidate a File&lt;br&gt;
Follow these steps to refresh your content across the web.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Access the CloudFront Console
Sign in to your AWS Management Console.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;In the search bar at the top, type CloudFront and select it from the services list.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Select Your Distribution
You will see a list of "Distributions" (these are the bridges between your S3 bucket and the web).&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Locate and click on the Distribution ID associated with your website&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create the Invalidation
Click on the Invalidations tab in the top menu.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Click the orange Create invalidation button.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Define the Object Path
In the "Object paths" box, you need to tell AWS exactly which file to clear.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Important: Do not paste the full website URL. Only paste the path that comes after the domain name.&lt;/p&gt;

&lt;p&gt;Example: If your file is at &lt;a href="https://example.com/restaurant/dinner.pdf" rel="noopener noreferrer"&gt;https://example.com/restaurant/dinner.pdf&lt;/a&gt;, you should enter:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;/restaurant/dinner.pdf&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Click Create invalidation at the bottom of the page.&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Key Points to Remember&lt;/u&gt;&lt;br&gt;
&lt;strong&gt;Leading Slash&lt;/strong&gt;: Always start your path with a forward slash &lt;code&gt;/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wildcards&lt;/strong&gt;: If you want to clear an entire folder, you can use an asterisk, such as &lt;code&gt;/restaurant/*&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Timing&lt;/strong&gt;: Invalidations usually take 1–3 minutes to process globally. Once the status changes from "In Progress" to "Completed," your new file is live!&lt;/p&gt;

&lt;p&gt;&lt;u&gt;Additional Resources&lt;/u&gt;&lt;br&gt;
For more technical details on how web caching works and advanced invalidation patterns, refer to the official AWS documentation:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Invalidation.html" rel="noopener noreferrer"&gt;AWS Documentation: Invalidating Files&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>cloudfront</category>
      <category>invalidation</category>
      <category>s3</category>
    </item>
    <item>
      <title>📅 Understanding Application Log Timeframes: A Guide to Log Time Formats and Timezone Differences</title>
      <dc:creator>nithish rodrigo</dc:creator>
      <pubDate>Thu, 24 Apr 2025 08:18:09 +0000</pubDate>
      <link>https://dev.to/nithish_rodrigo/understanding-application-log-timeframes-a-guide-to-log-time-formats-and-timezone-differences-3ggo</link>
      <guid>https://dev.to/nithish_rodrigo/understanding-application-log-timeframes-a-guide-to-log-time-formats-and-timezone-differences-3ggo</guid>
      <description>&lt;p&gt;Understanding application log time frame is crucial troubleshooting task where application log time could be different from your local machine clock. In this post I will provide simple examples and terms on understanding the time frames. &lt;/p&gt;

&lt;p&gt;P.S&amp;gt; attribution to &lt;em&gt;ChatGPT&lt;/em&gt; for helping me write my very first dev.to blog &lt;/p&gt;

&lt;p&gt;When you're debugging an issue or investigating an incident, logs are your best friends. But nothing is more frustrating than realizing the timestamp in your application logs doesn't match your local time. You might see a log line saying &lt;strong&gt;2025-04-24T10:00:00Z&lt;/strong&gt;, but you're pretty sure the event happened at 3 PM your time.&lt;/p&gt;

&lt;p&gt;In this post, we’ll break down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;What are the time formats commonly used in application logs&lt;/li&gt;
&lt;li&gt;What UTC time is&lt;/li&gt;
&lt;li&gt;How to identify the time zone used in your logs&lt;/li&gt;
&lt;li&gt;How to convert between log time and your local machine’s time&lt;/li&gt;
&lt;li&gt;Simple examples to bring it all together&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🕒 1. What Time Format Do Application Logs Use?&lt;br&gt;
Most modern applications use UTC (Coordinated Universal Time) in logs. This is a global time standard not affected by daylight saving time or local time zones. It keeps things consistent when logs are aggregated across servers in different regions.&lt;/p&gt;

&lt;p&gt;Here are some common log time formats you might see:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Format&lt;/th&gt;
&lt;th&gt;Example&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;ISO 8601 (UTC)&lt;/td&gt;
&lt;td&gt;2025-04-24T10:00:00Z&lt;/td&gt;
&lt;td&gt;The &lt;code&gt;Z&lt;/code&gt; means "Zulu time" (another term for UTC).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;UNIX Timestamp&lt;/td&gt;
&lt;td&gt;1713952800&lt;/td&gt;
&lt;td&gt;Number of seconds since Jan 1, 1970 (UTC).&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local Time Format&lt;/td&gt;
&lt;td&gt;Apr 24 03:30:00 PM&lt;/td&gt;
&lt;td&gt;Varies depending on the server’s time zone.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Custom Formats&lt;/td&gt;
&lt;td&gt;24/Apr/2025:10:00:00 +0000&lt;/td&gt;
&lt;td&gt;Often used in web server logs (like Apache/Nginx). The &lt;code&gt;+0000&lt;/code&gt; means UTC offset.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;🌍 2. What Is UTC and Why Is It Used?&lt;br&gt;
UTC (Coordinated Universal Time) is the time standard used across the world. Servers, cloud platforms, and applications prefer UTC to:&lt;/p&gt;

&lt;p&gt;Avoid confusion from local daylight saving time changes.&lt;/p&gt;

&lt;p&gt;Easily correlate logs across distributed systems.&lt;/p&gt;

&lt;p&gt;Think of it as the "common ground" for global systems.&lt;/p&gt;

&lt;p&gt;If you're in Sri Lanka, your local time is UTC+5:30. So if an application logs a timestamp of 2025-04-24T10:00:00Z, that event happened at 3:30 PM Sri Lanka time.&lt;/p&gt;

&lt;p&gt;🕵️ 3. How to Know What Time Zone a Log Uses?&lt;br&gt;
Look for hints in the log format:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A &lt;strong&gt;Z&lt;/strong&gt; at the end → UTC&lt;/li&gt;
&lt;li&gt;A number like &lt;strong&gt;+0530&lt;/strong&gt; → UTC+5:30&lt;/li&gt;
&lt;li&gt;No timezone at all? 😬 Then check your application/server settings. It might be in local time or UTC depending on configuration.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🔄 4. How to Convert Log Time to Your Local Time?&lt;br&gt;
Example 1: ISO 8601 UTC to Local Time (Sri Lanka)&lt;br&gt;
Log Time: 2025-04-24T10:00:00Z&lt;br&gt;
Local Time: UTC+5:30 → Add 5 hours and 30 minutes&lt;br&gt;
Result: 2025-04-24 03:30 PM&lt;/p&gt;

&lt;p&gt;Example 2: Apache-style Timestamp&lt;br&gt;
Log Time: 24/Apr/2025:10:00:00 +0000&lt;br&gt;
Still UTC, so same conversion as above → 2025-04-24 03:30 PM&lt;/p&gt;

&lt;p&gt;Example 3: UNIX Timestamp&lt;br&gt;
Log Time: 1713952800&lt;br&gt;
This needs to be converted using a tool or script (e.g., Python or an online converter):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# In Linux terminal
date -d @1713952800
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🛠️ 5. Tips to Work with Different Timezones in Logs&lt;br&gt;
Always check your local time zone offset (especially during daylight saving time).&lt;/p&gt;

&lt;p&gt;Use tools like date, timedatectl, or tzutil (Windows) to confirm your current local time setting.&lt;/p&gt;

&lt;p&gt;Many log aggregation tools (like Splunk, Datadog, CloudWatch, etc.) can automatically convert UTC to your local time in the UI.&lt;/p&gt;

&lt;p&gt;If you’re writing logs yourself, prefer UTC + ISO 8601 format. It’s clean, unambiguous, and machine-friendly.&lt;/p&gt;

&lt;p&gt;Conclusion &lt;br&gt;
When reviewing logs from servers or applications, always ask yourself: "What time zone is this in?" Knowing how to read and convert log times accurately will help you:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Correlate issues faster&lt;/li&gt;
&lt;li&gt;Understand when exactly something happened&lt;/li&gt;
&lt;li&gt;Avoid confusion when comparing logs from multiple systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Whether you're troubleshooting an incident or analyzing patterns, this understanding is a small step with big impact.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>logs</category>
      <category>observability</category>
      <category>timezone</category>
    </item>
  </channel>
</rss>
