<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Quincy Ouko</title>
    <description>The latest articles on Forem by Quincy Ouko (@quincy_ouko).</description>
    <link>https://forem.com/quincy_ouko</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3004226%2Ff882d612-5b90-4257-b8ea-5aef09c50945.jpg</url>
      <title>Forem: Quincy Ouko</title>
      <link>https://forem.com/quincy_ouko</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/quincy_ouko"/>
    <language>en</language>
    <item>
      <title>Deploying a Honeypot SOC with Microsoft Sentinel</title>
      <dc:creator>Quincy Ouko</dc:creator>
      <pubDate>Thu, 11 Sep 2025 10:52:31 +0000</pubDate>
      <link>https://forem.com/quincy_ouko/deploying-a-honeypot-soc-with-microsoft-sentinel-1l22</link>
      <guid>https://forem.com/quincy_ouko/deploying-a-honeypot-soc-with-microsoft-sentinel-1l22</guid>
      <description>&lt;p&gt;This project will explain how to setup a basic SOC using Azure. We shall setup a honeypot VM the forward the logs generated to central repository. We shall then integrate Microsoft Sentinel to analyze the attack data. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0jk3u9sbn1hc4hi6o2h.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fp0jk3u9sbn1hc4hi6o2h.jpg" alt=" " width="800" height="500"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Prerequisite&lt;/strong&gt;&lt;br&gt;
Azure free subscription account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create Resource Groups &amp;amp; Virtual Network&lt;/strong&gt;&lt;br&gt;
We shall create a Resource Groups leaving all the configurations as default. For our case it will be &lt;em&gt;my-first-rsg&lt;/em&gt; on Central India region. &lt;br&gt;
We shall then create a Virtual Network (Vnet) &lt;em&gt;my-first-vnet&lt;/em&gt; under the Resource Group we earlier created, leaving all the configurations as default. This has be under the same region which is Central India.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5yce4cw8g8pojsxp9dd7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5yce4cw8g8pojsxp9dd7.png" alt=" " width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As shown in the image above, we will create a virtual machine named &lt;em&gt;DataAnalysis-Server&lt;/em&gt; running a Windows Server 2019 Datacenter OS. We shall use size Standard B2S for the purpose of this project.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyxxde3ay6pwkpsrfp0j3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fyxxde3ay6pwkpsrfp0j3.png" alt=" " width="800" height="316"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once you're done with the configuration, you can deploy your newly created virtual machine as shown above.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9s9u7l9mffmkxpgwh02a.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9s9u7l9mffmkxpgwh02a.JPG" alt=" " width="576" height="895"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;From the Resource Groups, we will modify the Network Security Group. We will delete the default &lt;em&gt;Remote Desktop Protocol (RDP)&lt;/em&gt; rule and we will create a new rule that opens all ports from any source. We shall name this rule &lt;em&gt;DangerAllPortsAllowed&lt;/em&gt; as shown above.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukywl4i9liwofn2q2hsg.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fukywl4i9liwofn2q2hsg.JPG" alt=" " width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using Windows Remote Desktop Protocol (RPD), input the IP Address, username and password to log into the newly created virtual machine.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgij1kvbid5sh08wy2agw.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgij1kvbid5sh08wy2agw.JPG" alt=" " width="800" height="456"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the VM, open Windows Firewall and turn off all the Windows Defender Firewall Properties as shown above.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzrh0nwev1b54jl3245md.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzrh0nwev1b54jl3245md.JPG" alt=" " width="800" height="418"&gt;&lt;/a&gt;&lt;br&gt;
We can confirm if the VM is reachable by pinging it from our local machine as shown above.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpegoodeih8bmza90ozmy.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpegoodeih8bmza90ozmy.JPG" alt=" " width="800" height="354"&gt;&lt;/a&gt;&lt;br&gt;
We then create a Log Analytics workspace to collect our VM logs.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg1x17te3lyzzlaqhdbyz.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg1x17te3lyzzlaqhdbyz.JPG" alt=" " width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will then create a Microsoft Sentinel and add the newly created Log Analytics workspace we just created.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmqh2z8wtzo2hvp1q2kae.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmqh2z8wtzo2hvp1q2kae.JPG" alt=" " width="800" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On the Microsoft Sentinel page, under Content management on the Content hub. We will search and install the Windows Security Events tool which will allow us to connect the Log Analytics workspace to our newly created VM as shown above.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fudganhf3gx18eii0bdzo.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fudganhf3gx18eii0bdzo.JPG" alt=" " width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We shall then configure the Windows Security Events via Azure Monitoring Agent (AMA).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc1qpqc7qyo9c0p1vs6lm.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fc1qpqc7qyo9c0p1vs6lm.JPG" alt=" " width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will then create a data collection rule that our VM will use to forward logs into our Log Analytics workspace which eventually allows us to access them in our SIEM. Once this is done, we can switch back to the Azure VM window and on our VM under Settings: Extensions + applications we should start see the AMA installed. &lt;br&gt;
Once this is properly configured, we can query the logs using KQL as shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifk2zxjgy6tj4jmx6bd5.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fifk2zxjgy6tj4jmx6bd5.JPG" alt=" " width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We check back two hours later and we can see thousands of login attempts on our virtual machine.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbr3mul3psyr47np09f9.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffbr3mul3psyr47np09f9.JPG" alt=" " width="800" height="452"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can try query the last one minute to see how many attacks we record per minute.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flw7kjj9g2z48ydw0o7ib.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flw7kjj9g2z48ydw0o7ib.JPG" alt=" " width="800" height="447"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;p&gt;And we can see 9 failed login attempts to our virtual machine in the last minute.&lt;br&gt;
We will then create a Watchlist in the Microsoft Defender portal and upload the geographically mapped ip address spreadsheet: geoip-summarized.csv. Once uploaded the document should be as shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ficfuvodattqakcdaay2c.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ficfuvodattqakcdaay2c.JPG" alt=" " width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Using a simple KQL query we can get to highlight one specific attacker from Netherlands who has tried to login to the computer over 900 times as seen below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn7zn2sehx43bmvkg6oaz.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn7zn2sehx43bmvkg6oaz.JPG" alt=" " width="800" height="383"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will create a Sentinel workbook in order to plot the attack in a bar graph. We will then use the JSON query as shown on the image below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxau2vgwubughyemzuz07.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxau2vgwubughyemzuz07.JPG" alt=" " width="800" height="414"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4fq3r1pyuobwjezd0ar.JPG" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr4fq3r1pyuobwjezd0ar.JPG" alt=" " width="800" height="201"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We can visualize the data as a bar graph using the workbooks.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
It is very important to always install your security updates as soon as they become available. &lt;br&gt;
Only open necessary ports for the time you need it for.&lt;/p&gt;

</description>
      <category>tutorial</category>
      <category>security</category>
      <category>azure</category>
      <category>beginners</category>
    </item>
    <item>
      <title>Crafting a Scalable Three-Tier Architecture Demonstrating Blue-Green Deployment</title>
      <dc:creator>Quincy Ouko</dc:creator>
      <pubDate>Fri, 02 May 2025 23:06:41 +0000</pubDate>
      <link>https://forem.com/quincy_ouko/crafting-a-scalable-three-tier-architecture-demonstrating-blue-green-deployment-3326</link>
      <guid>https://forem.com/quincy_ouko/crafting-a-scalable-three-tier-architecture-demonstrating-blue-green-deployment-3326</guid>
      <description>&lt;p&gt;&lt;strong&gt;Create a VPC&lt;/strong&gt;&lt;br&gt;
We start by creating a VPC, Subnets, Internet Gateway and Route Tables.&lt;br&gt;
Below is how I allocated Ip Addresses to the VPC and each subnet.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;VPC 10.0.0.0/16&lt;br&gt;
10.0.1.0/24 - public subnet1&lt;br&gt;
10.0.2.0/24 - public subnet2&lt;br&gt;
10.0.3.0/24 - private subnet1&lt;br&gt;
10.0.4.0/24 - private subnet2&lt;/em&gt; &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a Bastion Server&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwxz191czuwei29i02cr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnwxz191czuwei29i02cr.png" alt="Image description" width="800" height="390"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create a Bastion that can only be accessed via SSH from your device IP Address and launch it. This highly improves security of your architecture.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1d4i5hy3ysgi4cic7gnh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1d4i5hy3ysgi4cic7gnh.png" alt="Image description" width="800" height="105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create the Database Security Group&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmkvuomn9amhzmz8bry5i.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmkvuomn9amhzmz8bry5i.png" alt="Image description" width="800" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Create the security group from the DB port 3306 to both the public subnets then create another rule for SSH only from the Bastion server we earlier created. This allows SSH connection only from the Bastion server improving security of the DB server.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a Database&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv6cmi706bnjp6s3z3g7o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fv6cmi706bnjp6s3z3g7o.png" alt="Image description" width="800" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We start by creating a subnet group with the two private subnets we earlier created. Then we create an SQL database placing it in the subnet group we created.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We created an extra private subnet just to use it to create a subnet group but for this project we only need one.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falzvff05uwyqqqny3mip.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Falzvff05uwyqqqny3mip.png" alt="Image description" width="800" height="53"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a Control Server&lt;/strong&gt;&lt;br&gt;
We will use the control server to test the connection to the database before we deploy the image.&lt;br&gt;
We will install php, php-mysqli and mysql-server on the control server.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6nbe1r0pq01ioekgc89.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs6nbe1r0pq01ioekgc89.png" alt="Image description" width="742" height="207"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Establish Connection to the SQL Database through SQL Workbench&lt;/strong&gt;&lt;br&gt;
We will now establish a connection to the database through the Bastion host we created. We will use MySQL Workbench to establish this connection.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4fqpp2cy5ftzby122igf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4fqpp2cy5ftzby122igf.png" alt="Image description" width="800" height="426"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Test the database by add users and marking their attendance&lt;/strong&gt;&lt;br&gt;
I added three users under the AWS SAA track and I was able to check their attendance. &lt;br&gt;
Generating the report is proof that the application is communicating with the database.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhddaekfdwhblujf01lnf.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhddaekfdwhblujf01lnf.png" alt="Image description" width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create an Image (AMI) of the Control Server&lt;/strong&gt;&lt;br&gt;
We create an image of the control server. At this point we can get rid of the control server since we will only make use of the it's AMI.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjlxsisk38tk9cfvzipak.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjlxsisk38tk9cfvzipak.png" alt="Image description" width="800" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a launch template from the AMI&lt;/strong&gt;&lt;br&gt;
We need a launch template since we can specify the launch configurations like security groups before we launch the instances from the image.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmz7og31sgt2n7o50oek3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmz7og31sgt2n7o50oek3.png" alt="Image description" width="800" height="173"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create a Target Groups&lt;/strong&gt;&lt;br&gt;
This will allow us to route traffic to the instances we will create based on our rules.&lt;br&gt;
We will then edit the listener port, port 80 and allow both the two target groups to use the same port.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff375fgd2tso5o792ondt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff375fgd2tso5o792ondt.png" alt="Image description" width="800" height="140"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create an Autoscaling Group&lt;/strong&gt;&lt;br&gt;
We will create the autoscaling group and attached then to the target groups we created.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1qetcjsaco5bs2y0w0ak.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1qetcjsaco5bs2y0w0ak.png" alt="Image description" width="800" height="157"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;While creating the autoscaling group, we will specify the desired capacity as 3, minimum capacity as 2 and maximum capacity as 5.&lt;/p&gt;

&lt;p&gt;The instances should be created as shown below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fard31gta758u97p99sik.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fard31gta758u97p99sik.png" alt="Image description" width="800" height="254"&gt;&lt;/a&gt; &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;To access the machines created, you will use the DNS of the load balancers. 
As shown with the DNS address below. We can also see that the records we took before creating the launch templates are also present.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frrisl1p6sqmho866t3ki.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frrisl1p6sqmho866t3ki.png" alt="Image description" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Create CloudWatch Alarms&lt;/strong&gt;&lt;br&gt;
This will inform the instances when to add or delete using specified parameters.&lt;br&gt;
We will create two EC2 alarms by Autoscaling. We will use CPU Utilization as the preferred metrics from both. For high utilization the threshold will be 75% and for low the threshold will be 25%. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjr7wrgvqibva9aaysq34.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjr7wrgvqibva9aaysq34.png" alt="Image description" width="800" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We will enable dynamic scaling and enable simple scaling.&lt;br&gt;
This will use the threshold we defined above to add or remove instances.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcpv9hovelk17q7jhenhb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcpv9hovelk17q7jhenhb.png" alt="Image description" width="800" height="369"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Demonstrate Blue-Green Deployment&lt;/strong&gt;&lt;br&gt;
We can do this under load balancers. We edit listeners traffic flow in different targets. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fns9jty5yhh0ljkshjasw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fns9jty5yhh0ljkshjasw.png" alt="Image description" width="800" height="144"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For instance, we are doing an update on Target-1, we will send all the traffic on target-2 and once we are done with the update we can send traffic to target-1. The now updated site.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SNS Notification (Optional)&lt;/strong&gt;&lt;br&gt;
You can also configure SNS notification to alert you on any threshold you go past. This will help during cost optimization since you will be able to monitor your cost.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvzv83lmul1wrcokprx7s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvzv83lmul1wrcokprx7s.png" alt="Image description" width="800" height="137"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusion&lt;/strong&gt;&lt;br&gt;
Building a three-tier architecture with blue-green deployment in mind enhances scalability and security while minimizing downtime. This approach streamlines updates, ensuring a seamless user experience and effective use of resources. &lt;/p&gt;

</description>
    </item>
    <item>
      <title>How I used Amazon QuickSight to Visualize Data</title>
      <dc:creator>Quincy Ouko</dc:creator>
      <pubDate>Mon, 21 Apr 2025 11:12:34 +0000</pubDate>
      <link>https://forem.com/quincy_ouko/how-i-used-amazon-quicksight-to-visualize-data-1gl8</link>
      <guid>https://forem.com/quincy_ouko/how-i-used-amazon-quicksight-to-visualize-data-1gl8</guid>
      <description>&lt;h3&gt;
  
  
  Upload your dataset and the 'manifest.json' file into S3
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;S3 is used in this project to store my dataset and manifest.json file.&lt;/li&gt;
&lt;li&gt;I edited the manifest.json file by updating the S3 URL of my dataset.&lt;/li&gt;
&lt;li&gt;It's important to update this file so that the manifest.json file won't be pointing to the wrong address.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rfx7s2s0ofa9fitpjfs.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8rfx7s2s0ofa9fitpjfs.png" alt="Image description" width="800" height="237"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Updated manifest.json file.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg207aqt2almik47gibr6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fg207aqt2almik47gibr6.png" alt="Image description" width="800" height="235"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Here is my bucket with CSV and manifest files.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Create your Amazon QuickSight account
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;QuickSight account is free to create and the free trial lasts for 30 days. It took about 2 minutes to create.&lt;/li&gt;
&lt;li&gt;I also had to enable QuickSight's access to S3 because my dataset is stored in a S3 bucket and specific access is required to access my dataset.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4e9xxb1uq71z2rykm1yz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4e9xxb1uq71z2rykm1yz.png" alt="Image description" width="800" height="331"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;I created a QuickSight account&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Why was the manifest file important
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;The manifest.json file was important in this step because it acts as a 
map to guide QuickSight on where the file is located and how it should 
classify the data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhszg6qhaol3sv84d6pw.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmhszg6qhaol3sv84d6pw.png" alt="Image description" width="750" height="367"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Let's make visualizations
&lt;/h3&gt;

&lt;p&gt;To create visualization on QuickSight you will have to drag fields you want to visualize into the QuickSight AutoGraph field.&lt;br&gt;
The graph shown here is a breakdown of movies vs tv shows released each year. I created this graph putting the release year on the Y axis and making the type movie/tv show the grouping variable. &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F292uej8x88z9okwyem5k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F292uej8x88z9okwyem5k.png" alt="Image description" width="648" height="428"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;My first visualization&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Using filters
&lt;/h3&gt;

&lt;p&gt;Filter are useful for specifying data that you want to analyze. Here I added a filter by excluding movies and tv shows released before 2015.&lt;br&gt;
This helped me create a visualization on movies released from 2015 onwards.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcfz9iecoe6utnsog4chc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcfz9iecoe6utnsog4chc.png" alt="Image description" width="800" height="466"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Visualization after filtering&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Set up your dashboard
&lt;/h3&gt;

&lt;p&gt;As a finishing touch, I edited titles of my graph so that the charts are readable.&lt;br&gt;
Did you know you could export your dashboard as a PDF file? I did this by publishing the dashboard and clicking the export function.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frcgltbuebgumq6o1duw6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frcgltbuebgumq6o1duw6.png" alt="Image description" width="800" height="743"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  My Key Learnings
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;QuickSight is a quick data visualization service.&lt;/li&gt;
&lt;li&gt;QuickSight makes data visualization easy especially using a drag and 
drop feature.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Final Thoughts
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Always clean up your project to keep it under free tier account :)&lt;/li&gt;
&lt;li&gt;Now that I know how to use QuickSight, in the future i'd use it to practice data visualization using other types of data.&lt;/li&gt;
&lt;li&gt;An area of data visualization i'd like to explore is making animated presentation with the data.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>cloudcomputing</category>
      <category>aws</category>
      <category>visualization</category>
    </item>
    <item>
      <title>Creating a Static Website Using S3 and CloudFront</title>
      <dc:creator>Quincy Ouko</dc:creator>
      <pubDate>Sat, 05 Apr 2025 12:04:32 +0000</pubDate>
      <link>https://forem.com/quincy_ouko/creating-a-static-website-using-s3-and-cloudfront-4n62</link>
      <guid>https://forem.com/quincy_ouko/creating-a-static-website-using-s3-and-cloudfront-4n62</guid>
      <description>&lt;p&gt;The objective of the project is to host my CV as a static HTML website using S3 and CloudFront.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7i0g05499ep4nswrc9r.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm7i0g05499ep4nswrc9r.jpg" alt="Image description" width="641" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The image above outlines the project workflow.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpu71r95ekl8p16yt3jco.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpu71r95ekl8p16yt3jco.jpg" alt="Image description" width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I started by creating an S3 bucket with public access policy enabled then I upload my CV document as an HTML file.&lt;br&gt;
I then navigated to the CloudFront Console, created a new distribution and   set the Origin Domain as the bucket created above. I then changed the Origin access from Public to Origin access control settings (OAC). Afterwards, I created a new OAC and selected it.&lt;br&gt;
I created the distribution the copied the CloudFront OAC to the bucket policy. This is as shown in the figure below.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftowu6ao7c44d8fj5fahc.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftowu6ao7c44d8fj5fahc.jpg" alt="Image description" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Once, that finished propagating, I copied the link to test my website.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr6bac4rogd1yo23osn8z.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr6bac4rogd1yo23osn8z.jpg" alt="Image description" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As the image above displays, the project objective was archived.&lt;/p&gt;

&lt;p&gt;Lessons Learned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Uploading a website on S3 allows you to easily edit and update it.&lt;/li&gt;
&lt;li&gt;S3 hosted website can be accessed from any browser.&lt;/li&gt;
&lt;li&gt;CloudFront ensure low latency &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conclusion:&lt;br&gt;
You can successfully host a static website on S3 even without having a domain. &lt;/p&gt;

</description>
      <category>cloudcomputing</category>
      <category>aws</category>
    </item>
  </channel>
</rss>
