<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title>All Posts - AWS Sensei</title><link>https://aws-sensei.cloud/posts/</link><description>All Posts | AWS Sensei</description><generator>Hugo -- gohugo.io</generator><language>en</language><lastBuildDate>Sat, 30 May 2026 00:00:00 +0200</lastBuildDate><atom:link href="https://aws-sensei.cloud/posts/" rel="self" type="application/rss+xml"/><item><title>Deploy smarter, sleep better — unit tests and change detection for Lambda APIs</title><link>https://aws-sensei.cloud/posts/2026-05-30-testing-selective-deployment/</link><pubDate>Sat, 30 May 2026 00:00:00 +0200</pubDate><author>Marcel</author><guid>https://aws-sensei.cloud/posts/2026-05-30-testing-selective-deployment/</guid><description>🔊 Voiced by Amazon Polly
As long as a project runs only for me, a failed deployment is annoying but harmless. That changes the moment the first LinkedIn post goes out and real readers land on the site. A broken chat widget, a dead contact form, or a failed sentiment analysis is no longer just a personal problem — it&amp;rsquo;s a bad first impression.
That was the trigger to tackle two things I&amp;rsquo;d been putting off: unit tests for all Lambda functions and a pipeline that only deploys what actually changed.</description></item><item><title>OG Image 2.0: From Hugo's Image Pipeline to Satori</title><link>https://aws-sensei.cloud/posts/2026-05-29-og-images-v2/</link><pubDate>Fri, 29 May 2026 00:00:00 +0200</pubDate><author>Marcel</author><guid>https://aws-sensei.cloud/posts/2026-05-29-og-images-v2/</guid><description>🔊 Voiced by Amazon Polly
OG images are the preview cards that appear when you share a link on WhatsApp, LinkedIn, or Twitter. Nobody talks about them, but everyone sees them. A bad OG image is like a bad business card — technically it works, but it doesn&amp;rsquo;t make a good impression.
My first OG images were bad.
V1: Hugo&amp;rsquo;s Built-In Image Pipeline Hugo can process images. There&amp;rsquo;s images.Text, images.</description></item><item><title>From 900,000 to 3: Drastically Reducing S3 Costs with Incremental Caching</title><link>https://aws-sensei.cloud/posts/2026-05-28-analytics-cost-optimization/</link><pubDate>Thu, 28 May 2026 00:00:00 +0200</pubDate><author>Marcel</author><guid>https://aws-sensei.cloud/posts/2026-05-28-analytics-cost-optimization/</guid><description>🔊 Voiced by Amazon Polly
$4.64 in two days. For a blog with modest traffic, that&amp;rsquo;s an unexpected surprise in the AWS Cost Explorer. The culprit was easy to find — but the fix took three iterations worth writing down.
The Problem My analytics system is built on Kinesis Firehose → S3 → Athena. A scheduled Lambda runs every hour, queries Athena, and writes the result as JSON to S3 where the dashboard reads it.</description></item><item><title>Automated LinkedIn Posts with AWS Lambda and Bedrock — An Approval-First Approach</title><link>https://aws-sensei.cloud/posts/2026-05-26-automated-linkedin-posts-aws-bedrock/</link><pubDate>Tue, 26 May 2026 00:00:00 +0200</pubDate><author>Marcel</author><guid>https://aws-sensei.cloud/posts/2026-05-26-automated-linkedin-posts-aws-bedrock/</guid><description>🔊 Voiced by Amazon Polly
Writing blog posts is one thing. Getting people to actually read them is another. LinkedIn is an obvious channel — but if you&amp;rsquo;re going to automate, do it properly from the start. So I built a pipeline that automatically turns new articles into LinkedIn post drafts — with an approval step built in, because AI-generated text going straight to production without review is not something I&amp;rsquo;m comfortable with.</description></item><item><title>Smarter S3 Triggers: Hash Files, SNS Fanout, and No More Redundant Calls</title><link>https://aws-sensei.cloud/posts/2026-05-22-smarter-post-triggers/</link><pubDate>Fri, 22 May 2026 00:00:00 +0200</pubDate><author>Marcel</author><guid>https://aws-sensei.cloud/posts/2026-05-22-smarter-post-triggers/</guid><description>🔊 Voiced by Amazon Polly
The Polly TTS setup worked well, but there was a flaw: every deployment triggered the Polly Lambda for every post, even when nothing had changed. The Lambda&amp;rsquo;s content-hash check caught duplicates after the fact, but the invocations still happened for all posts on every push. At the AWS Summit in Hamburg on May 20th I had some time to think through a cleaner solution.</description></item><item><title>How I Replaced Google Analytics with 3 AWS Services</title><link>https://aws-sensei.cloud/posts/2026-05-18-privacy-analytics/</link><pubDate>Mon, 18 May 2026 00:00:00 +0200</pubDate><author>Marcel</author><guid>https://aws-sensei.cloud/posts/2026-05-18-privacy-analytics/</guid><description>🔊 Voiced by Amazon Polly
Google Analytics is the obvious choice for blog analytics — free, ready to go, works out of the box. But it also means: third-party cookies, data sharing with Google, and a consent banner you have to make GDPR-compliant somehow. For a blog about AWS, it seemed natural to solve this differently.
The result: a custom analytics system built from three AWS services that sets no cookies, stores no IP addresses, and respects DNT — with a live dashboard at /stats.</description></item><item><title>Auto-Generated OG Images with Hugo</title><link>https://aws-sensei.cloud/posts/2026-05-13-hugo-og-images/</link><pubDate>Wed, 13 May 2026 00:00:00 +0200</pubDate><author>Marcel</author><guid>https://aws-sensei.cloud/posts/2026-05-13-hugo-og-images/</guid><description>🔊 Voiced by Amazon Polly
When you share a blog post on LinkedIn or WhatsApp, the platform fetches the og:image meta tag and renders a preview. If the image is too large, too small, or missing entirely, you get nothing — just a plain link.
I ran into this with every post on this blog. WhatsApp showed no preview at all. The reason: the featured images were up to 6000×4000px and 2.</description></item><item><title>AWS MCP Server with Claude Code</title><link>https://aws-sensei.cloud/posts/2026-05-08-aws-mcp-server-claude-code/</link><pubDate>Fri, 08 May 2026 00:00:00 +0200</pubDate><author>Marcel</author><guid>https://aws-sensei.cloud/posts/2026-05-08-aws-mcp-server-claude-code/</guid><description>🔊 Voiced by Amazon Polly
AWS recently announced the general availability of the AWS MCP Server. It gives AI coding assistants like Claude Code direct access to over 15,000 AWS API operations, live documentation, and sandboxed script execution — all via the Model Context Protocol.
I set it up for my own workflow and ran into a few stumbling blocks. Here&amp;rsquo;s the short version of what actually works.
What is the AWS MCP Server?</description></item><item><title>Voiced by Amazon Polly — Adding TTS to a Static Blog</title><link>https://aws-sensei.cloud/posts/2026-04-30-polly-tts/</link><pubDate>Thu, 30 Apr 2026 00:00:00 +0200</pubDate><author>Marcel</author><guid>https://aws-sensei.cloud/posts/2026-04-30-polly-tts/</guid><description><![CDATA[🔊 Voiced by Amazon Polly
You&rsquo;ve probably noticed the audio player at the top of this post. That&rsquo;s Amazon Polly — AWS&rsquo;s neural Text-to-Speech service. Here&rsquo;s how it works and why I built it the way I did.
The Goal Every blog post should have a &ldquo;listen&rdquo; option. Audio is generated automatically when a post is published or updated — no manual steps, no third-party service.
Architecture Git Push → Frontend Pipeline (Hugo build + S3 sync) → Markdown files synced to S3 (_content/posts/) → S3 Event triggers Lambda → Lambda reads HTML from S3 → Polly synthesizes speech (SSML) → MP3 saved to S3 (audio/{slug}.]]></description></item><item><title>Contact Form in the Blog — with AWS SES, Lambda and API Gateway</title><link>https://aws-sensei.cloud/posts/2026-04-27-contact-form/</link><pubDate>Mon, 27 Apr 2026 00:00:00 +0200</pubDate><author>Marcel</author><guid>https://aws-sensei.cloud/posts/2026-04-27-contact-form/</guid><description>🔊 Voiced by Amazon Polly
Static blogs have no backend — but sometimes you still need a way for visitors to get in touch. The usual solution is a third-party service like Formspree or Netlify Forms. My solution: build everything on AWS myself.
The Architecture Browser → API Gateway → Lambda → SES → Email Three AWS services, all serverless. The visitor fills out the form, Lambda validates the input and calls SES — the email lands in my inbox.</description></item></channel></rss>