<?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: Jose Luis</title>
    <description>The latest articles on Forem by Jose Luis (@joseluissr).</description>
    <link>https://forem.com/joseluissr</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%2F624575%2Ff6493a6a-6490-41d9-9cb4-5bbd6b31f942.jpeg</url>
      <title>Forem: Jose Luis</title>
      <link>https://forem.com/joseluissr</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/joseluissr"/>
    <language>en</language>
    <item>
      <title>How to install n8n self-hosted on AWS</title>
      <dc:creator>Jose Luis</dc:creator>
      <pubDate>Wed, 08 Apr 2026 15:51:52 +0000</pubDate>
      <link>https://forem.com/aws-builders/how-to-install-n8n-self-hosted-on-aws-18l4</link>
      <guid>https://forem.com/aws-builders/how-to-install-n8n-self-hosted-on-aws-18l4</guid>
      <description>&lt;p&gt;In this post, you will install and configure your own n8n instance using AWS cloud services. This gives you more control over infrastructure, costs, and workflow customization.&lt;/p&gt;

&lt;p&gt;Using n8n in your own infrastructure (self-hosted) is an alternative to automate workflows without paying a monthly subscription to &lt;a href="https://n8n.io/" rel="noopener noreferrer"&gt;n8n.io&lt;/a&gt;  cloud services.&lt;/p&gt;

&lt;h1&gt;
  
  
  What Will You Learn?
&lt;/h1&gt;

&lt;p&gt;In this post, you will learn how to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Install and configure n8n as self-hosted
&lt;/li&gt;
&lt;li&gt;Estimate basic operation costs
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  Step-by-Step Implementation
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Prerequisites ✅
&lt;/h2&gt;

&lt;p&gt;Before you start, you need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An active &lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;Amazon Web Services (AWS)&lt;/a&gt; account
&lt;/li&gt;
&lt;li&gt;A domain to publish n8n with HTTPS
&lt;/li&gt;
&lt;li&gt;Download the &lt;a href="https://github.com/JoseLuisSR/whatsapp-chatbot" rel="noopener noreferrer"&gt;whatsapp-chatbot&lt;/a&gt; repository for installation and configuration of n8n
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Deploy n8n on AWS 🚀
&lt;/h2&gt;

&lt;p&gt;The installation is automated using a CloudFormation template that creates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AWS Lightsail instance
&lt;/li&gt;
&lt;li&gt;Network and communication permissions
&lt;/li&gt;
&lt;li&gt;Static public IP address
&lt;/li&gt;
&lt;li&gt;Startup script to install docker, n8n, database (postgres), web server (nginx), and certbot
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Template Parameters:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;InstanceName&lt;/strong&gt;: instance name
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BlueprintId&lt;/strong&gt;: base image, for example &lt;code&gt;amazon_linux_2023&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BundleId&lt;/strong&gt;: instance size
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AvailabilityZone&lt;/strong&gt;: AWS region and zone
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;StaticIPName&lt;/strong&gt;: static IP name
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DBUser&lt;/strong&gt;: database user
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DBPassword&lt;/strong&gt;: database password
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain&lt;/strong&gt;: public domain for n8n
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email&lt;/strong&gt;: email for HTTPS certificate
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can run the CloudFormation template using &lt;strong&gt;AWS CLI&lt;/strong&gt; or &lt;strong&gt;AWS Console&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option A: Deploy from Command Line 💻
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Configure access keys to connect AWS CLI with your AWS account. Check details &lt;a href="https://docs.aws.amazon.com/cli/v1/userguide/cli-authentication-user.html#cli-authentication-user-configure-wizard" rel="noopener noreferrer"&gt;here&lt;/a&gt;.  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to the path where you downloaded the &lt;a href="https://github.com/JoseLuisSR/whatsapp-chatbot" rel="noopener noreferrer"&gt;whatsapp-chatbot&lt;/a&gt; project, inside the &lt;code&gt;aws&lt;/code&gt; folder  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Run this command. Replace &lt;code&gt;Domain&lt;/code&gt; and &lt;code&gt;Email&lt;/code&gt; with your values:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws cloudformation deploy &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--stack-name&lt;/span&gt; n8n &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--template-file&lt;/span&gt; template.yaml &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--parameter-overrides&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;InstanceName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;n8n-instance &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;AvailabilityZone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-east-1a &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;BlueprintId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;amazon_linux_2023 &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;BundleId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;small_3_0 &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;Domain&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;Domain&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;DBUser&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;DBPassword&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;Email&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;email&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;StaticIpName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;n8n-ip-address
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option B: Deploy from AWS Console 🌐
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Log in to &lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;AWS Console&lt;/a&gt;  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Go to CloudFormation and create a new stack  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Import the template (&lt;code&gt;template.yaml&lt;/code&gt;) and follow the steps to set parameters like &lt;code&gt;Domain&lt;/code&gt; and &lt;code&gt;Email&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/HslTs7opVJg"&gt;
  &lt;/iframe&gt;
  &lt;/p&gt;
&lt;h2&gt;
  
  
  3. Validate the installation 📝✅
&lt;/h2&gt;

&lt;p&gt;After CloudFormation finishes, check:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;The Lightsail instance exists
&lt;/li&gt;
&lt;li&gt;Security rules allow SSH, HTTP, and HTTPS
&lt;/li&gt;
&lt;li&gt;The static IP is assigned
&lt;/li&gt;
&lt;li&gt;You can connect using SSH
&lt;/li&gt;
&lt;li&gt;The n8n and postgres containers are running
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;It is recommended to restrict SSH access only to your IP.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/29utgb4wE7E"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Configure HTTPS 🔐
&lt;/h2&gt;

&lt;p&gt;This step is required so n8n can connect with platforms like &lt;strong&gt;WhatsApp&lt;/strong&gt;, &lt;strong&gt;Google&lt;/strong&gt;, etc., that require SSL/TLS.&lt;/p&gt;

&lt;p&gt;Steps:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create the DNS zone
&lt;/li&gt;
&lt;li&gt;Point the domain to the Lightsail static IP
&lt;/li&gt;
&lt;li&gt;Generate the certificate with Certbot
&lt;/li&gt;
&lt;li&gt;Verify that n8n works with HTTPS
&lt;/li&gt;
&lt;li&gt;Register in the n8n interface
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Connect to your Lightsail instance using SSH and run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot &lt;span class="nt"&gt;--nginx&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; n8n.tu-dominio.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--email&lt;/span&gt; tu-correo@dominio.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--agree-tos&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--no-eff-email&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--redirect&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/F5HlGKqmIsA"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  Licensing 📄
&lt;/h1&gt;

&lt;p&gt;n8n uses the Fair Code license (Sustainable Use License). You can use it for free, modify it, and run it in your own infrastructure (self-hosted) for personal or business use.&lt;/p&gt;

&lt;p&gt;You can use it inside internal products or services in a company, as long as n8n is not the main product.&lt;/p&gt;

&lt;p&gt;You cannot resell n8n as a hosted automation platform or create a business where the main product is a managed n8n service.&lt;/p&gt;

&lt;h1&gt;
  
  
  Costs 💰
&lt;/h1&gt;

&lt;h2&gt;
  
  
  AWS Lightsail (Self Hosting) ☁️
&lt;/h2&gt;

&lt;p&gt;In AWS Lightsail, the minimum recommended instance to run n8n is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;2 GB RAM
&lt;/li&gt;
&lt;li&gt;2 vCPU
&lt;/li&gt;
&lt;li&gt;60 GB SSD
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This setup supports basic workflows with good stability. This instance has a monthly 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%2Femc4vbv8ixmrz5crscuv.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%2Femc4vbv8ixmrz5crscuv.png" alt=" " width="730" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusions
&lt;/h1&gt;

&lt;p&gt;⚖️ You can use n8n in internal or business projects, but you cannot resell it as the main service.&lt;/p&gt;

&lt;p&gt;💰 n8n is free if you use your own infrastructure (self-hosted), but AWS infrastructure has monthly costs.&lt;/p&gt;

&lt;p&gt;🚀 Infrastructure and n8n installation are automated using AWS CloudFormation (Infrastructure as Code). You can deploy n8n in a few steps.&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>aws</category>
      <category>docker</category>
      <category>ngin</category>
    </item>
    <item>
      <title>How to build a WhatsApp Chatbot with n8n, AWS, and OpenAI</title>
      <dc:creator>Jose Luis</dc:creator>
      <pubDate>Tue, 07 Apr 2026 16:08:48 +0000</pubDate>
      <link>https://forem.com/joseluissr/how-to-build-a-whatsapp-chatbot-with-n8n-aws-and-openai-feh</link>
      <guid>https://forem.com/joseluissr/how-to-build-a-whatsapp-chatbot-with-n8n-aws-and-openai-feh</guid>
      <description>&lt;p&gt;If you want to build your own WhatsApp chatbot to receive text and voice messages, process them with AI, and reply automatically, this guide shows a practical way to do it using &lt;strong&gt;n8n + OpenAI + Meta + AWS&lt;/strong&gt;.  &lt;/p&gt;

&lt;h1&gt;
  
  
  🧠 What will you learn?
&lt;/h1&gt;

&lt;p&gt;In this post you will see how to:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connect OpenAI AI services with n8n
&lt;/li&gt;
&lt;li&gt;Connect WhatsApp Business Cloud services with n8n
&lt;/li&gt;
&lt;li&gt;Receive text and voice messages and reply automatically from an n8n workflow
&lt;/li&gt;
&lt;li&gt;Estimate basic operation costs
&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  🛠️ Implementation step by step
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Prerequisites ✅
&lt;/h2&gt;

&lt;p&gt;Before you start, you need:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An &lt;a href="https://platform.openai.com/home" rel="noopener noreferrer"&gt;OpenAI account&lt;/a&gt; with balance
&lt;/li&gt;
&lt;li&gt;A &lt;a href="https://developers.facebook.com/" rel="noopener noreferrer"&gt;Meta Developer account&lt;/a&gt; (you can use your personal Facebook account)
&lt;/li&gt;
&lt;li&gt;A domain to publish n8n with HTTPS
&lt;/li&gt;
&lt;li&gt;Access to n8n (&lt;a href="https://dev.to/aws-builders/how-to-install-n8n-self-hosted-on-aws-18l4"&gt;self-hosted&lt;/a&gt; or &lt;a href="https://n8n.io/" rel="noopener noreferrer"&gt;cloud service&lt;/a&gt;)
&lt;/li&gt;
&lt;li&gt;Download the &lt;a href="https://github.com/JoseLuisSR/whatsapp-chatbot" rel="noopener noreferrer"&gt;whatsapp-chatbot&lt;/a&gt; repository for installation and setup
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Import chatbot workflow 💬
&lt;/h2&gt;

&lt;p&gt;Import the workflow from the &lt;code&gt;n8n&lt;/code&gt; folder in the &lt;code&gt;whatsapp-chatbot&lt;/code&gt; repository. Copy and paste the content of the &lt;code&gt;whatsapp-chatbot.json&lt;/code&gt; file into n8n.  &lt;/p&gt;

&lt;p&gt;This workflow allows you to:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Receive text or voice messages from WhatsApp
&lt;/li&gt;
&lt;li&gt;Detect if the content is audio
&lt;/li&gt;
&lt;li&gt;Download and transcribe the audio
&lt;/li&gt;
&lt;li&gt;Run an OpenAI LLM model
&lt;/li&gt;
&lt;li&gt;Send the response back to WhatsApp&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%2Fjba3f29mgjnz7w4qwnbw.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%2Fjba3f29mgjnz7w4qwnbw.png" alt=" " width="800" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Configure OpenAI in n8n 🧠
&lt;/h2&gt;

&lt;p&gt;To run OpenAI Large Language Models (LLM) in n8n, you need an API Key to authenticate requests. Steps:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Go to &lt;a href="https://platform.openai.com/login" rel="noopener noreferrer"&gt;OpenAI Platform&lt;/a&gt; with your account
&lt;/li&gt;
&lt;li&gt;In the side panel, open API Key and create a key
&lt;/li&gt;
&lt;li&gt;In the n8n workflow, in the &lt;strong&gt;Transcribe Recording&lt;/strong&gt; node, configure OpenAI credentials
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/GNPiPK8XUPg"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  4. WhatsApp Business API 📲
&lt;/h2&gt;

&lt;p&gt;To send and receive voice and text messages from WhatsApp, you need to create an app in Meta Developer and configure it to get credentials for n8n.  &lt;/p&gt;

&lt;p&gt;Steps:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create an app in the &lt;a href="https://developers.facebook.com/" rel="noopener noreferrer"&gt;Meta Developers&lt;/a&gt; portal
&lt;/li&gt;
&lt;li&gt;Add the use case &lt;strong&gt;Connect with customers through WhatsApp&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Confirm app creation
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/5TU2F_jFPY0"&gt;
  &lt;/iframe&gt;
 &lt;/p&gt;
&lt;h3&gt;
  
  
  Send messages to WhatsApp 📤
&lt;/h3&gt;

&lt;p&gt;To enable sending messages from n8n, you need authentication credentials. Steps:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In &lt;a href="https://developers.facebook.com/" rel="noopener noreferrer"&gt;Meta Developer&lt;/a&gt;, open your app and go to the WhatsApp configuration. Copy the &lt;strong&gt;WhatsApp Business Account ID&lt;/strong&gt;  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;a href="https://business.facebook.com/" rel="noopener noreferrer"&gt;Meta Business&lt;/a&gt;, go to system users. Select or create a user  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Assign the Meta Developer app to that system user  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Generate an access token. Set permissions to &lt;code&gt;whatsapp_business_messaging&lt;/code&gt;  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In n8n workflow, in the &lt;strong&gt;Send Message (WhatsApp Business Cloud)&lt;/strong&gt; node, create WhatsApp credentials using values from steps 1 and 4. Test the connection  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/qe6a7kvbYjc"&gt;
  &lt;/iframe&gt;
 &lt;/p&gt;
&lt;h3&gt;
  
  
  Receive messages from WhatsApp 📥
&lt;/h3&gt;

&lt;p&gt;We will use WhatsApp test numbers to receive messages. For real numbers, follow extra &lt;a href="https://docs.omnileads.net/configuracion-del-canal-de-whatsapp/integracion-con-meta/dar-de-alta-una-cuenta-de-whatsapp-business-en-meta?utm_source=chatgpt.com#id-2.-verificacion-del-negocio" rel="noopener noreferrer"&gt;steps&lt;/a&gt;.  &lt;/p&gt;

&lt;p&gt;Each message triggers a Webhook in n8n. Steps:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In &lt;a href="https://developers.facebook.com/" rel="noopener noreferrer"&gt;Meta Developer&lt;/a&gt;, go to app settings and get &lt;strong&gt;App ID&lt;/strong&gt; and &lt;strong&gt;App Secret&lt;/strong&gt;  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In n8n workflow, in &lt;strong&gt;WhatsApp Business on Message&lt;/strong&gt; node, create OAuth credentials with App ID and App Secret. Test connection  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Publish the n8n workflow so it is available online  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Copy the &lt;strong&gt;Production POST URL&lt;/strong&gt; from the node (this is your webhook endpoint)  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;In &lt;a href="https://developers.facebook.com/" rel="noopener noreferrer"&gt;Meta Developer&lt;/a&gt;, set this URL in the WhatsApp configuration with a verification token. Test connection  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/j05R7taK6d4"&gt;
  &lt;/iframe&gt;
 &lt;/p&gt;
&lt;h2&gt;
  
  
  5. Test the chatbot 🤖
&lt;/h2&gt;

&lt;p&gt;Use WhatsApp test phone numbers to run the chatbot workflow. Steps:  &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;In Meta Developer, go to WhatsApp API settings and copy the test number  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Send a message from your WhatsApp to that number  &lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2F153bxvr7opmnsz73vmyp.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%2F153bxvr7opmnsz73vmyp.png" alt=" " width="800" height="266"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div&gt;
    &lt;iframe src="https://www.youtube.com/embed/33L8FaBnkL8"&gt;
    &lt;/iframe&gt;
  &lt;/div&gt;


&lt;h1&gt;
  
  
  Costs 💰
&lt;/h1&gt;

&lt;h2&gt;
  
  
  OpenAI API 🤖
&lt;/h2&gt;

&lt;p&gt;The cost of OpenAI API depends on:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Model used
&lt;/li&gt;
&lt;li&gt;Number of tokens
&lt;/li&gt;
&lt;li&gt;Input vs output usage
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Output is usually 3–6 times more expensive than input.  &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Input ($/1M tokens)&lt;/th&gt;
&lt;th&gt;Output ($/1M tokens)&lt;/th&gt;
&lt;th&gt;Context&lt;/th&gt;
&lt;th&gt;Recommended use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4&lt;/td&gt;
&lt;td&gt;$2.50&lt;/td&gt;
&lt;td&gt;$15.00&lt;/td&gt;
&lt;td&gt;~1M tokens&lt;/td&gt;
&lt;td&gt;High complexity, agents&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 mini&lt;/td&gt;
&lt;td&gt;$0.75&lt;/td&gt;
&lt;td&gt;$4.50&lt;/td&gt;
&lt;td&gt;400K tokens&lt;/td&gt;
&lt;td&gt;Apps, SaaS, chatbots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 nano&lt;/td&gt;
&lt;td&gt;$0.20&lt;/td&gt;
&lt;td&gt;$1.25&lt;/td&gt;
&lt;td&gt;~400K tokens&lt;/td&gt;
&lt;td&gt;Classification, extraction&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Monthly estimate 📊
&lt;/h3&gt;

&lt;p&gt;WhatsApp conversation (1–5 minutes):  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Messages per conversation: 6–12
&lt;/li&gt;
&lt;li&gt;Words per message: 8–15
&lt;/li&gt;
&lt;li&gt;Total words: ~120
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conversion:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 token ≈ 0.75 words
&lt;/li&gt;
&lt;li&gt;120 words ≈ 160 tokens
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;User input&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Model output&lt;/td&gt;
&lt;td&gt;80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Total&lt;/td&gt;
&lt;td&gt;160&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Monthly scenario 📅
&lt;/h3&gt;

&lt;p&gt;Example: 10,000 conversations/month  &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model&lt;/th&gt;
&lt;th&gt;Monthly cost&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4&lt;/td&gt;
&lt;td&gt;$14 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 mini&lt;/td&gt;
&lt;td&gt;$4.2 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 nano&lt;/td&gt;
&lt;td&gt;$0.4 USD&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Meta API 📱
&lt;/h2&gt;

&lt;p&gt;WhatsApp Business API uses a pricing model based on message categories:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Service
&lt;/li&gt;
&lt;li&gt;Utility
&lt;/li&gt;
&lt;li&gt;Authentication
&lt;/li&gt;
&lt;li&gt;Marketing
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Service messages (user starts the chat) are free within a 24-hour window.  &lt;/p&gt;

&lt;h3&gt;
  
  
  Monthly estimate 📈
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;600 service messages → $0
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Total Meta cost 💵: $0/month&lt;/strong&gt;  &lt;/p&gt;

&lt;h2&gt;
  
  
  n8n
&lt;/h2&gt;

&lt;p&gt;n8n cost depends on infrastructure and number of workflow executions (conversations). Below table shows the comparation between Self-hosted using AWS cloud services and Cloud Starter: &lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Self-hosted (AWS)&lt;/th&gt;
&lt;th&gt;Cloud Starter&lt;/th&gt;
&lt;th&gt;Cloud Pro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Base cost&lt;/td&gt;
&lt;td&gt;Low (infra + ops)&lt;/td&gt;
&lt;td&gt;Medium (~€20–€30/mo)&lt;/td&gt;
&lt;td&gt;High (~€50–€100+/mo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Infrastructure&lt;/td&gt;
&lt;td&gt;Your responsibility&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;td&gt;Included&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Executions&lt;/td&gt;
&lt;td&gt;Unlimited (depends infra)&lt;/td&gt;
&lt;td&gt;Limited (~5k–10k/mo)&lt;/td&gt;
&lt;td&gt;Higher (~20k–50k+/mo)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scalability&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Auto (limited)&lt;/td&gt;
&lt;td&gt;Auto (better)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Security&lt;/td&gt;
&lt;td&gt;Full control&lt;/td&gt;
&lt;td&gt;Managed by n8n&lt;/td&gt;
&lt;td&gt;Managed by n8n&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Concurrency&lt;/td&gt;
&lt;td&gt;Depends on resources&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Higher&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Integrations&lt;/td&gt;
&lt;td&gt;All&lt;/td&gt;
&lt;td&gt;All&lt;/td&gt;
&lt;td&gt;All&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Maintenance&lt;/td&gt;
&lt;td&gt;High (needs DevOps)&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Multi-user&lt;/td&gt;
&lt;td&gt;Manual setup&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Full (roles, teams)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>n8n</category>
      <category>aws</category>
      <category>whatsapp</category>
      <category>openai</category>
    </item>
    <item>
      <title>Cómo crear un chatbot de WhatsApp con n8n, aws y OpenAI</title>
      <dc:creator>Jose Luis</dc:creator>
      <pubDate>Tue, 31 Mar 2026 20:27:48 +0000</pubDate>
      <link>https://forem.com/joseluissr/como-crear-un-chatbot-de-whatsapp-con-n8n-aws-y-openai-1hm5</link>
      <guid>https://forem.com/joseluissr/como-crear-un-chatbot-de-whatsapp-con-n8n-aws-y-openai-1hm5</guid>
      <description>&lt;p&gt;Si quieres crear tu propio chatbot de WhatsApp para recibir mensajes de texto y voz, procesarlos con IA y responder automáticamente, esta guía te muestra una forma práctica de hacerlo con &lt;strong&gt;n8n&lt;/strong&gt; + &lt;strong&gt;OpenAI&lt;/strong&gt; + &lt;strong&gt;Meta&lt;/strong&gt; + &lt;strong&gt;AWS&lt;/strong&gt;.&lt;br&gt;
&lt;br&gt;&lt;/p&gt;
&lt;h1&gt;
  
  
  🧠 ¿Qué vas a aprender?
&lt;/h1&gt;

&lt;p&gt;En este post vas a ver cómo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Conectar los servicios de IA de OpenAI con n8n&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Conectar los servicios de WhatsApp Business Cloud con n8n&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Recibir mensajes de texto, voz y responder automáticamente desde un workflow de n8n.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Estimar costos básicos de operación&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;
  
  
  🛠️ Implementación paso a paso
&lt;/h1&gt;
&lt;h2&gt;
  
  
  1. Prerrequisitos ✅
&lt;/h2&gt;

&lt;p&gt;Antes de empezar, necesitas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Una cuenta de &lt;a href="https://platform.openai.com/home" rel="noopener noreferrer"&gt;OpenAI&lt;/a&gt; con saldo&lt;/li&gt;
&lt;li&gt;Una cuenta de &lt;a href="https://developers.facebook.com/" rel="noopener noreferrer"&gt;Meta Developer&lt;/a&gt;. Puedes usar tu cuenta personal de Facebook.&lt;/li&gt;
&lt;li&gt;Un dominio para publicar n8n con HTTPS&lt;/li&gt;
&lt;li&gt;Acceso a n8n utilizando la instalación &lt;a href="https://dev.to/aws-builders/como-instalar-tu-propia-instancia-de-n8n-con-aws-1neb"&gt;self-hosted&lt;/a&gt; o &lt;a href="https://n8n.io/" rel="noopener noreferrer"&gt;servicio en la nube&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Descargar el repositorio &lt;a href="https://github.com/JoseLuisSR/whatsapp-chatbot" rel="noopener noreferrer"&gt;whatsapp-chatbot&lt;/a&gt; para la instalación y configuración del chatbot.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  2. Importa chatbot workflow 💬
&lt;/h2&gt;

&lt;p&gt;Importar el flujo de proceso (workflow) que se encuentra en la carpeta n8n del repositorio &lt;a href="https://github.com/JoseLuisSR/whatsapp-chatbot" rel="noopener noreferrer"&gt;whatsapp-chatbot&lt;/a&gt;. Copia y pega el contenido del archivo &lt;strong&gt;whatsapp-chatbot.json&lt;/strong&gt; en n8n. Este proceso permite: &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Recibir mensajes de texto o voz desde WhatsApp&lt;/li&gt;
&lt;li&gt;Identificar si el contenido es audio&lt;/li&gt;
&lt;li&gt;Descargar el audio y transcribirlo&lt;/li&gt;
&lt;li&gt;Ejecutar modelo de LLM de OpenAI&lt;/li&gt;
&lt;li&gt;Envíar la respuesta nuevamente a WhatsApp &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%2Fjba3f29mgjnz7w4qwnbw.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%2Fjba3f29mgjnz7w4qwnbw.png" alt=" " width="800" height="279"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  3. Configurar OpenAI en n8n 🧠
&lt;/h2&gt;

&lt;p&gt;Para ejecutar los modelos Large Language Model (LLM) de OpenAI en n8n se necesita una API Key para autenticar las solicitudes realizadas desde n8n. Los pasos son:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ingresar a &lt;a href="https://platform.openai.com/login" rel="noopener noreferrer"&gt;Platform OpenAPI&lt;/a&gt; con tu cuenta&lt;/li&gt;
&lt;li&gt;En el panel lateral ingresar a API Key para crear la llave&lt;/li&gt;
&lt;li&gt;En el flujo de proceso de n8n, con el nodo de Transcribe Recording, configurar las credenciales OpenAI account.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/GNPiPK8XUPg"&gt;
  &lt;/iframe&gt;
 &lt;/p&gt;
&lt;h2&gt;
  
  
  4. WhatsApp Business API 📲
&lt;/h2&gt;

&lt;p&gt;Para recibir y enviar mensajes de voz y texto desde WhatsApp se debe crear una aplicación en META Developer y configurarla para obtener las credenciales necesarias que permitan la conexión desde n8n. Los pasos son:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Crear una aplicación en el portal &lt;a href="https://developers.facebook.com/" rel="noopener noreferrer"&gt;META Developers&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Añadir caso de uso Connect with customers through WhatsApp.&lt;/li&gt;
&lt;li&gt;Confirmar la creación de la aplicación.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/5TU2F_jFPY0"&gt;
  &lt;/iframe&gt;
 &lt;/p&gt;
&lt;h3&gt;
  
  
  Enviar mensajes hacia WhastApp 📤
&lt;/h3&gt;

&lt;p&gt;Para habilitar el envío de mensajes a WhatsApp desde n8n se requieren credenciales de autenticación para que WhatsApp acepte las solicitudes realizadas desde n8n. Los pasos son:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;En &lt;a href="https://developers.facebook.com/" rel="noopener noreferrer"&gt;Meta Developer&lt;/a&gt;, ingresar a la personalización del caso de uso de  Connect with customers through WhatsApp de la aplicación, en la sección de de configuración de la API, copiar Identificador de la cuenta de WhatsApp Business&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;En &lt;a href="https://business.facebook.com/" rel="noopener noreferrer"&gt;META Business&lt;/a&gt;, con el portafolio empresarial usado en la creación de la aplicación, opción usuario del sistema, seleccionar un usuario existente o crear uno nuevo.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Asignar la aplicación de Meta Developer como activo al usuario del sistema.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Generar un identificador para la aplicación seleccionando una vigencia del identificador y la asignación de permisos que deben ser &lt;strong&gt;whatsapp_business_messaging&lt;/strong&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;En el flujo de proceso de n8n, con el nodo de Send Message de WhatsApp Business Cloud, crear las credenciales de WhatsApp account, copiando los valores de los puntos 1 y 4, y probar la conexión.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/qe6a7kvbYjc"&gt;
  &lt;/iframe&gt;
 &lt;/p&gt;
&lt;h3&gt;
  
  
  Recibir mensajes desde WhatsApp 📥
&lt;/h3&gt;

&lt;p&gt;Vamos a usar los números de pruebas de WhatsApp para recibir los mensajes, para usar números propios seguir los siguientes &lt;a href="https://docs.omnileads.net/configuracion-del-canal-de-whatsapp/integracion-con-meta/dar-de-alta-una-cuenta-de-whatsapp-business-en-meta?utm_source=chatgpt.com#id-2.-verificacion-del-negocio" rel="noopener noreferrer"&gt;pasos&lt;/a&gt;. Cada mensaje recibido desde el número configurado en la aplicación ejecuta un WebHook (Servicio Web de n8n) para notificar la recepción del mensaje y el contenido del mismo. Los pasos para la obtención de la credenciales y la configuración del WebHook son:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;En &lt;a href="https://developers.facebook.com/" rel="noopener noreferrer"&gt;Meta Developer&lt;/a&gt;, ingresar a la información Básica de la Aplicación en la sección de Configuración para consultar el App ID y App Secret.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;En el flujo de proceso de n8n, con el nodo de WhatsApp Business on Message , crear credenciales WhatsApp OAuth account, con los valores del App ID y App Secret, posteriormente probar la conexión.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Publicar el flujo de proceso de n8n, para que estén expuestos sus servicios en internet.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;En el flujo de proceso de n8n, con el nodo de WhatsApp Business on Message de n8n, copiar la URL Post de Producción que es el Servicio Web expuesto por tu instalación de n8n para ser invocado cada vez que se recibe un mensaje en WhatsApp.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;En &lt;a href="https://developers.facebook.com/" rel="noopener noreferrer"&gt;Meta Developer&lt;/a&gt;, ingresar a la personalización del caso de uso de  Connect with customers through WhatsApp de la aplicación, en la sección de configuración, e ingresa la URL del punto 4 con un identificador de verificación. Posterior probar la conexión.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/j05R7taK6d4"&gt;
  &lt;/iframe&gt;
 &lt;/p&gt;
&lt;h2&gt;
  
  
  5. Probar el chatbot 🤖
&lt;/h2&gt;

&lt;p&gt;Utilizando los números de celular de WhatsApp de pruebas podemos ejecutar el flujo de proceso de WhatsApp Chat Bot. Los pasos son:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;En META Developer, ingresar a personalizar el Casos Uso WhatsApp de la aplicación,  en la opción Configuración de la API, copiar el número de prueba.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ingresar a tu WhatsApp y enviar mensaje al número del punto 1.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&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%2F153bxvr7opmnsz73vmyp.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%2F153bxvr7opmnsz73vmyp.png" alt=" " width="800" height="266"&gt;&lt;/a&gt;&lt;/p&gt;


&lt;div&gt;
    &lt;iframe src="https://www.youtube.com/embed/33L8FaBnkL8"&gt;
    &lt;/iframe&gt;
  &lt;/div&gt;


&lt;h1&gt;
  
  
  Costos 💰
&lt;/h1&gt;

&lt;h2&gt;
  
  
  OpenAI API 🤖
&lt;/h2&gt;

&lt;p&gt;El costo de usar la API de OpenAI depende principalmente de tres variables: el modelo elegido, la cantidad de tokens procesados y el tipo de uso (entrada y salida). El costo se calcula por cada millón de tokens (texto procesado), donde el output (respuesta del modelo) suele ser entre 3 y 6 veces más caro que el input (texto enviado).&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modelo&lt;/th&gt;
&lt;th&gt;Input ($/1M tokens)&lt;/th&gt;
&lt;th&gt;Output ($/1M tokens)&lt;/th&gt;
&lt;th&gt;Contexto&lt;/th&gt;
&lt;th&gt;Uso recomendado&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4&lt;/td&gt;
&lt;td&gt;$2.50&lt;/td&gt;
&lt;td&gt;$15.00&lt;/td&gt;
&lt;td&gt;~1M tokens&lt;/td&gt;
&lt;td&gt;Alta complejidad, agentes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 mini&lt;/td&gt;
&lt;td&gt;$0.75&lt;/td&gt;
&lt;td&gt;$4.50&lt;/td&gt;
&lt;td&gt;400K tokens&lt;/td&gt;
&lt;td&gt;Apps, SaaS, chatbots&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 nano&lt;/td&gt;
&lt;td&gt;$0.20&lt;/td&gt;
&lt;td&gt;$1.25&lt;/td&gt;
&lt;td&gt;~400K tokens&lt;/td&gt;
&lt;td&gt;Diseñado para: clasificación extracción pipelines masivos&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Cálculo mensual estimado 📊:&lt;/p&gt;

&lt;p&gt;Conversación en WhatsApp de 1–5 min&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Mensajes por conversación: 6–12
&lt;/li&gt;
&lt;li&gt;Palabras por mensaje: 8–15
&lt;/li&gt;
&lt;li&gt;Promedio total palabras: ≈ 120 palabras&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Conversión estándar:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 token ≈ 0.75 palabras
&lt;/li&gt;
&lt;li&gt;120 palabras ≈ 160 tokens&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Tokens&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Input usuario&lt;/td&gt;
&lt;td&gt;80 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Output modelo&lt;/td&gt;
&lt;td&gt;80 tokens&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Total&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;160 tokens&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Escenario mensual 📅&lt;/p&gt;

&lt;p&gt;Supón: 10,000 conversaciones / mes&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Modelo&lt;/th&gt;
&lt;th&gt;Costo mensual&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$14 USD&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 mini&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$4.2 USD&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPT-5.4 nano&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0.4 USD&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Meta API 📱
&lt;/h2&gt;

&lt;p&gt;El modelo de costos de WhatsApp Business API funciona principalmente bajo un esquema de mensajes por categoría, donde el cobro depende del tipo de interacción y de quién inicia la conversación. Existen cuatro categorías: servicio, utilidad, autenticación y marketing. Los mensajes de servicio (cuando el cliente escribe primero) son gratuitos y permiten responder libremente dentro de una ventana de 24 horas con texto, audio, imágenes o documentos. &lt;/p&gt;

&lt;p&gt;Cálculo mensual estimado 📈&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;600 mensajes de servicio iniciados por clientes → USD 0
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Total Meta estimado 💵: USD 0/mes&lt;/p&gt;

&lt;h2&gt;
  
  
  n8n
&lt;/h2&gt;

&lt;p&gt;Los costo de n8n dependen del la infraestructura y el número de ejecuciones del flujo del proceso, es decir en el número de conversaciones que se reciban en el chatbot. La comparación de opciones de uso de n8n con infraestructura en aws o de &lt;a href="https://n8n.io/pricing/" rel="noopener noreferrer"&gt;n8n.io&lt;/a&gt; es:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Variable&lt;/th&gt;
&lt;th&gt;Self-hosted (AWS)&lt;/th&gt;
&lt;th&gt;Cloud Starter&lt;/th&gt;
&lt;th&gt;Cloud Pro&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;💰 Costo base&lt;/td&gt;
&lt;td&gt;Bajo (infra + ops)&lt;/td&gt;
&lt;td&gt;Medio (~€20–€30/mes)&lt;/td&gt;
&lt;td&gt;Alto (~€50–€100+/mes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;⚙️ Infraestructura&lt;/td&gt;
&lt;td&gt;Tu responsabilidad (AWS, VPS, etc.)&lt;/td&gt;
&lt;td&gt;Incluida&lt;/td&gt;
&lt;td&gt;Incluida&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔁 Ejecuciones (workflows)&lt;/td&gt;
&lt;td&gt;Ilimitadas (según tu infra)&lt;/td&gt;
&lt;td&gt;Limitadas (~5k–10k/mes)&lt;/td&gt;
&lt;td&gt;Más altas (~20k–50k+/mes)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🚀 Escalabilidad&lt;/td&gt;
&lt;td&gt;Manual&lt;/td&gt;
&lt;td&gt;Automática (limitada)&lt;/td&gt;
&lt;td&gt;Automática (mejor)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔐 Seguridad&lt;/td&gt;
&lt;td&gt;Total control&lt;/td&gt;
&lt;td&gt;Gestionada por n8n&lt;/td&gt;
&lt;td&gt;Gestionada por n8n&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔄 Concurrencia&lt;/td&gt;
&lt;td&gt;Depende de recursos&lt;/td&gt;
&lt;td&gt;Limitada&lt;/td&gt;
&lt;td&gt;Mayor concurrencia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🔌 Integraciones&lt;/td&gt;
&lt;td&gt;Todas&lt;/td&gt;
&lt;td&gt;Todas&lt;/td&gt;
&lt;td&gt;Todas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;🛠️ Mantenimiento&lt;/td&gt;
&lt;td&gt;Alto (requiere DevOps)&lt;/td&gt;
&lt;td&gt;Bajo&lt;/td&gt;
&lt;td&gt;Bajo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;👥 Multiusuario&lt;/td&gt;
&lt;td&gt;Configurable manual&lt;/td&gt;
&lt;td&gt;Limitado&lt;/td&gt;
&lt;td&gt;Completo (roles y equipos)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

</description>
      <category>n8n</category>
      <category>aws</category>
      <category>whatsapp</category>
      <category>openai</category>
    </item>
    <item>
      <title>Cómo instalar tu propia instancia de n8n con AWS</title>
      <dc:creator>Jose Luis</dc:creator>
      <pubDate>Tue, 31 Mar 2026 18:00:03 +0000</pubDate>
      <link>https://forem.com/aws-builders/como-instalar-tu-propia-instancia-de-n8n-con-aws-1neb</link>
      <guid>https://forem.com/aws-builders/como-instalar-tu-propia-instancia-de-n8n-con-aws-1neb</guid>
      <description>&lt;p&gt;En este post vas a instalar y configurar tu propia instancia de n8n con los servicios de infraestructura en la nube de AWS para tener más control sobre la infraestructura, costos y personalización de workflows. &lt;/p&gt;

&lt;p&gt;Utilizar n8n en tu propia infraestructura (self-hosted) es una alternativa para la automatización de flujos de trabajo sin pagar subscripción mensual en los servicios de &lt;a href="https://n8n.io/" rel="noopener noreferrer"&gt;n8n.io&lt;/a&gt; en la nube que gestionan la infraestructura por ti. &lt;br&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  🧠 ¿Qué vas a aprender?
&lt;/h1&gt;

&lt;p&gt;En este post vas a ver cómo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Instalar y configurar n8n con self-hosted&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Estimar costos básicos de operación&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h1&gt;
  
  
  🛠️ Implementación paso a paso
&lt;/h1&gt;

&lt;h2&gt;
  
  
  1. Prerrequisitos ✅
&lt;/h2&gt;

&lt;p&gt;Antes de empezar, necesitas:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Una cuenta activa de &lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;Amazon Web Services (AWS)&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Un dominio para publicar n8n con HTTPS&lt;/li&gt;
&lt;li&gt;Descargar el repositorio &lt;a href="https://github.com/JoseLuisSR/whatsapp-chatbot" rel="noopener noreferrer"&gt;whatsapp-chatbot&lt;/a&gt; para la instalación y configuración de n8n.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. Despliegue de n8n en AWS 🚀
&lt;/h2&gt;

&lt;p&gt;La instalación se automatiza con una plantilla de CloudFormation que aprovisiona:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Instancia de AWS Lightsail&lt;/li&gt;
&lt;li&gt;Permisos de red y comunicaciones&lt;/li&gt;
&lt;li&gt;Dirección IP pública estática&lt;/li&gt;
&lt;li&gt;Script de arranque para instalar docker, n8n, base de datos (postgres), servidor web (nginx), y certbot.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Parámetros la plantilla:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;InstanceName&lt;/strong&gt;: nombre de la instancia&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BlueprintId&lt;/strong&gt;: imagen base, por ejemplo amazon_linux_2023&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;BundleId&lt;/strong&gt;: tipo/tamaño de la instancia&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;AvailabilityZone&lt;/strong&gt;: región y zona de disponibilidad de aws.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;StaticIPName&lt;/strong&gt;: nombre de la IP estática&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DBUser&lt;/strong&gt;: usuario de la base de datos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;DBPassword&lt;/strong&gt;: password de la base de datos&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Domain&lt;/strong&gt;: dominio público para n8n&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Email&lt;/strong&gt;: correo para la generación del certificado HTTPS&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;La ejecución de la plantilla de Cloudformation se puede realizar desde línea de comandos con &lt;strong&gt;AWS CLI&lt;/strong&gt; o por medio de la &lt;strong&gt;consola web de AWS&lt;/strong&gt;. &lt;/p&gt;

&lt;h3&gt;
  
  
  Opción A: despliegue por línea de comandos 💻
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Configurar las accesskey para la conexión de aws cli con tu cuenta de aws. Ver detalles &lt;a href="https://docs.aws.amazon.com/cli/v1/userguide/cli-authentication-user.html#cli-authentication-user-configure-wizard" rel="noopener noreferrer"&gt;aquí&lt;/a&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ubícate en el path donde descargaste el proyecto &lt;a href="https://github.com/JoseLuisSR/whatsapp-chatbot" rel="noopener noreferrer"&gt;whatsapp-chatbot&lt;/a&gt; en la carpeta aws.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ejecutar el siguiente comando, modificando los valores de los parámetros Domain y Email que correspondan al dominio y correo electrónico de tu propiedad:&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;aws cloudformation deploy &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--stack-name&lt;/span&gt; n8n &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--template-file&lt;/span&gt; template.yaml &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--region&lt;/span&gt; us-east-1 &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;--parameter-overrides&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;InstanceName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;n8n-instance &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;AvailabilityZone&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;us-east-1a &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;BlueprintId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;amazon_linux_2023 &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;BundleId&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;small_3_0 &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;Domain&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;Domain&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;DBUser&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;DBPassword&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;admin &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;Email&lt;/span&gt;&lt;span class="o"&gt;={&lt;/span&gt;email&lt;span class="o"&gt;}&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
        &lt;span class="nv"&gt;StaticIpName&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;n8n-ip-address
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Opción B: despliegue desde la consola web 🌐
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Ingresar a la &lt;a href="https://aws.amazon.com/" rel="noopener noreferrer"&gt;consola web de AWS&lt;br&gt;
&lt;/a&gt; con tu cuenta.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Ir al servicio de Cloudformation de tu cuenta de AWS y crear stack con nuevos recursos.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Importar la planilla de Cloudformation (template.yaml) y seguir los pasos del wizard para ingresar el nombre del stack y los valores de los parámetros Domain y Email.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/HslTs7opVJg"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Validación de la instalación
&lt;/h2&gt;

&lt;p&gt;Una vez finalizada la ejecución de la plantilla de Cloudformation, revisa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Que la instancia de Lightsail exista&lt;/li&gt;
&lt;li&gt;Que el grupo de acceso permita SSH, HTTP y HTTPS&lt;/li&gt;
&lt;li&gt;Que la IP estática esté asignada&lt;/li&gt;
&lt;li&gt;Que puedas entrar por SSH&lt;/li&gt;
&lt;li&gt;Que los contenedores de n8n y postgres estén activos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;También conviene restringir el acceso SSH para que solo esté permitido desde tu IP.&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/29utgb4wE7E"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Configuración de HTTPS 🔐
&lt;/h2&gt;

&lt;p&gt;Este paso es obligatorio para habilitar la conexión de n8n con plataformas como &lt;strong&gt;WhatsApp&lt;/strong&gt;, &lt;strong&gt;Google&lt;/strong&gt;, etc que requieren una conexión segura utilizando SSL/TLS. Los pasos son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Crear la zona DNS&lt;/li&gt;
&lt;li&gt;Asociar el dominio a la IP estática de Lightsail&lt;/li&gt;
&lt;li&gt;Generar el certificado con Certbot&lt;/li&gt;
&lt;li&gt;Validar que n8n abra por HTTPS&lt;/li&gt;
&lt;li&gt;Registrarte en la interfaz de n8n&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Accede a la instancia de Lightsail por medio de SSH y ejecuta el siguiente comando de Certbot para la generación de certificado SSL/TLS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;sudo &lt;/span&gt;certbot &lt;span class="nt"&gt;--nginx&lt;/span&gt; &lt;span class="nt"&gt;-d&lt;/span&gt; n8n.tu-dominio.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--email&lt;/span&gt; tu-correo@dominio.com &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--agree-tos&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--no-eff-email&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--redirect&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/F5HlGKqmIsA"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h1&gt;
  
  
  Licenciamiento 📄
&lt;/h1&gt;

&lt;p&gt;n8n se distribuye bajo la licencia Fair Code (Sustainable Use License). Esta licencia permite usar el software libremente, modificarlo y ejecutarlo en instalaciones propias (self-hosted) sin costo, tanto para uso personal como empresarial. Está permitido usarlo dentro de productos o servicios internos de una empresa, siempre que n8n no sea el producto principal ofrecido al cliente.&lt;/p&gt;

&lt;p&gt;No se puede revender n8n como plataforma de automatización hospedada ni crear un negocio cuyo producto principal sea una instancia gestionada de n8n. Se restringe la reventa o provisión pública del software como servicio.&lt;/p&gt;

&lt;h1&gt;
  
  
  Costos 💰
&lt;/h1&gt;

&lt;h2&gt;
  
  
  AWS Lightsail (Self Hosting) ☁️
&lt;/h2&gt;

&lt;p&gt;En AWS Lightsail, la instancia mínima razonable para operar n8n es la equivalente a 2 GB RAM / 2 vCPU / 60 GB SSD, que permite ejecutar workflows básicos con estabilidad. El precio por mes de este tipo y tamaño de instancia es:&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%2Femc4vbv8ixmrz5crscuv.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%2Femc4vbv8ixmrz5crscuv.png" alt=" " width="730" height="332"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Conclusiones
&lt;/h1&gt;

&lt;p&gt;⚖️ Puedes usar n8n libremente en proyectos internos o empresariales, pero no puedes revenderlo como servicio principal. Esto limita modelos de negocio tipo SaaS basados en n8n.&lt;/p&gt;

&lt;p&gt;💰 n8n es gratis cuando usas tu propia infraestructura (self-hosted), pero tu infraestructura con AWS tiene costos mensuales. &lt;/p&gt;

&lt;p&gt;🚀 El aprovisionamiento de la infraestructura e instalación de n8n está automatizada con el servicio CloudFormation de infraestructura como código de AWS. Puedes usar n8n a distancia de clicks.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>n8n</category>
      <category>docker</category>
      <category>nginx</category>
    </item>
    <item>
      <title>Data Streaming Architecture</title>
      <dc:creator>Jose Luis</dc:creator>
      <pubDate>Wed, 27 Mar 2024 03:19:57 +0000</pubDate>
      <link>https://forem.com/aws-builders/data-streaming-architecture-32j0</link>
      <guid>https://forem.com/aws-builders/data-streaming-architecture-32j0</guid>
      <description>&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%2Fdg5n6gag6062nk91s836.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%2Fdg5n6gag6062nk91s836.png" alt="Data Streaming Pipeline" width="800" height="297"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In a previous post, we studied the&lt;a href="https://dev.to/aws-builders/data-streaming-architecture-basics-52d7"&gt; data streaming architecture basics&lt;/a&gt;, now we are going to set up AWS services to enable speed layer capabilities to ingest, aggregate, and store the streaming data. Each AWS service belongs to one or many stages of the data pipeline depending on their capabilities.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Kinesis Data Stream
&lt;/h2&gt;

&lt;p&gt;Kinesis Data Stream is a serverless service with high throughput to ingest fast and continuous streaming data in real-time, it uses a shard to receive and store temporarily the data record in a unique sequence. A shard can support up to 1,000 RPS or 1 MB/sec writes and 2,000 RPS or 2 MB/sec read operations. The number of shards depends on the amount of data ingested and the level of throughput needed, more details about the capacity are &lt;a href="https://docs.aws.amazon.com/streams/latest/dev/how-do-i-size-a-stream.html" rel="noopener noreferrer"&gt;here&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Go to Kinesis services and create a data stream using the on-demand capacity.  &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%2F9rldtmauo9wkgny0rah7.gif" 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%2F9rldtmauo9wkgny0rah7.gif" alt="Kinesis Data Stream" width="480" height="260"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  awsmeter JMeter Plugin
&lt;/h2&gt;

&lt;p&gt;To produce streaming data we are going to use &lt;a href="https://github.com/JoseLuisSR/awsmeter" rel="noopener noreferrer"&gt;awsmeter&lt;/a&gt;, it is a JMeter plugin that uses AWS SDK + KPL (Kinesis Producer Library) to publish messaging on shards. You need an AWS access key and a data stream name. Find more details &lt;a href="https://github.com/JoseLuisSR/awsmeter/tree/main/src/main/java/org/apache/jmeter/protocol/aws/kinesis" rel="noopener noreferrer"&gt;here&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%2Fcy9ldph4pna7h6a4c7zl.gif" 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%2Fcy9ldph4pna7h6a4c7zl.gif" alt="awsmeter" width="480" height="255"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The structure of this example message is using &lt;a href="https://github.com/cloudevents/spec/blob/main/cloudevents/spec.md" rel="noopener noreferrer"&gt;CloudEvents &lt;/a&gt;specification:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
   &lt;/span&gt;&lt;span class="nl"&gt;"specversion"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"kinesis-data-stream"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://github.com/JoseLuisSR/awsmeter"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"subject"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"event-created"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"id"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${eventId}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"time"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"${time}"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"datacontentcoding"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text/xml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"datacontenttype"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"text/xml"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"data"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"&amp;lt;much wow=&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;xml&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;/&amp;gt;"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;h2&gt;
  
  
  S3
&lt;/h2&gt;

&lt;p&gt;Use S3 to store streaming data and query the data with S3 Select. It is integrated natively with Kinesis Firehose and is a fully managed and regional service. Create a S3 bucket.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  Kinesis Firehose
&lt;/h2&gt;

&lt;p&gt;It is a streaming ETL solution to capture, transform, and load stream data into AWS data stores. Kinesis Firehose is a serverless service, fully managed by AWS, and automatically scales to support the throughput you need. To create a delivery stream you choose the source and destination.&lt;/p&gt;

&lt;p&gt;For source choose Kinesis Data Stream, in the source setting section search the kinesis data stream you created.&lt;/p&gt;

&lt;p&gt;For Destination choose S3, in the destination setting section search S3 bucket you 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%2Fp0h524xewkelydtv29hh.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%2Fp0h524xewkelydtv29hh.png" alt="Source &amp;amp; Destination" width="719" height="243"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enable Dynamic partitioning for efficient query optimization.&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%2F2ye3vdzemned12l1kcfm.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%2F2ye3vdzemned12l1kcfm.png" alt="Dynamic partitioning" width="685" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Enable Inline parsing for JSON to use the Kinesis Data Firehose built-in support mechanism, a jq parser, for extracting the keys from messages for partitioning data records that are in JSON format. Specify the key name and JQ expression as 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%2F1shu0dwx6tcbh7culbmy.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%2F1shu0dwx6tcbh7culbmy.png" alt="Inline parsing" width="698" height="487"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the S3 bucket prefix section, choose &lt;strong&gt;Apply dynamic partitioning keys&lt;/strong&gt; to generate partition key expressions. To enable Hive-compatible style partitioning by type and source, update the S3 bucket prefix default value with type= and source=.&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%2Ftwn9dwk9k2qymdni94ef.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%2Ftwn9dwk9k2qymdni94ef.png" alt="Dynamic partitioning keys" width="693" height="234"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the S3 bucket error output prefix box, enter kdferror/. It will contain all the records that the Kinesis Data Firehose is not able to deliver to the specified S3 destination.&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%2F4ova97wd09ppr2jz5e0x.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%2F4ova97wd09ppr2jz5e0x.png" alt="S3 Bucket Error" width="687" height="129"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the delivery stream setting section, expand the Buffer hints, compression, and encryption section.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;For Buffer size, enter 64.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;For Buffer interval, enter 60.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Kinesis Data Firehose buffers incoming streaming data to a certain size and for a certain period before delivering it to the specified destinations (S3). For a delivery stream where data partitioning is enabled, the buffer size ranges from 64 to 128MB, with the default set to 128MB, and the buffer interval ranges from 60 seconds to 900 seconds.&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%2Fypc85nubffa3srxml1wt.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%2Fypc85nubffa3srxml1wt.png" alt="Buffer incoming streaming" width="699" height="447"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;To Kinesis Firehose can access S3 need to use IAM roles with the permissions needed, on the advance settings choose existing IAM role&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%2F6vhy7hyf7836cb3tigm3.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%2F6vhy7hyf7836cb3tigm3.png" alt="IAM Role" width="685" height="145"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Review the stream configuration, and then choose Create delivery stream&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  S3 Select
&lt;/h2&gt;

&lt;p&gt;Check your S3 Bucket to see if the data is stored on the folders of type and subject that are the dynamic partitions we configured. Choose one file, go to actions, and select the &lt;strong&gt;Query with S3 Select&lt;/strong&gt; option.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3dzdHk5Mm9qcnNwcmc2YWhjOWV1Mmc1c29obHZ6YjZ2b3FheDl5aCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3wcnExjGS1egI137r0/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/v1.Y2lkPTc5MGI3NjExZ3dzdHk5Mm9qcnNwcmc2YWhjOWV1Mmc1c29obHZ6YjZ2b3FheDl5aCZlcD12MV9pbnRlcm5hbF9naWZfYnlfaWQmY3Q9Zw/3wcnExjGS1egI137r0/giphy.gif" alt="S3 Select" width="480" height="260"&gt;&lt;/a&gt;&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

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

&lt;p&gt;In this post you have provisioned and set up aws services to enable a data streaming architecture solution, you have done the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Created Kinesis Data Stream.&lt;/li&gt;
&lt;li&gt;
Set up awsmeter to generate streaming messages.&lt;/li&gt;
&lt;li&gt;
Created a Kinesis Data Firehose stream and connected the Kinesis data stream to it.&lt;/li&gt;
&lt;li&gt;
Configured dynamic partitioning on the Kinesis Data Firehose delivery stream. &lt;/li&gt;
&lt;li&gt;
Delivered data to Amazon S3.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>bigdata</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Data Streaming Architecture Basics</title>
      <dc:creator>Jose Luis</dc:creator>
      <pubDate>Wed, 27 Mar 2024 03:19:24 +0000</pubDate>
      <link>https://forem.com/aws-builders/data-streaming-architecture-basics-52d7</link>
      <guid>https://forem.com/aws-builders/data-streaming-architecture-basics-52d7</guid>
      <description>&lt;p&gt;In this post, we will understand the &lt;strong&gt;6'V of Big Data&lt;/strong&gt;, review the &lt;strong&gt;Data Pipeline&lt;/strong&gt; and &lt;strong&gt;Lambda architecture&lt;/strong&gt; to understand the complexity of getting, storing, and processing the data, and then set up AWS services to ingest and store streaming data to perform real-time analytics. Let's start.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;h2&gt;
  
  
  6'V of Big Data
&lt;/h2&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%2Fxbfvjgeyybw3hbwliv0a.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%2Fxbfvjgeyybw3hbwliv0a.png" alt="6'V of Big Data" width="800" height="190"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The amount of data, the speed of produced data, and the diversity of data are common in the systems today, data is everywhere and we need to choose the right data sources to get the most accurate and valuable data. The 6V’s of Big Data shows us the challenges we need to face when creating Data Streaming Architecture with cost optimization and performance efficiency:&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Volume&lt;/strong&gt;: Gigabytes, Terabytes, Petabytes, and more are the amount of data we need to receive, store, and process.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Velocity&lt;/strong&gt;: The data is produced all day, Eg &lt;a href="https://cloudincome.com/youtube-statistics/" rel="noopener noreferrer"&gt;150K &lt;/a&gt;videos are uploaded to YouTube every minute, and &lt;a href="https://blog.hootsuite.com/instagram-statistics/" rel="noopener noreferrer"&gt;66K &lt;/a&gt;photos are shared on Instagram every minute. The data is coming at scheduled hours (batch), real-time (streaming), or both.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Variety&lt;/strong&gt;: The data are files, fields, text, audio, video, and images. The data is structured, semi-structured, and unstructured.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Veracity&lt;/strong&gt;: With many data sources the data could be incomplete, outdated, repeated, or not real, the quality of the data is essential to get the right insights.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Variability&lt;/strong&gt;: The data could change, depending on the seasons, geopolitics events, or just add a new data source. You need to validate how often the structure or shape of your data changes and the side effect is the meaning the data changes also.&lt;br&gt;&lt;br&gt;
  &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Value&lt;/strong&gt;: The main purpose is to give value, describing what is happening, what could happen, and the opportunities identified. The data insights enable organizations to become data-driven.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Data Pipeline
&lt;/h2&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%2F1nvrsnvj90c11efy13uc.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%2F1nvrsnvj90c11efy13uc.png" alt="Data Pipeline" width="800" height="246"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is the building block for analytics solutions, it defines the layers and capabilities needed to optimize the ingestion, transformation, and storage of your analytics system. The layers are:&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Data sources:&lt;/strong&gt; Include databases, system logs, IoT signals, tape disks, and other kinds of storage systems with data related to your business. The data is structured, semi-structured, and unstructured.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Ingestion&lt;/strong&gt;, move the data from external data sources to another location using tools like ETL, SDK, or middlewares, the tools depend on data type and workload requirements.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Storage&lt;/strong&gt;, the data is stored temporarily or persistently in databases or object storage. The data is stored with format, partitioning, and compression for efficient storage and optimized querying.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Processing&lt;/strong&gt;, to get performance efficiency and cost optimization, the data is cataloged for indexing and search, then processed to clean, complete, anonymization and enrich, and finally control access to enable confidentiality and integrity of the data.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Analytics and visualization&lt;/strong&gt; provide descriptive and predictive analytics for discovering patterns and insights in data. This stage provides business decision-makers with graphical representations of analysis, making it easier to see the implications of the data.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Lambda architecture
&lt;/h2&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%2Fl24xybqk8s0o1ln2hiz8.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%2Fl24xybqk8s0o1ln2hiz8.png" alt="Lambda Architecture" width="790" height="341"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is not a lambda function, it is a data-processing architecture designed to handle massive quantities of data coming from batch and real-time streams, and serving the data for user queries. This is a layered architecture to distribute the responsibilities and load to get better latency, throughput, and fault tolerance, the layers are.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Batch&lt;/strong&gt;, all the data sources with historical data or transaction information with restrictions to get data in real-time are in this layer with ETL and execute a map-reduce programming model to filter and sort information and reduce (summarize) the data using a distributed and parallel system.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Speed&lt;/strong&gt;, most recent information like events that occurred, online transactions, and streaming data are in this layer with capabilities to aggregate, partition, and compress the data in near real-time. The data could not be accurate or complete as a batch layer but it is available almost immediately.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Serving&lt;/strong&gt;, the information from batch and speed layers are joined and stored on this layer to enable analytics tools to do predictive and prescriptive analytics executing queries over precomputed views.&lt;br&gt;&lt;br&gt;
&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the next post, we will set up &lt;a href="https://dev.to/aws-builders/data-streaming-architecture-32j0"&gt;Kinesis Data Stream + Kinesis Firehose + S3&lt;/a&gt; to ingest and store streaming data to perform real-time analytics.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>DynamoDB Basics, Part 1</title>
      <dc:creator>Jose Luis</dc:creator>
      <pubDate>Mon, 27 Mar 2023 01:26:48 +0000</pubDate>
      <link>https://forem.com/aws-builders/dynamodb-basics-part-1-4e4i</link>
      <guid>https://forem.com/aws-builders/dynamodb-basics-part-1-4e4i</guid>
      <description>&lt;p&gt;Along my journey to the cloud, I have discovered amazing services, one of them is DynamoDB. It is NoSQL Database and serverless service with capabilities to store information semi-structured or unstructured with high performance, availability, and scalability.&lt;/p&gt;

&lt;p&gt;DynamoDB is an OLTP database that is focused on transaction-oriented tasks, today many of the applications or projects we are working on are to automatize tasks and transactional processing where need CRUD operations over a high volume of data, DynamoDB fits very well for these business cases, and you can use it instead SQL databases. I invite you to read Alex DeBrie's post about &lt;a href="https://www.alexdebrie.com/posts/dynamodb-single-table/" rel="noopener noreferrer"&gt;The What, Why, and When of Single-Table Design with DynamoDB&lt;/a&gt; to know in which cases you can use or not DynamoDB.&lt;/p&gt;

&lt;p&gt;One of the big differences between DynamoDB and traditional SQL database is the number of tables, with one single table of DynamoDB you can handle any data model with entities, relationships (1:N, N:N, etc), and attributes then the queries in a database is different also, DynamoDB is a Key-Value database, to request information you should use a partition key, the partition determines the physical storage where data is. We need to learn a new way to design a data model for DynamoDB but before seeing the methodology we can start with the basics of DynamoDB.&lt;/p&gt;

&lt;p&gt;When we face new technologies, we need to understand the problem solved, capabilities, boundaries, elements, and the reason why were created. I’m going to use some SQL database concepts to explain DynamoDB because there are similar things, and we can learn more easily by linking new knowledge, let’s start.&lt;/p&gt;

&lt;h1&gt;
  
  
  Table
&lt;/h1&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%2F7v1wa8y76xzhzxpo2ne7.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%2F7v1wa8y76xzhzxpo2ne7.png" alt=" " width="800" height="292"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Like an SQL database table, DynamoDB table is to store information. AWS replicates the data of the table in different AZ of the region, you can set up a global table to replicate the information in another AWS region. You can create many DynamoDB tables, but you don't need a table per entity as SQL database does, one single DynamoDB table can handle all the entities and relations in a single table.&lt;/p&gt;

&lt;h1&gt;
  
  
  Primary Key &amp;amp; Attributes
&lt;/h1&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%2Fbqewrm1w1np9lit9j0qb.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%2Fbqewrm1w1np9lit9j0qb.png" alt=" " width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It should be unique and it is the value to identify the record in the table. It could be a single key with the Partition Key (PK) or a composite key with Partition Key + Sort Key (SK). When using a composite primary key you can share the PK in multiple items but the SK should be different in each record. &lt;/p&gt;

&lt;p&gt;An attribute is a data element with type and value to store single or composite information like a list or map with data structures like JSON. DynamoDB is schema-less so each record could have different attributes. There is no limit to the number of attributes in one record but the size of the record cannot be higher than 400KB. The size of the record includes the attribute name and value.&lt;/p&gt;

&lt;h1&gt;
  
  
  Item &amp;amp; Item Collection
&lt;/h1&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%2Fop4665cuia7zn8wlqft1.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%2Fop4665cuia7zn8wlqft1.png" alt=" " width="800" height="268"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is a record with a collection of attributes. It is like a row of SQL database table, but the structure is more flexible because you can have items with different attributes in the same table rather than rows with the same columns in the SQL table. The maximum item size in DynamoDB is 400 KB, which includes both attribute name and attribute value lengths both with binary length.&lt;/p&gt;

&lt;p&gt;All items with the same partition key are part of an item collection. To get items collection is necessary to use the composite primary key and the sort key should be unique. No item collection can exceed 10 GB, so it's possible to run out of space for a particular partition key value. &lt;/p&gt;

&lt;p&gt;In the image we have Customer and Order items, both share the partition key so the Item Collection has both entities.&lt;/p&gt;

&lt;h1&gt;
  
  
  Partition
&lt;/h1&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%2Fj5uoffasszhu4z0m5wyv.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%2Fj5uoffasszhu4z0m5wyv.png" alt=" " width="469" height="239"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DynamoDB stores data in partitions, each partition is like a node in a cluster. DynamoDB uses the partition key value and hash function to choose the partition to write and read the data. A partition is an allocation of storage for a table, backed by solid state drives (SSDs) and automatically replicated across multiple Availability Zones within an AWS Region. Partition management is handled entirely by DynamoDB, you never have to manage partitions yourself. A partition can store up to 10 GB of data.&lt;/p&gt;

&lt;h1&gt;
  
  
  Partition Key
&lt;/h1&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%2Fidg8oypmdp4coodk6zkd.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%2Fidg8oypmdp4coodk6zkd.png" alt=" " width="572" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is an attribute and is used by DynamoDB to store the data in a specific partition and distribute write and read operations load between the partitions. DynamoDB uses a hash function with a partition key value to select the partition. It is a mandatory attribute to create a DynamoDB table and execute write and query operations over the DynamoDB table. &lt;/p&gt;

&lt;p&gt;A good practice is using a partition key with many possible values, for example, the personal identification number is a good choice because each person has his own identification and there are many persons with identifications. Another good practice is to use &lt;strong&gt;PK&lt;/strong&gt; as the partition key attribute name because it is general to all entities going to store in a single DynamoDB table.&lt;/p&gt;

&lt;h1&gt;
  
  
  Sort Key
&lt;/h1&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%2Ftxp97vca8p2snh286xh6.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%2Ftxp97vca8p2snh286xh6.png" alt=" " width="572" height="329"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is an attribute and is used by DynamoDB to order the data inside a partition. It is an optional field, you can create a DynamoDB table without a sort key but is a good practice to use it to sort the data. Uses &lt;strong&gt;SK&lt;/strong&gt; as a sort key name because it is general to all entities going to store in a single DynamoDB table.&lt;/p&gt;

&lt;p&gt;DynamoDB uses UTF-8 character encoding to order data, If the data type of the sort key is Number, the results are returned in numeric order, otherwise, the results are returned in order of UTF-8 bytes. By default, the sort order is ascending. To reverse the order, set the ScanIndexForward parameter to false.&lt;/p&gt;

&lt;h1&gt;
  
  
  Local Secondary Index (LSI)
&lt;/h1&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%2Fbh1amhy9jx6fi18uk0wl.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%2Fbh1amhy9jx6fi18uk0wl.png" alt=" " width="800" height="438"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is a table extension of the base table that contains a copy of some or all of the attributes from its base table. You can do read operations over the local secondary index, and the write operation only over the base table because DynamoDB projects the items from the base table to the local secondary index.&lt;/p&gt;

&lt;p&gt;You can create up 5 local secondary index per DynamoDB table and only can set up these when you are creating the base table with a composite primary key (partition key and sort key).  A local secondary index maintains a partition key from the base table and an alternate sort key, this is helpful when you need to sort the items with more dimensions, for example, sort the CUSTOMER by Name, created date, score, and more.&lt;/p&gt;

&lt;p&gt;In this example, the Order item has a timestamp attribute that is the Sort Key of the Local Secondary Index, Dynamo replicates the information from Base Table to Local Secondary Index, the Partition Key is the same, Sort Key is the timestamp and the SK attribute is the Sort Key of the Base Table.&lt;/p&gt;

&lt;h1&gt;
  
  
  Global Secondary Index (GSI)
&lt;/h1&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%2Fhsv2ui3h7axgs6spouqh.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%2Fhsv2ui3h7axgs6spouqh.png" alt=" " width="800" height="395"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is similar to Local Secondary Index, you can create it when you create the base table or after it and set up Partition Key and Sort Key. You can create up to 20 Global Secondary Index and only execute read operations,  the write operation only over the base table because DynamoDB projects the items from the base table to the global secondary index when the item is created with the attribute declared as partition key and sort key(optional) of the index.&lt;/p&gt;

&lt;p&gt;In this example, the Base Table has GSI1PK and GSI1SK attributes for the Partition Key and Sort Key of the Global Secondary Index, DynamoDB replicates the information from Base Table to Index which is the Order record, the PK and SK of the Base Table are attributes for the Index.&lt;/p&gt;

&lt;p&gt;In this post, we cover the main concepts of DynamoDB, Table,  Primary Key, Attributes, Partition, and Index, in the next post &lt;a href="https://dev.to/aws-builders/dynamodb-basics-1oe0"&gt;DynamoDB Basics Part 2&lt;/a&gt;, we are going to see the Read and Write operations, Streams, Global Table, and more about DynamoDB.&lt;/p&gt;

&lt;h1&gt;
  
  
  References
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;DynamoDB Developer Guide &lt;a href="https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DynamoDB Actions &lt;a href="https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Operations_Amazon_DynamoDB.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Operations_Amazon_DynamoDB.html&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>nosql</category>
      <category>dynamodb</category>
    </item>
    <item>
      <title>AWS Bastion Host / Jump Box</title>
      <dc:creator>Jose Luis</dc:creator>
      <pubDate>Mon, 23 May 2022 03:13:07 +0000</pubDate>
      <link>https://forem.com/aws-builders/aws-bastion-host-jump-box-471g</link>
      <guid>https://forem.com/aws-builders/aws-bastion-host-jump-box-471g</guid>
      <description>&lt;p&gt;Como administradores de sistemas debemos mantener la infraestructura actualizada aplicando parches de seguridad, instalando versiones nuevas del sistema operativo y configurando aplicaciones correctamente para fortalecer la seguridad de los recursos tecnológicos en la nube y cumplir con el modelo de responsabilidades compartidas de aws. Para realizar estas actividades en instancias de EC2 y bases de datos en RDS en necesario acceder a estos recursos de forma segura.&lt;/p&gt;

&lt;p&gt;En este post vamos a ver como establecer conexión con instancias EC2 y bases de datos RDS que se encuentran en subredes privadas sin acceso desde Internet a través de un Bastion Host o Jump Box usando las herramientas &lt;strong&gt;OpenSSH&lt;/strong&gt; y &lt;strong&gt;&lt;a href="https://www.mysql.com/products/workbench/" rel="noopener noreferrer"&gt;MySQL Workbench&lt;/a&gt;&lt;/strong&gt;. Utilizaremos la red privada virtual (VPC) y Subredes generadas en el post &lt;strong&gt;&lt;a href="https://dev.to/aws-builders/redes-en-aws-desde-0-35bo"&gt;Redes en AWS desde 0&lt;/a&gt;&lt;/strong&gt; para proteger la infraestructura creando entornos privados y seguros con topologías de red y controlando el acceso de comunicaciones entrantes o salientes hacia instancias de EC2 o bases de datos en RDS.&lt;/p&gt;

&lt;p&gt;Iniciamos creando la instancia EC2 para el Bastion Host, posterior aprovisionando las instancias EC2 y RDS en Subred privada y estableciendo conexión por medio del Bastion Host a las instancias privadas de EC2 y MySQL RDS, comencemos:&lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Crear Bastion Host.
&lt;/h2&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%2Fbe3qv3za0xhugthd86sm.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%2Fbe3qv3za0xhugthd86sm.png" alt=" " width="792" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Es una instancia de EC2 desplegada en una VPC y Subred publica (con acceso desde internet) para la conexión con instancias EC2 o bases de datos RDS localizadas en VPC y Subredes privadas (sin acceso desde internet) por medio del protocolo SSH (Secure Shell) y TCP/IP. Los pasos para crear un Bastion Host son:&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Usar asistente de lanzamiento de instancia EC2. Seleccionar AMI (Amazon Machine Image), para este ejemplo usamos Amazon Linux 2 AMI.&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%2Fs3mfc3mae4x35mk9qvky.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%2Fs3mfc3mae4x35mk9qvky.png" alt=" " width="800" height="202"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Seleccionar VPC y Subred Publica en configuración de detalles de la instancia EC2.&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%2Fmju96vfx0k0aovdxyzeb.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%2Fmju96vfx0k0aovdxyzeb.png" alt=" " width="800" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En el Post &lt;strong&gt;&lt;a href="https://dev.to/aws-builders/redes-en-aws-desde-0-35bo"&gt;Redes en AWS desde 0&lt;/a&gt;&lt;/strong&gt; creamos la subred &lt;strong&gt;publicSubnet1A&lt;/strong&gt; con CIDR &lt;strong&gt;192.168.0.0/27&lt;/strong&gt; y VPC &lt;strong&gt;192.168.0.0/24&lt;/strong&gt;, la tabla de enrutamiento y la lista de control de acceso de red (Network ACL) permiten comunicaciones internas y externas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Crear Security Group (Firewall) con regla de entrada para habilitar conexión SSH por medio del protocolo TCP puerto 22 y desde la dirección IP de nuestro equipo local.&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%2F3a25al4eu8fzsoldgofv.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%2F3a25al4eu8fzsoldgofv.png" alt=" " width="800" height="172"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Crear llaves (publica y privada) para la autenticación por conexión con SSH.&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%2Fqalns7z74x783j8kwxni.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%2Fqalns7z74x783j8kwxni.png" alt=" " width="623" height="497"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Revisar detalles de lanzamiento de la instancia y confirmar.
 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Crear instancia EC2 en subred privada.
&lt;/h2&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%2Fbtwt9rjo7fgzm5db4h9r.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%2Fbtwt9rjo7fgzm5db4h9r.png" alt=" " width="792" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una instancia EC2 es privada si es desplegada en una subred con restricciones en la comunicación desde internet. Los pasos para crear una instancia EC2 y desplegarla en subred privada son:&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Usar asistente de lanzamiento de instancia EC2. Seleccionar AMI (Amazon Machine Image), para este ejemplo usamos Amazon Linux 2 AMI.&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%2Fs3mfc3mae4x35mk9qvky.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%2Fs3mfc3mae4x35mk9qvky.png" alt=" " width="800" height="202"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Seleccionar VPC y Subred Privada en configuración de detalles de la instancia EC2. &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%2Fa0wrzuzmlcu2zryp0p7h.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%2Fa0wrzuzmlcu2zryp0p7h.png" alt=" " width="800" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En el Post &lt;strong&gt;&lt;a href="https://dev.to/aws-builders/redes-en-aws-desde-0-35bo"&gt;Redes en AWS desde 0&lt;/a&gt;&lt;/strong&gt; creamos la subred privateSubnet1A con CIDR &lt;strong&gt;192.168.0.32/27&lt;/strong&gt; privada y la VPC &lt;strong&gt;192.168.0.0/24&lt;/strong&gt;, la tabla de enrutamiento y la lista de control de acceso de red (Network ACL) permiten comunicaciones internas.&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Crear Security Group (Firewall) con regla de entrada para habilitar conexión SSH por medio del protocolo TCP puerto 22 y desde el Security Group usado por el Bastion Host.&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%2F8b7shfb8s3tf7y3gkqic.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%2F8b7shfb8s3tf7y3gkqic.png" alt=" " width="800" height="163"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Crear llaves (pública y privada) para la autenticación por conexión con SSH. Estas llaves deben ser diferente a las creadas para la instancia del Bastion Host para incrementar la seguridad y mitigar el riesgo de acceso a varios recursos de infraestructura si un atacante secuestra las llaves.&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%2Fou72ox9uri90q0g4khpv.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%2Fou72ox9uri90q0g4khpv.png" alt=" " width="630" height="501"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Revisar detalles de lanzamiento de la instancia y confirmar.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Crear Base de Datos RDS en subred privada.
&lt;/h2&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%2Fu3omde3ta0viofk55r94.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%2Fu3omde3ta0viofk55r94.png" alt=" " width="792" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una instancia de base de datos RDS es privada si es desplegada en una subred con restricciones en la comunicación desde internet. Los pasos para crear una base de datos SQL privada en RDS son:&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Crear Subnet Group con VPC y al menos dos Subredes en 2 zonas de disponibilidad diferentes en la región AWS:&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%2Fthvvld218kvnfnxzmhbg.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%2Fthvvld218kvnfnxzmhbg.png" alt=" " width="688" height="916"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En el Post  &lt;strong&gt;&lt;a href="https://dev.to/aws-builders/redes-en-aws-desde-0-35bo"&gt;Redes en AWS desde 0&lt;/a&gt;&lt;/strong&gt; creamos la subred privada &lt;strong&gt;privateSubnet1A&lt;/strong&gt; con CIDR &lt;strong&gt;192.168.0.32/27&lt;/strong&gt; en zona de disponibilidad &lt;strong&gt;us-east-2a&lt;/strong&gt; y la VPC con CIDR &lt;strong&gt;192.168.0.0/24&lt;/strong&gt;, la tabla de enrutamiento y la lista de control de acceso de red (Network ACL) permiten comunicaciones internas. En la zona de disponibilidad &lt;strong&gt;us-east-2b&lt;/strong&gt; tenemos la subred &lt;strong&gt;publicSubnet1B&lt;/strong&gt; con CIDR &lt;strong&gt;192.168.0.64/27&lt;/strong&gt; en la misma VPC. El objetivo de Subnet Group es agrupar subredes que son usadas para el despliegue de instancias de la base de datos por ejemplo read replica o standby.&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Crear Security Group (Firewall) con regla de entrada para habilitar conexión MYSQL/Aurora por medio del protocolo TCP puerto 3306 y desde el Security Group usado por el Bastion Host&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%2F3djjpyrc53d3l62y9otw.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%2F3djjpyrc53d3l62y9otw.png" alt=" " width="800" height="155"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Usar asistente de lanzamiento de instancia RDS. Seleccionar Motor de Base de Datos, para este ejemplo usamos MySQL:&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%2Flv6t29myqah4a8a8n12t.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%2Flv6t29myqah4a8a8n12t.png" alt=" " width="678" height="592"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Ingresar identificador de instancia de base de datos y crear credenciales de acceso a la base de datos, Master username y Master password:&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%2Fzvjzja717gkyr2wdjmqq.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%2Fzvjzja717gkyr2wdjmqq.png" alt=" " width="679" height="540"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Configurar propiedades de conexión a la base de datos, ingresar valores para VPC y Subnet Group (&lt;strong&gt;Creado en el punto 1&lt;/strong&gt;), habilitar restricción acceso público, security group (&lt;strong&gt;Creado en el punto 2&lt;/strong&gt;), seleccionar zona de disponibilidad donde se encuentra la subred privada (&lt;strong&gt;us-east-2&lt;/strong&gt;) y puerto.&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%2Fxcjqyzoe1c2uvkgj9xyo.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%2Fxcjqyzoe1c2uvkgj9xyo.png" alt=" " width="681" height="881"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Asignar nombre a la base de datos:&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%2Fv0atss3lhbucf1nl0j4h.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%2Fv0atss3lhbucf1nl0j4h.png" alt=" " width="680" height="357"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Crear base de datos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Conexión SSH hacia el Bastion Host
&lt;/h2&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%2Fw0b4gm5paox0x1vcynk3.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%2Fw0b4gm5paox0x1vcynk3.png" alt=" " width="792" height="842"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para la conexión hacia el Bastion Host desde nuestro equipo Local podemos utilizar clientes SSH como OpenSSH, PuTTY, MobaXterm, WinSCP y otros. Necesitamos la dirección ip publica o DNS de la instancia EC2 (Bastion Host) y el nombre de usuario por defecto en la AMI usada para crear la instancia EC2. Los pasos para establecer la conexión son:&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Buscar dirección IP publica o DNS en detalles de la instancia EC2:&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%2Fngrll9yj3j9x31p4aot0.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%2Fngrll9yj3j9x31p4aot0.png" alt=" " width="800" height="334"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Buscar nombre de usuario por defecto usado para crear instancia EC2. Para Amazon Linux 2 AMI el nombre de usuario es &lt;strong&gt;ec2-user&lt;/strong&gt;.&lt;br&gt;
 &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Desde nuestro equipo local usando el cliente OpenSSH por línea de comandos ejecutamos el comando &lt;code&gt;ssh-add -k&lt;/code&gt; para agregar la llave privada (.pem) del Bastion Host al agente de ssh:&lt;/p&gt;&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%2F8awqij7vdoazt4gm65fo.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%2F8awqij7vdoazt4gm65fo.png" alt=" " width="800" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En Windows, iniciar el Servicio OpenSSH Authentication Agent primero para ejecutar el comando ssh-add.&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Ejecutar el comando &lt;code&gt;ssh {user-name}@{public IP address}&lt;/code&gt;, con el nombre de usuario y la dirección ip publica de la instancia EC2 para establecer conexión ssh:&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%2Frzk1p5ss7dex3qnqisub.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%2Frzk1p5ss7dex3qnqisub.png" alt=" " width="800" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Conexión SSH hacia instancia EC2 Privada
&lt;/h2&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%2F8cgwqc8m0i9e26be1j9u.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%2F8cgwqc8m0i9e26be1j9u.png" alt=" " width="792" height="842"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con la conexión establecida con el Bastion Host, ejecutamos los siguientes pasos desde el cliente &lt;strong&gt;OpenSSH&lt;/strong&gt; para establecer conexión con la instancia EC2 privada::&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Buscar dirección IP privada en detalles de la instancia EC2:&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%2Fki20y9sz334kma8huc7h.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%2Fki20y9sz334kma8huc7h.png" alt=" " width="800" height="354"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Nombre de Usuario por defecto de la AMI (Amazon Machine Image) utilizada en la creación de la instancia EC2. Para Amazon Linux 2 AMI el nombre de usuario es &lt;strong&gt;ec2-user&lt;/strong&gt;.&lt;br&gt;
 &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Desde nuestro equipo local usando el cliente OpenSSH por línea de comandos ejecutamos el comando &lt;code&gt;ssh-add -k&lt;/code&gt; para agregar la llave privada (.pem) de la instancia privada al agente de ssh:&lt;/p&gt;&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%2Fuhjgx63rdyjpaatxtffu.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%2Fuhjgx63rdyjpaatxtffu.png" alt=" " width="800" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En Windows, ejecutar el Servicio OpenSSH Authentication Agent primero para ejecutar el comando ssh-add.&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Ejecutar el comando &lt;code&gt;ssh – J {user-name}@{public IP address} {user-name}@{private IP address}&lt;/code&gt;, con el nombre de usuario y la dirección ip publica del Bastion Host y el nombre de usuario y la dirección ip de la instancia privada para establecer conexión ssh:&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%2Fkym5tmk9djmm1qqnroyr.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%2Fkym5tmk9djmm1qqnroyr.png" alt=" " width="800" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Conexión Base de datos Privada
&lt;/h2&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%2Fn59k81f769ittfajcvdf.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%2Fn59k81f769ittfajcvdf.png" alt=" " width="792" height="842"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Los pasos para establecer conexión con la base de datos privada por medio del cliente &lt;strong&gt;MySQL Workbench&lt;/strong&gt; son los siguientes:&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Buscar end-point y puerto de conexión a la base de datos en detalles de la instancia en RDS.&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%2Fhiujhs11nhuaxbzevfpf.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%2Fhiujhs11nhuaxbzevfpf.png" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Abrir asistente para configurar conexión estándar TCP/IP sobre SSH en MySQL Workbench. Ingresar información en los siguientes parámetros:
 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;a. &lt;strong&gt;SSH Hostname:&lt;/strong&gt; Dirección ip publica o DNS del Bastion Host con el puerto 22.&lt;/p&gt;

&lt;p&gt;b. &lt;strong&gt;SSH Username:&lt;/strong&gt; Nombre de Usuario por defecto de la AMI (Amazon Machine Image) utilizada en la creación de la instancia EC2. Para Amazon Linux 2 AMI el nombre de usuario es &lt;strong&gt;ec2-user&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;c. &lt;strong&gt;SSH Key File:&lt;/strong&gt; Llave privada para la autenticación por conexión con SSH con el Bastion Host.&lt;/p&gt;

&lt;p&gt;d. &lt;strong&gt;MySQL Hostname:&lt;/strong&gt; End-point de conexión a la base de datos del punto 1.&lt;/p&gt;

&lt;p&gt;e. &lt;strong&gt;Username:&lt;/strong&gt; Nombre de usuario de la base de datos.&lt;/p&gt;

&lt;p&gt;f. &lt;strong&gt;Password:&lt;/strong&gt; Contraseña para la autenticación con la base de datos.&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%2F4yotbp60brclc9z9ymab.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%2F4yotbp60brclc9z9ymab.png" alt=" " width="782" height="487"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Probar la conexión&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%2F87iakqr8y9flv92p2558.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%2F87iakqr8y9flv92p2558.png" alt=" " width="327" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusión
&lt;/h2&gt;

&lt;p&gt;En este post vimos los pasos para establecer conexión con instancias de EC2 y RDS privadas de forma segura por medio del Bastion Host como servidor intermedio. Usamos las herramientas &lt;strong&gt;OpenSSH&lt;/strong&gt; y &lt;strong&gt;Workbench&lt;/strong&gt; como clientes en la conexión con la instancia de EC2 y base de datos en RDS.&lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-ssh-workbench-connect-ec2/" rel="noopener noreferrer"&gt;How can I use an SSH tunnel and MySQL Workbench to connect to a private Amazon RDS MySQL DB instance that uses a public EC2 instance?&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.redhat.com/sysadmin/ssh-proxy-bastion-proxyjump" rel="noopener noreferrer"&gt;SSH to remote hosts though a proxy or bastion with ProxyJump&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>networking</category>
    </item>
    <item>
      <title>AWS Bastion Host / Jump Box</title>
      <dc:creator>Jose Luis</dc:creator>
      <pubDate>Mon, 07 Feb 2022 02:45:13 +0000</pubDate>
      <link>https://forem.com/aws-builders/aws-bastion-host-jump-box-5h87</link>
      <guid>https://forem.com/aws-builders/aws-bastion-host-jump-box-5h87</guid>
      <description>&lt;p&gt;As systems administrators, we should keep updating the infrastructure applying security patches, installing the new versions of the operation system, and setting up applications correctly to strengthen the security of cloud technologic resources and achieve AWS Shared Responsibility Model. For doing these activities on EC2 instances and RDS databases are necessary to access securely.&lt;/p&gt;

&lt;p&gt;In this post, we are going to see how to establish the connection with EC2 instances and RDS databases that are on private subnetworks (without access from the internet) through Bastion Host or Jump Box and using &lt;strong&gt;OpenSSH&lt;/strong&gt; and &lt;strong&gt;&lt;a href="https://www.mysql.com/products/workbench/" rel="noopener noreferrer"&gt;MySQL Workbench&lt;/a&gt;&lt;/strong&gt; tools. We will use the virtual private cloud (VPC) and subnetworks created on the post &lt;strong&gt;&lt;a href="https://dev.to/aws-builders/aws-networking-from-scratch-8dm"&gt;AWS Networking from scratch&lt;/a&gt;&lt;/strong&gt; to protect the infrastructure by creating private and safe environments with network topologies and access control inbound and outbound communications to EC2 or databases RDS.&lt;/p&gt;

&lt;p&gt;We start to create an EC2 Bastion Host instance, then provision EC2 and RDS instances on a private subnetwork and establish a connection to these instances through Bastion Hots. Let’s start:&lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Create Bastion Host.
&lt;/h2&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%2Fbe3qv3za0xhugthd86sm.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%2Fbe3qv3za0xhugthd86sm.png" alt=" " width="792" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;It is an EC2 instance deployed on VPC and public subnet (with access from the internet) for the connection with EC2 instance and RDS databases on VPC and private subnet (without access from the internet) through SSH (Secure Shell) and TCP/IP communication protocols. The steps to create a Bastion Host are:&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Use EC2 instance wizard. Choose AMI (Amazon Machine Image), for this example we use Amazon Linux 2 AMI.&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%2Fs3mfc3mae4x35mk9qvky.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%2Fs3mfc3mae4x35mk9qvky.png" alt=" " width="800" height="202"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Choose VPC and public subnet on EC2 instance detail configuration.&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%2Fmju96vfx0k0aovdxyzeb.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%2Fmju96vfx0k0aovdxyzeb.png" alt=" " width="800" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Post &lt;strong&gt;&lt;a href="https://dev.to/aws-builders/aws-networking-from-scratch-8dm"&gt;AWS Network from scratch&lt;/a&gt;&lt;/strong&gt; we created the &lt;strong&gt;publicSubnet1A&lt;/strong&gt; subnet with CIDR &lt;strong&gt;192.168.0.0/27&lt;/strong&gt; and VPC &lt;strong&gt;192.168.0.0/24&lt;/strong&gt;, the route table and network access control list (NACL) allows internal and external communications.&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Create a Security Group (Firewall) with the inbound rule to enable SSH connection through TCP/IP protocol and port 22 from our local machine IP 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%2F3a25al4eu8fzsoldgofv.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%2F3a25al4eu8fzsoldgofv.png" alt=" " width="800" height="172"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Create keys (public and private) for SSH authentication.&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%2Fqalns7z74x783j8kwxni.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%2Fqalns7z74x783j8kwxni.png" alt=" " width="623" height="497"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Review instance launch details and launch it.
 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Create an EC2 instance on a private Subnet.
&lt;/h2&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%2Fbtwt9rjo7fgzm5db4h9r.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%2Fbtwt9rjo7fgzm5db4h9r.png" alt=" " width="792" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An EC2 instance is private when it is deployed on a subnet with communication restrictions from the internet. The steps to create an EC2 instance and deploy it on the private subnet are:&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Use EC2 instance wizard. Choose AMI (Amazon Machine Image), for this example we use Amazon Linux 2 AMI.&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%2Fs3mfc3mae4x35mk9qvky.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%2Fs3mfc3mae4x35mk9qvky.png" alt=" " width="800" height="202"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Choose VPC and private subnet on EC2 instance detail configuration.&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%2Fa0wrzuzmlcu2zryp0p7h.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%2Fa0wrzuzmlcu2zryp0p7h.png" alt=" " width="800" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Post &lt;strong&gt;&lt;a href="https://dev.to/aws-builders/aws-networking-from-scratch-8dm"&gt;AWS Network from scratch&lt;/a&gt;&lt;/strong&gt;, we created the &lt;strong&gt;privateSubnet1A&lt;/strong&gt; subnet with CIDR &lt;strong&gt;192.168.0.32/27&lt;/strong&gt; and VPC &lt;strong&gt;192.168.0.0/24&lt;/strong&gt;, the route table, and network access control list (NACL) allows only internal communications.&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Create a Security Group (Firewall) with the inbound rule to enable SSH connection through TCP/IP protocol and port 22 from the security group of Bastion Host.&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%2F8b7shfb8s3tf7y3gkqic.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%2F8b7shfb8s3tf7y3gkqic.png" alt=" " width="800" height="163"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Create keys (public and private) for SSH authentication. These keys should be different from the Bastions Host keys to increase the security and reduce the risk to access many infrastructure resources when a third party gets access to the key.&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%2Fou72ox9uri90q0g4khpv.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%2Fou72ox9uri90q0g4khpv.png" alt=" " width="630" height="501"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Review instance launch details and launch it.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Create an RDS Database on a private Subnet.
&lt;/h2&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%2Fu3omde3ta0viofk55r94.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%2Fu3omde3ta0viofk55r94.png" alt=" " width="792" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;An RDS Database instance is private when it is deployed on a private subnet with communication restrictions from the internet. The steps to create an RDS database and deploy it on the private subnet are:&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Create a Subnet Group with VPC and at least two Subnetworks in two different availability zones in the AWS region:&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%2Fthvvld218kvnfnxzmhbg.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%2Fthvvld218kvnfnxzmhbg.png" alt=" " width="688" height="916"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In the Post &lt;strong&gt;&lt;a href="https://dev.to/aws-builders/aws-networking-from-scratch-8dm"&gt;AWS Network from scratch&lt;/a&gt;&lt;/strong&gt;, we created the &lt;strong&gt;privateSubnet1A&lt;/strong&gt; subnet with CIDR &lt;strong&gt;192.168.0.32/27&lt;/strong&gt; on the availability zone &lt;strong&gt;us-east-2a&lt;/strong&gt; and VPC &lt;strong&gt;192.168.0.0/24&lt;/strong&gt;, the route table, and network access control list (NACL) allows only internal communications. On the availability zone &lt;strong&gt;us-east-2b&lt;/strong&gt; we have the subnet &lt;strong&gt;publicSubnet1B&lt;/strong&gt; with CIDR &lt;strong&gt;192.168.0.64/27&lt;/strong&gt; in the same VPC.&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Create a Security Group (Firewall) with the inbound rule to enable MYSQL/Aurora connection through TCP/IP protocol and port 3306 from the security group of Bastion Host.&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%2F3djjpyrc53d3l62y9otw.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%2F3djjpyrc53d3l62y9otw.png" alt=" " width="800" height="155"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Use the RDS database, instance wizard. Choose the database engine, for this example we use MySQL:&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%2Flv6t29myqah4a8a8n12t.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%2Flv6t29myqah4a8a8n12t.png" alt=" " width="678" height="592"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Enter database instance identity and create database access credentials, Master username, and Master password:&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%2Fzvjzja717gkyr2wdjmqq.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%2Fzvjzja717gkyr2wdjmqq.png" alt=" " width="679" height="540"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Set up database connection properties, enter the values to VPC, Subnet Group (&lt;strong&gt;Created in step 1&lt;/strong&gt;), enable public restrictions, security group (&lt;strong&gt;Created in step 2&lt;/strong&gt;), choose availability zone where the private subnet is present (&lt;strong&gt;us-east-2&lt;/strong&gt;) and port:&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%2Fxcjqyzoe1c2uvkgj9xyo.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%2Fxcjqyzoe1c2uvkgj9xyo.png" alt=" " width="681" height="881"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Enter database name:&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%2Fv0atss3lhbucf1nl0j4h.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%2Fv0atss3lhbucf1nl0j4h.png" alt=" " width="680" height="357"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Create a database.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  SSH Connection to Bastion Host
&lt;/h2&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%2Fw0b4gm5paox0x1vcynk3.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%2Fw0b4gm5paox0x1vcynk3.png" alt=" " width="792" height="842"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For SSH connection to Bastion Host from our local machine, we can use SSH clients like OpenSSH, Putty, MobaXterm, WinSCP, and others. We need the public IP address or DNS of the EC2 instance (Bastion Host), the default user name of AMI used to create the EC2 instance, and a private SSH key. The steps to establish the connection are:&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Find the public IP address or DNS in the EC2 instance details section:&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%2Fngrll9yj3j9x31p4aot0.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%2Fngrll9yj3j9x31p4aot0.png" alt=" " width="800" height="334"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Search the default user name of the AMI used to create the EC2 instance. The default user name of the Amazon Linux AMI is &lt;strong&gt;ec2-user&lt;/strong&gt;.&lt;br&gt;
 &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From our local machine and using the OpenSSH command line, execute the command &lt;code&gt;ssh-add -k&lt;/code&gt; to add Bastion Host private key (.pem) to &lt;strong&gt;ssh-agent&lt;/strong&gt;:&lt;/p&gt;&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%2F8awqij7vdoazt4gm65fo.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%2F8awqij7vdoazt4gm65fo.png" alt=" " width="800" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On Windows, run the OpenSSH Authentication Agent service first to execute the command ssh-add.&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Execute the command &lt;code&gt;ssh {user-name}@{public IP address}&lt;/code&gt; with the user name and public IP address of EC2 instance to establish ssh connection:&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%2Frzk1p5ss7dex3qnqisub.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%2Frzk1p5ss7dex3qnqisub.png" alt=" " width="800" height="182"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  SSH connection to EC2 private instance
&lt;/h2&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%2F8cgwqc8m0i9e26be1j9u.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%2F8cgwqc8m0i9e26be1j9u.png" alt=" " width="792" height="842"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;With Bastion Host connection ready, we can execute the below steps from our local machine and with &lt;strong&gt;OpenSSH&lt;/strong&gt; client to connect with EC2 private instance:&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Find the private IP address on the EC2 instance details section:&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%2Fki20y9sz334kma8huc7h.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%2Fki20y9sz334kma8huc7h.png" alt=" " width="800" height="354"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Search the default user name of the AMI used to create the EC2 instance. The default user name of the Amazon Linux AMI is &lt;strong&gt;ec2-user&lt;/strong&gt;.&lt;br&gt;
 &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;From our local machine and using the OpenSSH command line, execute the command &lt;code&gt;ssh-add -k&lt;/code&gt; to add EC2 private instance private key (.pem) to ssh-agent:&lt;/p&gt;&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%2Fuhjgx63rdyjpaatxtffu.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%2Fuhjgx63rdyjpaatxtffu.png" alt=" " width="800" height="134"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;On Windows, run the OpenSSH Authentication Agent service first to execute the command ssh-add.&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Execute the command &lt;code&gt;ssh – J {user-name}@{public IP address} {user-name}@{private IP address}&lt;/code&gt;, with the Bastion Host user name and public IP address, and EC2 private instance user name and local IP address to establish SSH connection:&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%2Fkym5tmk9djmm1qqnroyr.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%2Fkym5tmk9djmm1qqnroyr.png" alt=" " width="800" height="185"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  RDS private database connection
&lt;/h2&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%2Fn59k81f769ittfajcvdf.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%2Fn59k81f769ittfajcvdf.png" alt=" " width="792" height="842"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The steps to establish a connection with a private database using &lt;strong&gt;MySQL Workbench&lt;/strong&gt; client from our local machine are:&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Find the end-point and connection port of the database on RDS instance details.&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%2Fhiujhs11nhuaxbzevfpf.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%2Fhiujhs11nhuaxbzevfpf.png" alt=" " width="800" height="360"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Open MySQL Workbench wizard to set up TCP/IP connection over SSH. Enter the following fields:
 &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;a. &lt;strong&gt;SSH Hostname:&lt;/strong&gt; Bastion Host public IP address or DNS with port 22.&lt;/p&gt;

&lt;p&gt;b. &lt;strong&gt;SSH Username:&lt;/strong&gt; The default user name of the AMI used to create the EC2 instance. The default user name of the Amazon Linux AMI is ec2-user.&lt;/p&gt;

&lt;p&gt;c. &lt;strong&gt;SSH Key File:&lt;/strong&gt; Bastion Host Private key (.pem) for SSH authentication.&lt;/p&gt;

&lt;p&gt;d. &lt;strong&gt;MySQL Hostname:&lt;/strong&gt; End-point database connection (point 1).&lt;/p&gt;

&lt;p&gt;e. &lt;strong&gt;Username:&lt;/strong&gt; Database username.&lt;/p&gt;

&lt;p&gt;f. &lt;strong&gt;Password:&lt;/strong&gt; Database password.&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%2F4yotbp60brclc9z9ymab.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%2F4yotbp60brclc9z9ymab.png" alt=" " width="782" height="487"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
Test connection&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%2F87iakqr8y9flv92p2558.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%2F87iakqr8y9flv92p2558.png" alt=" " width="327" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt; &lt;br&gt;
 &lt;/p&gt;

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

&lt;p&gt;In this post, we learned the steps to establish a connection with EC2 and RDS private instances through Bastion Host. We used the &lt;strong&gt;OpenSSH&lt;/strong&gt; and &lt;strong&gt;Workbench&lt;/strong&gt; tools to connect with the EC2 instance and RDS database.&lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://aws.amazon.com/premiumsupport/knowledge-center/rds-mysql-ssh-workbench-connect-ec2/" rel="noopener noreferrer"&gt;How can I use an SSH tunnel and MySQL Workbench to connect to a private Amazon RDS MySQL DB instance that uses a public EC2 instance?&lt;/a&gt;&lt;/strong&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://www.redhat.com/sysadmin/ssh-proxy-bastion-proxyjump" rel="noopener noreferrer"&gt;SSH to remote hosts though a proxy or bastion with ProxyJump&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>networking</category>
    </item>
    <item>
      <title>AWS Networking from scratch</title>
      <dc:creator>Jose Luis</dc:creator>
      <pubDate>Tue, 12 Oct 2021 03:58:41 +0000</pubDate>
      <link>https://forem.com/aws-builders/aws-networking-from-scratch-8dm</link>
      <guid>https://forem.com/aws-builders/aws-networking-from-scratch-8dm</guid>
      <description>&lt;p&gt;In this post, we are going to see the AWS networking foundations, networks, subnetworks, firewall, Internet Gateway, Access Control List, NAT, and other services. &lt;/p&gt;

&lt;p&gt;Building networks, segregating the network, configuring routing, and network permissions are architectural decisions important for communications between the systems. Compute Services (EC2, ECS, EKS), Database (RDS, Aurora, ElastiCache), and others allow us to choose the network, subnetwork, availability zone, and firewall for deployment and execution of the AWS service. It is our responsibility to set up the communications needed for the systems and protect them against security attacks that impact the availability and integrity&lt;/p&gt;

&lt;p&gt;We start from inwards to towards with the services that are base to other services. Each service has a description, scope, limits, and an example to know their capabilities and boundaries. Let's start.&lt;br&gt;
   &lt;/p&gt;

&lt;h2&gt;
  
  
  Virtual Private Cloud (VPC)
&lt;/h2&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%2F8y4rqkktrpzbgrv173xu.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%2F8y4rqkktrpzbgrv173xu.png" alt="VPC" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; Networking.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scope:&lt;/strong&gt; Create a virtual private network with an IP addresses block (CIDR). It allows logical isolate the resources deployed in the virtual network from other services that are in the AWS cloud.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limits:&lt;/strong&gt; 5 VPC per AWS region. You can adjust the limit by requesting it from AWS support.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; To create a VPC you need an IPv4 or IPv6 CIDR block, this value depends on the number of subnetworks and hosts you need. We use CIDR block &lt;strong&gt;192.168.0.0/24&lt;/strong&gt; to create VPC on the Ohio AWS region. When you create a VPC by default create Route Table and Network Access Control List (NACL).&lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Subnets
&lt;/h2&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%2Fd3zbnrhg9tjpvfrdzo4f.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%2Fd3zbnrhg9tjpvfrdzo4f.png" alt="Subnet" width="792" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; Networking.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scope:&lt;/strong&gt; Create virtual subnetwork inside VPC network to split the network and deploy systems in the subnetwork. You can choose the availability zone (AZ) of the AWS region to create the subnetwork and you can create more than one subnetwork in the same AZ.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limits:&lt;/strong&gt; 200 subnets per VPC. You can adjust the limit by requesting it from AWS support.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; To create a VPC you need an IPv4 CIDR block that is inside the IPv4 CIDR block of VPC. &lt;/p&gt;

&lt;p&gt;Taken 3 bits of VPC network address then we can create 8 subnets (2^3=8). The IPv4 CIDR block for each subnet are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;192.168.0.0/27&lt;/li&gt;
&lt;li&gt;192.168.0.32/27&lt;/li&gt;
&lt;li&gt;192.168.0.64/27&lt;/li&gt;
&lt;li&gt;192.168.0.96/27&lt;/li&gt;
&lt;li&gt;192.168.0.128/27&lt;/li&gt;
&lt;li&gt;192.168.0.160/27&lt;/li&gt;
&lt;li&gt;192.168.0.192/27&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The other 5 bits are to create hosts, the number of hosts per subnet is 27 (2^5 = 32 - 5). AWS reserves 5 IP addresses in each subnet, the first 4 addresses and the last one.&lt;/p&gt;

&lt;p&gt;For the &lt;strong&gt;192.168.0.0/27&lt;/strong&gt; CIDR block the IP addresses reserved by AWS are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;192.168.0.0, Subnetwork address.&lt;/li&gt;
&lt;li&gt;192.168.0.1, reserved by AWS for VPC Router.&lt;/li&gt;
&lt;li&gt;192.168.0.2, reserved by AWS for Amazon-provided DNS.&lt;/li&gt;
&lt;li&gt;192.168.0.3, reserved by AWS for future use.&lt;/li&gt;
&lt;li&gt;192.168.0.31, Broadcast, AWS does not support Broadcast communication inside VPC.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For the &lt;strong&gt;192.168.0.32/27&lt;/strong&gt; CIDR block the IP addresses reserved by AWS are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;192.168.0.32, Subnetwork address.&lt;/li&gt;
&lt;li&gt;192.168.0.33, reserved by AWS for VPC Router.&lt;/li&gt;
&lt;li&gt;192.168.0.34, reserved by AWS for Amazon-provided DNS.&lt;/li&gt;
&lt;li&gt;192.168.0.35, reserved by AWS for future use.&lt;/li&gt;
&lt;li&gt;192.168.0.63, Broadcast, AWS does not support Broadcast communication inside VPC.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We are going to use the &lt;strong&gt;192.168.0.0/27&lt;/strong&gt; CIDR block for &lt;strong&gt;Public Subnet&lt;/strong&gt; (Internet access) and &lt;strong&gt;192.168.0.32/27&lt;/strong&gt; CIDR block for &lt;strong&gt;Private Subnet&lt;/strong&gt; (Internal access) on availability zone us-east-2a.&lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Internet Gateway
&lt;/h2&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%2Fe3lpj5apsubig7c56tfz.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%2Fe3lpj5apsubig7c56tfz.png" alt="Internet Gateway" width="792" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; Networking.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scope:&lt;/strong&gt; Internet access gateway for the resources deployed in subnet and VPC. Also, it is a NAT for instances (EC2, RDS) that has a public IP address.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limits:&lt;/strong&gt; 5 Internet Gateway per AWS Region. You can adjust the limit by requesting it from AWS support.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Create Internet Gateway for the &lt;strong&gt;VPC 192.168.0.0/24&lt;/strong&gt;. Just can attach one Internet Gateway per VPC.&lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Route Table
&lt;/h2&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%2Fqa2hhpxbsbcaiqub1vjx.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%2Fqa2hhpxbsbcaiqub1vjx.png" alt="Route Table" width="792" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; Networking.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scope:&lt;/strong&gt; Create routing rules to address the communications from the resource inside subnet and VPC to destination. Route Table attaches to VPC applies to all subnets of the VPC. Route Table attach directly to subnet has priority over Route Table of VPC.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limits:&lt;/strong&gt; 200 Route Tables per VPC and 50 routing rules by Route Table. You can adjust the limit by requesting it from AWS support.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; Create and attach new Route Table on &lt;strong&gt;Public Subnet (192.168.0.0/27)&lt;/strong&gt; with routing rules to Internet and VPC network destinations through Internet Gateway and local routing:&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%2Frb6b4g3rhvtsf9wsg7e2.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%2Frb6b4g3rhvtsf9wsg7e2.png" alt="Route Table Public Subnet" width="800" height="170"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;Private Subnet (192.168.0.32/27)&lt;/strong&gt; create a new Route Table and attach to it with routing rule to VPC network destination through local routing:&lt;br&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%2F8ayp9hyi4mdno4loju41.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%2F8ayp9hyi4mdno4loju41.png" alt="Route Table Private Subnet" width="800" height="151"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;h2&gt;
  
  
  Network Access Control List (NACL)
&lt;/h2&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%2Fnp9cprwx3ux7r7go2qf4.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%2Fnp9cprwx3ux7r7go2qf4.png" alt="NACL" width="792" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; Security.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scope:&lt;/strong&gt; Network firewall to control inbound and outbound communication to resources deployed in the subnet using rules. The rule specifies communication protocol, port, source/destination, and allow or deny communication. The rules are sorted by number, have precedence, and are stateless, you need to create inbound and outbound rules to requests and responses.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limits:&lt;/strong&gt; 200 NACL per VPC and 20 rules to IPv4 or IPV6 per NACL. You can adjust the limit by requesting it from AWS support.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; For &lt;strong&gt;Public Subnet (192.168.0.0/27)&lt;/strong&gt; create and attach NACL with inbound and outbound rules to allow internet access (All traffic).&lt;br&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%2Fo8w5ki5foopsl8sw1fzj.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%2Fo8w5ki5foopsl8sw1fzj.png" alt="NACL Inbound Public Subnet" width="800" height="149"&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%2Fa1bfatpj2n80fbrcjp71.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%2Fa1bfatpj2n80fbrcjp71.png" alt="NACL Outbound Public Subnet" width="800" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;Private Subnet (192.168.0.32/27)&lt;/strong&gt; create and attach NACL with inbound and outbound rules to allow communications from and to &lt;strong&gt;Public Subnet (192.168.0.0/27)&lt;/strong&gt;.&lt;br&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%2Fmzr9j5jqwau3tanmwod5.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%2Fmzr9j5jqwau3tanmwod5.png" alt="NACL Inbound Private Subnet" width="800" height="157"&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%2Fwe4qrt7mzn38cznlyoec.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%2Fwe4qrt7mzn38cznlyoec.png" alt="NACL Outbound Private Subnet" width="800" height="155"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Security Group
&lt;/h2&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%2Fflz88yf1dwdhb7go72oj.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%2Fflz88yf1dwdhb7go72oj.png" alt="Security Group" width="792" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; Security.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scope:&lt;/strong&gt; Instance firewall to control inbound and outbound communication to instances (EC2, RDS) using rules. The rule specifies communication protocol, port, and source/destination. The rules are stateful you just need to create inbound/outbound rules for requests received/generated by the instance and is not necessary to create rules for the response.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limits:&lt;/strong&gt; 2500 Security Groups per AWS Region and 60 inbound and outbound rules per Security Group. You can adjust the limit by requesting it from AWS support.&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt; For EC2 instance access over internet using HTTP and SSH protocols, deploy on &lt;strong&gt;Public Subnet (192.168.0.0/27)&lt;/strong&gt;, create and attach Security Group with inbound rules with sources anywhere and ip address (your ip).&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%2Fl90a3k7svrvpvsxl6m8z.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%2Fl90a3k7svrvpvsxl6m8z.png" alt="Security Group EC2 Public Subnet" width="800" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For EC2 instance to internal access only (no internet access), deploy on &lt;strong&gt;Private Subnet (192.168.0.32/27)&lt;/strong&gt;, create and attach Security Group with an inbound rule that allows communication from Security Group EC2 Instance of &lt;strong&gt;Public Subnet (192.168.0.0/27)&lt;/strong&gt; over TCP protocol and port 22.&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%2Fu1bix9tl23xqlszsmw3r.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%2Fu1bix9tl23xqlszsmw3r.png" alt="Security Group EC2 Private Subnet" width="800" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;For RDS instance to internal access only (no Internet access), deploy on &lt;strong&gt;Private Subnet (192.168.0.32/27)&lt;/strong&gt;, create and attach Security Group with an inbound rule that allows communication from Security Group EC2 Instance of &lt;strong&gt;Public Subnet (192.168.0.0/27)&lt;/strong&gt; and Security Group EC2 Instance of &lt;strong&gt;Private Subnet (192.168.0.32/27)&lt;/strong&gt;, both of them over TCP protocol and port 3306.&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%2Fg19gtkq0p51c6a3rstdq.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%2Fg19gtkq0p51c6a3rstdq.png" alt="Security Group RDS Private Subnet" width="800" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The EC2 instance on &lt;strong&gt;Public Subnet&lt;/strong&gt; is a Bastion Host (Bridge) to connect to EC2 and RDS instances on &lt;strong&gt;Private Subnet&lt;/strong&gt; witout internet access.&lt;br&gt;
   &lt;/p&gt;

&lt;h2&gt;
  
  
  NAT Instance &amp;amp; NAT Gateway
&lt;/h2&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%2F1xj9toa1gp3x574bxzue.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%2F1xj9toa1gp3x574bxzue.png" alt="NAT" width="792" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; Networking&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scope:&lt;/strong&gt; Internet access from instances on &lt;strong&gt;Private Subnet&lt;/strong&gt; (without Internet Access) through exchange of ip addresses. Taken the ip address of communication packages send by instances and replace it with the ip address of NAT.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NAT Instance:&lt;/strong&gt; It is EC2 instances with preconfigured Amazon Machine Image (AMI) and elastic ip address or public ip. The bandwidth depends on the bandwidth of the instance type.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NAT Gateway:&lt;/strong&gt; Is a NAT service managed by AWS with high availability and elastic ip. Scale up to 45 Gbps in bandwidth. It can handle communication to internet, between VPCs and between VPC and on-premise corporate network.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limits NAT Instance:&lt;/strong&gt; Apply EC2 limits.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limits NAT Gateway:&lt;/strong&gt; 5 NAT Gateway per availability zone of AWS region. You can adjust the limit by requesting it to AWS support.&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NAT Instance:&lt;/strong&gt; Create EC2 instance with NAT AMI and deploy on &lt;strong&gt;Public Subnet (192.168.0.0/27)&lt;/strong&gt; with internet access through Internet Gateway. &lt;/p&gt;

&lt;p&gt;On Route Table of &lt;strong&gt;Private Subnet (192.168.0.32/27)&lt;/strong&gt; add routing rule to NAT instance when destination is internet.&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%2Flhtrc5whsv7tev5lwk06.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%2Flhtrc5whsv7tev5lwk06.png" alt="Route Table Private Subnet" width="800" height="175"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NAT Gateway: Create NAT Gateway and deploy on &lt;strong&gt;Public Subnet (192.168.0.0/27)&lt;/strong&gt; with internet access through Internet Gateway. &lt;/p&gt;

&lt;p&gt;On Route Table of &lt;strong&gt;Private Subnet (192.168.0.32/27)&lt;/strong&gt; add routing rule to NAT Gateway when destination is internet.&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%2F7mkfd0k7w7ukfixuswkf.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%2F7mkfd0k7w7ukfixuswkf.png" alt="Route Table Private Subnet" width="800" height="174"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Update NACL of &lt;strong&gt;Private Subnet (192.168.0.32/27)&lt;/strong&gt; with inbound and outbound rules that allow internet communications (Request and Response).&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%2Ft1nk15sptcaadly23p6k.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%2Ft1nk15sptcaadly23p6k.png" alt="NACL Inbound Private Subnet" width="800" height="173"&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%2Fbqgqbbelbtmy0s23osjx.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%2Fbqgqbbelbtmy0s23osjx.png" alt="NACL Outbound Private Subnet" width="800" height="175"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Route Table and NACL of &lt;strong&gt;Public Subnet (192.168.0.0/27)&lt;/strong&gt; without changes.&lt;br&gt;
 &lt;/p&gt;

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

&lt;p&gt;In this post we saw the main networking and security aws services to build a network and allow or deny the communication between the systems deployed on it. We also build a solution to protect the instances by restricting access to and from the internet with network and instance Firewall and allowing connection through Bastion Host and NAT.&lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html" rel="noopener noreferrer"&gt;VPC Limites&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-comparison.html" rel="noopener noreferrer"&gt;NAT Comparison&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>networking</category>
    </item>
    <item>
      <title>Redes en AWS desde 0</title>
      <dc:creator>Jose Luis</dc:creator>
      <pubDate>Mon, 11 Oct 2021 05:23:17 +0000</pubDate>
      <link>https://forem.com/aws-builders/redes-en-aws-desde-0-35bo</link>
      <guid>https://forem.com/aws-builders/redes-en-aws-desde-0-35bo</guid>
      <description>&lt;p&gt;En este artículo vamos a ver los fundamentos de las comunicaciones en AWS, redes, subredes, firewall, internet gateway, listas de control de acceso, NAT entre otros. &lt;/p&gt;

&lt;p&gt;Crear redes, segmentos de red, configurar enrutamiento y asignar permisos de red son decisiones arquitecturales importantes para la comunicación entre los sistemas. Servicio de Computo (EC2, ECS, EKS), Bases de Datos (RDS, Aurora, ElastiCache) entre otros, permiten seleccionar la red, subred, firewall y zona de disponibilidad para el despliegue y ejecución del servicio de AWS. Es nuestra responsabilidad configurar las comunicaciones necesarias para la operación de los sistemas y protegerlos ante ataques que afecten la disponibilidad e integridad.&lt;/p&gt;

&lt;p&gt;Iniciamos de adentro hacia fuera, con los servicios que son base para la creación de otros servicios. En cada servicio se describe el tipo, alcance, límites y un ejemplo para conocer capacidades y fronteras de cada uno. Comencemos.&lt;/p&gt;

&lt;p&gt;   &lt;/p&gt;

&lt;h2&gt;
  
  
  Virtual Private Cloud (VPC)
&lt;/h2&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%2F8y4rqkktrpzbgrv173xu.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%2F8y4rqkktrpzbgrv173xu.png" alt="VPC" width="800" height="331"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; Comunicaciones&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alcance:&lt;/strong&gt; Crear red virtual privada con bloque de direcciones ip (CIDR). Permite aislar lógicamente los recursos provisionados y desplegados en la red virtual de otros servicios que están en la nube de AWS.&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limites:&lt;/strong&gt; Por región de AWS se pueden crear máximo 5 VPC. Pude ajustar el límite por medio de una solicitud a soporte AWS. &lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; Para crear una VPC se necesita un bloque de direcciones ip privadas (CIDR) para IPv4 o IPv6, este valor depende de la cantidad de subredes y hosts que necesitamos. Utilizaremos el bloque &lt;strong&gt;192.168.0.0/24&lt;/strong&gt; para crear VPC en la Región de Ohio en AWS. Al crear una VPC, se crean un Route Table y Network Access Control List (NACL) automáticamente &lt;br&gt;
   &lt;/p&gt;

&lt;h2&gt;
  
  
  Subnets
&lt;/h2&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%2Fd3zbnrhg9tjpvfrdzo4f.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%2Fd3zbnrhg9tjpvfrdzo4f.png" alt="Subnet" width="792" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; Comunicaciones&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alcance:&lt;/strong&gt; Crear subred virtual en la red VPC para segmentar la red y habilitar el despliegue de sistemas en la subred. Permite seleccionar la zona de disponibilidad de la Región de AWS para crear la subred, es posible crear más de una subred en una zona de disponibilidad.&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limites:&lt;/strong&gt; Por VPC se puede crear hasta 200 Subredes. Pude ajustar el límite por medio de una solicitud a soporte AWS. &lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; Para crear una subred se necesita un bloque de direcciones ip (CIDR) que este dentro del bloque de direcciones asignado a la VPC. &lt;/p&gt;

&lt;p&gt;Tomando 3 bits de la dirección de red &lt;strong&gt;VPC 192.168.0.0/24&lt;/strong&gt;,  podemos crear 8 subredes (2^3=8). Los bloques de direcciones ip para cada subred son:&lt;br&gt;
   &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;192.168.0.0/27&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;192.168.0.32/27&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;192.168.0.64/27&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;192.168.0.96/27&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;192.168.0.128/27&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;192.168.0.160/27&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;192.168.0.192/27&lt;/strong&gt;
 
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Los restantes 5 bites son para crear hosts, la cantidad de hosts en cada subred es 27 (2^5 = 32 - 5). En cada bloque de direcciones ip de las subredes, AWS reserva 5 direcciones ip, las 4 primeras direcciones y la última. &lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;Para el bloque &lt;strong&gt;192.168.0.0/27&lt;/strong&gt;, las direcciones ip reservadas por AWS son:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;192.168.0.0&lt;/strong&gt;, Dirección de red.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;192.168.0.1&lt;/strong&gt;, Reservada por AWS para VPC Router.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;192.168.0.2&lt;/strong&gt;, Reservada por AWS para DNS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;192.168.0.3&lt;/strong&gt;, Reservada por AWS para uso futuro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;192.168.0.31&lt;/strong&gt;, Broadcast, AWS no soporta comunicación broadcast en una VPC.
  &lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Para el bloque &lt;strong&gt;192.168.0.32/27&lt;/strong&gt;, las direcciones ip reservadas por AWS son son:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;192.168.0.32&lt;/strong&gt;, Dirección de red.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;192.168.0.33&lt;/strong&gt;, Reservada por AWS para VPC Router.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;192.168.0.34&lt;/strong&gt;, Reservada por AWS para DNS.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;192.168.0.35&lt;/strong&gt;, Reservada por AWS para uso futuro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;192.168.0.63&lt;/strong&gt;, Broadcast, AWS no soporta broadcast en una VPC.
 
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Utilizamos el bloque CIDR &lt;strong&gt;192.168.0.0/27&lt;/strong&gt; para crear &lt;strong&gt;Subred Publica&lt;/strong&gt; (acceso a Internet) y el bloque CIDR &lt;strong&gt;192.168.0.32/27&lt;/strong&gt; para crear &lt;strong&gt;Subred Privada&lt;/strong&gt; (acceso interno) en la zona de disponibilidad &lt;strong&gt;us-east-2a&lt;/strong&gt; de Ohio.&lt;br&gt;
   &lt;/p&gt;

&lt;h2&gt;
  
  
  Internet Gateway
&lt;/h2&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%2Fe3lpj5apsubig7c56tfz.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%2Fe3lpj5apsubig7c56tfz.png" alt="Internet Gateway" width="792" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; Comunicaciones&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alcance:&lt;/strong&gt; Puerta de entrada de acceso a Internet para los recursos desplegados en la subred y VPC. También es un NAT para las instancias (EC2, RDS) que tiene direcciones ip públicas.&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limites:&lt;/strong&gt; Hasta 5 Internet Gateway por Región. Pude ajustar el límite por medio de una solicitud a soporte AWS.&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; Se crea Internet Gateway para &lt;strong&gt;VPC 192.168.0.0/24&lt;/strong&gt;. Un Internet Gateway se adjunta a una sola VPC.&lt;br&gt;
   &lt;/p&gt;

&lt;h2&gt;
  
  
  Route Table
&lt;/h2&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%2Fqa2hhpxbsbcaiqub1vjx.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%2Fqa2hhpxbsbcaiqub1vjx.png" alt="Route Table" width="792" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; Comunicaciones&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alcance:&lt;/strong&gt; Crear reglas de enrutamiento usadas para direccionar las comunicaciones de los recursos en al VPC y Subred hacia un sistema destinatario. Route Table adjunto a una VPC aplica para todas las Subredes de la VPC. Route Table adjunto a una Subred tiene prioridad sobre Route Table de la VPC.&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limites:&lt;/strong&gt; Hasta 200 Route Tables por VPC y máximo 50 reglas de enrutamiento por Route Table. Pude ajustar el límite por medio de una solicitud a soporte AWS.&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; En &lt;strong&gt;Subred Publica 192.168.0.0/27&lt;/strong&gt; se crea y asocia Route Table con reglas de enrutamiento hacia Internet Gateway y red interna Local.&lt;br&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%2Frb6b4g3rhvtsf9wsg7e2.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%2Frb6b4g3rhvtsf9wsg7e2.png" alt="Route Table Public Subnet" width="800" height="170"&gt;&lt;/a&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;Para &lt;strong&gt;Subred Privada 192.168.0.32/27&lt;/strong&gt; se crea y asocia Route Table con regla de enrutamiento hacia red interna Local.&lt;br&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%2F8ayp9hyi4mdno4loju41.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%2F8ayp9hyi4mdno4loju41.png" alt="Route Table Private Subnet" width="800" height="151"&gt;&lt;/a&gt;&lt;br&gt;
   &lt;/p&gt;

&lt;h2&gt;
  
  
  Network Access Control List (NACL)
&lt;/h2&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%2Fnp9cprwx3ux7r7go2qf4.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%2Fnp9cprwx3ux7r7go2qf4.png" alt="NACL" width="792" height="542"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; Seguridad&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alcance:&lt;/strong&gt; Firewall de red para controlar comunicaciones de entrada y salida a recursos en la Subred por medio de reglas. Una regla especifica el protocolo de comunicación, puerto, origen/destino y permitir o rechazar la comunicación. Las reglas son ordenadas por número, tienen precedencia y son sin estado, se crean reglas de entrada y salida para peticiones y respuestas&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limites:&lt;/strong&gt; Máximo 200 Network ACL por VPC y hasta 20 reglas de IPv4 o IPv6 por NACL. Pude ajustar el límite por medio de una solicitud a soporte AWS.&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; En &lt;strong&gt;Subred Publica 192.168.0.0/27&lt;/strong&gt; se crea y asocia NACL con reglas de entrada y salida que permitan acceso a internet (todas las comunicaciones).&lt;br&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%2Fo8w5ki5foopsl8sw1fzj.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%2Fo8w5ki5foopsl8sw1fzj.png" alt="NACL Inbound Public Subnet" width="800" height="149"&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%2Fa1bfatpj2n80fbrcjp71.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%2Fa1bfatpj2n80fbrcjp71.png" alt="NACL Outbound Public Subnet" width="800" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para &lt;strong&gt;Subred Privada 192.168.0.32/27&lt;/strong&gt; se crea y asocia NACL con regla de entrada y salida que permitan las comunicaciones desde y hacia la &lt;strong&gt;Subred Publica 192.168.0.0/27&lt;/strong&gt;.&lt;br&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%2Fmzr9j5jqwau3tanmwod5.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%2Fmzr9j5jqwau3tanmwod5.png" alt="NACL Inbound Private Subnet" width="800" height="157"&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%2Fwe4qrt7mzn38cznlyoec.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%2Fwe4qrt7mzn38cznlyoec.png" alt="NACL Outbound Private Subnet" width="800" height="155"&gt;&lt;/a&gt;&lt;br&gt;
   &lt;/p&gt;

&lt;h2&gt;
  
  
  Security Group
&lt;/h2&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%2Fflz88yf1dwdhb7go72oj.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%2Fflz88yf1dwdhb7go72oj.png" alt="Security Group" width="792" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; Seguridad&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alcance:&lt;/strong&gt; Firewall de instancia para controlar comunicaciones de entrada y salida de una instancia (EC2, RDS) por medio de reglas. Una regla especifica el protocolo de comunicación, puerto y origen/destino especifico. Las reglas de Security Group son con estado, solo se necesitan crear reglas de entrada/salida para peticiones recibidas/generadas por la instancia y no necesita reglas para la respuesta.&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limites:&lt;/strong&gt; Máximo 2500 Security Group por Region de AWS y hasta 60 reglas de entrada o salida por Security Group. Pude ajustar el límite por medio de una solicitud a soporte AWS.&lt;br&gt;&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt; Para instancia EC2 con conexión desde internet por medio de los protocolos de comunicación HTTP y SSH, desplegar en &lt;strong&gt;Subred Publica 192.168.0.0/27&lt;/strong&gt;, crear y asociar Security Group con reglas de entrada que permitan comunicaciones por SSH y HTTP desde Internet e ip especifica.&lt;br&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%2Fl90a3k7svrvpvsxl6m8z.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%2Fl90a3k7svrvpvsxl6m8z.png" alt="Security Group EC2 Public Subnet" width="800" height="154"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para Instancia EC2 con acceso interno (sin acceso desde internet), desplegar en &lt;strong&gt;Subred Privada 192.168.0.32/27&lt;/strong&gt;, crear y asociar Security Group con regla de entrada que permitan comunicaciones desde Security Group de la instancia EC2 en la &lt;strong&gt;Subred Publica 192.168.0.0/27&lt;/strong&gt; por el protocolo TCP y puerto 22.&lt;br&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%2Fu1bix9tl23xqlszsmw3r.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%2Fu1bix9tl23xqlszsmw3r.png" alt="Security Group EC2 Private Subnet" width="800" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para Instancia RDS con acceso interno (sin acceso desde internet), desplegar en &lt;strong&gt;Subred Privada 192.168.0.32/27&lt;/strong&gt;, crear y asociar Security Group con reglas de entrada que permitan comunicaciones desde Security Group de la instancia EC2 en la &lt;strong&gt;Subred Publica 192.168.0.0/27&lt;/strong&gt; y el Security Group de la instancia EC2 en la &lt;strong&gt;Subred Privada 192.168.0.32/27&lt;/strong&gt;, ambos por el protocolo TCP y puerto 3306.&lt;br&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%2Fg19gtkq0p51c6a3rstdq.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%2Fg19gtkq0p51c6a3rstdq.png" alt="Security Group RDS Private Subnet" width="800" height="153"&gt;&lt;/a&gt;&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;La instancia EC2 en &lt;strong&gt;Subred Publica&lt;/strong&gt; es &lt;strong&gt;Bastion Host&lt;/strong&gt; (Puente) para conectar a las instancias EC2 y RDS en &lt;strong&gt;Subred Privada&lt;/strong&gt; sin acceso desde internet.&lt;/p&gt;

&lt;h2&gt;
  
  
  NAT Instance &amp;amp; NAT Gateway
&lt;/h2&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%2F1xj9toa1gp3x574bxzue.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%2F1xj9toa1gp3x574bxzue.png" alt="NAT" width="792" height="702"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tipo:&lt;/strong&gt; Comunicaciones&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alcance:&lt;/strong&gt; Acceso a Internet para las instancias que se encuentran en &lt;strong&gt;Subred privada&lt;/strong&gt; (sin acceso a interne) por medio del cambio de direcciones ip. Toma la dirección ip de los paquetes de comunicaciones enviados por las instancias y las reemplaza con la dirección ip de la NAT.&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NAT Instance:&lt;/strong&gt; Es una instancia EC2 con imagen de Maquina Amazon (AMI) preconfigurada, se despliega en subred pública con dirección ip publica o elástica. Ancho de banda depende del ancho de banda de la instancia EC2.&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NAT Gateway:&lt;/strong&gt; Es un servicio NAT administrado por AWS, con alta disponibilidad y dirección ip elástica. Escala hasta 45GB de ancho de banda. Permite comunicaciones hacia internet, entre VPCs y entre VPC y redes corporativas.&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limites NAT Instance:&lt;/strong&gt; Aplican los límites de instancias EC2.&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limites NAT Gateway:&lt;/strong&gt; Hasta 5 NAT Gateway por zona de disponibilidad de la región AWS. Pude ajustar el límite por medio de una solicitud a soporte AWS.&lt;br&gt;
   &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ejemplo:&lt;/strong&gt;&lt;br&gt;
  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NAT Instance:&lt;/strong&gt; : En &lt;strong&gt;Subred Publica 192.168.0.0/27&lt;/strong&gt; desplegamos instancia EC2 con imagen NAT. &lt;/p&gt;

&lt;p&gt;En Route Table de la &lt;strong&gt;Subred Privada 192.168.0.32/27&lt;/strong&gt;, agregamos regla de enrutamiento hacía NAT instance cuando el destino es internet.&lt;br&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%2Flhtrc5whsv7tev5lwk06.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%2Flhtrc5whsv7tev5lwk06.png" alt="Route Table Private Subnet" width="800" height="175"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;NAT Gateway:&lt;/strong&gt; Se crea NAT Gateway y se despliega en &lt;strong&gt;Subred Publica 192.168.0.0/27&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;En Route Table de la &lt;strong&gt;Subred Privada 192.168.0.32/27&lt;/strong&gt;, agregamos regla de enrutamiento hacía NAT instance cuando el destino es internet.&lt;br&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%2F7mkfd0k7w7ukfixuswkf.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%2F7mkfd0k7w7ukfixuswkf.png" alt="Route Table Private Subnet" width="800" height="174"&gt;&lt;/a&gt;&lt;br&gt;
 &lt;/p&gt;

&lt;p&gt;Actualizar NACL de &lt;strong&gt;Subred Privada 192.168.0.32/27&lt;/strong&gt; con regla de entrada y salida que permitan las comunicaciones hacia Internet (Peticiones y Respuestas).&lt;br&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%2Ft1nk15sptcaadly23p6k.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%2Ft1nk15sptcaadly23p6k.png" alt="NACL Inbound Private Subnet" width="800" height="173"&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%2Fbqgqbbelbtmy0s23osjx.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%2Fbqgqbbelbtmy0s23osjx.png" alt="NACL Outbound Private Subnet" width="800" height="175"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Route Table y NACL de &lt;strong&gt;Subred Publica 192.168.0.0/27&lt;/strong&gt; sin cambios.&lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusiones
&lt;/h2&gt;

&lt;p&gt;En este post vimos los principales servicios de redes y seguridad de aws para construir redes y controlar las comunicaciones entre los sistemas desplegados en las red. También construimos solución para proteger las instancias restringiendo el acceso desde y hacia internet con Firewall de red e instancia y permitiendo la conexión por medio de Bastion Host y NAT.&lt;br&gt;
 &lt;/p&gt;

&lt;h2&gt;
  
  
  Referencias
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html" rel="noopener noreferrer"&gt;VPC Limites&lt;/a&gt;&lt;br&gt;
&lt;a href="https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-comparison.html" rel="noopener noreferrer"&gt;Comparación NAT&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>networking</category>
    </item>
    <item>
      <title>DynamoDB Basics, Part 2</title>
      <dc:creator>Jose Luis</dc:creator>
      <pubDate>Tue, 04 May 2021 15:06:49 +0000</pubDate>
      <link>https://forem.com/aws-builders/dynamodb-basics-1oe0</link>
      <guid>https://forem.com/aws-builders/dynamodb-basics-1oe0</guid>
      <description>&lt;p&gt;Continuing with the post on &lt;a href="https://dev.to/aws-builders/dynamodb-basics-part-1-4e4i"&gt;DynamoDB Basics, Part 1&lt;/a&gt;, we are going to see the operations you can execute over the DynamoDB table and the features you can use the improve the performance and availability, let's start.&lt;/p&gt;

&lt;h1&gt;
  
  
  Read operations
&lt;/h1&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%2Fvho4fbqq0ycpx1wo6h8b.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%2Fvho4fbqq0ycpx1wo6h8b.png" alt=" " width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;There are two operations, Query and Scan to perform over the main table or secondary Indexes, the detail of each operation are:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Query:&lt;/strong&gt; You need the partition key to choose the partition and execute the operation over it. You can use the sort key and add filters to get specific data. It reads multiple items that have the same partition key and satisfies the sort key constraint when it is present. The filters are constraints over the attributes and these are validated after the query operation.&lt;/p&gt;

&lt;p&gt;A single Query operation will read up 1 MB of data, you can set the maximum number of items also. When the query result size is more than 1 MB the Query results are divided into pages of data that are 1 MB in size or less. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Scan:&lt;/strong&gt; You don’t need the partition key to perform it, you can add filters to define constraints over the attributes including the primary key (PK + SK) but these are validated after the scan operations which means it is an expensive operation because read all items in each partition and then apply the filters. When the total number of scanned items exceeds the maximum dataset size limit of 1 MB, the scan stops and the results are returned to the user as a LastEvaluatedKey value to continue the scan in a subsequent operation. &lt;/p&gt;

&lt;h1&gt;
  
  
  Write operations
&lt;/h1&gt;

&lt;p&gt;Create, Update, and Delete are operations you can execute ONLY over the DynamoDB main table. If the table has a secondary index, then DynamoDB performs the write operation over the index. When you create an item with an existing primary key DynamoDB updates the item in the table, you can add a conditional to execute it only if there is not already an item with the same primary key. You cannot update the primary key of one item, you need first delete it and create with the new primary key, DynamoDB does not support updating the primary key in one shot.&lt;/p&gt;

&lt;h1&gt;
  
  
  Provisioned Capacity
&lt;/h1&gt;

&lt;p&gt;You can set up on-demand provisioned capacity to pay just for the write and query operations you perform or provisioned to specify the number of data reads and writes per second that you require for your application. On-demand is more expensive than provisioned, select provisioned to save on throughput costs if you can reliably estimate your application's throughput requirements. Both are using the Write Capacity Units (WCU) and Read Capacity Unit (RCU) to execute operations over DynamoDB main table and index.&lt;/p&gt;

&lt;h1&gt;
  
  
  Read Capacity Unit (RCU)
&lt;/h1&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%2F0cjygwcyc58j60ptb1px.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%2F0cjygwcyc58j60ptb1px.png" alt=" " width="602" height="342"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All the read operations over the DynamoDB main table and secondary indexes spend read capacity units, this a read per second. The RCU is shared between the main table and local secondary index, for the global secondary index you can set up RCU. One RCU represents one strongly consistent read request per second, or two eventually consistent read requests per second, for an item up to 4 KB in size. Two RCU represent one transactional read for items up to 4 KB. If you need to read an item that is larger than 4 KB, DynamoDB needs additional read request units.&lt;/p&gt;

&lt;p&gt;The results returned by the Query operation could be item collection or single item depending on the query expression used, in both case the number of RCU depends on the size of the result not the number of items, for example, query operation using the partition key return 4 items (all with the same partition key), each item size is 1 KB, total size is 4 KB for strong consistent read you need 1 RCU or half for eventually consistent read requests&lt;/p&gt;

&lt;h1&gt;
  
  
  Write Capacity Unit (WCU)
&lt;/h1&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%2Fadnum9ualrzex053bs6b.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%2Fadnum9ualrzex053bs6b.png" alt=" " width="602" height="412"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All the write operations are over the DynamoDB main table only, DynamoDB executes write operations over secondary indexes automatically. One WCU represents one write per second for an item up to 1 KB in size. If you need to write an item that is larger than 1 KB, DynamoDB must consume additional write capacity units. The total number of write capacity units required depends on the item size not the number of items impacted. For example, if your item size is 2 KB, you require 2 write capacity units to sustain one write request per second. DynamoDB spends more WCU when need to project the item attributes from the main table to the secondary index, you will need more WCU.&lt;/p&gt;

&lt;h1&gt;
  
  
  Eventually Consistent Reads
&lt;/h1&gt;

&lt;p&gt;When you read data from a DynamoDB table, the response might not reflect the results of a recently completed write operation. The response might include some stale data. If you repeat your read request after a short time, the response should return the latest data. By default, the read operations use eventually consistent read. The read operation with eventually consistently spends less RCU, you can perform two reads per second for items up to 4KB.&lt;/p&gt;

&lt;h1&gt;
  
  
  Strongly Consistent Reads
&lt;/h1&gt;

&lt;p&gt;When you request a strongly consistent read, DynamoDB returns a response with the most up-to-date data, reflecting the updates from all prior write successful operations. Strongly consistent reads use more throughput capacity than eventually consistent reads, you can perform 1 request per second for items up to 4KB, and may have higher latency than eventually consistent reads.&lt;/p&gt;

&lt;h1&gt;
  
  
  Transactional
&lt;/h1&gt;

&lt;p&gt;You can group multiple actions together and submit them as a single all-or-nothing TransactWriteItems or TransactGetItems operation.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TransactWriteItems&lt;/strong&gt; is a synchronous and idempotent write operation that groups up to 25 write actions in a single all-or-nothing operation. These actions can target up to 25 distinct items in one or more DynamoDB tables within the same AWS account and in the same Region. The aggregate size of the items in the transaction cannot exceed 4 MB.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TransactGetItems&lt;/strong&gt; is a synchronous read operation that groups up to 25 Get actions together. These actions can target up to 25 distinct items in one or more DynamoDB tables within the same AWS account and Region. The aggregate size of the items in the transaction can't exceed 4 MB.&lt;/p&gt;

&lt;h1&gt;
  
  
  Global Table
&lt;/h1&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%2Fo64768iks5e71pcikigl.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%2Fo64768iks5e71pcikigl.png" alt=" " width="722" height="422"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;DynamoDB replicates the data between the availability zone of the aws region, to replicate the data between the aws region you need Global Table. DynamoDB replicates write operations from the main table and secondary index from one region to another region to improve the availability of your data. Replicate data between regions and also spend Write Capacity Unit.&lt;/p&gt;

&lt;h1&gt;
  
  
  Stream
&lt;/h1&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%2F6vto4k58bmi6hbjdwcvs.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%2F6vto4k58bmi6hbjdwcvs.png" alt=" " width="455" height="192"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;All the write operations over DynamoDB table generate a stream with detail of the old and new items, or only old or new items, you can choose. Behind AWS DynamoDB table there is a Kinesis Data Stream managed by AWS where all the stream is going on, so you can integrate the lambda function with the source event stream to read the stream.&lt;/p&gt;

&lt;p&gt;The above elements are the most important, and most of them are tools used to DynamoDB design data models and build client applications to perform read and write operations, hope this post can help you to understand DynamoDB.&lt;/p&gt;

&lt;h1&gt;
  
  
  References
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;DynamoDB Developer Guide &lt;a href="https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;DynamoDB Actions &lt;a href="https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Operations_Amazon_DynamoDB.html" rel="noopener noreferrer"&gt;https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Operations_Amazon_DynamoDB.html&lt;/a&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Alex DeBrie Post The What, Why, and When of Single-Table Design with DynamoDB &lt;a href="https://www.alexdebrie.com/posts/dynamodb-single-table/" rel="noopener noreferrer"&gt;https://www.alexdebrie.com/posts/dynamodb-single-table/&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>aws</category>
      <category>dynamodb</category>
      <category>nosql</category>
    </item>
  </channel>
</rss>
