<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Posts on Hoarau Jerome | Hands-on Cloud &amp; Kubernetes</title><link>https://blog.hoaraujerome.com/posts/</link><description>Recent content in Posts on Hoarau Jerome | Hands-on Cloud &amp; Kubernetes</description><generator>Hugo</generator><language>en-us</language><copyright>2026 Hoarau Jerome · Site last updated: May 2026</copyright><lastBuildDate>Sat, 27 Sep 2025 14:25:43 -0400</lastBuildDate><atom:link href="https://blog.hoaraujerome.com/posts/index.xml" rel="self" type="application/rss+xml"/><item><title>Why You Can’t Terminate TLS at Traefik for PostgreSQL (and What to Do Instead)</title><link>https://blog.hoaraujerome.com/posts/why-you-cant-terminate-tls-at-traefik-for-postgresql-and-what-to-do-instead/</link><pubDate>Sat, 27 Sep 2025 14:25:43 -0400</pubDate><guid>https://blog.hoaraujerome.com/posts/why-you-cant-terminate-tls-at-traefik-for-postgresql-and-what-to-do-instead/</guid><description>&lt;h1 id="context"&gt;Context&lt;/h1&gt;
&lt;p&gt;I had the need to allow &lt;strong&gt;Power BI&lt;/strong&gt; to connect to a &lt;strong&gt;PostgreSQL database&lt;/strong&gt; running in Kubernetes, fronted by &lt;strong&gt;Traefik&lt;/strong&gt; using a &lt;strong&gt;TCP entrypoint&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;At first, I hoped to &lt;strong&gt;terminate TLS at Traefik&lt;/strong&gt;, the same way you’d do for HTTPS traffic. But this turned out not to be possible with standard PostgreSQL clients (psql, libpq, psycopg, etc.). Here’s why.&lt;/p&gt;
&lt;h1 id="why-this-happens"&gt;Why This Happens&lt;/h1&gt;
&lt;p&gt;Unlike HTTPS, PostgreSQL does &lt;strong&gt;not&lt;/strong&gt; start a TLS handshake immediately.&lt;br&gt;
Instead, a libpq/psql client first sends a &lt;strong&gt;special SSLRequest packet&lt;/strong&gt;:&lt;/p&gt;</description></item><item><title>Fix Vim key repeat in Cursor, Zed, VS Code on macOS</title><link>https://blog.hoaraujerome.com/posts/fix-vscodevim-key-repeat-cursor-macos/</link><pubDate>Sun, 13 Jul 2025 09:47:01 -0400</pubDate><guid>https://blog.hoaraujerome.com/posts/fix-vscodevim-key-repeat-cursor-macos/</guid><description>&lt;p&gt;Vim extension in Cursor, Zed, or VS Code on macOS — arrow keys and held &lt;code&gt;hjkl&lt;/code&gt; don&amp;rsquo;t repeat. macOS disables key repeat for some Electron apps by default.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fix:&lt;/strong&gt; disable &lt;code&gt;ApplePressAndHoldEnabled&lt;/code&gt; for the app (keeps accent popup off, enables key repeat).&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Get the app&amp;rsquo;s bundle ID:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;osascript -e &lt;span style="color:#e6db74"&gt;&amp;#39;id of app &amp;#34;Cursor&amp;#34;&amp;#39;&lt;/span&gt; &lt;span style="color:#75715e"&gt;# or &amp;#34;Zed&amp;#34; or &amp;#34;Visual Studio Code&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start="2"&gt;
&lt;li&gt;Enable key repeat for that app:&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;defaults write &amp;lt;BUNDLE_ID&amp;gt; ApplePressAndHoldEnabled -bool false
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Examples:&lt;/p&gt;</description></item><item><title>From Goals to Constraints to Costs: Designing a Lean AWS Kubernetes Homelab</title><link>https://blog.hoaraujerome.com/posts/aws-kubernetes-homelab-design-decisions/</link><pubDate>Sun, 29 Jun 2025 14:32:38 -0400</pubDate><guid>https://blog.hoaraujerome.com/posts/aws-kubernetes-homelab-design-decisions/</guid><description>&lt;h2 id="-why-build-a-homelab"&gt;🧭 Why Build a Homelab?&lt;/h2&gt;
&lt;p&gt;I recently completed the first phase of my &lt;strong&gt;cloud-native homelab&lt;/strong&gt; — a Kubernetes cluster on AWS built from scratch with &lt;code&gt;kubeadm&lt;/code&gt;, provisioned using &lt;strong&gt;Terraform&lt;/strong&gt;, &lt;strong&gt;Packer&lt;/strong&gt;, &lt;strong&gt;Ansible&lt;/strong&gt;, and &lt;strong&gt;Cilium&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This wasn&amp;rsquo;t just for fun (though it was). I designed this homelab as:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A hands-on way to &lt;strong&gt;prepare for the CKA certification&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A platform to &lt;strong&gt;host real-world workloads&lt;/strong&gt; later&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A personal sandbox to &lt;strong&gt;understand what’s happening under the hood&lt;/strong&gt;, not just run &lt;code&gt;kubectl apply&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Automating Kubeadm Init and Join on Aws My Cloud Homelab Approach</title><link>https://blog.hoaraujerome.com/posts/automating-kubeadm-init-and-join-on-aws-my-cloud-homelab-approach/</link><pubDate>Sun, 29 Jun 2025 13:35:45 -0400</pubDate><guid>https://blog.hoaraujerome.com/posts/automating-kubeadm-init-and-join-on-aws-my-cloud-homelab-approach/</guid><description>&lt;p&gt;When you&amp;rsquo;re setting up a Kubernetes cluster using &lt;code&gt;kubeadm&lt;/code&gt;, one of the first questions is:&lt;br&gt;
&lt;strong&gt;“How do I automate the init/join logic without hardcoding IPs or manually copying tokens?”&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In my &lt;a href="https://github.com/hoaraujerome/k8s-homelab"&gt;AWS-based Kubernetes homelab&lt;/a&gt;, I wanted a fully automated, reproducible setup — including both control plane and worker nodes joining the cluster automatically as soon as they boot.&lt;/p&gt;
&lt;p&gt;This blog explains how I accomplished that using:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;EC2 instance tags and metadata&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>How Rosetta Broke My Terraform Setup (and How I Fixed It on Apple Silicon)</title><link>https://blog.hoaraujerome.com/posts/how-rosetta-broke-my-terraform-setup-and-how-i-fixed-it-on-apple-silicon/</link><pubDate>Sat, 28 Jun 2025 15:05:01 -0400</pubDate><guid>https://blog.hoaraujerome.com/posts/how-rosetta-broke-my-terraform-setup-and-how-i-fixed-it-on-apple-silicon/</guid><description>&lt;h2 id="-how-rosetta-broke-my-terraform-setup-and-how-i-fixed-it-on-apple-silicon"&gt;🛠️ How Rosetta Broke My Terraform Setup (and How I Fixed It on Apple Silicon)&lt;/h2&gt;
&lt;p&gt;Everything was working fine — until it wasn’t.&lt;/p&gt;
&lt;p&gt;While setting up a &lt;a href="https://github.com/hoaraujerome/k8s-homelab"&gt;Kubernetes homelab&lt;/a&gt; using &lt;code&gt;Terraform&lt;/code&gt; inside a &lt;code&gt;devbox&lt;/code&gt; environment on my M1 Mac (macOS 15.5, Apple Silicon), I started hitting this dreaded error:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Error: Failed to load plugin schemas
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Error &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; loading schemas &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; plugin components: Failed to obtain provider schema: Could not load the schema &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; provider registry.terraform.io/hashicorp/aws:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;failed to instantiate provider &lt;span style="color:#e6db74"&gt;&amp;#34;registry.terraform.io/hashicorp/aws&amp;#34;&lt;/span&gt; to obtain schema: timeout &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; waiting &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; plugin to start..
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Re-running &lt;code&gt;terraform validate&lt;/code&gt; or &lt;code&gt;terraform plan&lt;/code&gt; produced the same issue, even though &lt;code&gt;terraform init&lt;/code&gt; was succeeding.&lt;/p&gt;</description></item><item><title>How to Add git-crypt Contributors to Your Encrypted Git Repository</title><link>https://blog.hoaraujerome.com/posts/how-to-add-git-crypt-contributors-to-your-encrypted-git-repository/</link><pubDate>Sat, 11 Jan 2025 15:07:40 -0400</pubDate><guid>https://blog.hoaraujerome.com/posts/how-to-add-git-crypt-contributors-to-your-encrypted-git-repository/</guid><description>&lt;p&gt;Managing sensitive information in a Git repository can be challenging, but tools like &lt;code&gt;git-crypt&lt;/code&gt; make it easier by encrypting specific files. When adding a new contributor to such a repository, the admin needs to ensure they have the necessary access to decrypt and work with these sensitive values. This tutorial aims to provide a detailed, step-by-step guide to help admins manage contributors effectively, as the official &lt;a href="https://github.com/AGWA/git-crypt"&gt;git-crypt&lt;/a&gt; repository provides only basic setup instructions.&lt;/p&gt;</description></item><item><title>Linux Cheat Sheet</title><link>https://blog.hoaraujerome.com/posts/linux-cheat-sheet/</link><pubDate>Sun, 28 Jan 2024 15:09:48 -0400</pubDate><guid>https://blog.hoaraujerome.com/posts/linux-cheat-sheet/</guid><description>&lt;ul&gt;
&lt;li&gt;Remove execution permission to &amp;ldquo;others&amp;rdquo; on every regular files inside a directory&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;find directory_name -type f -exec chmod a-x &lt;span style="color:#f92672"&gt;{}&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;;&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Avoid using &amp;#39;chmod -R&amp;#39; as the execution permission is interpreted differently on a directory compared to a regular file.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Edit your cron configuration file&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;crontab -e
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Always use -e and not crontab file_name &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# Also do NOT edit it directly in /var/spool/cron/&amp;lt;user&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Write errors to the filesystem playbook&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Determine which filesystem (FS) is full and which file is filling it up
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;1.&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`df -h`&lt;/span&gt; to look for FS that&amp;#39;s 100% or more (possible) full
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;2.&lt;/span&gt; &lt;span style="color:#e6db74"&gt;`du -h XX | sort -h`&lt;/span&gt; on the identified FS to determine which directory is using the most space. Rinse &amp;amp; repeat command until all the large files are discovered
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;3.&lt;/span&gt; Try &lt;span style="color:#e6db74"&gt;`fuser`&lt;/span&gt; or &lt;span style="color:#e6db74"&gt;`lsof`&lt;/span&gt; in case you cant determine which process is using a file
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Note: &lt;span style="color:#e6db74"&gt;`df`&lt;/span&gt; &amp;amp; &lt;span style="color:#e6db74"&gt;`du`&lt;/span&gt; can have disparity in the space reported
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Write useful shell scripts error messages&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;*&lt;/span&gt; Error messages in STDERR
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;*&lt;/span&gt; Include name of the program that&amp;#39;s issuing the error
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;*&lt;/span&gt; State what function / operation failed
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;*&lt;/span&gt; If a system call fails, include the perror string
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;*&lt;/span&gt; Exit with some code other than 0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Write shell script steps&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-markdown" data-lang="markdown"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;1.&lt;/span&gt; Develop the script as a pipeline, 1 step at a time, on the command line. Use bash.
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;2.&lt;/span&gt; Send output to stdout and check to be sure it looks right
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;3.&lt;/span&gt; At each step, use the shell&amp;#39;s command history to recall pipelines and tweak them
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;4.&lt;/span&gt; Once the output is correct, execute the actual commands and verify they worked
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;5.&lt;/span&gt; Use &lt;span style="color:#e6db74"&gt;`fc`&lt;/span&gt; to capture your work
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Ex: &lt;span style="color:#e6db74"&gt;`find . -type f -name &amp;#39;*.log&amp;#39; | grep -v .do-not-touch | while read fname; do echo mv $fname `&lt;/span&gt;echo $fname | sed s/.log/.LOG/&lt;span style="color:#e6db74"&gt;`; done | sh -x`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Save systemd journal between reboots&lt;/p&gt;</description></item><item><title>Dockerizing CDKTF with Python</title><link>https://blog.hoaraujerome.com/posts/dockerizing-cdktf-with-python/</link><pubDate>Sun, 31 Dec 2023 15:11:05 -0400</pubDate><guid>https://blog.hoaraujerome.com/posts/dockerizing-cdktf-with-python/</guid><description>&lt;p&gt;Cloud Development Kit for Terraform (&lt;a href="https://developer.hashicorp.com/terraform/cdktf"&gt;CDKTF&lt;/a&gt;) is a framework that allows you to use familiar programming languages to define and provision infrastructure using Terraform. CDKTF supports multiple languages, including Python, which is a popular choice for DevOps engineers.&lt;/p&gt;
&lt;p&gt;Unfortunately, there is currently no official Docker image for it. Using a Dockerfile, you can ensure that your CDKTF application has all the dependencies and configurations needed to run smoothly and consistently. In this blog post, I will show you the Dockerfile I built for my project that uses CDKTF with Python to create a Kubernetes cluster.&lt;/p&gt;</description></item><item><title>DevOps - 4 Practices to Reduce Your Lead Time</title><link>https://blog.hoaraujerome.com/posts/devops-4-practices-to-reduce-your-lead-time/</link><pubDate>Tue, 22 Feb 2022 15:12:28 -0400</pubDate><guid>https://blog.hoaraujerome.com/posts/devops-4-practices-to-reduce-your-lead-time/</guid><description>&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Create on-demand environments dynamically triggered by a CI/CD pipeline, so teams don&amp;rsquo;t have to wait weeks.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automate your deployments as much as possible, so any developers can autonomously deploy when needed.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Automate your tests and add them to the CI pipeline, so teams can process deployments safely.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Design loosely coupled architecture, so developer&amp;rsquo;s changes are deployed in smaller chunks more frequently with confidence.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Those strategies allow teams to improve the delay between the time the customer creates a ticket and its completion.&lt;/p&gt;</description></item><item><title>Jenkins As Code With Packer, Ansible, Terraform, and AWS</title><link>https://blog.hoaraujerome.com/posts/jenkins-as-code-with-packer-ansible-terraform-and-aws/</link><pubDate>Mon, 07 Feb 2022 15:14:42 -0400</pubDate><guid>https://blog.hoaraujerome.com/posts/jenkins-as-code-with-packer-ansible-terraform-and-aws/</guid><description>&lt;h2 id="what-will-we-cover"&gt;What Will We Cover&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Build an OS image for AWS with a Jenkins ready to use&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Provision an EC2 instance to host the Jenkins server&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;See all the code for this article here: &lt;a href="GitHub"&gt;https://github.com/hoaraujerome/devops_cicd&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="using-packer-with-ansible-to-build-an-ami-image"&gt;Using Packer with Ansible to build an AMI image&lt;/h2&gt;
&lt;p&gt;Packer tool is responsible for creating the OS image, while Ansible is responsible for installing everything we need on this image.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://github.com/hoaraujerome/devops_cicd/raw/main/misc/devops_cicd-Packer.jpg" alt="" title="buildAMI" /&gt;
&lt;/p&gt;
&lt;p&gt;The final version of the image has Jenkins (with &amp;ldquo;GIT&amp;rdquo;, &amp;ldquo;Pipeline&amp;rdquo;, and &amp;ldquo;Pipeline: AWS Steps&amp;rdquo; plugins), Docker, AWS CLI, Terraform, and Java installed for running Jenkins pipelines hosted on GitHub.&lt;/p&gt;</description></item><item><title>DynamoDB: 3 ways to use the API</title><link>https://blog.hoaraujerome.com/posts/dynamodb-3-ways-to-use-the-api/</link><pubDate>Tue, 14 Dec 2021 15:27:32 -0400</pubDate><guid>https://blog.hoaraujerome.com/posts/dynamodb-3-ways-to-use-the-api/</guid><description>&lt;p&gt;The way you interact with DynamoDB is usually with AWS SDK, where you can perform:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Items-based actions: Anytime you act on a single item - writing, updating, or deleting - you are using an item-based action. You must provide the entire primary key.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Query: Read-only actions that allow you to fetch multiple items in a single request. You must provide the partition key and optionally provide sort key conditions.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Scan: Full table scan that looks at every item in your table. Avoid it unless you are doing an export or ETL. It&amp;rsquo;s an expensive operation at scale regarding how long it takes to respond to a request and how much capacity you need to service it. Remember that there is a 1MB limit when reading items from the table.&lt;/p&gt;</description></item><item><title>5 Responsibilities Regarding the JWT as an API Provider</title><link>https://blog.hoaraujerome.com/posts/5-responsibilities-regarding-the-jwt-as-an-api-provider/</link><pubDate>Sun, 12 Dec 2021 15:29:02 -0400</pubDate><guid>https://blog.hoaraujerome.com/posts/5-responsibilities-regarding-the-jwt-as-an-api-provider/</guid><description>&lt;p&gt;As a reminder, a JWT (JSON Web Token) is a way for securely transmitting information between parties as a JSON object.&lt;/p&gt;
&lt;p&gt;As an API provider, here are the actions to take on the received JWT:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Validate the signature of the JWT (&lt;strong&gt;mandatory&lt;/strong&gt;)&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check if the scope necessary to use your API is present (&lt;strong&gt;mandatory&lt;/strong&gt;). Your API may require more than one scope.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Check if the JWT is not expired (&lt;strong&gt;mandatory&lt;/strong&gt;)&lt;/p&gt;</description></item><item><title>My Thoughts About Java Reactive Programming</title><link>https://blog.hoaraujerome.com/posts/my-thoughts-about-java-reactive-programming/</link><pubDate>Sat, 11 Dec 2021 15:30:48 -0400</pubDate><guid>https://blog.hoaraujerome.com/posts/my-thoughts-about-java-reactive-programming/</guid><description>&lt;h1 id="context"&gt;Context&lt;/h1&gt;
&lt;p&gt;Traditional Java applications use thread pools for simultaneous I/O operations (such as a REST call). Each request consumes a thread freed at the end of the processing only. So, whenever the thread pool is empty, new requests are blocked waiting for an available thread. This programming paradigm is called imperative or blocking.&lt;/p&gt;
&lt;h1 id="what-is-reactive-programming"&gt;What is reactive programming?&lt;/h1&gt;
&lt;p&gt;It is a programming paradigm based on the data transmission from one or more sources called Publishers to other elements called Subscribers in an asynchronous, non-blocking, and functional way. Streams combined with the Observable design pattern process all types of data.&lt;/p&gt;</description></item><item><title>Hexagonal Architecture and Microservices</title><link>https://blog.hoaraujerome.com/posts/hexagonal-architecture-and-microservices/</link><pubDate>Fri, 10 Dec 2021 15:32:06 -0400</pubDate><guid>https://blog.hoaraujerome.com/posts/hexagonal-architecture-and-microservices/</guid><description>&lt;h1 id="presentation"&gt;Presentation&lt;/h1&gt;
&lt;p&gt;Several technologies make it possible to expose or invoke business functions: SOA, REST / Web API, Messaging / JMS, and others. It is crucial to isolate the code that implements the business logic from the architectures used. The hexagonal architecture is an option to design microservices to address these challenges.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.hoaraujerome.com/images/hexagonal_architecture_diagram.png" alt="" title="Hexagonal Architecture Diagram" /&gt;
&lt;/p&gt;
&lt;p&gt;Source: &lt;a href="http://tpierrain.blogspot.com/2013/08/a-zoom-on-hexagonalcleanonion.html"&gt;http://tpierrain.blogspot.com/2013/08/a-zoom-on-hexagonalcleanonion.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;P/A stands for &amp;ldquo;Port/Adapter&amp;rdquo; and UC stands for &amp;ldquo;Use Case&amp;rdquo;&lt;/p&gt;
&lt;p&gt;High-level sequencing:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;A service receives and sends events to the &amp;ldquo;outside&amp;rdquo; via ports. A port is specific to a technology or a protocol: Servlet API, SOAP endpoint, JMS listener, or a JDBC driver.&lt;/p&gt;</description></item><item><title>Modern Website Architecture Overview in AWS</title><link>https://blog.hoaraujerome.com/posts/modern-website-architecture-overview-in-aws/</link><pubDate>Thu, 09 Dec 2021 15:00:19 -0400</pubDate><guid>https://blog.hoaraujerome.com/posts/modern-website-architecture-overview-in-aws/</guid><description>&lt;p&gt;I have recently launched a new website &lt;a href="https://github.com/hoaraujerome/snapvocab"&gt;snapvocab&lt;/a&gt; on the AWS cloud. This hands-on experience allowed me to practice what I learned in the AWS Cloud Developer Certification. After long hours working on it - more than I expected, I can tell you it was worth it. Nothing can ever replace having our hands dirty!&lt;/p&gt;
&lt;p&gt;From a functional point of view, it is simply a CRUD application that allows a user to manage a list of words with a paid plan. On the technical side, my goal was to leverage AWS services to go live as soon as possible and at a lower cost.&lt;/p&gt;</description></item></channel></rss>