<?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: Mohammed Armaan</title>
    <description>The latest articles on DEV Community by Mohammed Armaan (@mohammed_armaan_51c01b74e).</description>
    <link>https://dev.to/mohammed_armaan_51c01b74e</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%2F3366382%2F7b73d190-49ce-42b4-b4ab-61838b0017a4.png</url>
      <title>DEV Community: Mohammed Armaan</title>
      <link>https://dev.to/mohammed_armaan_51c01b74e</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mohammed_armaan_51c01b74e"/>
    <language>en</language>
    <item>
      <title>How I Built a Shift-Left DevSecOps Pipeline for FastAPI &amp; Kubernetes (And Caught 3 Real High-Severity CVEs with Trivy) published: true</title>
      <dc:creator>Mohammed Armaan</dc:creator>
      <pubDate>Mon, 02 Nov 2026 14:45:03 +0000</pubDate>
      <link>https://dev.to/mohammed_armaan_51c01b74e/how-i-built-a-shift-left-devsecops-pipeline-for-fastapi-kubernetes-and-caught-3-real-g8k</link>
      <guid>https://dev.to/mohammed_armaan_51c01b74e/how-i-built-a-shift-left-devsecops-pipeline-for-fastapi-kubernetes-and-caught-3-real-g8k</guid>
      <description>&lt;p&gt;When an e-commerce platform runs a flash sale, traffic can jump from 10 requests per second to 10,000 in under a minute. If your team hasn't tested how your containers and Kubernetes pods behave under a sudden traffic surge—or how Kubernetes self-heals when a pod returns &lt;code&gt;HTTP 503&lt;/code&gt;—production is the worst place to find out.&lt;/p&gt;

&lt;p&gt;Even before code reaches a Kubernetes cluster, there is a second problem: most CI pipelines only check if the code &lt;em&gt;runs&lt;/em&gt;, not if the container image is &lt;em&gt;secure&lt;/em&gt;. Warning-only security scans get ignored, leaked secrets hide in Git commit history, and default base images quietly ship with unpatched vulnerabilities.&lt;/p&gt;

&lt;p&gt;To solve both problems, I built &lt;strong&gt;CloudPulse&lt;/strong&gt;—a two-repository High-Availability Cloud Status &amp;amp; Incident Telemetry Platform designed around strict shift-left DevSecOps gates and GitOps delivery:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Part 1 (App &amp;amp; DevSecOps CI):&lt;/strong&gt; &lt;a href="https://github.com/mohammedarmaan936-sketch/cloudpulse-devsecops-service" rel="noopener noreferrer"&gt;cloudpulse-devsecops-service&lt;/a&gt; — FastAPI telemetry &amp;amp; chaos microservice, multistage Docker hardening, and a 3-stage GitHub Actions pipeline.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 2 (AWS EKS &amp;amp; GitOps Infra):&lt;/strong&gt; &lt;a href="https://github.com/mohammedarmaan936-sketch/cloudpulse-eks-gitops-infra" rel="noopener noreferrer"&gt;cloudpulse-eks-gitops-infra&lt;/a&gt; — Modular AWS VPC &amp;amp; EKS Terraform IaC, Argo CD GitOps continuous delivery, Kubernetes HPA auto-scaling, and Prometheus/Grafana observability.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Here is how I architected the pipeline, how our &lt;strong&gt;Trivy&lt;/strong&gt; security gate blocked a real build after catching &lt;strong&gt;3 HIGH severity CVEs&lt;/strong&gt;, and how I remediated them to reach a zero-CVE container build.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Designing a Microservice Built for Kubernetes Chaos Testing
&lt;/h2&gt;

&lt;p&gt;Instead of deploying a static "Hello World" container, &lt;code&gt;CloudPulse&lt;/code&gt; exposes real Prometheus telemetry (&lt;code&gt;cloudpulse_http_requests_total&lt;/code&gt;, &lt;code&gt;cloudpulse_flash_surge_events_total&lt;/code&gt;, &lt;code&gt;cloudpulse_service_health_status&lt;/code&gt;, and request latency histograms) alongside two interactive chaos endpoints:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;POST /simulate-surge&lt;/code&gt;:&lt;/strong&gt; Launches a non-blocking 30-second background task (&lt;code&gt;asyncio.create_task&lt;/code&gt;) that injects synthetic checkout traffic bursts into the Prometheus counters to trigger downstream Kubernetes HorizontalPodAutoscaler (HPA) scaling and Grafana alerts.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;&lt;code&gt;POST /simulate-outage&lt;/code&gt;:&lt;/strong&gt; Flips the internal service health state so &lt;code&gt;GET /healthz&lt;/code&gt; returns &lt;code&gt;HTTP 503 Service Unavailable&lt;/code&gt;, allowing us to test Kubernetes Liveness and Readiness probe self-healing in real time.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Baseline Healthy State (&lt;code&gt;200 OK&lt;/code&gt;)
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs7f74v39td85a0v7kjho.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fs7f74v39td85a0v7kjho.png" alt="CloudPulse Healthy Dashboard" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Active Flash-Sale Traffic Surge
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvad1d6wt713w66jsrpqe.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fvad1d6wt713w66jsrpqe.png" alt="CloudPulse Flash Surge Active" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Simulated Server Outage (&lt;code&gt;503 OUTAGE&lt;/code&gt;)
&lt;/h3&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpmoggrfkn27tlvf3p72r.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fpmoggrfkn27tlvf3p72r.png" alt="CloudPulse Outage Simulation" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2. The 3-Stage Shift-Left DevSecOps Pipeline
&lt;/h2&gt;

&lt;p&gt;Every push and pull request to &lt;code&gt;main&lt;/code&gt; passes through three strict gates in &lt;code&gt;.github/workflows/devsecops.yml&lt;/code&gt; before any container image can be published to GitHub Container Registry (&lt;code&gt;ghcr.io&lt;/code&gt;).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Station 1 — Code Quality &amp;amp; Unit Tests (&lt;code&gt;Ruff&lt;/code&gt; + &lt;code&gt;Pytest&lt;/code&gt;):&lt;/strong&gt; Lints Python syntax/import formatting and executes automated &lt;code&gt;TestClient&lt;/code&gt; tests verifying &lt;code&gt;/healthz&lt;/code&gt;, &lt;code&gt;/metrics&lt;/code&gt;, surge increments, and &lt;code&gt;200 &amp;lt;-&amp;gt; 503&lt;/code&gt; outage toggling.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Station 2 — Full-History Secret Scanning (&lt;code&gt;Gitleaks&lt;/code&gt;):&lt;/strong&gt; Runs &lt;code&gt;gitleaks-action@v2&lt;/code&gt; with &lt;code&gt;fetch-depth: 0&lt;/code&gt; to scan the entire Git commit history—not just the latest commit—so accidentally committed AWS keys or tokens block the build immediately.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Station 3 — Multistage Container Build, &lt;code&gt;Trivy&lt;/code&gt; CVE Gate &amp;amp; Smoke Test:&lt;/strong&gt; Builds the production Docker image, scans both OS packages and Python libraries with &lt;strong&gt;Trivy&lt;/strong&gt; (&lt;code&gt;exit-code: '1'&lt;/code&gt;, &lt;code&gt;severity: 'CRITICAL,HIGH'&lt;/code&gt;), spins up the live container to smoke-test &lt;code&gt;/healthz&lt;/code&gt; and &lt;code&gt;/metrics&lt;/code&gt; via &lt;code&gt;curl --fail&lt;/code&gt;, and pushes to &lt;code&gt;ghcr.io&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  3. Real-World Remediation: When Trivy Blocked the Pipeline
&lt;/h2&gt;

&lt;p&gt;Having &lt;code&gt;exit-code: '1'&lt;/code&gt; configured on Trivy immediately proved its value on our initial pipeline run.&lt;/p&gt;

&lt;p&gt;Even though our code passed all unit tests and used the official &lt;code&gt;python:3.12-slim&lt;/code&gt; base image, &lt;strong&gt;Trivy failed the build and blocked the image from publishing&lt;/strong&gt; after detecting three actionable HIGH severity vulnerabilities and vulnerable vendored SBOM metadata:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CVE ID&lt;/th&gt;
&lt;th&gt;Package&lt;/th&gt;
&lt;th&gt;Vulnerability Summary&lt;/th&gt;
&lt;th&gt;Fixed Version&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CVE-2025-62727&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;starlette&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;DoS via Range header merging&lt;/td&gt;
&lt;td&gt;&lt;code&gt;0.49.1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CVE-2026-48818&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;starlette&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;SSRF / NTLM credential theft in &lt;code&gt;StaticFiles&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1.1.0&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;CVE-2026-54283&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;starlette&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;code&gt;request.form()&lt;/code&gt; limits bypassed enabling DoS&lt;/td&gt;
&lt;td&gt;&lt;code&gt;1.3.1&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Additionally, Trivy flagged embedded CycloneDX SBOM files (&lt;code&gt;bom.cdx.json&lt;/code&gt;) bundled inside &lt;code&gt;setuptools&lt;/code&gt; and &lt;code&gt;wheel&lt;/code&gt; in the base Python image that referenced older vulnerable package versions.&lt;/p&gt;

&lt;h3&gt;
  
  
  How We Fixed It for a 0-CVE Build
&lt;/h3&gt;

&lt;p&gt;First, we pinned &lt;code&gt;starlette&amp;gt;=1.3.1&lt;/code&gt; alongside upgraded &lt;code&gt;fastapi&lt;/code&gt; in &lt;code&gt;requirements.txt&lt;/code&gt; so transitive dependencies could no longer resolve to vulnerable versions.&lt;/p&gt;

&lt;p&gt;Second, we hardened our multistage &lt;code&gt;Dockerfile&lt;/code&gt; to patch OS packages, strip unused packaging tools and embedded &lt;code&gt;bom.cdx.json&lt;/code&gt; metadata from the runtime image, and execute Uvicorn under a locked-down non-root user (&lt;code&gt;appuser&lt;/code&gt;, UID &lt;code&gt;10001&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight docker"&gt;&lt;code&gt;&lt;span class="c"&gt;# Stage 1: Builder&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;python:3.12-slim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;builder&lt;/span&gt;
&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /build&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;python &lt;span class="nt"&gt;-m&lt;/span&gt; venv /opt/venv
&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PATH="/opt/venv/bin:$PATH"&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; requirements.txt .&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; pip setuptools wheel &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; requirements.txt &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    find /opt/venv &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"bom.cdx.json"&lt;/span&gt; &lt;span class="nt"&gt;-delete&lt;/span&gt;

&lt;span class="c"&gt;# Stage 2: Hardened Runtime&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;python:3.12-slim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;AS&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s"&gt;runtime&lt;/span&gt;
&lt;span class="k"&gt;RUN &lt;/span&gt;apt-get update &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    apt-get upgrade &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; &lt;span class="nt"&gt;--no-install-recommends&lt;/span&gt; curl &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /var/lib/apt/lists/&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    pip &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;--no-cache-dir&lt;/span&gt; &lt;span class="nt"&gt;--upgrade&lt;/span&gt; pip setuptools wheel &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    &lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nt"&gt;-rf&lt;/span&gt; /usr/local/lib/python3.12/site-packages/setuptools&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;           /usr/local/lib/python3.12/site-packages/wheel&lt;span class="k"&gt;*&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    find /usr/local/lib/python3.12 &lt;span class="nt"&gt;-name&lt;/span&gt; &lt;span class="s2"&gt;"bom.cdx.json"&lt;/span&gt; &lt;span class="nt"&gt;-delete&lt;/span&gt;

&lt;span class="k"&gt;RUN &lt;/span&gt;groupadd &lt;span class="nt"&gt;-g&lt;/span&gt; 10001 appuser &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="se"&gt;\
&lt;/span&gt;    useradd &lt;span class="nt"&gt;-u&lt;/span&gt; 10001 &lt;span class="nt"&gt;-g&lt;/span&gt; appuser &lt;span class="nt"&gt;-s&lt;/span&gt; /sbin/nologin &lt;span class="nt"&gt;-M&lt;/span&gt; appuser

&lt;span class="k"&gt;WORKDIR&lt;/span&gt;&lt;span class="s"&gt; /app&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --from=builder /opt/venv /opt/venv&lt;/span&gt;
&lt;span class="k"&gt;COPY&lt;/span&gt;&lt;span class="s"&gt; --chown=appuser:appuser app/ ./app/&lt;/span&gt;

&lt;span class="k"&gt;ENV&lt;/span&gt;&lt;span class="s"&gt; PATH="/opt/venv/bin:$PATH" \&lt;/span&gt;
    PYTHONDONTWRITEBYTECODE=1 \
    PYTHONUNBUFFERED=1

&lt;span class="k"&gt;USER&lt;/span&gt;&lt;span class="s"&gt; appuser&lt;/span&gt;
&lt;span class="k"&gt;EXPOSE&lt;/span&gt;&lt;span class="s"&gt; 8000&lt;/span&gt;
&lt;span class="k"&gt;HEALTHCHECK&lt;/span&gt;&lt;span class="s"&gt; --interval=30s --timeout=5s --start-period=5s --retries=3 \&lt;/span&gt;
    CMD curl -f http://localhost:8000/healthz || exit 1

&lt;span class="k"&gt;CMD&lt;/span&gt;&lt;span class="s"&gt; ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;On the next push (&lt;code&gt;commit 688dfa7&lt;/code&gt;), Trivy reported &lt;strong&gt;0 HIGH or CRITICAL vulnerabilities&lt;/strong&gt;, the container smoke tests passed, and the verified image was published to &lt;code&gt;ghcr.io&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Downstream GitOps Delivery &amp;amp; Observability (Preview of Part 2)
&lt;/h2&gt;

&lt;p&gt;Because we separated our application repository from our infrastructure repository following enterprise GitOps practices, our second repository &lt;a href="https://github.com/mohammedarmaan936-sketch/cloudpulse-eks-gitops-infra" rel="noopener noreferrer"&gt;cloudpulse-eks-gitops-infra&lt;/a&gt; provisions the AWS VPC &amp;amp; EKS architecture with Terraform and uses &lt;strong&gt;Argo CD&lt;/strong&gt; (&lt;code&gt;selfHeal: true&lt;/code&gt;, &lt;code&gt;prune: true&lt;/code&gt;) to deploy the verified container.&lt;/p&gt;

&lt;p&gt;When we trigger the Flash-Sale Traffic Surge across the Kubernetes pods, &lt;strong&gt;Prometheus&lt;/strong&gt; scrapes the &lt;code&gt;/metrics&lt;/code&gt; endpoint and &lt;strong&gt;Grafana&lt;/strong&gt; visualizes the real-time request spike (~300 req/s) and pod readiness.&lt;/p&gt;




&lt;h2&gt;
  
  
  Explore the Full Source Code
&lt;/h2&gt;

&lt;p&gt;Both repositories—including the FastAPI source, unit tests, multistage &lt;code&gt;Dockerfile&lt;/code&gt;, GitHub Actions workflows, AWS EKS Terraform modules, Argo CD manifests, and Grafana dashboard JSON—are open source on GitHub.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Part 1 (App &amp;amp; DevSecOps CI/CD):&lt;/strong&gt; &lt;a href="https://github.com/mohammedarmaan936-sketch/cloudpulse-devsecops-service" rel="noopener noreferrer"&gt;cloudpulse-devsecops-service&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Part 2 (AWS EKS Terraform, Argo CD &amp;amp; Observability):&lt;/strong&gt; &lt;a href="https://github.com/mohammedarmaan936-sketch/cloudpulse-eks-gitops-infra" rel="noopener noreferrer"&gt;cloudpulse-eks-gitops-infra&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devops</category>
      <category>kubernetes</category>
      <category>aws</category>
      <category>docker</category>
    </item>
  </channel>
</rss>
