<?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: Arnob</title>
    <description>The latest articles on DEV Community by Arnob (@arn-ob).</description>
    <link>https://dev.to/arn-ob</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%2F189152%2F14db6847-4a8e-4e28-b35c-375457dfe9f2.jpg</url>
      <title>DEV Community: Arnob</title>
      <link>https://dev.to/arn-ob</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/arn-ob"/>
    <language>en</language>
    <item>
      <title>Build Own GitHub Action</title>
      <dc:creator>Arnob</dc:creator>
      <pubDate>Mon, 08 Jun 2026 16:19:53 +0000</pubDate>
      <link>https://dev.to/arn-ob/build-own-github-action-1820</link>
      <guid>https://dev.to/arn-ob/build-own-github-action-1820</guid>
      <description>&lt;p&gt;Here I told you how you create an action package and publish that to the marketplace.&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%2Fhk3tzf1k7k6onx2vr5ao.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhk3tzf1k7k6onx2vr5ao.jpeg" alt="do action docker" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;What is GitHub Action&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;GitHub Actions is a continuous integration and continuous delivery (CI/CD) platform that allows you to automate your build, test, and deployment pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  [Understanding GitHub Actions - GitHub Docs
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GitHub Actions is a continuous integration and continuous delivery (CI/CD) platform that allows you to automate your…
&lt;/h3&gt;

&lt;p&gt;docs.github.com](&lt;a href="https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions?source=post_page-----75573fcdc831---------------------------------------" rel="noopener noreferrer"&gt;https://docs.github.com/en/actions/learn-github-actions/understanding-github-actions?source=post_page-----75573fcdc831---------------------------------------&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;I hope it will help you understand action well&lt;/p&gt;

&lt;p&gt;How to create a GitHub Action!&lt;/p&gt;

&lt;p&gt;At the starting, you need to create an action.yaml file. And write there the details of the action&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;action.yaml&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: 'DigitalOcean kubectl Action'
author: Arnob Almazee
description: DigitalOcean kubectl image Update by using Github Action
branding:
  color: 'blue'
  icon: 'command'
runs:
  using: 'docker'
  image: 'docker://ghcr.io/arn-ob/do-kubectl-action:latest'
inputs:
  do_access_token:
    description: Access token for accessing the doctl. 
    required: true
  do_cluster_certificate:
    description: Cluster certificate for accessing the kubectl. 
    required: true
  do_deployment_name:
    description: App deployment name. 
    required: true
  do_container_name:
    description: App container name. 
    required: true
  do_image_tag:
    description: App build image and tag. 
    required: true
  stdin:
    description: File to read and pass as stdin to kubectl
    required: false
  args:
    description: The arguments that you want to pass through to the kubectl command
    required: true
outputs:
  kubectl-out:
    description: The output of the kubectl command 
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the action config file. Here the action knows what you wanted to do and which value will get input and output. Now you have to give the Dockerfile which is initing run&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM alpine:latest
LABEL maintainer="Arnob Almazee &amp;lt;github.com@arn-ob&amp;gt;"
RUN apk add --no-cache curl
RUN wget https://github.com/digitalocean/doctl/releases/download/v1.84.0/doctl-1.84.0-linux-amd64.tar.gz
RUN tar -xf doctl-1.84.0-linux-amd64.tar.gz -C ~/
RUN chmod +x ~/doctl
RUN mv ~/doctl /usr/local/bin
RUN curl -LO https://storage.googleapis.com/kubernetes-release/release/` curl -s https://storage.googleapis.com/kubernetes-release/release/stable.txt`/bin/linux/amd64/kubectl
RUN chmod +x ./kubectl
RUN mv ./kubectl /usr/local/bin/kubectl
ADD entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
ENTRYPOINT ["/entrypoint.sh"]
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This Dockerfile describes the process and the steps which I need to run the entrypoint.sh.&lt;/p&gt;

&lt;h3&gt;
  
  
  Short Details:
&lt;/h3&gt;

&lt;p&gt;1st Dockerfile run from alpine:latest image. it will wget the doctl release then extract and save it in the bin file. Then install kubectl also it save to the bin. then make kubectl and doctl exec files.&lt;/p&gt;

&lt;p&gt;After Dockerfile build then it runs entrypoint.sh&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/bin/sh
debug() {
  if [ "${ACTIONS_RUNNER_DEBUG:-}" = "true" ]; then
    echo "DEBUG: :: $*" &amp;gt;&amp;amp;2
  fi
}
echo "DigitalOcean version"
doctl version
echo "DO Token Init"
doctl auth init -t "${INPUT_DO_ACCESS_TOKEN}"
echo "DigitalOcean add the cluster kubeconfig"
doctl kubernetes cluster kubeconfig save ${INPUT_DO_CLUSTER_CERTIFICATE}
echo "Kubectl deployment"
kubectl set image deployment/${INPUT_DO_DEPLOYMENT_NAME} ${INPUT_DO_CONTAINER_NAME}=${INPUT_DO_IMAGE_TAG}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This entrypoint.sh file work is the main process of GitHub action. It checks the doctl version then it gets the token, then saves the cluster certificate number. Then deployment the image from the deployment name, container name, and image tag.&lt;/p&gt;

&lt;p&gt;Those are found at Repository secrets (Repo Setting &amp;gt; Secrets &amp;gt; Action)&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%2Fypsf5m7ql10okfltu4pv.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fypsf5m7ql10okfltu4pv.jpeg" alt="captionless image" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So the GitHub workflow YAML for that repository is like&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;name: Production Hattimatim
on: 
  push:
    branches:
      -  main
jobs:
  Deploy:
    name: Hattimatim FrontEnd Deploy Process

    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v2
      - name: Get brandh tag
        id: vars
        shell: bash
        run: |
          echo "::set-output name=tag::${GITHUB_REF#refs/heads/}-$(git rev-parse --short HEAD)"

      - name: Login to GitHub Container Registry
        uses: docker/login-action@v1
        with:
          username: ${{ secrets.GIT_USERNAME }}
          password: ${{ secrets.GIT_PASSWORD }}
      - name: Build and push image to Docker Hub
        run: |
          docker build . -t arnobdev/hattimatim-frontend:${{ steps.vars.outputs.tag }}
          docker push arnobdev/hattimatim-frontend:${{ steps.vars.outputs.tag }}

      - name: Push the build image to the DO kubectl
        uses: arn-ob/do-kubectl-action@main
        with:
          do_access_token: ${{ secrets.DO_ACCESS_TOKEN }}
          do_cluster_certificate: ${{ secrets.DO_CLUSTER_CERTIFICATE }}
          do_deployment_name: hattimatim-frontend-app
          do_container_name: hattimatim-frontend-app
          do_image_tag: arnobdev/hattimatim-frontend:${{ steps.vars.outputs.tag }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Short Details:&lt;/p&gt;

&lt;p&gt;Get the new commit tag, then it login into the docker hub. Then build the image from the repository. When the image ready then the image push to the kubectl by using &lt;em&gt;arn-ob/do-kubectl-action.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  [DigitalOcean kubectl Action - GitHub Marketplace
&lt;/h2&gt;

&lt;h3&gt;
  
  
  GitHub Action Access your DigitalOcean cluster via kubectl in a Github Action.
&lt;/h3&gt;

&lt;p&gt;github.com](&lt;a href="https://github.com/marketplace/actions/digitalocean-kubectl-action?source=post_page-----75573fcdc831---------------------------------------" rel="noopener noreferrer"&gt;https://github.com/marketplace/actions/digitalocean-kubectl-action?source=post_page-----75573fcdc831---------------------------------------&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;Thank you.&lt;/p&gt;

&lt;p&gt;Happy Learning…&lt;/p&gt;

</description>
    </item>
    <item>
      <title>GitHub Action Runs From Repository To Another Repository</title>
      <dc:creator>Arnob</dc:creator>
      <pubDate>Mon, 08 Jun 2026 16:19:26 +0000</pubDate>
      <link>https://dev.to/arn-ob/github-action-runs-from-repository-to-another-repository-127h</link>
      <guid>https://dev.to/arn-ob/github-action-runs-from-repository-to-another-repository-127h</guid>
      <description>&lt;p&gt;Hello, Here I show you the process with run one repository action from another specific repository.&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%2Fc81aoxv2u4zvmeldhiff.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%2Fc81aoxv2u4zvmeldhiff.png" alt="https://svrooij.io/assets/images/github-actions-banner.png" width="800" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Use Case
&lt;/h2&gt;

&lt;p&gt;Lots of developer work to build projects. So any project there is a GitHub workflow. So you wanted to protect the workflow for the wrong deployment.&lt;/p&gt;

&lt;p&gt;So here is the process of running action from one repository to any other repository.&lt;/p&gt;

&lt;h2&gt;
  
  
  Config Token
&lt;/h2&gt;

&lt;p&gt;You have to need a Personal Access Token (PAT). That token actually works when you pull another repository to the action.&lt;/p&gt;

&lt;p&gt;Goto Settings &amp;gt; Developer settings &amp;gt; Personal access tokens (classic)&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%2Fyzw6qduawm0wixi1zhsg.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyzw6qduawm0wixi1zhsg.jpeg" alt="Developer settings page" width="800" height="409"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Now needed to set up the workflow.&lt;/p&gt;

&lt;h2&gt;
  
  
  Action:
&lt;/h2&gt;

&lt;p&gt;Here is the GitHub workflow&lt;/p&gt;

&lt;p&gt;This workflow actually works as a middleware of project deployment. This workflow defines it runs in ubuntu and then selects any repository. Done.&lt;/p&gt;

&lt;h2&gt;
  
  
  Select Repository
&lt;/h2&gt;

&lt;p&gt;Here is the workflow from the selected repository&lt;/p&gt;

&lt;p&gt;This workflow is the GitHub action repository. It actually acknowledges/commit the arn-ob/github-actions repository for running the arn-ob/ssr-fetch.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: It actually based on branch to branch.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Now hope you will get confused. How does it work? So it is better to give you a diagram of the process.&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%2Fepzg6pvatwkrk1zzf02y.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%2Fepzg6pvatwkrk1zzf02y.png" alt="captionless image" width="800" height="509"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Process Details:&lt;/p&gt;

&lt;p&gt;1st github-repo-1 gives a commit then it runs the workflow. So repo-1 workflow yaml has targeted the repository to the github-action repo. repo-1 has committed to the github-action with a blank text file and commits that. So then github-action workflow runs. Then the github-action yaml has a repository of github-repo-1. So the action pulls the github-repo-1 code. Then it runs as it told to the github-action yaml.&lt;/p&gt;

&lt;p&gt;Happy Learning…&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Manage Multiple ExternalSecret</title>
      <dc:creator>Arnob</dc:creator>
      <pubDate>Mon, 08 Jun 2026 16:18:48 +0000</pubDate>
      <link>https://dev.to/arn-ob/manage-multiple-externalsecret-3poh</link>
      <guid>https://dev.to/arn-ob/manage-multiple-externalsecret-3poh</guid>
      <description>&lt;p&gt;Here I will share how you manage multiple Kubernetes secrets in One or Multiple services/pods.&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%2F7y356hvr6nbbdtf8thlp.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%2F7y356hvr6nbbdtf8thlp.png" alt="captionless image" width="800" height="416"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the story, every pod contains a secret or external secret file. So there are some common secrets in every pod. So I told you this secret is a common secret. So if any secret key changes then you have to change the secret from every pod.&lt;/p&gt;

&lt;p&gt;So, here describe how you manage the common secret.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pod 1 — cart-one-secret&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ENV_ONE=1
ENV_TWO=2
COMMON_TYPE=1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Pod 2 — cart-two-secret&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ENV_ONE=1
ENV_THREE=3
COMMON_TYPE=1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So here the two pods contain pod-wise secrets.&lt;/p&gt;

&lt;h2&gt;
  
  
  So here I create a common env.
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;Secret— common-secret&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;And Remove the Common Secret from other Pod Secret.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Pod 1 — cart-one-secret&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ENV_ONE=1
ENV_TWO=2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;em&gt;Pod 2 — cart-two-secret&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ENV_ONE=1
ENV_THREE=3
COMMON_TYPE=1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now you have to modify the Kubernetes deployment.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;apiVersion: apps/v1
kind: Deployment
metadata:
  annotations:
    name: cart-one
spec:
  progressDeadlineSeconds: 600
  replicas: 1
  revisionHistoryLimit: 10
  selector:
    matchLabels:
      app: cart-one
  strategy:
    rollingUpdate:
      maxSurge: 25%
      maxUnavailable: 25%
  template:
    metadata:
      annotations:
        secret.reloader.stakater.com/reload: cart-one-secret
      labels:
        app: cart-one
    spec:
      containers:
        envFrom:
        - secretRef:
            name: cart-one-secret
        image: docker.io/cart/cart-one/136a45d:136a45d
        imagePullPolicy: Always
        name: cart-one
        ports:
        - containerPort: 3000
          name: env
          protocol: TCP
        resources:
          limits:
            cpu: 150m
            memory: 150Mi
          requests:
            cpu: 50m
            memory: 50Mi
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;At the deployment, there is an &lt;em&gt;envFrom&lt;/em&gt; containing the secret key called &lt;em&gt;secretRef&lt;/em&gt;. So here in one &lt;em&gt;secretEnv&lt;/em&gt; then you have to add common &lt;em&gt;secretEnv&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;envFrom:
    - secretRef:
        name: cart-one-secret
    - secretRef:
        name: cart-two-secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now the pod &lt;em&gt;(cart-one-deployment)&lt;/em&gt; have then two secret env. If You can see the env details from the pod. Exec/run the pod&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl exec -it cart-one-57494cf954-9fg6f -- printenv | grep -i COMMON_TYPE=
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Output&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ENV_ONE=1
ENV_TWO=2
COMMON_TYPE=1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now if you wanted to reload/re-create-container the pod. At template, metadata modifies the secret&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;template:
    metadata:
      annotations:
        secret.reloader.stakater.com/reload: cart-one-secret,common-secret
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you change any secret at the common secret then the pod will re-create the pod.&lt;/p&gt;

&lt;p&gt;If you create a common secret from another pod &lt;em&gt;cart-two&lt;/em&gt;. Then use the same process as &lt;em&gt;cart-one&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Happy Learning…&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Kubernetes RBAC User Permission Manage</title>
      <dc:creator>Arnob</dc:creator>
      <pubDate>Mon, 08 Jun 2026 16:17:52 +0000</pubDate>
      <link>https://dev.to/arn-ob/kubernetes-rbac-user-permission-manage-5e8a</link>
      <guid>https://dev.to/arn-ob/kubernetes-rbac-user-permission-manage-5e8a</guid>
      <description>&lt;p&gt;Kubernetes RBAC stands for Role-Based Access Control. It is a security mechanism Kubernetes provides to control and manage access to resources within a cluster. RBAC allows cluster administrators to define fine-grained permissions and roles for individual users or groups, enabling them to access and perform specific actions on various resources.&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%2Fq72triu301qiepdmn67g.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%2Fq72triu301qiepdmn67g.png" alt="captionless image" width="800" height="718"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here I will share how you manage permission based on the user. I will give full details of how you handle the user permission. you can ignore it if you already have users.&lt;/p&gt;

&lt;p&gt;First, you have to create a policy. Go to “IAM dashboard”&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%2Fnb1ak27ztb7i3o04mr4j.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%2Fnb1ak27ztb7i3o04mr4j.png" alt="IAM dashboard" width="799" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now you have to go to the &lt;strong&gt;Policies&lt;/strong&gt; Page&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%2F7vybwv03b4y75btvqdrq.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%2F7vybwv03b4y75btvqdrq.png" alt="Policies" width="799" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now create policies&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%2Fhsrxjpmrn3qye5sfsmfk.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%2Fhsrxjpmrn3qye5sfsmfk.png" alt="Add Permission" width="800" height="456"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
    "Version": "2012-10-17",
    "Statement": [        {
            "Effect": "Allow",
            "Action": […
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
    </item>
    <item>
      <title>Kubernetes ElasticSearch Indices Snapshot And Restore Using AWS S3</title>
      <dc:creator>Arnob</dc:creator>
      <pubDate>Mon, 08 Jun 2026 16:15:40 +0000</pubDate>
      <link>https://dev.to/arn-ob/kubernetes-elasticsearch-indices-snapshot-and-restore-using-aws-s3-4fhb</link>
      <guid>https://dev.to/arn-ob/kubernetes-elasticsearch-indices-snapshot-and-restore-using-aws-s3-4fhb</guid>
      <description>&lt;p&gt;ElasticSearch deployed in Kubernetes, so here I will describe everything about snapshots and restoring indices by using AWS S3.&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%2Fmuslpbti4jk30i6qiax8.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%2Fmuslpbti4jk30i6qiax8.png" alt="captionless image" width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At AWS S3, we need to give permission S3 Access IAM Policy&lt;/p&gt;

&lt;p&gt;Here policy name &lt;em&gt;AmazonS3BucketAccess&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;AWS S3 configuration done. Now need to configure kubectl elastic search.&lt;/p&gt;

&lt;p&gt;Now install ECK (&lt;strong&gt;Elastic Cloud on Kubernetes&lt;/strong&gt;) resources&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl create -f https://download.elastic.co/downloads/eck/2.5.0/crds.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kubectl apply -f https://download.elastic.co/downloads/eck/2.5.0/operator.yaml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now need to give aws access and aws secret to elasticsearch keystore. You can’t find the keystore at kibana UI. You need to add the Keystore at deployment.&lt;/p&gt;

&lt;p&gt;Need to configure at deployment.&lt;/p&gt;

&lt;p&gt;Need to install a &lt;em&gt;repository-s3&lt;/em&gt; plugin at Kubernetes&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- name: install-plugins
  command:
    - sh
    - -c
    - |
      bin/elasticsearch-plugin install --batch repository-s3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now add the AWS Access Key and Secret Access with mapping with elastic search keystore.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;- name: add-aws-keys
  env:
  - name: AWS_ACCESS_KEY_ID
    value: &amp;lt;AWS_ACCESS_KEY_ID&amp;gt;
  - name: AWS_SECRET_ACCESS_KEY
    value: &amp;lt;AWS_SECRET_ACCESS_KEY&amp;gt;
  command:
    - sh
    - -c
    - |
      echo $AWS_ACCESS_KEY_ID | bin/elasticsearch-keystore add --stdin --force s3.client.default.access_key
      echo $AWS_SECRET_ACCESS_KEY | bin/elasticsearch-keystore add --stdin --force s3.client.default.secret_key
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here is the ElasticSearch deployment yaml.&lt;/p&gt;

&lt;p&gt;After the deployment, you need to wait for 1–2 minutes to get deployment in service.&lt;/p&gt;

&lt;h2&gt;
  
  
  Snapshot
&lt;/h2&gt;

&lt;p&gt;Create a _&lt;em&gt;snapshort&lt;/em&gt; PUT request from Kibana Dev Tools. Here at AWS S3 bucket gives a bucket name.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PUT /_snapshot/s3_repository?verify=false&amp;amp;pretty
{
  "type": "s3",
  "settings": {
    "bucket": "es-aws-s3-bucket",
    "region": "ap-northeast-3"
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "acknowledged": true
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After create the repository, need to check the verification status&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%2Fk33nwt9p75vc7tbmn2y8.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%2Fk33nwt9p75vc7tbmn2y8.png" alt="captionless image" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If it give connected. Done. If not then check the AWS S3 bucket access key, secret access key, also the AWS S3 IAM role.&lt;/p&gt;

&lt;p&gt;Now needs to back up the indices (index) to AWS S3 Buckets.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PUT _snapshot/s3_repository/backup
{
  "indices": "*",
  "ignore_unavailable": true,
  "include_global_state": false,
  "partial": false
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Response&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "accepted": true
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Also, you can create a Snapshot Policy from kibana&lt;/p&gt;

&lt;p&gt;Snapshot Policy Create&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%2Febiuw293zxr8vp4ljfpn.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%2Febiuw293zxr8vp4ljfpn.png" alt="captionless image" width="799" height="459"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here need to give a snapshot details&lt;/p&gt;

&lt;p&gt;Give a Policy name like &lt;em&gt;snapshot-policy&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Giving Snapshot Name like &lt;em&gt;&lt;/em&gt;. This means it will take the snapshot in present day.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Note: If you wanted to take the snapshot previous day then you have to give the snapshot name &lt;em&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The created Repository will be shown here. On the 1st you create the &lt;em&gt;s3_repository&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Giving the snapshot schedule.&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%2F1t4s9gjictnnbjwxt8bp.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%2F1t4s9gjictnnbjwxt8bp.png" alt="captionless image" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here give your snapshot setting.&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%2Fuz9e4jqilwv4k7w470w7.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%2Fuz9e4jqilwv4k7w470w7.png" alt="captionless image" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Snapshot retention, you can configure deleting snapshots after some days/m&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%2F0my27ipycfh3mmp3lkmn.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%2F0my27ipycfh3mmp3lkmn.png" alt="captionless image" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If your setting is good then it creates the policy&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%2Fflyie3azu24zwsc2rcl2.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%2Fflyie3azu24zwsc2rcl2.png" alt="captionless image" width="799" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Policy created. Or you can create a policy by using DevTools&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;PUT /_slm/policy/snapshot-policy
{
  "schedule": "0 30 1 * * ?",   // Set a time when the snapshot should be taken, for example, 01:30 UTC
  "name": "&amp;lt;snapshot-{now/d-1d}&amp;gt;",
  "repository": "s3_repository",
  "config": {
    "indices": "&amp;lt;logstash-{now/d-1d}&amp;gt;",
    "ignore_unavailable": true,
    "include_global_state": false
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you need to this policy then you see that snapshot setting at selected data streams and indices.&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%2Fau8k5r4tmgh1pq95rm6a.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%2Fau8k5r4tmgh1pq95rm6a.png" alt="captionless image" width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Selected Data streams and indices see the index patterns at the setting page.&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%2Ftjcpgkc9xdqbaa9078wv.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%2Ftjcpgkc9xdqbaa9078wv.png" alt="captionless image" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here the policy details view.&lt;/p&gt;

&lt;p&gt;Need to check the AWS S3 Buckets Objects, Are indices(index) backup or not&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%2Fevmcqla7z6xhmbctev0f.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%2Fevmcqla7z6xhmbctev0f.png" alt="captionless image" width="799" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Indices are backed up in AWS S3.&lt;/p&gt;

&lt;p&gt;When the schedule snapshot is taken, the snapshot history looks like this&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%2F9234z1v6bjzn6kb2ta1b.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%2F9234z1v6bjzn6kb2ta1b.png" alt="captionless image" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Restore&lt;/p&gt;

&lt;p&gt;Here I show you, how you restore the backup.&lt;/p&gt;

&lt;p&gt;If you using KGL(Kibana Query Language) then&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST _snapshot/s3_repository/backup/_restore
{
  "indices": "logstash-2023.09.26",
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If you had some naming indices then you can rename the indices&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;POST _snapshot/s3_repository/backup/_restore
{
  "indices": "logstash-2023.09.26",
  "rename_pattern": "logstash-(.+)", 
  "rename_replacement": "logstash-ret-$1"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here the rename pattern is the selected indices pattern to which you want to change the name. The rename will place the replacement rename before the $1.&lt;/p&gt;

&lt;p&gt;Here $1 is the first group from your regular expression. The (.+) is regex (regular expression) consists of a sequence of sub-expressions. In this example, [0–9] and +. The […], known as a character class (or bracket list), encloses a list of characters. It matches any SINGLE character in the list.&lt;/p&gt;

&lt;p&gt;Response&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "acknowledged": true
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After restoring the indices, if you search the indices&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GET _cat/indices
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F2tg85n0uu6u6av33zl8p.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%2F2tg85n0uu6u6av33zl8p.png" alt="captionless image" width="799" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You see the logstash-2023.09.26 is restore to logstash-ret-2023.09.26.&lt;/p&gt;

&lt;p&gt;Restoring Done.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;PUT _snapshot/s3_repository/backup&lt;/em&gt; if this response give this message then&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "error": {
    "root_cause": [      {
        "type": "repository_exception",
        "reason": "[s3_repository] Could not determine repository generation from root blobs"
      }
    ],
    "type": "repository_exception",
    "reason": "[s3_repository] Could not determine repository generation from root blobs",
    "caused_by": {
      "type": "i_o_exception",
      "reason": "Exception when listing blobs by prefix [index-]",
      "caused_by": {
        "type": "amazon_s3_exception",
        "reason": "The request signature we calculated does not match the signature you provided. Check your key and signing method. (Service: Amazon S3; Status Code: 403; Error Code: SignatureDoesNotMatch; Request ID: EPKD1F7TRQEFYRJQ; S3 Extended Request ID: x9cP0DSRbIzQlUExCjnmTItFJlkhEXx3wFMMVKUTMH+Nxeu6aQAApWmEJdUGwaH6bX9p8VWAAhs=; Proxy: null)"
      }
    }
  },
  "status": 500
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This means your ElasticSearch not connecting with AWS S3.&lt;br&gt;
You have to check the AWS S3 Access keys. If not solve the problem, then you have to add another access key, it will solve the problem&lt;/p&gt;

&lt;p&gt;Thank you.&lt;/p&gt;

&lt;p&gt;Happy Learning ….&lt;/p&gt;

</description>
    </item>
    <item>
      <title>AWS Lambda Introduction &amp; Create A Serverless Function</title>
      <dc:creator>Arnob</dc:creator>
      <pubDate>Mon, 08 Jun 2026 16:14:53 +0000</pubDate>
      <link>https://dev.to/arn-ob/aws-lambda-introduction-create-a-serverless-function-bpm</link>
      <guid>https://dev.to/arn-ob/aws-lambda-introduction-create-a-serverless-function-bpm</guid>
      <description>&lt;h2&gt;
  
  
  What is Lambda
&lt;/h2&gt;

&lt;p&gt;AWS Lambda is an event-driven, serverless computing platform provided by Amazon as a part of Amazon Web Services. It is a computing service that runs code in response to events and automatically manages the computing resources required by that code.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;AWS Lambda is a serverless, event-driven compute service that lets you run code for virtually any type of application or backend service without provisioning or managing servers. You can trigger Lambda from over 200 AWS services and software as a service (SaaS) applications, and only pay for what you use.&lt;/p&gt;

&lt;p&gt;I share those infromation from &lt;a href="https://aws.amazon.com/lambda/" rel="noopener noreferrer"&gt;AWS Lambd&lt;/a&gt; 😁&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Create a&lt;/strong&gt; Lambda &lt;strong&gt;Function&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Here i use Serverless for Lambda function. By using Serverless make easier to create and deploy a serverless function.&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%2Fpadxdxqc1vvcyxe9ox2o.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%2Fpadxdxqc1vvcyxe9ox2o.png" alt="serverless.com" width="800" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Install a &lt;code&gt;serverless&lt;/code&gt; package.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -g serverless
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After installing the serverless. Run &lt;code&gt;serverless&lt;/code&gt; from terminal&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;output&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%2Ffnbqb6yqeop96upapil8.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%2Ffnbqb6yqeop96upapil8.png" alt="captionless image" width="800" height="345"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now select a project type. Here i select &lt;code&gt;AWS — Node.js — HTTP API&lt;/code&gt; . Here i project name &lt;code&gt;aws-node-http-api-project&lt;/code&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%2Fbhjxcuruv81vgjtb9ov7.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%2Fbhjxcuruv81vgjtb9ov7.png" alt="captionless image" width="800" height="299"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here i don’t need to serverless dashboard because we not need the serverless dashboard so we set to No. And we not need to deploy it also selected No.&lt;/p&gt;

&lt;p&gt;Now open the project code at Visual Studio Code&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%2Fnpqrvltsgkgn7em8f5rc.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%2Fnpqrvltsgkgn7em8f5rc.png" alt="captionless image" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The file list&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%2F3b3clmrxs71xmzj9vvkf.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%2F3b3clmrxs71xmzj9vvkf.png" alt="captionless image" width="562" height="206"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At serverless.yaml there region is not given. Better you have to define the region. If you not give any region then it default region &lt;code&gt;us-east-1&lt;/code&gt; will be deployed.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;service: aws-node-http-api-project
frameworkVersion: '3'
provider:
  name: aws
  runtime: nodejs18.x
  region: ap-southeast-1 # Region is Singapore
functions:
  api:
    handler: index.handler
    events:
      - httpApi:
          path: /
          method: get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The Index.js is like a hello World 😁&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module.exports.handler = async (event) =&amp;gt; {
  return {
    statusCode: 200,
    body: JSON.stringify(
      {
        message: "Go Serverless v3.0! Your function executed successfully!",
        input: event,
      },
      null,
      2
    ),
  };
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So now deploy the serverless.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Here had a profile so use my profile for deploy.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;serverless deploy --aws-profile arn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fryvfdyjlcuelen0b1lpp.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%2Fryvfdyjlcuelen0b1lpp.png" alt="captionless image" width="800" height="215"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So visit the site using the link &lt;code&gt;[https://n7bu0mlvah.execute-api.ap-southeast-1.amazonaws.com](https://n7bu0mlvah.execute-api.ap-southeast-1.amazonaws.com/)&lt;/code&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%2Fzogkh8dkc7urww39eki0.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%2Fzogkh8dkc7urww39eki0.png" alt="captionless image" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Lambda Function deployed.&lt;/p&gt;

&lt;p&gt;Hope so you learn, how to deploy a lambda function by using serverless framework.&lt;/p&gt;

&lt;p&gt;Happy Learning ….&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Configuring Lambda Function For Custom Domain By Using API Gateway</title>
      <dc:creator>Arnob</dc:creator>
      <pubDate>Mon, 08 Jun 2026 16:14:08 +0000</pubDate>
      <link>https://dev.to/arn-ob/configuring-lambda-function-for-custom-domain-by-using-api-gateway-2lo8</link>
      <guid>https://dev.to/arn-ob/configuring-lambda-function-for-custom-domain-by-using-api-gateway-2lo8</guid>
      <description>&lt;p&gt;Here Configuring a custom domain for AWS Lambda Function with API Gateway.&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%2Ff6tnd41m3losz4ekzldg.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%2Ff6tnd41m3losz4ekzldg.png" alt="captionless image" width="759" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Create Lambda Function
&lt;/h2&gt;

&lt;p&gt;At first create a lambda function. Here i just create a normal hello-world function.&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%2Fjw2azvujl4nsfp1psjt2.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%2Fjw2azvujl4nsfp1psjt2.png" alt="captionless image" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here the function&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handler&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// TODO implement&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;statusCode&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Hello from Lambda!&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the hello world function. Now this function need to connect custom domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Create API Gateway
&lt;/h2&gt;

&lt;p&gt;Go to Lambda function add a API Gateway&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%2Fej3zgmgckx3ccwlbckrg.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%2Fej3zgmgckx3ccwlbckrg.png" alt="captionless image" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After clicking the add trigger button, Search API Gateway. Select that&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%2Fbnyf78idgwhvwdk0i1yd.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%2Fbnyf78idgwhvwdk0i1yd.png" alt="captionless image" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At Intent, Select Create a new API and Security is open, Then click Add Button.&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%2Fjgn8ni28e40hokmbr5ce.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%2Fjgn8ni28e40hokmbr5ce.png" alt="captionless image" width="799" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then at Configuration &amp;gt; Triggers, a API Gateway came.&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%2Fpvx3fcap97shrtwlcwqh.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%2Fpvx3fcap97shrtwlcwqh.png" alt="captionless image" width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can visit the link&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%2Fvniuqdb15662eb9x5oke.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%2Fvniuqdb15662eb9x5oke.png" alt="captionless image" width="800" height="498"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here the API Gateway creating is Done. Now need to add custom domain.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add Custom Domain
&lt;/h2&gt;

&lt;p&gt;If you don’t mapping with Cloudflare and AWS Certificate Manager . Then you have to map it 1st.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Certificate Manager
&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%2F5kn10xac39eplkh8es0b.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%2F5kn10xac39eplkh8es0b.png" alt="captionless image" width="799" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Request a Certificate&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%2Fupu9r7vuk8b6ur7fh1ah.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%2Fupu9r7vuk8b6ur7fh1ah.png" alt="captionless image" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Next&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%2Fd58caj86s0bwg7gtutgm.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%2Fd58caj86s0bwg7gtutgm.png" alt="captionless image" width="800" height="462"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then you see the Certificates list. Click on the id&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%2Fp53w890snfrvymxxkqvg.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%2Fp53w890snfrvymxxkqvg.png" alt="captionless image" width="799" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: This Domain Already Issued. I just show to process.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Then copy the CNAME Name and CNAME Value. Then add to the cloudflare dns record&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%2Fh1mrvolrjxaxf3o55nie.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%2Fh1mrvolrjxaxf3o55nie.png" alt="captionless image" width="800" height="29"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After add the record. Wait 5 min, it will be issued.&lt;/p&gt;

&lt;h2&gt;
  
  
  Add &lt;strong&gt;API Gateway&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now add a custom Domain Names&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%2Frsb6on9me4hwlyzg8o14.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%2Frsb6on9me4hwlyzg8o14.png" alt="captionless image" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create a Domain&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%2Fyrs7734qpxf5vfs7lkq5.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%2Fyrs7734qpxf5vfs7lkq5.png" alt="captionless image" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then Click Create Domain Name Button.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Note: It will be created. I already create this domain. So here getting the error message.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Then goto Custom Domain Names. Select the domain&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%2Fik8vnffrjh3ggat8yakj.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%2Fik8vnffrjh3ggat8yakj.png" alt="captionless image" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copy the API Gateway domain name. Then goto Cloudflare. Add a record&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%2F9fyor34fe3it2tdl888a.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%2F9fyor34fe3it2tdl888a.png" alt="captionless image" width="800" height="28"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Done. Now wait for 5 min. It will sync the DNS Record.&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%2F1wc3pvgupf1k27u58j9q.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%2F1wc3pvgupf1k27u58j9q.png" alt="captionless image" width="799" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Custom Domain Mapping Done.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How To Read S3 File/Image Using Lambda Functions</title>
      <dc:creator>Arnob</dc:creator>
      <pubDate>Mon, 08 Jun 2026 16:13:25 +0000</pubDate>
      <link>https://dev.to/arn-ob/how-to-read-s3-fileimage-using-lambda-functions-85k</link>
      <guid>https://dev.to/arn-ob/how-to-read-s3-fileimage-using-lambda-functions-85k</guid>
      <description>&lt;p&gt;Here i share how you preview image using API Gateway, S3 and Lambda Function. This function build on Node.js 18.x&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%2Fhul5pl8jb4hsogqqgz8q.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%2Fhul5pl8jb4hsogqqgz8q.png" alt="AWS Lambda Function" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Create A Lambda Function&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%2Fg6njk2vzl0zm9otkibpp.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%2Fg6njk2vzl0zm9otkibpp.png" alt="captionless image" width="799" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give a function name, Runtime, Architecture.&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%2F9sadssxxnpzuiokfuuvn.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%2F9sadssxxnpzuiokfuuvn.png" alt="captionless image" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After creating the function. Need to Add trigger with S3 and API Gateway&lt;/p&gt;

&lt;h2&gt;
  
  
  Add Trigger at S3 and API Gateways
&lt;/h2&gt;

&lt;p&gt;Here 1st i adding S3 as a trigger with this function.&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%2Fehbdpr9usfkfo18c2tl0.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%2Fehbdpr9usfkfo18c2tl0.png" alt="captionless image" width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give the selected bucker name and event type. After that click Add.&lt;/p&gt;

&lt;p&gt;2nd adding the API Gateway&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%2Flka1ik50elsow85b7vwk.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%2Flka1ik50elsow85b7vwk.png" alt="captionless image" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At API Gateway, create intent as a &lt;code&gt;create a new API&lt;/code&gt; , Set API Type is &lt;code&gt;HTTP API&lt;/code&gt; , At Security, Select Open. Then Click Add Button.&lt;/p&gt;

&lt;p&gt;Trigger configuration done.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Adding Code&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now Add Code at &lt;code&gt;index.js&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;const AWS = require('aws-sdk');
const s3 = new AWS.S3();
exports.handler = async (event, context) =&amp;gt; {

  const bucketName = '&amp;lt;BUCKET_NAME&amp;gt;';
  const imageKey = '&amp;lt;IMAGE_KEY/NAME&amp;gt;'; // Replace 'your-image-key.jpg' with your actual image key

  try {
    const params = {
      Bucket: bucketName,
      Key: imageKey,
    };

     const s3Object = await s3.getObject(params).promise();
    if (!s3Object || !s3Object.Body) {
      return {
        statusCode: 404,
        body: JSON.stringify({ message: 'Image not found' })
      };
    }
    const imageData = Buffer.from(s3Object.Body, 'binary').toString('base64') ;
    return {
      statusCode: 200,
      headers: {
        'Content-Type': 'image/jpeg'
      },
      isBase64Encoded: true,
      body: imageData

    };
  } catch (error) {
    return {
      statusCode: 500,
      body: JSON.stringify(error.message)
    };
  }
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here a a require package needed. But you can’t add &lt;code&gt;node_modules&lt;/code&gt; at Lambda function. Need to create a layer.&lt;/p&gt;

&lt;p&gt;Goto Lambda Function &amp;gt; Layer (At Additional resources)&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%2Ff6wqqmsix0ekteabi83t.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%2Ff6wqqmsix0ekteabi83t.png" alt="captionless image" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Creating a layer&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%2Fnfv4g0xxlbne28z73uok.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%2Fnfv4g0xxlbne28z73uok.png" alt="captionless image" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give a function name, upload the zip file, select the Compatible architectures and select the compatible runtimes. Then Create Layer.&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%2Ftzxp85tblneny25qn3rx.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%2Ftzxp85tblneny25qn3rx.png" alt="captionless image" width="800" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that, you need to add that layer to lambda function.&lt;/p&gt;

&lt;h2&gt;
  
  
  Adding Layer
&lt;/h2&gt;

&lt;p&gt;At the Code Section, the bottom you find the &lt;strong&gt;Layers&lt;/strong&gt; section.&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%2Fvinp55nzi5pbds0pjgso.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%2Fvinp55nzi5pbds0pjgso.png" alt="captionless image" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Add a layer&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%2Fv6709dycexv9t1xisawc.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%2Fv6709dycexv9t1xisawc.png" alt="captionless image" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select Custom Layers, there it shows your created layers. Add that layer then click Add Button.&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%2Fb84d7r0f8dznh0r5tpjo.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%2Fb84d7r0f8dznh0r5tpjo.png" alt="captionless image" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then 1 layer has added.&lt;/p&gt;

&lt;p&gt;Now goto &lt;strong&gt;Configuration &amp;gt; Click Triggers&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%2Fux13n0j998jc1dwngum6.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%2Fux13n0j998jc1dwngum6.png" alt="captionless image" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here you see a API Gateway endpoint and S3 bucket&lt;/p&gt;

&lt;p&gt;When you click the link, you see the image,&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%2Fv6btmausd2k1uw6wvfcb.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%2Fv6btmausd2k1uw6wvfcb.png" alt="captionless image" width="800" height="597"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Happy Coding…&lt;/p&gt;

&lt;p&gt;Here a Payoneer &lt;a href="http://share.payoneer.com/nav/9s0aWS2LFYEM7_Zi4XIP8NM7JXq7eDPqB8FqjGQ7kGNrVquqh4346azbkGJ9X9SoGYRSeDn7tln1aPoJH6a0UQ2" rel="noopener noreferrer"&gt;&lt;strong&gt;Refer Link&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Images Resizing From S3 Using Lambda Function and CloudFront</title>
      <dc:creator>Arnob</dc:creator>
      <pubDate>Mon, 08 Jun 2026 16:12:47 +0000</pubDate>
      <link>https://dev.to/arn-ob/images-resizing-from-s3-using-lambda-function-and-cloudfront-3gpl</link>
      <guid>https://dev.to/arn-ob/images-resizing-from-s3-using-lambda-function-and-cloudfront-3gpl</guid>
      <description>&lt;p&gt;Change the image size on the fly from S3 Object, also using CDN for serving the image.&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%2Fthzj208c865uwsv69c43.jpeg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fthzj208c865uwsv69c43.jpeg" alt="Image From Medium" width="800" height="391"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Story: Images are store in S3. The recruitment is view any image any size on the fly and send to the response using recommend size. The resizing image will serve at CDN using CloudFront.&lt;/p&gt;

&lt;p&gt;Lambda Function Deployment&lt;/p&gt;

&lt;p&gt;For lambda function i use Serverless Apps. 1st need to create a node package.&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Output&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "name": "image-resizer-function",
  "version": "1.0.0",
  "description": "Image Resizer Function",
  "main": "index.js",
  "keywords": [],
  "author": "",
  "license": "ISC",
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now install serverless&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install serverless -g
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After install the serverless. Create a Serverless app, At terminal&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&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%2Flkdko2ej8spgtl01gcfo.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%2Flkdko2ej8spgtl01gcfo.png" alt="captionless image" width="616" height="306"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select &lt;code&gt;HTTP API&lt;/code&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%2Fv5j0i8mb6ukwyzunmr7x.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%2Fv5j0i8mb6ukwyzunmr7x.png" alt="captionless image" width="529" height="314"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Project created.&lt;/p&gt;

&lt;p&gt;Now adding the code to that index.js&lt;/p&gt;

&lt;p&gt;At Lambda Function Preview&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%2F4ir8ku0njf8o54sutmfy.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%2F4ir8ku0njf8o54sutmfy.png" alt="captionless image" width="799" height="451"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here added 2 packages. So need to add 2 layer at Lambda Function.&lt;/p&gt;

&lt;p&gt;If you deploy this project that project will get &lt;code&gt;Internal Server Error&lt;/code&gt;. Now we can deploy this function. Then add the layer to that function.&lt;/p&gt;

&lt;p&gt;Lambda Function Deployment&lt;/p&gt;

&lt;p&gt;Here the Serverless yaml config&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;service: aws-node-http-api-project
frameworkVersion: '3'
provider:
  name: aws
  runtime: nodejs18.x
  region: us-east-1
functions:
  api:
    handler: index.handler
    events:
      - httpApi:
          path: /{pathA}
          method: get
      - httpApi:
          path: /{pathA}/{pathB}
          method: get
      - httpApi:
          path: /{pathA}/{pathB}/{pathC}
          method: get
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Need to run this at terminal&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Output&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%2Fv32okhjmmb7a8kkyj6v7.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%2Fv32okhjmmb7a8kkyj6v7.png" alt="captionless image" width="750" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The AWS Lambda Console&lt;/p&gt;

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

&lt;p&gt;Here a Serverless add a API Gateway. Now adding a S3 Bucket with Lambda Function.&lt;/p&gt;

&lt;p&gt;S3 Bucket Creating and Manage&lt;/p&gt;

&lt;p&gt;Here the bucket name is &lt;code&gt;img-resizer-v1&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Object Ownership&lt;/strong&gt; ACLs Enabled*&lt;em&gt;.&lt;/em&gt;*&lt;/p&gt;

&lt;p&gt;Allow Public Access.&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%2Fwtcay7kyfbz4s3iozesl.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%2Fwtcay7kyfbz4s3iozesl.png" alt="captionless image" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Creating Done.&lt;/p&gt;

&lt;p&gt;Now edit the bucket policy&lt;/p&gt;

&lt;p&gt;Bucket &amp;gt; img-resizer-v1 &amp;gt; Edit Bucket Policy&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Now uploading some images at Buckets.&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%2Fu2s0eqqovdr4e6h3yxhw.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%2Fu2s0eqqovdr4e6h3yxhw.png" alt="captionless image" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Connecting Lambda function with S3&lt;/p&gt;

&lt;p&gt;Click Add Trigger&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%2F1szduss4rxbjow9vv9ir.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%2F1szduss4rxbjow9vv9ir.png" alt="captionless image" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select S3&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%2Fesvhprsyxmluomacsw68.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%2Fesvhprsyxmluomacsw68.png" alt="captionless image" width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select the Selected bucket. Then Click Add&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%2Fzyg9m0nugazsdfdyfclk.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%2Fzyg9m0nugazsdfdyfclk.png" alt="captionless image" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add Layer&lt;/p&gt;

&lt;p&gt;Now Add Layer at the function. At the bottom get the layer section.&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%2F110riqg5vb84c5n4v08z.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%2F110riqg5vb84c5n4v08z.png" alt="captionless image" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Add Layer. At Choose a layer select Custom Layers.&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%2Fy5c5duqe7s0019ib5kfp.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%2Fy5c5duqe7s0019ib5kfp.png" alt="captionless image" width="799" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;Note: Now you add the layer i will share later.&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Add aws-sdk and sharp with this layer.&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%2F7dlhwxgfi07jot2xlhg0.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%2F7dlhwxgfi07jot2xlhg0.png" alt="captionless image" width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At Function 2 Layer added.&lt;/p&gt;

&lt;p&gt;Testing&lt;/p&gt;

&lt;p&gt;Now test the Lambda Function. At the Configuration Tab. Select Triggers. You will see the API Gateway. There you will find a API Endpoint&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%2F0jbeujfatqcbn6yrfd82.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%2F0jbeujfatqcbn6yrfd82.png" alt="captionless image" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For testing view the image from API Gateway link.&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%2Fq8a33c3jg7q5020qtviw.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%2Fq8a33c3jg7q5020qtviw.png" alt="captionless image" width="800" height="476"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For testing the image resizing. Given the image size width is 500px&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;https://u4kqo8jrjd.execute-api.us-east-1.amazonaws.com/image.png?w=500
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2Fc8r3tezt65wkkj64gza6.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%2Fc8r3tezt65wkkj64gza6.png" alt="captionless image" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Working 😁. I think it will return some error 😅.&lt;/p&gt;

&lt;p&gt;Now Applying CloudFront with Lambda Function&lt;/p&gt;

&lt;p&gt;Applying Cloudfront CDN&lt;/p&gt;

&lt;p&gt;Creating a Distributions.&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%2F2w8pzbpa2coklnw1bnhy.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%2F2w8pzbpa2coklnw1bnhy.png" alt="captionless image" width="800" height="775"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Select Origin Domain, which is given URL by API Gateway&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;u4kqo8jrjd.execute-api.us-east-1.amazonaws.com
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Protocol is HTTPS only.&lt;/p&gt;

&lt;p&gt;At &lt;strong&gt;Default cache behavior,&lt;/strong&gt; Viewer protocol policy is HTTPS Only.&lt;/p&gt;

&lt;p&gt;At &lt;strong&gt;Cache key and origin requests,&lt;/strong&gt; Cache policy is Caching Optimized&lt;/p&gt;

&lt;p&gt;For creating image resizing parameter need to create a cache policy and origin request policy.&lt;/p&gt;

&lt;p&gt;Goto Policy Tab, Creating cache policy and origin request policy&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%2Fae4d56tvcmlfv84sfp2g.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%2Fae4d56tvcmlfv84sfp2g.png" alt="captionless image" width="800" height="1279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then click Origin Request Tab. Create origin request policy&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%2Flbbqxup26bfiyacyyb4c.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%2Flbbqxup26bfiyacyyb4c.png" alt="captionless image" width="800" height="847"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Create Button.&lt;/p&gt;

&lt;p&gt;At CloudFront page click refresh button, newly created policy will show there,&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%2F86t8wzy09jcc7qcoyyjq.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%2F86t8wzy09jcc7qcoyyjq.png" alt="captionless image" width="800" height="565"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;At Web Application Firewall (WAF) Select Do Not Enable Security Protections&lt;/p&gt;

&lt;p&gt;At Settings, if you wanted to add domain, you need to create a Certificate, then add the sub-domain with CloudFront.&lt;/p&gt;

&lt;p&gt;Goto AWS Certificate Manager &amp;gt; Certificates&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%2F92rx8bhox8vqy4a1p15y.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%2F92rx8bhox8vqy4a1p15y.png" alt="captionless image" width="800" height="453"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give the Domain Name&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;image-resizer.arn-ob.xyz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Click Request.&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%2Fwz3lz15peig8rtpn1jim.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%2Fwz3lz15peig8rtpn1jim.png" alt="captionless image" width="800" height="106"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Certificate ID&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%2F48gm3gdog0geclka2yxs.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%2F48gm3gdog0geclka2yxs.png" alt="captionless image" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Add the DNS to CNAME name and value to Cloudflare&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%2Fe3q7gozatkke4nev1j46.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%2Fe3q7gozatkke4nev1j46.png" alt="captionless image" width="800" height="475"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click Save. It will take some time to validate the Domain. Now it status is Pending Validation.&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%2Fsv815xls7wqip5njy2vp.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%2Fsv815xls7wqip5njy2vp.png" alt="captionless image" width="798" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After 2–3 min. It will issued.&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%2Fd4my2mpn07vj7mbt8xqc.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%2Fd4my2mpn07vj7mbt8xqc.png" alt="captionless image" width="798" height="122"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now add the sub-domain to CloudFront&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%2Fvoy0pjxee4au2ctebmaq.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%2Fvoy0pjxee4au2ctebmaq.png" alt="captionless image" width="800" height="835"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All Done. Click Create Distribution. Now it will take 5–10 min for deploying CDN.&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%2F3becqsyzo2mloq1pmxkx.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%2F3becqsyzo2mloq1pmxkx.png" alt="captionless image" width="800" height="378"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now connect the sub-domain with CloudFront.&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%2Fciyr9g8m06yvlwq6tkui.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%2Fciyr9g8m06yvlwq6tkui.png" alt="captionless image" width="799" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Domain mapping done with CloudFront CDN.&lt;/p&gt;

&lt;p&gt;Tesitng&lt;/p&gt;

&lt;p&gt;Original Image&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%2Fiemx9568mdaoirrvkio8.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%2Fiemx9568mdaoirrvkio8.png" alt="captionless image" width="799" height="479"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resizing Image&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%2Fd0ucs1l0jnb9ey7xnfy3.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%2Fd0ucs1l0jnb9ey7xnfy3.png" alt="captionless image" width="800" height="481"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Image Resizing Done. 😁&lt;/p&gt;

&lt;p&gt;So here we use CloudFront CDN, Now testing the image return response time.&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%2Fxti3hgjwd3jobhdj1hhr.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%2Fxti3hgjwd3jobhdj1hhr.png" alt="captionless image" width="800" height="478"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here CloudFront CDN working Good. 😁&lt;/p&gt;

&lt;p&gt;The project repository:&lt;br&gt;
&lt;a href="https://github.com/arn-ob/aws-img-resizer-s3-lambda-cdn" rel="noopener noreferrer"&gt;https://github.com/arn-ob/aws-img-resizer-s3-lambda-cdn&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you for Reading…&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Configure Kubernetes &amp; Manage Other Domains by using Nginx Proxy Manager</title>
      <dc:creator>Arnob</dc:creator>
      <pubDate>Mon, 08 Jun 2026 16:12:10 +0000</pubDate>
      <link>https://dev.to/arn-ob/configure-kubernetes-manage-other-domains-by-using-nginx-proxy-manager-3c</link>
      <guid>https://dev.to/arn-ob/configure-kubernetes-manage-other-domains-by-using-nginx-proxy-manager-3c</guid>
      <description>&lt;p&gt;&lt;strong&gt;Here I used CNAME instead of an IP because I needed to run both Proxy Manager and Kubernetes, but both use port 80. One had to run on port 80 directly, and the other through CNAME. Since I hadn’t used CNAME before, I had to learn and test it and finally, I got it working.&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%2Fwqxhnewdqwq07uir3569.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%2Fwqxhnewdqwq07uir3569.png" alt="nginx proxy manager" width="800" height="382"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;What is Nginx Proxy Manager?&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Expose your web services easily with free SSL from Let’s Encrypt.&lt;/strong&gt;&lt;br&gt;
Built with security in mind, it’s perfect for home or private networks.&lt;br&gt;
You can manage Proxy Hosts, Redirection Hosts, Streams.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Deploying Nginx Proxy Manager To VM&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;1st you have to install docker. For using the NPM.&lt;br&gt;
Create an &lt;em&gt;docker-compose.yml&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;services:
  app:
    image: 'jc21/nginx-proxy-manager:latest'
    restart: unless-stopped
    ports:
      - '80:80' # Public HTTP Port
      - '443:443' # Public HTTPS Port
      - '81:81' # Admin Web Port
    environment:
      # Mysql/Maria connection parameters:
      DB_MYSQL_HOST: "db"
      DB_MYSQL_PORT: 3306
      DB_MYSQL_USER: "npm"
      DB_MYSQL_PASSWORD: "npm"
      DB_MYSQL_NAME: "npm"

    volumes:
      - ./data:/data
      - ./letsencrypt:/etc/letsencrypt
    depends_on:
      - db
  db:
    image: 'jc21/mariadb-aria:latest'
    restart: unless-stopped
    environment:
      MYSQL_ROOT_PASSWORD: 'npm'
      MYSQL_DATABASE: 'npm'
      MYSQL_USER: 'npm'
      MYSQL_PASSWORD: 'npm'
      MARIADB_AUTO_UPGRADE: '1'
    volumes:
      - ./mysql:/var/lib/mysql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run the docker compose&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://nginxproxymanager.com/screenshots/login.png" rel="noopener noreferrer"&gt;https://nginxproxymanager.com/screenshots/login.png&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Default Administrator User&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Email:    admin@example.com
Password: changeme
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Change the password and email after login&lt;/p&gt;

&lt;p&gt;Also you can modify in &lt;em&gt;docker-compose.yml&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;environment:
      INITIAL_ADMIN_EMAIL: my@example.com
      INITIAL_ADMIN_PASSWORD: mypassword1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F1dvip8dfq2j5j6gst7n3.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%2F1dvip8dfq2j5j6gst7n3.png" alt="Image from nginxproxymanager screenshort" width="800" height="610"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After Login&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%2Ft68qtol9mug0zlih0o2d.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%2Ft68qtol9mug0zlih0o2d.png" alt="image from nginx proxy manager screenshort" width="800" height="586"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now Creating an Proxy Host&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%2Fxcfl5lbqe5rx4qhz5vb0.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%2Fxcfl5lbqe5rx4qhz5vb0.png" alt="image from nginx proxy manager screenshort" width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: The dashboard will empty, Here i sharing my dashboard.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Networking:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now its time to configure the Network. We will make the 80 port with Proxy manager also kubernetes. So my router is mikrotik&lt;/p&gt;
&lt;h3&gt;
  
  
  First Step: We are going to configure Proxy Manager
&lt;/h3&gt;

&lt;p&gt;Check and get proxy manager ip&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%2F03hf5yw3duyn8e219mgb.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%2F03hf5yw3duyn8e219mgb.png" alt="captionless image" width="798" height="171"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here is the ip is &lt;em&gt;192.168.88.180&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Now target the ip to mikrotik. At Mikrotik goto IP &amp;gt; Firewall &amp;gt; NAT&lt;/p&gt;

&lt;p&gt;Add an NAT rules&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%2Fx64wr4ir02plu7726q0y.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%2Fx64wr4ir02plu7726q0y.png" alt="captionless image" width="799" height="578"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Note: Please add your public ip at Dst. Address (change from X.X.X.X to public ip).&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Then add the local ip at Action.&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%2Flag6uf9ovv27w4umxu85.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%2Flag6uf9ovv27w4umxu85.png" alt="captionless image" width="799" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;After that need to create and Proxy Host at Proxy Manager, Goto Dashboard, Click &lt;em&gt;Add Proxy Host&lt;/em&gt; button.&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%2F7eoo9a59zxc06ufhgou2.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%2F7eoo9a59zxc06ufhgou2.png" alt="captionless image" width="800" height="872"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Note: I configure that previously so here is the edit tab.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here is the details:&lt;/strong&gt;&lt;br&gt;
Sub-Domain: proxy.arn-ob.xyz&lt;br&gt;
Scheme: http&lt;br&gt;
Forward IP: 192.168.88.180&lt;br&gt;
Forward Port: 80&lt;/p&gt;

&lt;p&gt;No need to configure the SSL.&lt;/p&gt;

&lt;p&gt;Now goto Cloudflare, Add that sub domain to DNS&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%2F9uv2zgtummqxgime2jan.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%2F9uv2zgtummqxgime2jan.png" alt="captionless image" width="800" height="94"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;This now using CNAME, for other sub domain at Cloudflare&lt;/p&gt;

&lt;p&gt;Another config are need, that is Cloudflare SSL/TLS. Make sure the Current encryption mode is Full&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%2Fvm21xieodv1nv6c9hry5.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%2Fvm21xieodv1nv6c9hry5.png" alt="Cloudflare SSL/TLS Ency Type" width="800" height="393"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Networking Part is Done.&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;Proxy Manager Configure&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Now adding kubernetes nginx ingress ip to nginx proxy manager.&lt;/p&gt;

&lt;p&gt;Now getting ip from vm. Goto VM open terminal type&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;At output you will find the ip. Copy that.&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%2Fc5tr5kzfqdsaoutwrfp0.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%2Fc5tr5kzfqdsaoutwrfp0.png" alt="captionless image" width="798" height="113"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now check the ingress is it giving private ip or not&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%2F0qtx4yr2xtgfp08khkgj.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%2F0qtx4yr2xtgfp08khkgj.png" alt="captionless image" width="799" height="107"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;VM ip and kubernetes ingress not same, its ok. In the behind i using &lt;strong&gt;MetalLB.&lt;/strong&gt; It will manage the internal networking.&lt;/p&gt;

&lt;p&gt;Then Goto Dashboard, Click &lt;em&gt;Add Proxy Host&lt;/em&gt; button&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%2Faitzr6cvj8wrh1uap4jy.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%2Faitzr6cvj8wrh1uap4jy.png" alt="captionless image" width="800" height="870"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Give the Domain Name, Scheme, Forward Hostname/IP, Forward Port&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Here the details:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Domain Name: nginx.arn-ob.xyz&lt;/li&gt;
&lt;li&gt;  Scheme: http&lt;/li&gt;
&lt;li&gt;  Forward Hostname/IP: &lt;a href="http://192.168.88.175:80" rel="noopener noreferrer"&gt;192.168.88.175&lt;/a&gt; (kubernetes ingress ip)&lt;/li&gt;
&lt;li&gt;  Forward Port: 80&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Now add the SSL from &lt;strong&gt;Let’s Encrypt, Go to SSL Tab, Then you see this&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%2Fuf4bfcs3xlx332i57oa1.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%2Fuf4bfcs3xlx332i57oa1.png" alt="captionless image" width="800" height="621"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here the config&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%2F7zlyfwvqda6blodo9n3v.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%2F7zlyfwvqda6blodo9n3v.png" alt="captionless image" width="800" height="888"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Request a SSL Certificate. Also enable HTTP/2 Support. Then give the check mark of I Agree. Then Save.&lt;/p&gt;

&lt;p&gt;If give an &lt;em&gt;Internal Error.&lt;/em&gt; Then Check you enable 80 port or your router NAT config which based on proxy manager private IP with public IP&lt;/p&gt;

&lt;p&gt;Then Add the record to Cloudflare DNS&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%2Fn5os9mvbads1edkm3128.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%2Fn5os9mvbads1edkm3128.png" alt="captionless image" width="796" height="83"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Remember we add the proxy.arn-ob.xyz sub-domain with External IP.&lt;/p&gt;

&lt;p&gt;Now for &lt;em&gt;nginx.arn-ob.xyz&lt;/em&gt; sub-domain mapping Content with the &lt;em&gt;proxy.arn-ob.xyz&lt;/em&gt; as type as &lt;strong&gt;CNAME&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Now hit the browser with the domain &lt;em&gt;nginx.arn-ob.xyz.&lt;/em&gt; Hope you will see this screen&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%2Fc5jpxa6367ksimipsgf2.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%2Fc5jpxa6367ksimipsgf2.png" alt="captionless image" width="800" height="662"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Thank you for Reading.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>CNAME Cross-User Banned Issue</title>
      <dc:creator>Arnob</dc:creator>
      <pubDate>Mon, 08 Jun 2026 16:11:32 +0000</pubDate>
      <link>https://dev.to/arn-ob/cname-cross-user-banned-issue-mn9</link>
      <guid>https://dev.to/arn-ob/cname-cross-user-banned-issue-mn9</guid>
      <description>&lt;p&gt;I will share how to solve the CNAME Cross-User Banned issue&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%2Fsg7um6e99jn0swa9e80l.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%2Fsg7um6e99jn0swa9e80l.png" alt="captionless image" width="800" height="454"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;“CNAME Cross-User Banned”&lt;/strong&gt; error usually happens on &lt;strong&gt;AWS CloudFront&lt;/strong&gt; (but also in other CDN providers) when you try to associate a custom domain (CNAME/alternate domain name) with a distribution, but that domain is already registered with another account.&lt;/p&gt;

&lt;p&gt;This is a security restriction to prevent &lt;strong&gt;CNAME hijacking&lt;/strong&gt; (so someone else cannot claim your domain and serve content under it without authorization). But you configure that for right.&lt;/p&gt;

&lt;p&gt;Here i am using Proxy Manager. So i need to connect other domain using proxy manager&lt;/p&gt;

&lt;p&gt;So How i got that error:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  You have &lt;strong&gt;Nginx Proxy Manager&lt;/strong&gt; (NPM) running.&lt;/li&gt;
&lt;li&gt;  It listens on &lt;strong&gt;port 80&lt;/strong&gt; with the hostname &lt;code&gt;proxy.pxydomain.xyz&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  You then added another domain (&lt;code&gt;anotherdomain.xyz&lt;/code&gt;) into Proxy Manager.&lt;/li&gt;
&lt;li&gt;  In DNS, instead of pointing &lt;code&gt;anotherdomain.xyz&lt;/code&gt; directly with an &lt;strong&gt;A record&lt;/strong&gt; to your server’s IP, you created a &lt;strong&gt;CNAME&lt;/strong&gt; like this:
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;anotherdomain.xyz     CNAME    proxy.pxydomain.xyz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;  Now you’re getting the &lt;strong&gt;CNAME Cross-User Banned&lt;/strong&gt; error.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why this happens
&lt;/h2&gt;

&lt;p&gt;The error isn’t from your DNS itself — it’s usually from &lt;strong&gt;Cloudflare, AWS CloudFront, or another CDN/proxy layer&lt;/strong&gt; in front of your setup.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Cloudflare in particular blocks “CNAME flattening”&lt;/strong&gt; if the target (&lt;code&gt;proxy.pxydomain.xyz&lt;/code&gt;) doesn’t belong to your account or doesn’t resolve in a way Cloudflare accepts.&lt;/li&gt;
&lt;li&gt;  AWS CloudFront also blocks if the CNAME target (&lt;code&gt;proxy.pxydomain.xyz&lt;/code&gt;) is registered with a distribution in another AWS account.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So, the issue comes from your DNS proxy/CDN provider &lt;strong&gt;not allowing you to CNAME one apex/root domain (&lt;/strong&gt;&lt;code&gt;**anotherdomain.xyz**&lt;/code&gt;&lt;strong&gt;) to another domain (&lt;/strong&gt;&lt;code&gt;**proxy.pxydomain.xyz**&lt;/code&gt;&lt;strong&gt;)&lt;/strong&gt; unless you prove ownership of both.&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Here the solutions:&lt;/strong&gt;
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Option 1 — Use A/AAAA record directly
&lt;/h3&gt;

&lt;p&gt;Instead of CNAME:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;anotherdomain.xyz  A     &amp;lt;your server IP&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then let Nginx Proxy Manager handle the domain internally. This is the simplest and avoids the CNAME restriction&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 2 — Use CNAME only for subdomains
&lt;/h3&gt;

&lt;p&gt;Some providers (like Cloudflare) don’t allow CNAME at the &lt;strong&gt;root domain&lt;/strong&gt; (&lt;code&gt;anotherdomain.xyz&lt;/code&gt;). But they allow it for subdomains, e.g.:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;www.anotherdomain.xyz  CNAME  proxy.pxydomain.xyz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then redirect &lt;code&gt;anotherdomain.xyz → [www.](http://www.greatmind.xyz.)anotherdomain[.xyz](http://www.greatmind.xyz.)&lt;/code&gt;&lt;a href="http://www.greatmind.xyz." rel="noopener noreferrer"&gt;.&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 3 — Same CDN account
&lt;/h3&gt;

&lt;p&gt;If you’re using Cloudflare:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Add &lt;strong&gt;both domains (&lt;/strong&gt;&lt;code&gt;**pxydomain.xyz**&lt;/code&gt; &lt;strong&gt;and&lt;/strong&gt; &lt;code&gt;**anotherdomain.xyz**&lt;/code&gt;&lt;strong&gt;) to the same Cloudflare account/zone&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;  Then Cloudflare won’t block the CNAME because it sees you own both.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Option 4 — Disable CDN proxying
&lt;/h3&gt;

&lt;p&gt;If Cloudflare is the culprit:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Go to your DNS settings in Cloudflare.&lt;/li&gt;
&lt;li&gt;  Switch the orange cloud ☁️ (proxy) → to gray (DNS only).&lt;/li&gt;
&lt;li&gt;  This bypasses the restriction but loses Cloudflare proxy/CDN features.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Done.&lt;/p&gt;

&lt;p&gt;Here i am using Option 4. And It works 😀&lt;/p&gt;

</description>
    </item>
    <item>
      <title>How to connect ProxMox with Proxy Manager</title>
      <dc:creator>Arnob</dc:creator>
      <pubDate>Mon, 08 Jun 2026 16:10:56 +0000</pubDate>
      <link>https://dev.to/arn-ob/how-to-connect-proxmox-with-proxy-manager-2ea3</link>
      <guid>https://dev.to/arn-ob/how-to-connect-proxmox-with-proxy-manager-2ea3</guid>
      <description>&lt;p&gt;&lt;strong&gt;Here i share how to use Proxmox in Proxy Manager&lt;/strong&gt;, you’re essentially trying to &lt;strong&gt;proxy Proxmox’s web interface or API&lt;/strong&gt; (port &lt;code&gt;8006&lt;/code&gt;) through your reverse proxy securely — so you can access it via a domain like &lt;code&gt;https://proxmox.example.com&lt;/code&gt; instead of &lt;code&gt;https://192.168.0.1:8006&lt;/code&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%2F75mezd9vgqzej6vhk58k.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%2F75mezd9vgqzej6vhk58k.png" alt="captionless image" width="230" height="219"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s how to do it cleanly depending on your proxy setup:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nginx Proxy Manager (NPM) Configuration&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Step 1: Add a new Proxy Host
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Open Nginx Proxy Manager dashboard → click “Add Proxy Host”.&lt;/li&gt;
&lt;li&gt;  In the Details tab:

&lt;ul&gt;
&lt;li&gt;Domain Names: proxmox.example.com&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scheme&lt;/strong&gt;: https&lt;/li&gt;
&lt;li&gt;Forward Hostname / IP: &lt;/li&gt;
&lt;li&gt;Forward Port: 8006&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable&lt;/strong&gt; — Block Common Exploits&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Enable&lt;/strong&gt; -Websockets Support&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Disable&lt;/strong&gt; — Cache Assets&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  Step 2: SSL
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  Go to the &lt;strong&gt;SSL&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;  Select:

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;SSL Certificate:&lt;/strong&gt; Request a new &lt;strong&gt;Let’s Encrypt&lt;/strong&gt; certificate.&lt;/li&gt;
&lt;li&gt;Enable &lt;strong&gt;Force SSL&lt;/strong&gt; and &lt;strong&gt;HTTP/2 Support&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;Step 3: Custom Nginx config (important)&lt;/p&gt;

&lt;p&gt;In NPM, under “Advanced”, add:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;proxy_ssl_verify off;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Forwarded-Proto $scheme;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This disables SSL verification for Proxmox’s backend self-signed cert and ensures WebSocket/Console access works.&lt;/p&gt;

&lt;p&gt;Done.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
