<?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>DEV Community: Fady</title>
    <description>The latest articles on DEV Community by Fady (@fadyio).</description>
    <link>https://dev.to/fadyio</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F751249%2F66d299a9-36bf-4e1b-958f-5da6d6edf274.png</url>
      <title>DEV Community: Fady</title>
      <link>https://dev.to/fadyio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fadyio"/>
    <language>en</language>
    <item>
      <title>Can You Actually Build Real Software With Today’s AI Models?</title>
      <dc:creator>Fady</dc:creator>
      <pubDate>Sun, 30 Aug 2026 06:01:26 +0000</pubDate>
      <link>https://dev.to/fadyio/can-you-actually-build-real-software-with-todays-ai-models-i0g</link>
      <guid>https://dev.to/fadyio/can-you-actually-build-real-software-with-todays-ai-models-i0g</guid>
      <description>&lt;p&gt;Since around 2014, I’ve had a habit of browsing Hacker News every day to see what people were building and what new technology was coming out.&lt;/p&gt;

&lt;p&gt;Since ChatGPT arrived, Hacker News has basically been taken hostage by AI.&lt;/p&gt;

&lt;p&gt;Every week there is another story about someone building in a weekend what supposedly needed ten engineers before, or a new model that is going to change software development forever.&lt;/p&gt;

&lt;p&gt;Every time I read one of those posts, I ask myself the same question:&lt;/p&gt;

&lt;p&gt;How much of this is real, and how much is hype?&lt;/p&gt;

&lt;p&gt;Around the same time, I found Google’s &lt;a href="https://allthingsagentichackathon.devpost.com" rel="noopener noreferrer"&gt;All Things Agentic Hackathon&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;That seemed like a good excuse to test this properly.&lt;/p&gt;

&lt;p&gt;I didn’t want to build another landing page or to-do app. I wanted a real frontend and backend, authentication, cloud infrastructure, storage, CI/CD, tests, security, AI agents, and enough moving parts for things to actually break.&lt;/p&gt;

&lt;p&gt;The question was simple: Can one person use today’s AI models to build real software?&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding Something Worth Building
&lt;/h2&gt;

&lt;p&gt;Ironically, AI wasn’t very useful for finding the idea.&lt;/p&gt;

&lt;p&gt;I spent around two hours talking to Gemini and ChatGPT, and most of the suggestions either already existed or were just weird.&lt;/p&gt;

&lt;p&gt;So I went for a walk.&lt;/p&gt;

&lt;p&gt;A few years ago, I had to record a video for a client explaining how to manage their WordPress site on AWS.&lt;/p&gt;

&lt;p&gt;Recording it was easy.&lt;/p&gt;

&lt;p&gt;Editing it was not.&lt;/p&gt;

&lt;p&gt;The audio was bad, I had multiple takes, and I spent much longer than I wanted turning a simple recording into something presentable.&lt;/p&gt;

&lt;p&gt;That gave me the idea.&lt;/p&gt;

&lt;p&gt;What if I could upload the raw video and let an AI system handle most of what happens afterward?&lt;/p&gt;

&lt;p&gt;Not just remove silence, but actually understand the footage, find bad takes, decide what should be removed, review the edit, render it, and eventually learn from how the published video performed.&lt;/p&gt;

&lt;p&gt;That became &lt;strong&gt;Croviq&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;I’m a DevOps engineer. Infrastructure, containers, networking, and CI/CD are comfortable territory for me.&lt;/p&gt;

&lt;p&gt;Building a React application, a video editor, and a multimodal AI system from scratch is not.&lt;/p&gt;

&lt;p&gt;So before writing much code, I used AI to help me design the product.&lt;/p&gt;

&lt;p&gt;I gave the models the hackathon requirements, my constraints, and the basic idea. I wanted to stay inside Google Cloud, keep the cost low, and build something that could actually be deployed.&lt;/p&gt;

&lt;p&gt;I also kept questioning the architecture instead of just accepting whatever the model suggested first, with some help from Matt Pocock’s AI skills.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned After Five Days of Building
&lt;/h2&gt;

&lt;p&gt;So, can you build real software with AI?&lt;/p&gt;

&lt;p&gt;I’m not going to turn this article into clickbait, so I’ll answer that now.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Yes.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;But not in the way some of the headlines make it sound.&lt;/p&gt;

&lt;p&gt;Writing code was actually one of the easier parts.&lt;/p&gt;

&lt;p&gt;The models could generate a surprising amount of working code, often in frameworks and areas I don’t normally work in.&lt;/p&gt;

&lt;p&gt;The problem is that they are also very good at telling you something is finished when it isn’t.&lt;/p&gt;

&lt;p&gt;A feature can look completely fine in the code. The agent can tell you the tests pass and everything has been successfully implemented.&lt;/p&gt;

&lt;p&gt;Then you open the browser and half of it is broken.&lt;/p&gt;

&lt;p&gt;I also went into the project thinking the backend was going to be the hardest part.&lt;/p&gt;

&lt;p&gt;Video processing is very backend-heavy, so that seemed obvious.&lt;/p&gt;

&lt;p&gt;Surprisingly, the backend ended up being relatively easy.&lt;/p&gt;

&lt;p&gt;The frontend was much worse.&lt;/p&gt;

&lt;p&gt;Getting an agent to write a frontend that actually works, looks good, and behaves the way you expect is much harder than I thought.&lt;/p&gt;

&lt;p&gt;Gemini was actually the best model I tried for frontend work.&lt;/p&gt;

&lt;p&gt;I think its image understanding helps a lot because I could give it screenshots, show it exactly what was wrong, and let it work from there.&lt;/p&gt;

&lt;p&gt;For general coding, though, I still found Gemini noticeably worse than OpenAI or Claude.&lt;/p&gt;

&lt;p&gt;It would sometimes confidently generate something that was simply wrong or based on outdated information.&lt;/p&gt;

&lt;p&gt;That becomes much more dangerous when an agent is changing hundreds of lines across multiple files, because now the bug is hiding somewhere inside a massive Git diff.&lt;/p&gt;

&lt;p&gt;And if you don’t catch it, you can end up with some pretty nasty bugs.&lt;/p&gt;

&lt;h2&gt;
  
  
  I Stopped Looking for the “Best” Model
&lt;/h2&gt;

&lt;p&gt;Eventually I stopped trying to find one model that was good at everything.&lt;/p&gt;

&lt;p&gt;I started using them more like a small team.&lt;/p&gt;

&lt;p&gt;An OpenAI model would act as the advisor and think through the problem first.&lt;/p&gt;

&lt;p&gt;Gemini Flash would do most of the actual implementation.&lt;/p&gt;

&lt;p&gt;Then another model would review the changes before I accepted them.&lt;/p&gt;

&lt;p&gt;That worked much better than expecting one model to plan, write, review, and debug everything by itself.&lt;/p&gt;

&lt;p&gt;It also changed the way I think about AI coding.&lt;/p&gt;

&lt;p&gt;I don’t really care anymore about which model is “the best.”&lt;/p&gt;

&lt;p&gt;I care about which model is best for the job I’m giving it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Then I Started Thinking About Tokens
&lt;/h2&gt;

&lt;p&gt;Another thing I started noticing was how easy it is to burn through tokens when you use coding agents all day.&lt;/p&gt;

&lt;p&gt;I came across &lt;a href="https://danielabaron.me/blog/how-i-stopped-running-out-of-tokens/" rel="noopener noreferrer"&gt;Daniela Baron’s post&lt;/a&gt; about running out of Claude tokens, and a lot of it sounded familiar.&lt;/p&gt;

&lt;p&gt;The problem is not only how much code the model generates.&lt;/p&gt;

&lt;p&gt;It is all the other stuff you keep feeding back into it.&lt;/p&gt;

&lt;p&gt;Huge terminal outputs. Documentation. Tool definitions. Files it read twenty messages ago. Failed attempts. Conversation history that just keeps getting bigger.&lt;/p&gt;

&lt;p&gt;A bigger context window sounds great, but it does not really solve the problem if you keep filling it with things the model does not need.&lt;/p&gt;

&lt;p&gt;At some point I started asking myself:&lt;/p&gt;

&lt;p&gt;Does the model really need this entire conversation?&lt;/p&gt;

&lt;p&gt;Does it need the output of every command?&lt;/p&gt;

&lt;p&gt;Does it need to read ten files when only two of them matter?&lt;/p&gt;

&lt;p&gt;Giving the model less, but better, context started becoming just as important as choosing the model itself.&lt;/p&gt;

&lt;p&gt;And I think this is something we are going to hear a lot more about.&lt;/p&gt;

&lt;p&gt;The model matters, obviously.&lt;/p&gt;

&lt;p&gt;But the harness around the model, the tools it can access, what context gets loaded, and how much garbage you keep out of that context matter just as much.&lt;/p&gt;

&lt;p&gt;After five days of building Croviq, I don’t think AI removes engineering, If anything, it made some parts of engineering more important.&lt;/p&gt;

&lt;p&gt;You still have to review what the models produce which is the hardest part, test it properly, think about security, and know when something just looks wrong.&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyfrxpux0ivrz78ytc5kc.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fyfrxpux0ivrz78ytc5kc.png" alt=" " width="797" height="89"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Some tools that I used in the hackathon that are useful
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;if you are going to vibe code, you will need them both, I have been using &lt;a href="//gitguardian.com"&gt;GitGuardian&lt;/a&gt; and &lt;a href="https://github.com/betterleaks/betterleaks" rel="noopener noreferrer"&gt;Betterleaks&lt;/a&gt; to scan for leaked secrets while the agents were changing a lot of files quickly. With AI generated code, this became a very useful safety net.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://omp.sh/" rel="noopener noreferrer"&gt;Oh My Pi&lt;/a&gt; was the sweet spot for me between heavier tools like OpenCode and building everything in the pi ecosystem. It stays lightweight, but still gives you a good ecosystem of pi plugins out of the box.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://www.aihero.dev/skills" rel="noopener noreferrer"&gt;Matt Pocock’s AI skills&lt;/a&gt; were some of the most useful I tried. His workflow forces you to write the specs and understand what you are building before asking the agent to code, which makes a huge difference. If you and the agent don’t have a clear plan, things go wrong very quickly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://impeccable.style/" rel="noopener noreferrer"&gt;Impeccable&lt;/a&gt; gave me much better results for frontend work, especially when combined with native browser tools like Chrome DevTools and Oh My Pi. If you are doing frontend work with an agent, I would definitely read the documentation and use this skill properly.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="https://github.com/rtk-ai/rtk" rel="noopener noreferrer"&gt;RTK&lt;/a&gt; (Rust Token Killer) is great for reducing token usage from CLI commands. It sits between the agent and commands like git log, then returns a condensed version instead of dumping the entire output into the context. Simple idea, but it can save a lot of unnecessary tokens.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Thank you for reading this far!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;I created this article for the purpose of entering in Google’s All Things Agentic Hackathon.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>programming</category>
    </item>
    <item>
      <title>Securely Accessing Private AWS Resources from GitHub Actions with TailScale</title>
      <dc:creator>Fady</dc:creator>
      <pubDate>Thu, 14 Dec 2023 09:49:49 +0000</pubDate>
      <link>https://dev.to/aws-builders/securely-accessing-private-aws-resources-from-github-actions-with-tailscale-7ol</link>
      <guid>https://dev.to/aws-builders/securely-accessing-private-aws-resources-from-github-actions-with-tailscale-7ol</guid>
      <description>&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;One of the common problems of CI/CD automation is how to handle private resources without exposing these resources directly to the public or relying on complex VPN setups may not be the ideal solution.&lt;/p&gt;

&lt;p&gt;Typically, you go with something like OpenVPN, but OpenVPN can be complicated, with something like OpenVPN,you have to set up your own server, and configure, maintain, etc. On the other hand, it takes less than 2 minutes to set up TailScale, Another thing, if you live in a country where OpenVPN is blocked, you don't have many options.&lt;/p&gt;

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

&lt;p&gt;Here is the diagram that we are going to be implanted in this blog, the blog post will guide you with step-by-step through its implementation. The initial steps involve setting up a GitHub Actions workflow that installs the TailScale client and authorizes it into a TailScale network. Subsequently, the blog post will cover the creation and configuration of the TailScale router, ensuring proper traffic routing and security group settings on AWS.&lt;/p&gt;

&lt;h2&gt;
  
  
  Connecting GitHub Actions to the Tailscale Network
&lt;/h2&gt;

&lt;p&gt;Before starting this guide, you'll need to have a Tailscale network set up and configured with at least one existing device, If you do not know how, follow this &lt;a href="https://tailscale.com/kb/1017/install/" rel="noopener noreferrer"&gt;guide&lt;/a&gt; and of course you're going to need an AWS account as well.&lt;/p&gt;

&lt;p&gt;Now the next thing that I'm going to do is go out to GitHub and create a new repository,You can find the code for the end result in this &lt;a href="https://github.com/Fadyio/Accessing-Private-AWS-Resources" rel="noopener noreferrer"&gt;repository&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;You will then need to create an OAuth client to use with the Github action via this &lt;a href="https://login.tailscale.com/admin/settings/oauth" rel="noopener noreferrer"&gt;link&lt;/a&gt;, copy the Client ID and Client Secret to a safe place for now.&lt;/p&gt;

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

&lt;p&gt;Go to the GitHub repo you created earlier and go to Settings &amp;gt; in the Security section of the sidebar, select Secrets and Variables, then click Actions, Create a GitHub secret with the name &lt;code&gt;TS_OAUTH_CLIENT_ID&lt;/code&gt; and assign your OAuth client ID as the secret value and name &lt;code&gt;TS_OAUTH_SECRET&lt;/code&gt; and assign your OAuth client secret as the secret value.&lt;/p&gt;

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

&lt;p&gt;You will then need to create a server role account using ACL tags in Tailscale, basically ACL tags allow you to assign an identity to a device that is separate from human users, and use that identity as part of an ACL to restrict access. This should be used when adding servers to your Tailscale network, to learn more about ACL tags, &lt;a href="https://tailscale.com/kb/1068/acl-tags/" rel="noopener noreferrer"&gt;click here&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Open your favorite editor and create a .github directory and underneath .github we'll create a Workflows directory, this is the special directory that GitHub Actions is going to look for workflow files in, create a new workflow, I'm going to call it tailscale.yaml.&lt;/p&gt;

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

&lt;p&gt;And inside of this file, we're going to go ahead and set up our basic workflow structure.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy-via-tailscale&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Tailscale&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tailscale/github-action@v2&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;oauth-client-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.TS_OAUTH_CLIENT_ID }}&lt;/span&gt;
        &lt;span class="na"&gt;oauth-secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.TS_OAUTH_SECRET }}&lt;/span&gt;
        &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tag:ci&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let me break it down for you. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the workflow dispatch event. Allows us to trigger workflows manually, which is great for debugging.&lt;/li&gt;
&lt;li&gt;The push event means that whenever we push a change, it goes ahead and triggers a build.&lt;/li&gt;
&lt;li&gt;Define the job and name it deploy-via-tailscale. It will run on the latest release of Ubuntu.&lt;/li&gt;
&lt;li&gt;connect to your tailnet by using the &lt;a href="https://github.com/tailscale/github-action" rel="noopener noreferrer"&gt;Tailscale GitHub Action&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Go ahead and push the code to Github, you should see an ephemeral node. The node can access nodes in your Tailnet, subject to the access rules that apply to the specified ACL tag(s).&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Set Up Amazon VPC and Tailscale Router
&lt;/h2&gt;

&lt;p&gt;What we're going to do is we're going to create a VPC, and then we're going to have this public subnet, and we're going to put an EC2 instance on that public subnet, and we're going to have that EC2 instance connect out to our Tailscale network as well, and then we're going to set that EC2 instance up as a router.&lt;/p&gt;

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

&lt;p&gt;Let's go to the AWS Management Console. First, we'll create  an elastic IP and EC2 instance on the public subnet, which will act as a subnet router.&lt;/p&gt;

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

&lt;p&gt;After the instance has passed the checks we need to download and install Tailscale onto your subnet router machine.&lt;/p&gt;

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

&lt;p&gt;Step 1: Install the Tailscale client&lt;/p&gt;

&lt;p&gt;ssh into the instance and follow the instructions&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;curl -fsSL https://tailscale.com/install.sh | sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;Step 2: Enable IP forwarding and Advertise subnet routes&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo tailscale up --advertise-routes==10.0.16.0/20 --accept-dns=false
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the subnets in the example above with the correct ones for your network, it will give you a link that you will need to go to in order to authenticate.&lt;/p&gt;

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

&lt;p&gt;The EC2 instance should appear in the Tailscale console.&lt;/p&gt;

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

&lt;p&gt;Step 3: Enable subnet routes from the tailscale console&lt;/p&gt;

&lt;p&gt;Locate the device that advertised subnet routes, from the ellipsis menu at the bottom of the table, select Edit Route Settings. This opens the Edit Route Settings panel.&lt;/p&gt;

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

&lt;p&gt;Everything should be working to test connectivity, we will add test connectivity to the Github action, commit and push the code.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy-via-tailscale&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Tailscale&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tailscale/github-action@v2&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;oauth-client-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.TS_OAUTH_CLIENT_ID }}&lt;/span&gt;
        &lt;span class="na"&gt;oauth-secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.TS_OAUTH_SECRET }}&lt;/span&gt;
        &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tag:ci&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;test-connectivity&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;ping -c 10 100.73.32.96&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Replace the IP address with the IP address of the subnet router.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Create Private Amazon RDS Instance and Test Connectivity
&lt;/h2&gt;

&lt;p&gt;After reviewing and verifying, we will provision an Amazon RDS instance in our VPC and test connectivity from our GitHub Actions workflow.&lt;/p&gt;

&lt;p&gt;First, we will create a security group that will allow connection from the subnet router, I'm going to call it the database security group.&lt;/p&gt;

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

&lt;p&gt;In a production environment, it is bad practice to allow all connections from a security group, Only allow access from trusted sources for specific ports and protocols, following the principle of least privilege.&lt;/p&gt;

&lt;p&gt;I will not cover how to create an RDS database here. I assume you have already created an RDS database, please refer to the &lt;a href="https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_CreateDBInstance.html" rel="noopener noreferrer"&gt;AWS documentation&lt;/a&gt; if you don't know how to create one.&lt;/p&gt;

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

&lt;p&gt;If you want to test connectivity between your machine and the private Amazon RDS instance type the following command. This action allows you to connect to the MySQL DB instance using the MySQL client, Replace endpoint with the DB instance endpoint (DNS name) and replace admin with the master username you used. Enter the master password that you used when prompted for a password.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql -h endpoint -P 3306 -u admin -p
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;If everything is configured correctly, you should be able to see this massage.&lt;/p&gt;

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

&lt;p&gt;We will return to the Github action workflow to test connectivity, we will create three secrets for the database endpoint, password, and username.&lt;/p&gt;

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

&lt;p&gt;Update the workflow with this to test connectivity. We can now connect to RDS from any node in the Tailnet, using the same DNS name used inside AWS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="na"&gt;on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;workflow_dispatch&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;push&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;

&lt;span class="na"&gt;jobs&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
  &lt;span class="na"&gt;deploy-via-tailscale&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="na"&gt;runs-on&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;ubuntu-latest&lt;/span&gt;
    &lt;span class="na"&gt;steps&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;actions/checkout@v2&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Tailscale&lt;/span&gt;
      &lt;span class="na"&gt;uses&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tailscale/github-action@v2&lt;/span&gt;
      &lt;span class="na"&gt;with&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt;
        &lt;span class="na"&gt;oauth-client-id&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.TS_OAUTH_CLIENT_ID }}&lt;/span&gt;
        &lt;span class="na"&gt;oauth-secret&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;${{ secrets.TS_OAUTH_SECRET }}&lt;/span&gt;
        &lt;span class="na"&gt;tags&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;tag:ci&lt;/span&gt;
    &lt;span class="pi"&gt;-&lt;/span&gt; &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;Test-Connectivity-to-AWS-RDS&lt;/span&gt;
      &lt;span class="na"&gt;run&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="pi"&gt;|&lt;/span&gt;
        &lt;span class="s"&gt;mysql -h ${{ secrets.ENDPOINT }} -u ${{ secrets.USER }} -p"${{ secrets.PASSWORD }}" -e "show databases;"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;In this blog, we've demonstrated how to create a secure and seamless connection between GitHub Actions workflows and private AWS resources. This approach not only improves the overall security of your CI/CD pipeline, but also ensures that sensitive data and interactions remain within your network, TailScale is easy to use, and has robust encryption mechanisms.&lt;/p&gt;

&lt;p&gt;This is not sponsored or endorsed by TailScale, I use the TailScale at work and in my home lab, I am just a happy customer.&lt;/p&gt;

&lt;p&gt;One more thing, you can host &lt;a href="https://github.com/juanfont/headscale" rel="noopener noreferrer"&gt;Tailscale Control Server&lt;/a&gt; yourself if you want, which is a plus.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>cicd</category>
      <category>githubactions</category>
    </item>
    <item>
      <title>Protect your Web Apps Against DDoS Attacks by Using AWS Shield</title>
      <dc:creator>Fady</dc:creator>
      <pubDate>Mon, 24 Apr 2023 09:52:09 +0000</pubDate>
      <link>https://dev.to/aws-builders/protect-your-web-apps-against-ddos-attacks-by-using-aws-shield-1gle</link>
      <guid>https://dev.to/aws-builders/protect-your-web-apps-against-ddos-attacks-by-using-aws-shield-1gle</guid>
      <description>&lt;p&gt;AWS offers really great tools to protect you from threats and ensure security in the cloud, one of these tools is AWS shield which is essential tools to safeguard your web apps or websites from Distributed Denial of Service (DDoS) attacks.&lt;/p&gt;

&lt;h2&gt;
  
  
  what is DDoS attacks?
&lt;/h2&gt;

&lt;p&gt;DDoS attacks have become increasingly common in today's digital world, &lt;a href="https://blog.cloudflare.com/ddos-threat-report-2022-q4/" rel="noopener noreferrer"&gt;with the number of attacks are rising&lt;/a&gt;, DDoS stands for “Distributed Denial-of-Service” attack, DDoS attacks are a type of Cyberattacks in which the attacker (Often, it's not just one person who is responsible for this attack; sometimes, the attacker is a nation) floods a server with internet traffic by botnets (A botnet is a network of computers infected by malware that are under the control of the attacker), rendering connected online services and sites inaccessible to legitimate users. These attacks are sophisticated and designed to overwhelm the network with unwanted traffic. As a result, network performance is either degraded or critical infrastructure experiences a service outage.&lt;/p&gt;

&lt;h2&gt;
  
  
  AWS Shield
&lt;/h2&gt;

&lt;p&gt;AWS Shield is a managed DDoS protection service offered by AWS, It works in partnership with ELB, Amazon CloudFront, and Amazon Route 53 to protects you from DDoS attacks of many types of DDoS Attacks.&lt;br&gt;
AWS Shield protects against three different types&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Network volumetric attacks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These are designed to simply overwhelm the system being attacked. &lt;br&gt;
So to direct as much raw network data at a target as possible&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Network protocol attacks or TCP SYN floods&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are various types of protocol attack, but one common one is to generate a huge number of connections from a spoofed IP address (computers infected by malware) and then just leave these connections open and never terminating them, the server will be impacted by the huge volume of fake connections.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Application layer attacks&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Imagine you have a part of your web app which allows searches, think of something like Facebook or Twitter Search which lets you search for new friends or people to follow, Attackers can use web app searches to launch DDoS attacks by sending a large number of requests to a web application that has a search feature. The attacker sends requests that are designed to consume as much server resources as possible. And it can be done hundreds, thousands, or millions of times per second. Some parts of the application are cheap to request, but expensive to deliver the result.&lt;/p&gt;

&lt;p&gt;So those are the types of things which Shield protects against.&lt;/p&gt;

&lt;p&gt;AWS Shield comes in two forms, Shield Standard and Shield Advanced. While both offer protection against DDoS attacks, there are significant differences between the two.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shield Standard
&lt;/h3&gt;

&lt;p&gt;Shield Standard is a free service that comes with all AWS accounts, you benefit from its protection automatically without you having to do anything.&lt;/p&gt;

&lt;p&gt;AWS Shield Standard doesn’t provide much in the way of proactive capability or any form of explicit configurable protection. It’s just there working away in the background&lt;/p&gt;

&lt;p&gt;Shield Standard is designed for applications that require basic protection against DDoS attacks but have a low risk tolerance.&lt;/p&gt;

&lt;h3&gt;
  
  
  Shield Advanced
&lt;/h3&gt;

&lt;p&gt;Shield Advanced, which comes with additional costs (&lt;a href="https://aws.amazon.com/shield/pricing/" rel="noopener noreferrer"&gt;it costs $3,000 US dollars per month,per organization&lt;/a&gt;) and benefits, is a commercial extra product that offers additional detection and mitigation against large and sophisticated DDoS attacks, near real-time visibility into attacks, and integration with AWS WAF, a web application firewall.&lt;br&gt;
Shield Advanced provides a 24/7 to &lt;a href="https://docs.aws.amazon.com/waf/latest/developerguide/ddos-srt-support.html" rel="noopener noreferrer"&gt;AWS Shield Response Team (SRT)&lt;/a&gt;, advanced attack mitigation techniques, and protection against attacks at the application layer. &lt;br&gt;
It also includes features such as traffic logging and metrics, which allow customers to monitor their traffic and identify potential attacks. &lt;/p&gt;

&lt;p&gt;Shield Advanced is designed for applications that require a higher level of protection against DDoS attacks and have a higher risk tolerance.&lt;/p&gt;

&lt;p&gt;If you have feedback about this blog post, submit comments in the Comments section below.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>aws</category>
      <category>security</category>
      <category>cloud</category>
    </item>
  </channel>
</rss>
