PageSourceSearch

https://adrianthegreat.com/2024/07/27/Exploring-AWS-Serverless-Dep…-From-RSS-to-X-Posts-Part-3-of-the-Odyssey/

html adrianthegreat.com collected 2026-09-24 23:31:40 UTC 34,689 bytes, 134 lines download raw bytes

1<!doctype html>
2<html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1"><meta><title>Exploring AWS Serverless Deployments with CDK v2: From RSS to X Posts - Part 3 of the Odyssey - The Future Is Serverless ⚡️</title><link rel="manifest" href="/manifest.json"><meta name="application-name" content="The Future Is Serverless ⚡️"><meta name="msapplication-TileImage" content="https://adrianpublicbucket.s3.af-south-1.amazonaws.com/favicon.ico"><meta name="apple-mobile-web-app-capable" content="yes"><meta name="apple-mobile-web-app-title" content="The Future Is Serverless ⚡️"><meta name="apple-mobile-web-app-status-bar-style" content="default"><meta name="description" content="Welcome to part 3 of “Exploring AWS Serverless Deployments with CDK v2”. Firstly I’d like to thank you for your patience as there’s been a bit of a gap since part 2. I was deep into studying and worki"><meta property="og:type" content="blog"><meta property="og:title" content="Exploring AWS Serverless Deployments with CDK v2: From RSS to X Posts - Part 3 of the Odyssey"><meta property="og:url" content="https://adrianthegreat.com/2024/07/27/Exploring-AWS-Serverless-Deployments-with-CDK-v2-From-RSS-to-X-Posts-Part-3-of-the-Odyssey/"><meta property="og:site_name" content="The Future Is Serverless ⚡️"><meta property="og:description" content="Welcome to part 3 of “Exploring AWS Serverless Deployments with CDK v2”. Firstly I’d like to thank you for your patience as there’s been a bit of a gap since part 2. I was deep into studying and worki"><meta property="og:locale" content="en_US"><meta property="og:image" content="https://adrianthegreat.com/images/LightningStruckOnCityAtNightTime.jpg"><meta property="article:published_time" content="2024-07-27T13:00:00.000Z"><meta property="article:modified_time" content="2024-12-24T20:05:31.458Z"><meta property="article:author" content="Adrian Mudzwiti"><meta property="article:tag" content="Python"><meta property="article:tag" content="CDK"><meta property="article:tag" content="Testing"><meta property="twitter:card" content="summary"><meta property="twitter:image:src" content="https://adrianthegreat.com/images/LightningStruckOnCityAtNightTime.jpg">
2<script type="application/ld+json">{"@context":"https://schema.org","@type":"BlogPosting","mainEntityOfPage":{"@type":"WebPage","@id":"https://adrianthegreat.com/2024/07/27/Exploring-AWS-Serverless-Deployments-with-CDK-v2-From-RSS-to-X-Posts-Part-3-of-the-Odyssey/"},"headline":"Exploring AWS Serverless Deployments with CDK v2: From RSS to X Posts - Part 3 of the Odyssey","image":["https://adrianthegreat.com/images/LightningStruckOnCityAtNightTime.jpg"],"datePublished":"2024-07-27T13:00:00.000Z","dateModified":"2024-12-24T20:05:31.458Z","author":{"@type":"Person","name":"Adrian Mudzwiti"},"publisher":{"@type":"Organization","name":"The Future Is Serverless ⚡️","logo":{"@type":"ImageObject","url":"https://adrianthegreat.com/images/TheFutureIsServerless.png"}},"description":"Welcome to part 3 of “Exploring AWS Serverless Deployments with CDK v2”. Firstly I’d like to thank you for your patience as there’s been a bit of a gap since part 2. I was deep into studying and worki"}</script>
2<link rel="canonical" href="https://adrianthegreat.com/2024/07/27/Exploring-AWS-Serverless-Deployments-with-CDK-v2-From-RSS-to-X-Posts-Part-3-of-the-Odyssey/"><link rel="icon" href="https://adrianpublicbucket.s3.af-south-1.amazonaws.com/favicon.ico"><link rel="stylesheet" href="https://use.fontawesome.com/releases/v6.0.0/css/all.css"><link data-pjax rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/styles/atom-one-light.css"><link rel="stylesheet" href="https://fonts.googleapis.com/css2?family=Ubuntu:wght@400;600&amp;family=Source+Code+Pro"><link data-pjax rel="stylesheet" href="/css/default.css"><style>body>.footer,body>.navbar,body>.section{opacity:0}</style><!--!--><!--!--><!--!--><!--!--><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/build/cookieconsent.min.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/lightgallery.min.css"><link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/justifiedGallery.min.css">
vendor: 57 bytes, line 2
2<script src="https://www.googletagmanager.com/gtag/js?id=
2UA-151393593-1
vendor: 17 bytes, line 2
2" async></script>
2<script>
vendor: 156 bytes, lines 2-6
2window.dataLayer = window.dataLayer || [];
3        function gtag(){dataLayer.push(arguments);}
4        gtag('js', new Date());
5    
6        gtag('config', '
6UA-151393593-1
vendor: 3 bytes, line 6
6');
6</script>
6<!--!--><!--!--><style>.pace{-webkit-pointer-events:none;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;user-select:none}.pace-inactive{display:none}.pace .pace-progress{background:#3273dc;position:fixed;z-index:2000;top:0;right:100%;width:100%;height:2px}</style>
6<script src="https://cdn.jsdelivr.net/npm/[email protected]/pace.min.js"></script>
6<!--!--><!--!--><!-- hexo injector head_end start -->
6<script>
7  (function () {
8      function switchTab() {
9          if (!location.hash) {
10            return;
11          }
12
13          const id = '#' + CSS.escape(location.hash.substring(1));
14          const $tabMenu = document.querySelector(`.tabs a[href="${id}"]`);
15          if (!$tabMenu) {
16            return;
17          }
18
19          const $tabMenuContainer = $tabMenu.parentElement.parentElement;
20          Array.from($tabMenuContainer.children).forEach($menu => $menu.classList.remove('is-active'));
21          Array.from($tabMenuContainer.querySelectorAll('a'))
22              .map($menu => document.getElementById($menu.getAttribute("href").substring(1)))
23              .forEach($content => $content.classList.add('is-hidden'));
24
25          if ($tabMenu) {
26              $tabMenu.parentElement.classList.add('is-active');
27          }
28          const $activeTab = document.querySelector(id);
29          if ($activeTab) {
30              $activeTab.classList.remove('is-hidden');
31          }
32      }
33      switchTab();
34      window.addEventListener('hashchange', switchTab, false);
35  })();
36  </script>
36<!-- hexo injector head_end end --><meta name="generator" content="Hexo 7.3.0"><link rel="alternate" href="/atom.xml" title="The Future Is Serverless ⚡️" type="application/atom+xml">
37</head><body class="is-2-column"><nav class="navbar navbar-main"><div class="container navbar-container"><div class="navbar-brand justify-content-center"><a class="navbar-item navbar-logo" href="/"><img src="/images/TheFutureIsServerless.png" alt="The Future Is Serverless ⚡️" height="28"></a></div><div class="navbar-menu"><div class="navbar-start"><a class="navbar-item" href="/">Home</a><a class="navbar-item" href="/archives">Archives</a><a class="navbar-item" href="/categories">Categories</a><a class="navbar-item" href="/tags">Tags</a><a class="navbar-item" href="/about">About</a></div><div class="navbar-end"><a class="navbar-item search" title="Search" href="javascript:;"><i class="fas fa-search"></i></a></div></div></div></nav><section class="section"><div class="container"><div class="columns"><div class="column order-2 column-main is-8-tablet is-8-desktop is-8-widescreen"><div class="card"><div class="card-image"><span class="image is-7by3"><img class="fill" src="/images/LightningStruckOnCityAtNightTime.jpg" alt="Exploring AWS Serverless Deployments with CDK v2: From RSS to X Posts - Part 3 of the Odyssey"></span></div><article class="card-content article" role="article"><div class="article-meta is-size-7 is-uppercase level is-mobile"><div class="level-left"><span class="level-item">Posted&nbsp;<time dateTime="2024-07-27T13:00:00.000Z" title="2024/07/27, 15:00:00">2024-07-27</time></span><span class="level-item">Updated&nbsp;<time dateTime="2024-12-24T20:05:31.458Z" title="2024/12/24, 22:05:31">2024-12-24</time></span><span class="level-item"><a class="link-muted" href="/categories/AWS/">AWS</a></span><span class="level-item">3 minutes read (About 418 words)</span></div></div><h1 class="title is-3 is-size-4-mobile">Exploring AWS Serverless Deployments with CDK v2: From RSS to X Posts - Part 3 of the Odyssey</h1><div class="content"><p>Welcome to part 3 of “Exploring AWS Serverless Deployments with CDK v2”. Firstly I’d like to thank you for your patience as there’s been a bit of a gap since part 2. I was deep into studying and working on serverless projects at work which kept me away, but i’m excited to get back on track and continue our exploration.</p>
38<p>In previous posts, we’ve defined our constructs and deployed them to AWS. Today, we’ll focus on an essential practice: testing. Proper testing ensures that our deployments work as expected and can save us from potential issues.</p>
39<span id="more"></span>
40
41<p><em><strong>Getting Started With Testing</strong></em></p>
42<p>To get started, you’ll need to add <strong>pytest</strong> to your project’s dependencies (the main <strong>requirements.txt</strong> file for our stack).</p>
43<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install -r requirements.txt</span><br></pre></td></tr></table></figure>
44
45<p>Within our project, navigate towards the <strong>test</strong> directory, then  <strong>unit</strong> and open the <strong>test_rss_lambda_ddb_socialshare_stack.py</strong> file. This auto generated test file includes an example test.</p>
46<script src="//gist.github.com/2c45392cc626fda031f1f44d813af0d5.js"></script>
46
47
48<p>We don’t have an <strong>SQS</strong> construct in our stack but reviewing the example test provides some level of insight on how to test a construct. Let’s delete the auto generated example test and create our own test.</p>
49<p><em><strong>Setting Up The Testing Function</strong></em></p>
50<p>First, let’s create a reusable function to get the CloudFormation template from the stack:</p>
51<script src="//gist.github.com/38cb4f7cd5586831b40cfb8a727515f4.js"></script>
51
52
53<p><em><strong>Testing DynamoDB Table Properties</strong></em></p>
54<p>We’ll start by adding a test to check that the <strong>DynamoDB</strong> table in our stack has the correct properties. Here’s how to do it:</p>
55<script src="//gist.github.com/466d680609f9a871cc490f40185400ed.js"></script>
55
56
57
58<p><em><strong>Testing Lambda Functions</strong></em></p>
59<p>Next, let’s ensure that our stack creates the correct number of Lambda functions and verifies their runtime version:</p>
60<script src="//gist.github.com/b2e376ea0c97f40ded1823393578ee17.js"></script>
60
61
62<p><em><strong>Running Tests</strong></em></p>
63<p>To run tests you can execute <strong>pytest</strong> in the terminal:</p>
64<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pytest</span><br></pre></td></tr></table></figure>
65
66<p>Below is the output you should receive:</p>
67<figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">================================================================================= test session starts =================================================================================</span><br><span class="line">platform darwin -- Python 3.12.4, pytest-8.1.1, pluggy-1.4.0</span><br><span class="line">rootdir: /Users/adrian/Developer/Projects/rss-lambda-ddb-socialshare</span><br><span class="line">plugins: typeguard-2.13.3</span><br><span class="line">collected 2 items                                                                                                                                                                     </span><br><span class="line"></span><br><span class="line">tests/unit/test_rss_lambda_ddb_socialshare_stack.py ..                                                                                                                          [100%]</span><br><span class="line"></span><br><span class="line">================================================================================= 2 passed in 21.86s ==================================================================================</span><br></pre></td></tr></table></figure>
68
69<p><em><strong>Conclusion</strong></em></p>
70<p>In Part 3 of our series, we’ve learned how to test our CDK constructs. In the final installment, we will explore how to test Lambda functions locally.</p>
71<p><em><strong>Resources</strong></em></p>
72<ul>
73<li><a href="https://docs.pytest.org/en/stable/" title="" target="">Pytest</a></li>
74<li><a href="https://docs.aws.amazon.com/cdk/v2/guide/testing.html" title="" target="">Testing constructs</a></li>
75</ul>
76</div><div class="article-licensing box"><div class="licensing-title"><p>Exploring AWS Serverless Deployments with CDK v2: From RSS to X Posts - Part 3 of the Odyssey</p><p><a href="https://adrianthegreat.com/2024/07/27/Exploring-AWS-Serverless-Deployments-with-CDK-v2-From-RSS-to-X-Posts-Part-3-of-the-Odyssey/">https://adrianthegreat.com/2024/07/27/Exploring-AWS-Serverless-Deployments-with-CDK-v2-From-RSS-to-X-Posts-Part-3-of-the-Odyssey/</a></p></div><div class="licensing-meta level is-mobile"><div class="level-left"><div class="level-item is-narrow"><div><h6>Author</h6><p>Adrian Mudzwiti</p></div></div><div class="level-item is-narrow"><div><h6>Posted on</h6><p>2024-07-27</p></div></div><div class="level-item is-narrow"><div><h6>Updated on</h6><p>2024-12-24</p></div></div><div class="level-item is-narrow"><div><h6>Licensed under</h6><p><a class="icons" rel="noopener" target="_blank" title="Creative Commons" href="https://creativecommons.org/"><i class="icon fab fa-creative-commons"></i></a><a class="icons" rel="noopener" target="_blank" title="Attribution" href="https://creativecommons.org/licenses/by/4.0/"><i class="icon fab fa-creative-commons-by"></i></a><a class="icons" rel="noopener" target="_blank" title="Noncommercial" href="https://creativecommons.org/licenses/by-nc/4.0/"><i class="icon fab fa-creative-commons-nc"></i></a></p></div></div></div></div></div><div class="article-tags is-size-7 mb-4"><span class="mr-2">#</span><a class="link-muted mr-2" rel="tag" href="/tags/Python/">Python</a><a class="link-muted mr-2" rel="tag" href="/tags/CDK/">CDK</a><a class="link-muted mr-2" rel="tag" href="/tags/Testing/">Testing</a></div><div class="a2a_kit a2a_kit_size_32 a2a_default_style"><a class="a2a_dd" target="_blank" rel="noopener" href="https://www.addtoany.com/share"></a><a class="a2a_button_facebook"></a><a class="a2a_button_twitter"></a><a class="a2a_button_telegram"></a><a class="a2a_button_whatsapp"></a><a class="a2a_button_reddit"></a></div>
76<script src="https://static.addtoany.com/menu/page.js" defer></script>
76</article></div><div class="card"><div class="card-content"><h3 class="menu-label has-text-centered">Like this article? Support the author with</h3><div class="buttons is-centered"><a class="button donate" href="https://www.buymeacoffee.com/adrianm" target="_blank" rel="noopener" data-type="buymeacoffee"><span class="icon is-small"><i class="fas fa-coffee"></i></span><span>Buy me a coffee</span></a></div></div></div><nav class="post-navigation mt-4 level is-mobile"><div class="level-start"><a class="article-nav-prev level level-item link-muted" href="/2025/01/06/Serverless-FastAPI-Development-Building-Player-FC-API-on-AWS/"><i class="level-item fas fa-chevron-left"></i><span class="level-item">Serverless FastAPI Development: Building Player FC API on AWS</span></a></div><div class="level-end"><a class="article-nav-next level level-item link-muted" href="/2024/03/24/Exploring-AWS-Serverless-Deployments-with-CDK-v2-From-RSS-to-X-Posts-Part-2-of-the-Odyssey/"><span class="level-item">Exploring AWS Serverless Deployments with CDK v2: From RSS to X Posts - Part 2 of the Odyssey</span><i class="level-item fas fa-chevron-right"></i></a></div></nav><div class="card" id="comments"><div class="card-content"><h3 class="title is-5">Comments</h3><div id="disqus_thread"><noscript>Please enable JavaScript to view the <a target="_blank" rel="noopener" href="//disqus.com/?ref_noscript">comments powered by Disqus.</a></noscript></div>
76<script>var disqus_config = function () {
77            this.page.url = 'https://adrianthegreat.com/2024/07/27/Exploring-AWS-Serverless-Deployments-with-CDK-v2-From-RSS-to-X-Posts-Part-3-of-the-Odyssey/';
78            this.page.identifier = '2024/07/27/Exploring-AWS-Serverless-Deployments-with-CDK-v2-From-RSS-to-X-Posts-Part-3-of-the-Odyssey/';
79        };
80        (function() {
81            var d = document, s = d.createElement('script');  
82            s.src = '//' + 'adrianthegreat-com' + '.disqus.com/embed.js';
83            s.setAttribute('data-timestamp', +new Date());
84            (d.head || d.body).appendChild(s);
85        })();</script>
85</div></div></div><div class="column column-left is-4-tablet is-4-desktop is-4-widescreen  order-1"><div class="card widget" data-type="profile"><div class="card-content"><nav class="level"><div class="level-item has-text-centered flex-shrink-1"><div><figure class="image is-128x128 mx-auto mb-2"><img class="avatar is-rounded" src="/images/Avatar.jpeg" alt="Adrian Mudzwiti"></figure><p class="title is-size-4 is-block" style="line-height:inherit;">Adrian Mudzwiti</p><p class="is-size-6 is-block">⚡️ Embracing the Serverless Revolution | 🚀 Backend Software Engineer | 🐍 Python Enthusiast | Harnessing the Power of Simplicity.</p><p class="is-size-6 is-flex justify-content-center"><i class="fas fa-map-marker-alt mr-1"></i><span>South Africa</span></p></div></div></nav><nav class="level is-mobile"><div class="level-item has-text-centered is-marginless"><div><p class="heading">Posts</p><a href="/archives/"><p class="title">22</p></a></div></div><div class="level-item has-text-centered is-marginless"><div><p class="heading">Categories</p><a href="/categories/"><p class="title">2</p></a></div></div><div class="level-item has-text-centered is-marginless"><div><p class="heading">Tags</p><a href="/tags/"><p class="title">45</p></a></div></div></nav><div class="level"><a class="level-item button is-primary is-rounded" href="https://linktr.ee/adrianm10" target="_blank" rel="me noopener">Follow</a></div><div class="level is-mobile is-multiline"><a class="level-item button is-transparent is-marginless" target="_blank" rel="me noopener" title="Github" href="https://github.com/AdrianM10"><i class="fab fa-github"></i></a><a class="level-item button is-transparent is-marginless" target="_blank" rel="me noopener" title="Polywork" href="https://bsky.app/profile/adrianthegreat.com"><i class="fas fa-gem"></i></a><a class="level-item button is-transparent is-marginless" target="_blank" rel="me noopener" title="LinkedIn" href="https://www.linkedin.com/in/adrianmudzwiti"><i class="fab fa-linkedin"></i></a><a class="level-item button is-transparent is-marginless" target="_blank" rel="me noopener" title="Twitter" href="https://twitter.com/adrianmudzwiti"><i class="fab fa-twitter"></i></a><a class="level-item button is-transparent is-marginless" target="_blank" rel="me noopener" title="Acclaim" href="https://www.youracclaim.com/users/adrianmudzwiti/badges"><i class="fas fa-medal"></i></a></div></div></div><!--!--><div class="card widget" data-type="recent-posts"><div class="card-content"><h3 class="menu-label">Recents</h3><article class="media"><figure class="media-left"><a class="image" href="/2025/11/23/Serverless-FastAPI-Deployment-Actions-Speak-Louder-Than-Words/"><img src="/images/Pipeline.jpg" alt="Serverless FastAPI Deployment: Actions Speak Louder Than Words"></a></figure><div class="media-content"><p class="date"><time dateTime="2025-11-23T21:09:22.000Z">2025-11-23</time></p><p class="title"><a href="/2025/11/23/Serverless-FastAPI-Deployment-Actions-Speak-Louder-Than-Words/">Serverless FastAPI Deployment: Actions Speak Louder Than Words</a></p><p class="categories"><a href="/categories/AWS/">AWS</a></p></div></article><article class="media"><figure class="media-left"><a class="image" href="/2025/07/12/Serverless-FastAPI-Security-Unlocked-Doors-Invite-Unwanted-Guests/"><img src="/images/Door.png" alt="Serverless FastAPI Security: Unlocked Doors Invite Unwanted Guests"></a></figure><div class="media-content"><p class="date"><time dateTime="2025-07-12T06:22:59.000Z">2025-07-12</time></p><p class="title"><a href="/2025/07/12/Serverless-FastAPI-Security-Unlocked-Doors-Invite-Unwanted-Guests/">Serverless FastAPI Security: Unlocked Doors Invite Unwanted Guests</a></p><p class="categories"><a href="/categories/AWS/">AWS</a></p></div></article><article class="media"><figure class="media-left"><a class="image" href="/2025/06/21/Serverless-FastAPI-Testing-Use-Moto-and-Just-Mock-It/"><img src="/images/UnitTesting.png" alt="Serverless FastAPI Testing: Use Moto and Just Mock It!"></a></figure><div class="media-content"><p class="date"><time dateTime="2025-06-21T19:07:59.000Z">2025-06-21</time></p><p class="title"><a href="/2025/06/21/Serverless-FastAPI-Testing-Use-Moto-and-Just-Mock-It/">Serverless FastAPI Testing: Use Moto and Just Mock It!</a></p><p class="categories"><a href="/categories/AWS/">AWS</a></p></div></article><article class="media"><figure class="media-left"><a class="image" href="/2025/01/06/Serverless-FastAPI-Development-Building-Player-FC-API-on-AWS/"><img src="/images/FastAPIOnAWS.png" alt="Serverless FastAPI Development: Building Player FC API on AWS"></a></figure><div class="media-content"><p class="date"><time dateTime="2025-01-06T05:10:18.000Z">2025-01-06</time></p><p class="title"><a href="/2025/01/06/Serverless-FastAPI-Development-Building-Player-FC-API-on-AWS/">Serverless FastAPI Development: Building Player FC API on AWS</a></p><p class="categories"><a href="/categories/AWS/">AWS</a></p></div></article><article class="media"><figure class="media-left"><a class="image" href="/2024/07/27/Exploring-AWS-Serverless-Deployments-with-CDK-v2-From-RSS-to-X-Posts-Part-3-of-the-Odyssey/"><img src="/images/LightningStruckOnCityAtNightTime.jpg" alt="Exploring AWS Serverless Deployments with CDK v2: From RSS to X Posts - Part 3 of the Odyssey"></a></figure><div class="media-content"><p class="date">
85<time dateTime="2024-07-27T13:00:00.000Z">2024-07-27</time></p><p class="title"><a href="/2024/07/27/Exploring-AWS-Serverless-Deployments-with-CDK-v2-From-RSS-to-X-Posts-Part-3-of-the-Odyssey/">Exploring AWS Serverless Deployments with CDK v2: From RSS to X Posts - Part 3 of the Odyssey</a></p><p class="categories"><a href="/categories/AWS/">AWS</a></p></div></article></div></div><div class="card widget" data-type="categories"><div class="card-content"><div class="menu"><h3 class="menu-label">Categories</h3><ul class="menu-list"><li><a class="level is-mobile" href="/categories/AWS/"><span class="level-start"><span class="level-item">AWS</span></span><span class="level-end"><span class="level-item tag">18</span></span></a></li><li><a class="level is-mobile" href="/categories/Azure/"><span class="level-start"><span class="level-item">Azure</span></span><span class="level-end"><span class="level-item tag">3</span></span></a></li></ul></div></div></div><div class="card widget" data-type="tags"><div class="card-content"><div class="menu"><h3 class="menu-label">Tags</h3><div class="field is-grouped is-grouped-multiline"><div class="control"><a class="tags has-addons" href="/tags/ALB/"><span class="tag">ALB</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/AWS-CDK/"><span class="tag">AWS CDK</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/AWS-Lambda/"><span class="tag">AWS Lambda</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Amazon-API-Gateway/"><span class="tag">Amazon API Gateway</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Amazon-Cognito/"><span class="tag">Amazon Cognito</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Azure-AD/"><span class="tag">Azure AD</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Azure-Blob-Storage/"><span class="tag">Azure Blob Storage</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Azure-CLI/"><span class="tag">Azure CLI</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Azure-Key-Vault/"><span class="tag">Azure Key Vault</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Boto3/"><span class="tag">Boto3</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/CDK/"><span class="tag">CDK</span><span class="tag">5</span></a></div><div class="control"><a class="tags has-addons" href="/tags/CI-CD/"><span class="tag">CI/CD</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Certificate-Manager/"><span class="tag">Certificate Manager</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/CloudFront/"><span class="tag">CloudFront</span><span class="tag">2</span></a></div><div class="control"><a class="tags has-addons" href="/tags/CodeCommit/"><span class="tag">CodeCommit</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/DevOps/"><span class="tag">DevOps</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/DynamoDB/"><span class="tag">DynamoDB</span><span class="tag">5</span></a></div><div class="control"><a class="tags has-addons" href="/tags/EC2/"><span class="tag">EC2</span><span class="tag">2</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Encryption/"><span class="tag">Encryption</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/EventBridge/"><span class="tag">EventBridge</span><span class="tag">2</span></a></div><div class="control"><a class="tags has-addons" href="/tags/FastAPI/"><span class="tag">FastAPI</span><span class="tag">4</span></a></div><div class="control"><a class="tags has-addons" href="/tags/GitHub-Actions/"><span class="tag">GitHub Actions</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Hexo/"><span class="tag">Hexo</span><span class="tag">2</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Intro/"><span class="tag">Intro</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Lambda/"><span class="tag">Lambda</span><span class="tag">5</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Lambda-Layers/"><span class="tag">Lambda Layers</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Lightsail/"><span class="tag">Lightsail</span><span class="tag">2</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Moto/"><span class="tag">Moto</span><span class="tag">1</span></a></div><div class="control">
85<a class="tags has-addons" href="/tags/OpenVPN/"><span class="tag">OpenVPN</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/PowerShell/"><span class="tag">PowerShell</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Pydantic/"><span class="tag">Pydantic</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Pytest/"><span class="tag">Pytest</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Python/"><span class="tag">Python</span><span class="tag">8</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Resource-Graph/"><span class="tag">Resource Graph</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Route-53/"><span class="tag">Route 53</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/S3/"><span class="tag">S3</span><span class="tag">3</span></a></div><div class="control"><a class="tags has-addons" href="/tags/SNS/"><span class="tag">SNS</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/SSH/"><span class="tag">SSH</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Security/"><span class="tag">Security</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Terraform/"><span class="tag">Terraform</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Testing/"><span class="tag">Testing</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/VS-Code/"><span class="tag">VS Code</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/WAF/"><span class="tag">WAF</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/WordPress/"><span class="tag">WordPress</span><span class="tag">1</span></a></div><div class="control"><a class="tags has-addons" href="/tags/Wordpress/"><span class="tag">Wordpress</span><span class="tag">1</span></a></div></div></div></div></div></div><!--!--></div></div></section><footer class="footer"><div class="container"><div class="level"><div class="level-start"><a class="footer-logo is-block mb-2" href="/"><img src="/images/TheFutureIsServerless.png" alt="The Future Is Serverless ⚡️" height="28"></a><p class="is-size-7"><span>&copy; 2026 Adrian Mudzwiti</span>  Powered by <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a> &amp; <a href="https://github.com/ppoffice/hexo-theme-icarus" target="_blank" rel="noopener">Icarus</a></p></div><div class="level-end"><div class="field has-addons"><p class="control"><a class="button is-transparent is-large" target="_blank" rel="noopener" title="Creative Commons" href="https://creativecommons.org/"><i class="fab fa-creative-commons"></i></a></p><p class="control"><a class="button is-transparent is-large" target="_blank" rel="noopener" title="Attribution 4.0 International" href="https://creativecommons.org/licenses/by/4.0/"><i class="fab fa-creative-commons-by"></i></a></p></div></div></div></div></footer>
85<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/jquery.min.js"></script>
85<script src="https://cdn.jsdelivr.net/npm/[email protected]/min/moment-with-locales.min.js"></script>
85<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/clipboard.min.js" defer></script>
85<script>moment.locale("en");</script>
85<script>var IcarusThemeSettings = {
86            article: {
87                highlight: {
88                    clipboard: true,
89                    fold: 'unfolded'
90                }
91            }
92        };</script>
92<script data-pjax src="/js/column.js"></script>
92<script src="/js/animation.js"></script>
92<a id="back-to-top" title="Back to top" href="javascript:;"><i class="fas fa-chevron-up"></i></a>
92<script data-pjax src="/js/back_to_top.js" defer></script>
92<!--!--><!--!--><!--!-->
92<script src="https://cdn.jsdelivr.net/npm/[email protected]/build/cookieconsent.min.js" defer></script>
92<script>window.addEventListener("load", () => {
93      window.cookieconsent.initialise({
94        type: "info",
95        theme: "edgeless",
96        static: false,
97        position: "bottom-left",
98        content: {
99          message: "This website uses cookies to improve your experience.",
100          dismiss: "Got it!",
101          allow: "Allow cookies",
102          deny: "Decline",
103          link: "Learn more",
104          policy: "Cookie Policy",
105          href: "https://www.cookiesandyou.com/",
106        },
107        palette: {
108          popup: {
109            background: "#edeff5",
110            text: "#838391"
111          },
112          button: {
113            background: "#4b81e8"
114          },
115        },
116      });
117    });</script>
117<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/lightgallery.min.js" defer></script>
117<script src="https://cdn.jsdelivr.net/npm/[email protected]/dist/js/jquery.justifiedGallery.min.js" defer></script>
117<script>window.addEventListener("load", () => {
118            if (typeof $.fn.lightGallery === 'function') {
119                $('.article').lightGallery({ selector: '.gallery-item' });
120            }
121            if (typeof $.fn.justifiedGallery === 'function') {
122                if ($('.justified-gallery > p > .gallery-item').length) {
123                    $('.justified-gallery > p > .gallery-item').unwrap();
124                }
125                $('.justified-gallery').justifiedGallery();
126            }
127        });</script>
127<!--!--><!--!-->
127<script src="https://cdn.jsdelivr.net/npm/[email protected]/pjax.min.js"></script>
127<script src="/js/pjax.js"></script>
127<!--!-->
127<script>
128      var sc_project=12507532;
129      var sc_invisible=1;
130      var sc_security="8e8f6e10";
131      var sc_https=1;
132      var sc_remove_link=1;</script>
132<script src="https://www.statcounter.com/counter/counter.js" async></script>
132<noscript><div class="statcounter"><img class="statcounter" src="https://c.statcounter.com/12507532/0/8e8f6e10/1/" alt="real time web analytics"></div></noscript><!--!-->
132<script data-pjax src="/js/main.js" defer></script>
132<div class="searchbox"><div class="searchbox-container"><div class="searchbox-header"><div class="searchbox-input-container"><input class="searchbox-input" type="text" placeholder="Type something..."></div><a class="searchbox-close" href="javascript:;">×</a></div><div class="searchbox-body"></div></div></div>
132<script data-pjax src="/js/insight.js" defer></script>
132<script data-pjax>document.addEventListener('DOMContentLoaded', function () {
133            loadInsight({"contentUrl":"/content.json"}, {"hint":"Type something...","untitled":"(Untitled)","posts":"Posts","pages":"Pages","categories":"Categories","tags":"Tags"});
134        });</script>
134</body></html>

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.