<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[Stories by Naveen on Medium]]></title>
        <description><![CDATA[Stories by Naveen on Medium]]></description>
        <link>https://medium.com/@nnav33nk?source=rss-f4f57a3d1cc6------2</link>
        <image>
            <url>https://cdn-images-1.medium.com/fit/c/150/150/1*2Ed7JcFkxlP9yIL_KEW1BQ.jpeg</url>
            <title>Stories by Naveen on Medium</title>
            <link>https://medium.com/@nnav33nk?source=rss-f4f57a3d1cc6------2</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 24 May 2026 02:25:58 GMT</lastBuildDate>
        <atom:link href="https://medium.com/@nnav33nk/feed" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Amazon EKS: Deploying a Go Server with AWS Load Balancer Controller]]></title>
            <link>https://medium.com/@nnav33nk/amazon-eks-deploying-a-go-server-with-aws-load-balancer-controller-ed7cf907d923?source=rss-f4f57a3d1cc6------2</link>
            <guid isPermaLink="false">https://medium.com/p/ed7cf907d923</guid>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[golang]]></category>
            <category><![CDATA[aws]]></category>
            <category><![CDATA[aws-eks]]></category>
            <category><![CDATA[devops]]></category>
            <dc:creator><![CDATA[Naveen]]></dc:creator>
            <pubDate>Thu, 02 Nov 2023 14:06:21 GMT</pubDate>
            <atom:updated>2023-11-02T14:06:21.781Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="Superman(EKS) managing massive ships(master nodes)" src="https://cdn-images-1.medium.com/max/1024/1*pPRTJ-gTh0Vu7WL2v4UEpQ.jpeg" /></figure><p>In my previous <a href="https://medium.com/@nnav33nk/deploying-a-basic-go-server-using-helm-locally-c0d57bf6740e">post</a><a href="https://medium.com/@nnav33nk/deploying-a-basic-go-server-using-helm-locally-c0d57bf6740e,">,</a> we created a basic Go application, generated a Docker image, and deployed it to our local minikube k8s cluster. In this post, let’s take that same application and deploy it on Amazon’s EKS.</p><h3>Prerequisites</h3><ul><li>Familiarity with the previous post is recommended but not mandatory.</li><li>Install the AWS CLI and configure your account, either through a named profile or default. AWS CLI <a href="https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html">Installation Guide</a>.</li><li>Install eksctl, a tool that simplifies EKS cluster management. eksctl <a href="https://eksctl.io/installation/">Installation</a>.</li><li>Set up kubectl to access your EKS cluster. Install <a href="https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/">kubectl</a>.</li></ul><h3>The Why and What of EKS?</h3><p>Working with Kubernetes involves great abstraction and greater complexity. Managing a Kubernetes cluster involves tasks like upgrades, handling certificates, managing etcd and master node crashes. EKS, as a managed platform, abstracts the control plane components and simplifies cluster management, allowing you to focus on worker nodes. See a comparison of Self-Managed vs. Managed Platforms <a href="https://dzone.com/articles/the-state-of-kubernetes-self-managed-vs-managed-pl">here</a>.</p><h3><strong>EKS Cluster</strong></h3><p>We will create an EKS cluster, and our containers will run on AWS Fargate, a managed compute engine. Fargate eliminates the need to manage infrastructure, handling tasks like scaling and patching.</p><h4><strong>Create an EKS Cluster</strong></h4><pre>eksctl create cluster --name go-server-cluster --region &lt;region-name&gt; --fargate --profile &lt;aws-profile-name&gt;</pre><p>This command creates a cluster in the specified region. The — fargate option creates a default Fargate profile. The command also sets up a new VPC, and brings up the entire cluster.</p><pre>aws eks update-kubeconfig --name go-server-cluster --region &lt;region-name&gt; --profile &lt;aws-profile-name&gt;</pre><p>Configures kubectl on our local machine to interact with the EKS cluster by creating and switching to a new kubectl context.</p><pre>eksctl create fargateprofile --cluster go-server-cluster --region &lt;region-name&gt; --profile &lt;aws-profile-name&gt; --name go-server-alb --namespace goserver-2023</pre><p>Creates a new Fargate profile for deploying pods onto Fargate.</p><pre># go-server.yaml<br><br>---<br>apiVersion: v1<br>kind: Namespace<br>metadata:<br>  name: goserver-2023<br>---<br>apiVersion: apps/v1<br>kind: Deployment<br>metadata:<br>  namespace: goserver-2023<br>  name: goserver-deployment<br>spec:<br>  selector:<br>    matchLabels:<br>      app.kubernetes.io/name: goserver-2023<br>  replicas: 5<br>  template:<br>    metadata:<br>      labels:<br>        app.kubernetes.io/name: goserver-2023<br>    spec:<br>      containers:<br>      - image: knav33n/go-server:latest<br>        imagePullPolicy: Always<br>        name: goserver-2023<br>        ports:<br>        - containerPort: 3333<br>---<br>apiVersion: v1<br>kind: Service<br>metadata:<br>  namespace: goserver-2023<br>  name: goserver-service<br>spec:<br>  ports:<br>    - port: 80<br>      targetPort: 3333<br>      protocol: TCP<br>  type: NodePort<br>  selector:<br>    app.kubernetes.io/name: goserver-2023<br>---<br>apiVersion: networking.k8s.io/v1<br>kind: Ingress<br>metadata:<br>  namespace: goserver-2023<br>  name: goserver-ingress<br>  annotations:<br>    alb.ingress.kubernetes.io/scheme: internet-facing<br>    alb.ingress.kubernetes.io/target-type: ip<br>spec:<br>  ingressClassName: alb<br>  rules:<br>    - http:<br>        paths:<br>        - path: /<br>          pathType: Prefix<br>          backend:<br>            service:<br>              name: goserver-service<br>              port:<br>                number: 80</pre><pre>kubectl apply -f go-server.yaml</pre><p>Creates various Kubernetes resources as defined in the ‘go-server.yaml’ file. The public image `knav33n/go-server:latest` is pulled from Dockerhub.</p><h4>Configuring the Policy and Service Account for the ALB</h4><p>Amazon EKS provides support for IAM Roles for Service Accounts, allowing cluster operators to associate AWS IAM Roles with Kubernetes Service Accounts. This facilitates fine-grained permission management for applications running on EKS that utilize various AWS services. These services may include components like the AWS Load Balancer controller or ExternalDNS.</p><pre>eksctl utils associate-iam-oidc-provider --cluster $cluster_name --approve --profile &lt;aws-profile-name&gt;</pre><p>Enables the IAM OIDC Provider, which is not enabled by default.</p><pre>curl -O https://raw.githubusercontent.com/kubernetes-sigs/aws-load-balancer-controller/v2.5.4/docs/install/iam_policy.json</pre><p>Fetches the necessary policy document.</p><pre>aws iam create-policy --policy-name AWSLoadBalancerControllerIAMPolicy --policy-document file://iam_policy.json --profile &lt;aws-profile-name&gt;</pre><p>Creates a policy in AWS with the specified name and the policy document we fetched.</p><pre>eksctl create iamserviceaccount --cluster=go-server-cluster --namespace=kube-system --name=aws-load-balancer-controller --profile &lt;aws-profile-name&gt; --role-name AmazonEKSLoadBalancerControllerRole --attach-policy-arn=arn:aws:iam::&lt;aws-account-number&gt;:policy/AWSLoadBalancerControllerIAMPolicy --approve</pre><p>Creates an IAM Service Account for the AWS Load Balancer controller.</p><p>The AWS Load Balancer controller (LBC) manages AWS Network Load Balancer (NLB) and Application Load Balancer (ALB) resources. It continuously monitors Kubernetes service and ingress resources, configuring AWS resources accordingly.</p><h4>Add Controller to Cluster</h4><p>To install and configure the AWS Load Balancer controller as the Ingress controller, use the following commands.</p><pre>helm repo add eks https://aws.github.io/eks-charts<br>helm repo update eks<br>helm install aws-load-balancer-controller eks/aws-load-balancer-controller -n kube-system --set clusterName=go-server-cluster --set serviceAccount.create=false --set serviceAccount.name=aws-load-balancer-controller --set region=&lt;region-name&gt; --set vpcId=&lt;aws-vpc-id-created-by-eksctl&gt;</pre><p>Upon completion, the service will be assigned an external IP address, and our Go server will be accessible via the internet.</p><pre>kubectl get svc -n goserver-2023</pre><p>To find the external IP address of the service.</p><p>With the ingress mapped to forward requests from port 80 to 3333, we can access our server using <em>curl &lt;external-ip&gt;</em>, which should yield a 200 response.</p><h3>Clean Up</h3><p>Use the following commands to clean up the AWS resources.</p><pre>eksctl delete cluster --name go-server-cluster --profile &lt;aws-profile-name&gt;</pre><p>Delete the EKS cluster</p><pre>eksctl delete iamserviceaccount -c go-server-cluster --name aws-load-balancer-controller --profile &lt;aws-profile-name&gt;</pre><p>Delete the IAM service account</p><pre>aws iam detach-role-policy --role-name AmazonEKSLoadBalancerControllerRole --policy-arn arn:aws:iam::&lt;aws-account-number&gt;:policy/AWSLoadBalancerControllerIAMPolicy --profile &lt;aws-profile-name&gt;</pre><p>Detach the role policy</p><pre>aws iam delete-role --role-name AmazonEKSLoadBalancerControllerRole --profile &lt;aws-profile-name&gt;</pre><p>Delete the role</p><pre>aws iam delete-policy --policy-arn arn:aws:iam::&lt;aws-account-number&gt;:policy/AWSLoadBalancerControllerIAMPolicy --profile &lt;aws-profile-name&gt;</pre><p>Delete the policy</p><h3><strong>Helpful Links</strong></h3><ul><li><a href="https://www.youtube.com/watch?v=RRCrY12VY_s">https://www.youtube.com/watch?v=RRCrY12VY_s</a></li><li><a href="https://dzone.com/articles/the-state-of-kubernetes-self-managed-vs-managed-pl">https://dzone.com/articles/the-state-of-kubernetes-self-managed-vs-managed-pl</a></li><li><a href="https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html">https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html</a></li><li><a href="https://aws.amazon.com/fargate/">https://aws.amazon.com/fargate/</a></li><li><a href="https://docs.aws.amazon.com/eks/latest/userguide/fargate-getting-started.html">https://docs.aws.amazon.com/eks/latest/userguide/fargate-getting-started.html</a></li><li><a href="https://eksctl.io/usage/fargate-support/">https://eksctl.io/usage/fargate-support/</a></li><li><a href="https://eksctl.io/usage/iamserviceaccounts/">https://eksctl.io/usage/iamserviceaccounts/</a></li><li><a href="https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.5/deploy/installation/">https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.5/deploy/installation/</a></li><li><a href="https://www.bing.com/create">https://www.bing.com/create</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=ed7cf907d923" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Deploying a Basic Go Server Using Helm Locally]]></title>
            <link>https://medium.com/@nnav33nk/deploying-a-basic-go-server-using-helm-locally-c0d57bf6740e?source=rss-f4f57a3d1cc6------2</link>
            <guid isPermaLink="false">https://medium.com/p/c0d57bf6740e</guid>
            <category><![CDATA[docker]]></category>
            <category><![CDATA[helm]]></category>
            <category><![CDATA[golang]]></category>
            <category><![CDATA[kubernetes]]></category>
            <category><![CDATA[microk8s]]></category>
            <dc:creator><![CDATA[Naveen]]></dc:creator>
            <pubDate>Wed, 18 Oct 2023 10:01:43 GMT</pubDate>
            <atom:updated>2023-10-18T10:04:54.533Z</atom:updated>
            <content:encoded><![CDATA[<h3><strong>Deploying a Go Server Using Helm Locally</strong></h3><figure><img alt="Deploying a Basic Go Server Using Helm Locally" src="https://cdn-images-1.medium.com/max/1024/1*SXswNg4CNtUx62tf2m4ZOg.jpeg" /></figure><h3><strong>What We Are Going to Do</strong></h3><p>We will deploy a Go application with 2 endpoints onto a Kubernetes (k8s) cluster using Helm. The process involves creating a Docker container for the application, pushing the image to Dockerhub, and configuring our Helm chart to fetch the Go application from Dockerhub.</p><h3><strong>Prerequisites</strong></h3><p>To follow this tutorial effectively, you should have some knowledge of Kubernetes. Although Helm abstracts away a lot of YAML configuration, familiarity with Kubernetes will help you appreciate the simplification. Here are the prerequisites:</p><ul><li><strong>Go</strong>: Install Go by following the instructions at <a href="https://go.dev/doc/install">Go Installation</a>.</li><li><strong>kubectl</strong>: Install kubectl by visiting <a href="https://kubernetes.io/docs/tasks/tools/install-kubectl-linux/">Install kubectl</a>.</li><li><strong>Microk8s</strong>: You can set up a Kubernetes cluster on your local machine using microk8s. Refer to <a href="https://microk8s.io/docs/working-with-kubectl">Microk8s Documentation</a> for installation and <a href="https://microk8s.io/docs/getting-started">Getting Started</a> for initial setup.</li></ul><pre>// if you plan on using the official kubectl, install kubectl first and then install Microk8s<br><br>sudo snap install microk8s<br>sudo usermod -a -G microk8s $USER<br><br>cd $HOME<br>mkdir .kube<br>cd .kube<br>microk8s config &gt; config<br><br>sudo chown -f -R $USER ~/.kube</pre><ul><li><strong>Helm</strong>: Install Helm using a script or package manager relevant to your operating system. Refer to Helm Installation.</li></ul><h3><strong>What Is Helm? Why Helm?</strong></h3><p>Helm is a Kubernetes package manager designed to simplify the lifecycle management of Kubernetes applications. Think of it as a package manager for Kubernetes, similar to apt, homebrew, or npm. Instead of binary apps or JS modules, Helm deals with entire applications that can be deployed on a Kubernetes cluster. You can search for packages using <strong>`helm search hub &lt;package-name&gt;</strong>` after installing Helm. Additionally, Helm allows you to add repositories to download private Kubernetes packages.</p><p>If you’ve encountered the complexity of Kubernetes, you know that all resources are typically declared in YAML. Helm simplifies this by generating the necessary YAML with a single command. This makes deploying and managing applications more straightforward. It’s especially useful for maintaining multiple environments and facilitating updates and rollbacks.</p><h3><strong>The Go Server</strong></h3><p>Let’s build a simple Go app. Create a directory and a file named <strong>`main.go`</strong>.</p><pre>// main.go<br><br>package main<br><br>import (<br> &quot;errors&quot;<br> &quot;fmt&quot;<br> &quot;io&quot;<br> &quot;net/http&quot;<br> &quot;os&quot;<br>)<br><br>func getRoot(w http.ResponseWriter, r *http.Request) {<br> fmt.Printf(&quot;got / request\n&quot;)<br> io.WriteString(w, &quot;https://naveenkumar.dev 🔥🎇🎆🧨\n&quot;)<br>}<br><br>func getHello(w http.ResponseWriter, r *http.Request) {<br> fmt.Printf(&quot;got /hello request\n&quot;)<br> io.WriteString(w, &quot;Hello from Helm!\n&quot;)<br>}<br><br>func main() {<br> http.HandleFunc(&quot;/&quot;, getRoot)<br> http.HandleFunc(&quot;/hello&quot;, getHello)<br><br> err := http.ListenAndServe(&quot;:3333&quot;, nil)<br> if errors.Is(err, http.ErrServerClosed) {<br>  fmt.Printf(&quot;server closed\n&quot;)<br> } else if err != nil {<br>  fmt.Printf(&quot;error starting server: %s\n&quot;, err)<br>  os.Exit(1)<br> }<br>}</pre><p>This app provides two endpoints: <strong>`/`</strong> and <strong>`/hello`</strong>, exposed on port <strong>`3333`</strong>. Initialize the Go module with <strong>`go mod init go-server`</strong>, and run the application with <strong>`go run main.go`</strong>. Use <strong>`curl localhost:3333/hello`</strong> to verify that it responds with “Hello from Helm!”.</p><h3><strong>The Go Server Container</strong></h3><p>Let’s create a Dockerfile for the Go application to build a Docker image and push it to Dockerhub.</p><pre># Dockerfile<br><br>FROM golang:1.21.3-alpine3.18<br>WORKDIR /app<br>COPY go.mod ./<br>RUN go mod download<br>COPY *.go ./<br>RUN CGO_ENABLED=0 GOOS=linux go build -o /go-server<br>EXPOSE 3333<br>CMD [&quot;/go-server&quot;]</pre><p>Build the image and run it locally using the following commands:</p><pre>docker build --tag go-server .<br>docker run -d -p 3333:3333 go-server</pre><p>Use <strong>`curl localhost:3333/hello`</strong> to verify that it still responds with “Hello from Helm!”. Next, tag the image and push it to Dockerhub since Helm and Kubernetes fetch images from Dockerhub. Log in to Dockerhub via the CLI before pushing the image:</p><pre>docker login<br>docker tag go-server &lt;your-dockerhub-username&gt;/go-server:latest<br>docker push &lt;your-dockerhub-username&gt;/go-server</pre><h3><strong>Helm Chart</strong></h3><p>Navigate to a workspace directory and execute the following command:</p><pre>helm create go-server</pre><p>The <strong>`helm create`</strong> command generates a template needed for any single-tier application. Open the <strong>`values.yaml`</strong> file generated by the previous command and update the <strong>`repository`</strong> field under <strong>`image`</strong> to <strong>`&lt;your-dockerhub-username&gt;/go-server:latest`</strong>. Additionally, change the <strong>`type`</strong> of service to <strong>`NodePort`</strong> and the port to 3333 (matching the application’s port).</p><p>You’re almost done! Deploy your application to the Microk8s cluster with the following command. Ensure you’ve stopped the previously started Docker container using <strong>`docker stop &lt;container-id&gt;`</strong>.</p><pre>helm install go-server-helm go-server</pre><p>You can verify what’s created in the Kubernetes cluster with these commands:</p><pre>helm list -a<br>kubectl get po -w<br>kubectl get svc<br>curl &lt;CLUSTER-IP ip-from kubectl get svc&gt;<br>curl &lt;CLUSTER-IP ip-from kubectl get svc&gt;:3333<br>curl &lt;CLUSTER-IP ip-from kubectl get svc&gt;:3333/hello</pre><p><strong>`curl localhost:3333/hello`</strong> should respond with “Hello from Helm!” once more.</p><h3><strong>Cleanup</strong></h3><p>Use <strong>`helm uninstall go-server-helm`</strong> to remove the application from the cluster. To remove the Docker container and image:</p><pre>docker rm &lt;container-id&gt; // for the container<br>docker rmi &lt;image-id&gt; // for the image</pre><h3><strong>Helpful Links</strong></h3><ul><li><a href="https://artifacthub.io/">https://artifacthub.io/</a></li><li><a href="https://sysdig.com/learn-cloud-native/kubernetes-101/what-is-helm-in-kubernetes/">https://sysdig.com/learn-cloud-native/kubernetes-101/what-is-helm-in-kubernetes/</a></li><li><a href="https://www.cncf.io/blog/2020/08/26/why-do-devops-engineers-love-helm/">https://www.cncf.io/blog/2020/08/26/why-do-devops-engineers-love-helm/</a></li><li><a href="https://www.digitalocean.com/community/tutorials/how-to-make-an-http-server-in-go">https://www.digitalocean.com/community/tutorials/how-to-make-an-http-server-in-go</a></li><li><a href="https://docs.docker.com/language/golang/build-images/">https://docs.docker.com/language/golang/build-images/</a></li><li><a href="https://www.youtube.com/watch?v=DQk8HOVlumI">https://www.youtube.com/watch?v=DQk8HOVlumI</a></li><li><a href="https://www.bing.com/images/create/">https://www.bing.com/images/create/</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c0d57bf6740e" width="1" height="1" alt="">]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[My Journey through — The Cloud Resume Challenge]]></title>
            <link>https://medium.com/@nnav33nk/my-journey-through-the-cloud-resume-challenge-902692efb2a6?source=rss-f4f57a3d1cc6------2</link>
            <guid isPermaLink="false">https://medium.com/p/902692efb2a6</guid>
            <category><![CDATA[cloud-resume-challenge]]></category>
            <category><![CDATA[devops]]></category>
            <category><![CDATA[aws]]></category>
            <dc:creator><![CDATA[Naveen]]></dc:creator>
            <pubDate>Wed, 28 Jun 2023 08:02:07 GMT</pubDate>
            <atom:updated>2023-06-28T10:25:57.855Z</atom:updated>
            <content:encoded><![CDATA[<h3>My Journey through — The Cloud Resume Challenge</h3><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*L-xjCKHzmdcxTEjM0xoEVg.png" /><figcaption>Cloud Resume Challenge</figcaption></figure><p>Links -</p><ul><li>Site: <a href="https://naveenkumar.dev">https://naveenkumar.dev</a></li><li>Repo: <a href="https://github.com/knav33n/naveenkumar.dev">https://github.com/knav33n/naveenkumar.dev</a></li></ul><p>As someone who loves to learn by doing, I was actively exploring ways to gain practical experience in cloud-related skills. That’s when I stumbled upon The Cloud Resume Challenge. Even though I have prior experience in software development, I was genuinely amazed at how much I learned through this challenge. In a nutshell, the challenge invites you to deploy an application on a cloud provider of your choice. The flexibility to choose any provider intrigued me, and given my familiarity with AWS, I decided to go with it.</p><p>Creating the static site was a breeze for me, as I’ve been working with front-end development since I first started in software. Instead of opting for a comprehensive resume, I decided to go with a simpler introductory/portfolio page. Deploying the static site proved to be relatively straightforward using the user interface. First, I needed to generate a certificate for my domain through ACM (AWS Certificate Manager), which was then validated through a CNAME entry. Next, I set up an S3 bucket and created a CloudFront distribution that linked to the S3 bucket, making sure to include the alternate domain I had purchased. I then updated the bucket policy with the one provided by CloudFront. At this point, I could access the site using the domain generated by CloudFront. To further connect everything together, I created a CNAME entry in Route53 to point my domain to the CloudFront domain. Voila! The site was now fully accessible through my own domain name.</p><p>The next step involved writing a lambda function to track the number of views and store them in DynamoDB. This part took some time since I was relatively new to working with Python and it was my first experience with Lambda and DynamoDB. To ensure the lambda function could access the DynamoDB table, I created a relevant role that granted the necessary read and write permissions.</p><p>Lambda provided a function URL that could be utilized to call it. Curious to explore further, I decided to experiment by using a subdomain of mine to invoke this lambda function. This required setting up an API Gateway and configuring it to forward requests to the lambda function(though this is not in the final repo). To ensure security, I updated the CORS settings of the lambda function, ensuring that it could only be called from my own domain.</p><p>Now, whenever the page loads, an AJAX call from the front-end triggered the update of the DynamoDB table. The response from this update contained the updated view count, which was then displayed on the UI. It was truly rewarding to witness the views being dynamically updated in real time.</p><p>The next crucial step was to incorporate monitoring capabilities. To achieve this, I proceeded to set up CloudWatch alarms to keep a close eye on any errors or invocations of the lambda function. In order to receive timely notifications, I configured SNS topics and created an additional Lambda function with the necessary role. This Lambda function was specifically designed to register and publish these alarms to a designated channel within a Slack workspace. By utilizing webhooks, I established a seamless integration between CloudWatch and Slack, enabling real-time updates and notifications.</p><p>For source control, I relied on GitHub, although I must admit that GitHub Actions was a new concept for me. I encountered numerous failed workflows along the way, which was a bit frustrating. To make matters more confusing, there were instances when GitHub Actions experienced downtime, adding to the challenges I faced.</p><p>Next, I delved into using Terraform to provision the necessary infrastructure. It was a whole new learning experience, and I dedicated hours upon hours to understanding how it functions. I scoured through documentation, learning the ins and outs of deploying the desired resources. It involved a lot of trial and error, and there were countless moments of searching for solutions.</p><p>But eventually, after much persistence and effort, I managed to provision everything I needed using Terraform. From setting up S3 buckets to configuring CloudWatch alarms, I successfully achieved the desired infrastructure setup. It was truly fulfilling to see everything fall into place after overcoming the initial learning curve and persisting through the challenges.</p><p>In conclusion, this journey has been nothing short of incredible, filled with invaluable learning experiences. I am immensely grateful to Forrest Brazeal for crafting such an amazing challenge. It has pushed me to explore new territories, expand my skill set, and discover the boundless possibilities of cloud-related technologies.</p><p>Helpful links -</p><ul><li><a href="https://www.automat-it.com/post/using-github-actions-with-aws-iam-roles">https://www.automat-it.com/post/using-github-actions-with-aws-iam-roles</a></li><li><a href="https://github.com/aws-actions/configure-aws-credentials">https://github.com/aws-actions/configure-aws-credentials</a></li><li><a href="https://repost.aws/knowledge-center/cloudfront-serve-static-website">https://repost.aws/knowledge-center/cloudfront-serve-static-website</a></li><li><a href="https://www.netlify.com/guides/creating-an-api-with-aws-lambda-dynamodb-and-api-gateway/setting-up-our-lambda-function/">https://www.netlify.com/guides/creating-an-api-with-aws-lambda-dynamodb-and-api-gateway/setting-up-our-lambda-function/</a></li><li><a href="https://aws.amazon.com/getting-started/hands-on/build-serverless-web-app-lambda-apigateway-s3-dynamodb-cognito/">https://aws.amazon.com/getting-started/hands-on/build-serverless-web-app-lambda-apigateway-s3-dynamodb-cognito/</a></li><li><a href="https://stackoverflow.com/questions/57288992/terraform-how-to-create-iam-role-for-aws-lambda-and-deploy-both">https://stackoverflow.com/questions/57288992/terraform-how-to-create-iam-role-for-aws-lambda-and-deploy-both</a></li><li><a href="https://docs.aws.amazon.com/lambda/latest/dg/API_CreateFunction.html#SSS-CreateFunction-request-Runtime">https://docs.aws.amazon.com/lambda/latest/dg/API_CreateFunction.html#SSS-CreateFunction-request-Runtime</a></li><li><a href="https://stackoverflow.com/a/56070283">https://stackoverflow.com/a/56070283</a></li><li><a href="https://stackoverflow.com/a/67879838">https://stackoverflow.com/a/67879838</a></li><li><a href="https://www.youtube.com/watch?v=NxQgltu1yYM">https://www.youtube.com/watch?v=NxQgltu1yYM</a></li><li><a href="https://www.youtube.com/watch?v=G4_ay2_h9GI">https://www.youtube.com/watch?v=G4_ay2_h9GI</a></li><li><a href="https://www.youtube.com/watch?v=ox_HJ8w7FPI">https://www.youtube.com/watch?v=ox_HJ8w7FPI</a></li><li><a href="https://medium.com/analytics-vidhya/generate-slack-notifications-for-aws-cloudwatch-alarms-e46b68540133">https://medium.com/analytics-vidhya/generate-slack-notifications-for-aws-cloudwatch-alarms-e46b68540133</a></li><li><a href="https://github.com/aws-actions/configure-aws-credentials/issues/357">https://github.com/aws-actions/configure-aws-credentials/issues/357</a></li></ul><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=902692efb2a6" width="1" height="1" alt="">]]></content:encoded>
        </item>
    </channel>
</rss>