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&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 <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 <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>© 2026 Adrian Mudzwiti</span>  Powered by <a href="https://hexo.io/" target="_blank" rel="noopener">Hexo</a> & <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.