<?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: Robert Orozco </title>
    <description>The latest articles on Forem by Robert Orozco  (@robertdev).</description>
    <link>https://forem.com/robertdev</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%2F3224207%2Fd35db442-3762-4541-8a7b-402782e45d38.png</url>
      <title>Forem: Robert Orozco </title>
      <link>https://forem.com/robertdev</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/robertdev"/>
    <language>en</language>
    <item>
      <title>DAY 7 - TERRAFORM</title>
      <dc:creator>Robert Orozco </dc:creator>
      <pubDate>Tue, 07 Apr 2026 14:22:40 +0000</pubDate>
      <link>https://forem.com/robertdev/day-7-terraform-315d</link>
      <guid>https://forem.com/robertdev/day-7-terraform-315d</guid>
      <description>&lt;p&gt;🗂️ Day 7 of the 30-Day Terraform Challenge — state isolation deep dive. Implemented both Terraform Workspaces and File Layout isolation for multi-environment deployments. Knowing when to use each one is what separates good infrastructure from great infrastructure. #30DayTerraformChallenge #TerraformChallenge #Terraform #IaC #DevOps #AWSUserGroupKenya #EveOps&lt;/p&gt;

&lt;p&gt;LAB – PART 1&lt;br&gt;
First, I created three workspaces named dev, staging and production.&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%2F0ssdv3fi2zow4w205ona.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%2F0ssdv3fi2zow4w205ona.png" alt=" " width="800" height="114"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Then, I switched to the dev workspace and ran terraform apply. The resource was successfully 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%2Fumruztq9zogu3r4y1ifo.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%2Fumruztq9zogu3r4y1ifo.png" alt=" " width="800" height="216"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, I switched to the staging workspace and executed terraform plan to validate the configuration.&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%2Fgzjt1hnhjyevpta4v9p5.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%2Fgzjt1hnhjyevpta4v9p5.png" alt=" " width="800" height="68"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The (EC2) resource was created successfully with instance type “t3.small”&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%2F7zepkmjzg54ic9dtuklf.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%2F7zepkmjzg54ic9dtuklf.png" alt=" " width="800" height="31"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Now, while working in the staging environment I’ll destroy the resource.&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%2Frze2h7u0xc43l9usabas.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%2Frze2h7u0xc43l9usabas.png" alt=" " width="800" height="191"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Only the web-staging machine was destroyed.&lt;/p&gt;

&lt;p&gt; &lt;br&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%2Fk9whw26mbv7ouvzoz4rd.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%2Fk9whw26mbv7ouvzoz4rd.png" alt=" " width="800" height="55"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;LAB – PART 2 &lt;br&gt;
ISOLATION VIA FILE LAYOUTS&lt;br&gt;
First, I created bootstrap resources. S3 Resource to save the terraform.state of dev and production environment.&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%2Fmsede507sqo4qfro2n5u.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%2Fmsede507sqo4qfro2n5u.png" alt=" " 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%2Fuma6zvaav75qoy49owfb.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%2Fuma6zvaav75qoy49owfb.png" alt=" " width="800" height="241"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, I configure the backends files to set the parameter of the S3 name. I pushed terraform plan and terraform apply.&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%2Ffu0022fpaxn4o6if9cjo.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%2Ffu0022fpaxn4o6if9cjo.png" alt=" " width="800" height="313"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The resource terraform.tfstate was successfully created in S3.&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%2Fplhp0qtbpgatdfes2ik7.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%2Fplhp0qtbpgatdfes2ik7.png" alt=" " width="800" height="239"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next, I pushed terraform apply to create the terraform.tfstate file for production environment.&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%2F60z1cpxgenlpulk18rz3.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%2F60z1cpxgenlpulk18rz3.png" alt=" " width="800" height="351"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>devops</category>
      <category>terraform</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>DAY 5: Lab: Benefits of State</title>
      <dc:creator>Robert Orozco </dc:creator>
      <pubDate>Mon, 06 Apr 2026 15:18:04 +0000</pubDate>
      <link>https://forem.com/robertdev/day-5-lab-benefits-of-state-4fl4</link>
      <guid>https://forem.com/robertdev/day-5-lab-benefits-of-state-4fl4</guid>
      <description>&lt;p&gt;Today, I performed a cluster web deployment in terraform.&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%2F1kujcnk0is5udw2g5g09.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%2F1kujcnk0is5udw2g5g09.png" alt=" " width="800" height="131"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The answer was it.&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%2Fzglhl7vghbi56iyyfjcy.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%2Fzglhl7vghbi56iyyfjcy.png" alt=" " width="678" height="184"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Take a minute to analyze:&lt;/p&gt;

&lt;p&gt;Experiment 1 — Manual state tampering: Manually edit a value in terraform.tfstate&lt;/p&gt;

&lt;p&gt;Change instance type&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%2Fv3xa1g9w913ntkuuzh75.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%2Fv3xa1g9w913ntkuuzh75.png" alt=" " width="621" height="139"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Run terraform plan to see the changes: No changes are needed!&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%2Fxp1f3rvmn0j028rjothw.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%2Fxp1f3rvmn0j028rjothw.png" alt=" " width="800" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Experiment 2 — State drift: In the AWS Console, manually change a tag on one of your EC2 instances. Run terraform plan without touching your code. Observe how Terraform detects the drift and what it proposes to do about it.&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%2F0t2h767nisxlq00texfs.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%2F0t2h767nisxlq00texfs.png" alt=" " width="800" height="166"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Terraform detech the change:&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%2Fu9556pzsfkfuikfg88wj.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%2Fu9556pzsfkfuikfg88wj.png" alt=" " width="800" height="277"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>devops</category>
    </item>
    <item>
      <title>What is Infrastructure as Code and Why It's Transforming DevOps</title>
      <dc:creator>Robert Orozco </dc:creator>
      <pubDate>Thu, 02 Apr 2026 13:22:23 +0000</pubDate>
      <link>https://forem.com/robertdev/what-is-infrastructure-as-code-and-why-its-transforming-devops-4j2g</link>
      <guid>https://forem.com/robertdev/what-is-infrastructure-as-code-and-why-its-transforming-devops-4j2g</guid>
      <description>&lt;p&gt;&lt;strong&gt;What IaC is and the problem it solves&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Infrastructure as Code (IaC) is the practice of managing and provisioning infrastructure (servers, networks, databases, etc.) using code instead of manual processes.&lt;/p&gt;

&lt;p&gt;It solves several key problems:&lt;/p&gt;

&lt;p&gt;Manual errors → reduces human mistakes from repetitive tasks&lt;br&gt;
Inconsistency (configuration drift) → ensures all environments are identical&lt;br&gt;
Slow deployments → enables fast, automated provisioning&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The difference between declarative and imperative approaches&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imperative approach&lt;br&gt;
You define how to achieve a result step by step.&lt;br&gt;
Example: install packages, configure files, start services manually in sequence.&lt;/p&gt;

&lt;p&gt;Declarative approach&lt;br&gt;
You define what the final desired state should be, and the tool figures out how to achieve it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Terraform is worth learning&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Terraform is worth learning because:&lt;/p&gt;

&lt;p&gt;It allows you to manage infrastructure across multiple cloud providers (AWS, Azure, GCP, etc.)&lt;/p&gt;

&lt;p&gt;It uses a simple declarative language, making it easier to understand and maintain&lt;/p&gt;

&lt;p&gt;It enables automation and scalability, which are essential in DevOps&lt;/p&gt;

&lt;p&gt;It integrates well with modern tools like CI/CD, Docker, and Kubernetes&lt;/p&gt;

&lt;p&gt;It is widely adopted and in high demand in the industry&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Your personal goals for this 30-day challenge&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I want to master the tool and improve my skills.&lt;/p&gt;

</description>
      <category>devops</category>
      <category>terraform</category>
    </item>
    <item>
      <title>INSTALAR K8S EN DEBIAN 13</title>
      <dc:creator>Robert Orozco </dc:creator>
      <pubDate>Fri, 09 Jan 2026 17:30:56 +0000</pubDate>
      <link>https://forem.com/robertdev/instalar-k8s-en-debian-13-4o1a</link>
      <guid>https://forem.com/robertdev/instalar-k8s-en-debian-13-4o1a</guid>
      <description>&lt;h2&gt;
  
  
  ¿Qué es Kubernetes?
&lt;/h2&gt;

&lt;p&gt;Es una plataforma de orquestación que permite automatizar el despliegue, scaling y gestión de aplicaciones contenerizadas.&lt;/p&gt;

&lt;p&gt;🧩 Paso 1: Preparar el Kernel y la Red&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="c"&gt;#Deshabilitar Swap&lt;/span&gt;
swapoff &lt;span class="nt"&gt;-a&lt;/span&gt;
&lt;span class="c"&gt;#Comenta swapoff en /etc/fstab&lt;/span&gt;
nano /etc-fstab

&lt;span class="c"&gt;#Habilita modulos de kernel&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;modprobe br_netfilter
&lt;span class="nb"&gt;sudo &lt;/span&gt;modprobe overlay
lsmod | &lt;span class="nb"&gt;grep &lt;/span&gt;br_netfilter
lsmod | &lt;span class="nb"&gt;grep &lt;/span&gt;overlay

&lt;span class="c"&gt;#Hacer los cambios persistentes&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; | sudo tee /etc/modules-load.d/k8s.conf
overlay
br_netfilter
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;#Configuración de parámetros de red&lt;/span&gt;
&lt;span class="nb"&gt;cat&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class="no"&gt;EOF&lt;/span&gt;&lt;span class="sh"&gt; | sudo tee /etc/sysctl.d/k8s.conf
net.bridge.bridge-nf-call-iptables  = 1
net.bridge.bridge-nf-call-ip6tables = 1
net.ipv4.ip_forward                 = 1
&lt;/span&gt;&lt;span class="no"&gt;EOF

&lt;/span&gt;&lt;span class="c"&gt;#Verificar las configuraciones&lt;/span&gt;
&lt;span class="nb"&gt;sudo &lt;/span&gt;sysctl &lt;span class="nt"&gt;--system&lt;/span&gt;
sysctl net.ipv4.ip_forward
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧩 Paso 2: Instalar los CNI Plugins&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;wget https://github.com/containernetworking/plugins/releases/download/v1.8.0/cni-plugins-linux-amd64-v1.8.0.tgz

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"ab3bda535f9d90766cccc90d3dddb5482003dd744d7f22bcf98186bf8eea8be6 cni-plugins-linux-amd64-v1.8.0.tgz"&lt;/span&gt; | &lt;span class="nb"&gt;sha256sum&lt;/span&gt; &lt;span class="nt"&gt;--check&lt;/span&gt;

&lt;span class="nb"&gt;sudo mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; /opt/cni/bin
&lt;span class="nb"&gt;sudo tar &lt;/span&gt;Cxzvf /opt/cni/bin cni-plugins-linux-amd64-v1.8.0.tgz
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧩 Paso 3: Instalar el ContainerRuntime (Puede ser CRI-O o Containerd)&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="nv"&gt;KUBERNETES_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;v1.32
&lt;span class="nv"&gt;CRIO_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;v1.32

&lt;span class="c"&gt;#Instala curl y actualiza&lt;/span&gt;
apt-get update
apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; curl

&lt;span class="c"&gt;#Añade los repositorios de Kubernetes&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://pkgs.k8s.io/core:/stable:/&lt;span class="nv"&gt;$KUBERNETES_VERSION&lt;/span&gt;/deb/Release.key | gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /etc/apt/keyrings/kubernetes-apt-keyring.gpg

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/&lt;/span&gt;&lt;span class="nv"&gt;$KUBERNETES_VERSION&lt;/span&gt;&lt;span class="s2"&gt;/deb/ /"&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; /etc/apt/sources.list.d/kubernetes.list

&lt;span class="c"&gt;#Añade los repositorios de CRI-O&lt;/span&gt;
curl &lt;span class="nt"&gt;-fsSL&lt;/span&gt; https://download.opensuse.org/repositories/isv:/cri-o:/stable:/&lt;span class="nv"&gt;$CRIO_VERSION&lt;/span&gt;/deb/Release.key | gpg &lt;span class="nt"&gt;--dearmor&lt;/span&gt; &lt;span class="nt"&gt;-o&lt;/span&gt; /etc/apt/keyrings/cri-o-apt-keyring.gpg

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;"deb [signed-by=/etc/apt/keyrings/cri-o-apt-keyring.gpg] https://download.opensuse.org/repositories/isv:/cri-o:/stable:/&lt;/span&gt;&lt;span class="nv"&gt;$CRIO_VERSION&lt;/span&gt;&lt;span class="s2"&gt;/deb/ /"&lt;/span&gt; | &lt;span class="nb"&gt;tee&lt;/span&gt; /etc/apt/sources.list.d/cri-o.list

&lt;span class="c"&gt;#Instala los paquetes&lt;/span&gt;
apt-get update
apt-get &lt;span class="nb"&gt;install&lt;/span&gt; &lt;span class="nt"&gt;-y&lt;/span&gt; cri-o kubelet kubeadm kubectl
&lt;span class="nb"&gt;sudo &lt;/span&gt;apt-mark hold kubelet kubeadm kubectl
&lt;span class="nb"&gt;sudo &lt;/span&gt;systemctl &lt;span class="nb"&gt;enable&lt;/span&gt; &lt;span class="nt"&gt;--now&lt;/span&gt; kubelet

&lt;span class="c"&gt;#Inicia el servicio CRI-O&lt;/span&gt;
systemctl start crio.service
systemctl &lt;span class="nb"&gt;enable &lt;/span&gt;crio.service

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

&lt;/div&gt;



&lt;p&gt;🧩 Paso 4: Inicializa el Cluster&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;kubeadm init &lt;span class="nt"&gt;--pod-network-cidr&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;10.244.0.0/16
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧩 Paso 5: Copia la configuración de Kubectl para la gestión del cluster.&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;mkdir&lt;/span&gt; &lt;span class="nt"&gt;-p&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.kube
&lt;span class="nb"&gt;sudo cp&lt;/span&gt; &lt;span class="nt"&gt;-i&lt;/span&gt; /etc/kubernetes/admin.conf &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.kube/config
&lt;span class="nb"&gt;sudo chown&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;-u&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:&lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;id&lt;/span&gt; &lt;span class="nt"&gt;-g&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;$HOME&lt;/span&gt;/.kube/config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧩 Paso 6: Instala Flannel&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;kubectl apply &lt;span class="nt"&gt;-f&lt;/span&gt; https://github.com/flannel-io/flannel/releases/latest/download/kube-flannel.yml
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🧩 Paso 7: Une el node01 al cluster&lt;/p&gt;

</description>
      <category>kubernetes</category>
      <category>debian</category>
      <category>k8s</category>
      <category>linux</category>
    </item>
    <item>
      <title>Despliegue de una aplicación en AWS usando ECS + ECR</title>
      <dc:creator>Robert Orozco </dc:creator>
      <pubDate>Wed, 19 Nov 2025 21:40:16 +0000</pubDate>
      <link>https://forem.com/robertdev/despliegue-de-una-aplicacion-en-aws-usando-ecs-ecr-j9p</link>
      <guid>https://forem.com/robertdev/despliegue-de-una-aplicacion-en-aws-usando-ecs-ecr-j9p</guid>
      <description>&lt;p&gt;En este post te cuento cómo desplegué una aplicación en AWS usando Elastic Container Service (ECS) y Elastic Container Registry (ECR).&lt;/p&gt;

&lt;p&gt;👉 La idea es: contenerizamos la app, subimos la imagen, armamos un clúster ECS y la aplicación queda corriendo en ECS (Con EC2)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ARQUITECTURA&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ibnsp5askbmyw07zs0f.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%2F2ibnsp5askbmyw07zs0f.png" alt=" " width="800" height="779"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🐳 1. Preparar la instancia EC2 para construir la imagen&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Primero lanzamos una EC2 con Amazon Linux 2023 para preparar la imagen que luego enviaremos a ECR.&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%2Ft72p04o3dpn9dtoq6lex.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%2Ft72p04o3dpn9dtoq6lex.png" alt=" " width="800" height="213"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔧 Instalar Docker y Git&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo dnf update -y
sudo yum install -y docker
sudo systemctl enable --now docker
sudo systemctl status docker
sudo yum install -y git
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F60h10r4g3e4xqgs3g4ic.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%2F60h10r4g3e4xqgs3g4ic.png" alt=" " width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📥 Clonar el repositorio y construye la imagen.&lt;/p&gt;

&lt;p&gt;Clona la carpeta 4 del repositorio: &lt;a href="https://github.com/NotHarshhaa/DevOps-Projects/tree/master/DevOps-Project-04" rel="noopener noreferrer"&gt;https://github.com/NotHarshhaa/DevOps-Projects/tree/master/DevOps-Project-04&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;git clone &amp;lt;URL-del-proyecto&amp;gt;
cd &amp;lt;directorio&amp;gt;
docker build -t hello-world-django-app:version-1 .
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Verifica que la imagen existe:&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%2Fsozu7s3z319mj6896ap6.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%2Fsozu7s3z319mj6896ap6.png" alt=" " width="800" height="80"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📦 2. Crear el repositorio en ECR&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;En la consola de AWS:&lt;/p&gt;

&lt;p&gt;ECR → Repositories → Create repository&lt;/p&gt;

&lt;p&gt;Ponle un nombre como aplicaciones ✔.&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%2F51f81bz4zrslohch63qf.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%2F51f81bz4zrslohch63qf.png" alt=" " width="800" height="263"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Este repo será donde guardaremos nuestras imágenes Docker para que ECS pueda consumirlas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔐 3. Rol IAM para permitir que EC2 interactúe con ECR&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;1️⃣ Crear el rol&lt;/p&gt;

&lt;p&gt;IAM → Roles → Create Role → EC2&lt;br&gt;
Agrega la politica:&lt;br&gt;
AmazonEC2ContainerRegistryPowerUser (push + pull)&lt;br&gt;
Nombre sugerido: ec2-ecr-role&lt;/p&gt;

&lt;p&gt;2️⃣ Asignar el rol a tu instancia EC2&lt;/p&gt;

&lt;p&gt;EC2 → Instance → Actions → Security → Modify IAM role&lt;br&gt;
Selecciona ec2-ecr-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%2Focil8ezu53mkjvbb4w93.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%2Focil8ezu53mkjvbb4w93.png" alt=" " width="800" height="307"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;🔑 4. Login en ECR + Push de la imagen&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
En la EC2 define estas variables:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)
AWS_REGION=us-east-2
ECR_URI=${ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com

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

&lt;/div&gt;



&lt;p&gt;🔐 Loguearte en ECR&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;aws ecr get-login-password --region $AWS_REGION \
  | docker login --username AWS --password-stdin $ECR_URI
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🏷 Etiquetar la imagen&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker tag hello-world-django-app:version-1 $ECR_URI/aplicaciones:version-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;🚀 Subir la imagen (push)&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;docker push $ECR_URI/aplicaciones:version-1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F35z6qps48fhpfdt9oh1v.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%2F35z6qps48fhpfdt9oh1v.png" alt=" " width="800" height="235"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;¡Imagen lista en ECR! 🐳📦&lt;/p&gt;

&lt;p&gt;☁️ 5. Crear el clúster ECS&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%2F72iopxj4706d35gux6jb.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%2F72iopxj4706d35gux6jb.png" alt=" " width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔧 Configuración del clúster&lt;/strong&gt;&lt;br&gt;
Selecciona Fargate e instancias EC2 autoadministradas&lt;br&gt;
Crea un Auto Scaling Group “bajo demanda” (modo prueba: 1 instancia)&lt;br&gt;
Selecciona el rol básico de ECS&lt;br&gt;
Elige dos subredes mínimo (ej: us-east-2a y us-east-2b)&lt;br&gt;
Crea un SG llamado ecs-sg&lt;/p&gt;

&lt;p&gt;📑 6. Definición de tarea (Task Definition)&lt;/p&gt;

&lt;p&gt;Aquí le decimos a ECS qué contenedor correr, cuánta memoria, puertos, etc.&lt;/p&gt;

&lt;p&gt;⚙️ Configuración principal&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%2Ftdeqpezgtqujfsloe1fe.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%2Ftdeqpezgtqujfsloe1fe.png" alt=" " width="800" height="304"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nombre: app-task&lt;br&gt;
Infraestructura: EC2&lt;br&gt;
Modo de red: bridge&lt;br&gt;
CPU: 0.5 vCPU&lt;br&gt;
Memoria: 1 GB&lt;br&gt;
Rol de ejecución: el de ECS&lt;/p&gt;

&lt;p&gt;📦 Contenedor&lt;br&gt;
Nombre: django-app&lt;br&gt;
Image URI: selecciona la imagen que subiste a ECR 🐳&lt;br&gt;
Puertos: 8000:8000&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯 7. Crear el servicio ECS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para que la app quede corriendo de forma continua:&lt;/p&gt;

&lt;p&gt;ECS → Cluster → Create Service&lt;br&gt;
Familia de tareas: app-task&lt;br&gt;
Launch type: EC2&lt;br&gt;
Número de tareas: 1&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🌐 8. Probar la app en el navegador&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsym9sdcpcsnoq26iaqqv.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%2Fsym9sdcpcsnoq26iaqqv.png" alt=" " width="800" height="386"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con esta arquitectura se ha desplegada una aplicacion mediante el uso de ECR y ECS para orquestar contenedores.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>devops</category>
      <category>ecs</category>
      <category>ecr</category>
    </item>
    <item>
      <title>Como instalar certificados SSL en Cisco C8000V</title>
      <dc:creator>Robert Orozco </dc:creator>
      <pubDate>Tue, 03 Jun 2025 17:52:20 +0000</pubDate>
      <link>https://forem.com/robertdev/como-instalar-certificados-ssl-en-cisco-c8000v-5e8c</link>
      <guid>https://forem.com/robertdev/como-instalar-certificados-ssl-en-cisco-c8000v-5e8c</guid>
      <description>&lt;p&gt;Este procedimiento está basado en la siguiente guía oficial de Webex:&lt;br&gt;
🔗 &lt;a href="https://help.webex.com/en-us/article/d68vi1/Site-survivability-for-Webex-Calling#task_T89" rel="noopener noreferrer"&gt;https://help.webex.com/en-us/article/d68vi1/Site-survivability-for-Webex-Calling#task_T89&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;1️⃣ Accede al equipo Cisco C8000V:&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;enable
&lt;/span&gt;configure terminal
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;2️⃣ Genera la clave RSA privada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;crypto key generate rsa general-keys label webex-sgw exportable modulus 2048
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;3️⃣ Configura el trustpoint:&lt;br&gt;
Reemplaza &lt;strong&gt;&lt;/strong&gt; por el FQDN de tu gateway (por ejemplo: &lt;strong&gt;migsbc.ejemplo.com&lt;/strong&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;crypto pki trustpoint webex-sgw 
 enrollment terminal 
 fqdn &amp;lt;gateway_fqdn&amp;gt; 
 subject-name &lt;span class="nv"&gt;cn&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&amp;lt;gateway_fqdn&amp;gt;
 subject-alt-name &amp;lt;gateway_fqdn&amp;gt;
 revocation-check crl 
 rsakeypair webex-sgw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;4️⃣ Genera el CSR (Certificate Signing Request):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;crypto pki enroll webex-sgw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Copialo con el siguiente formato:&lt;br&gt;
-----BEGIN CERTIFICATE REQUEST-----&lt;br&gt;
 Insert CSR here&lt;br&gt;
-----END CERTIFICATE REQUEST-----&lt;/p&gt;

&lt;p&gt;5️⃣ Solicita el certificado SSL: &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%2F78f3e9h0fgffiascenwv.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%2F78f3e9h0fgffiascenwv.png" alt="Image description" width="666" height="394"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;6️⃣ Une los certificados intermedios y el root:&lt;br&gt;
Concatena en orden correcto los certificados intermedios y el certificado raíz provistos por la CA, tal como se indica:&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;cat &lt;/span&gt;SectigoPublicServerAuthenticationCADVR36.crt SectigoPublicServerAuthenticationRootR46_USERTrust.crt USERTrustRSACertificationAuthority.crt &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; intermediosv2.crt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;7️⃣ Autentica el trustpoint con la cadena de certificados intermediosv2 que se creó en el paso 6.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;crypto pki authenticate webex-sgw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;8️⃣ Importa el certificado final (emitido por la CA). Copia y pega el contenido del archivo .pem que contiene tu certificado principal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;crypto pki import webex-sgw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;9️⃣ Validaciones finales&lt;br&gt;
Una vez instalado el certificado, realiza las siguientes comprobaciones para validar que todo esté correctamente configurado:&lt;/p&gt;

&lt;p&gt;✅ Verifica el estado del certificado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;show crypto pki certificates webex-sgw
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Verifica las claves RSA generadas:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;show crypto key mypubkey rsa
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirma que exista una clave con la etiqueta webex-sgw.&lt;/p&gt;

&lt;p&gt;✅ Verifica la configuración HTTPS del router:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;show running-config | include ip http
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Confirma que esté habilitado el servicio HTTPS:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ip http secure-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Si no está habilitado, agrégalo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;configure terminal
ip http secure-server
&lt;span class="nb"&gt;exit&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>ssl</category>
      <category>cisco</category>
      <category>c8000v</category>
    </item>
    <item>
      <title>Automatizar un despliegue en Google Cloud con Terraform</title>
      <dc:creator>Robert Orozco </dc:creator>
      <pubDate>Tue, 03 Jun 2025 06:14:31 +0000</pubDate>
      <link>https://forem.com/robertdev/automatizar-un-despliegue-en-google-cloud-con-terraform-4oga</link>
      <guid>https://forem.com/robertdev/automatizar-un-despliegue-en-google-cloud-con-terraform-4oga</guid>
      <description>&lt;p&gt;Terraform es una poderosa herramienta de infraestructura como código (IaC) que permite crear, modificar y gestionar tu infraestructura de manera segura, repetible y predecible.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TAREA 1️⃣&lt;/strong&gt;: Usar Terraform en Cloud Shell&lt;/p&gt;

&lt;p&gt;Google Cloud Shell ya viene con Terraform instalado. Para verificar la versión, ejecuta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;terraform --version
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📁 Ahora, crea un nuevo directorio de trabajo:&lt;br&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%2Fif2b8l8iv823co0l9otv.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%2Fif2b8l8iv823co0l9otv.png" alt="Image description" width="800" height="185"&gt;&lt;/a&gt;&lt;br&gt;
Abre el editor integrado de Cloud Shell y crea la siguiente estructura de carpetas y archivos:&lt;br&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%2Fkywouvnyz6eexdnazvt7.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%2Fkywouvnyz6eexdnazvt7.png" alt="Image description" width="589" height="353"&gt;&lt;/a&gt;&lt;br&gt;
&lt;strong&gt;🔧 Inicializa Terraform&lt;/strong&gt;&lt;br&gt;
En el archivo provider.tf define el proveedor de Google Cloud:&lt;br&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%2Fqz0s19dd4y3oniql0f7z.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%2Fqz0s19dd4y3oniql0f7z.png" alt="Image description" width="800" height="219"&gt;&lt;/a&gt;&lt;br&gt;
Luego ejecuta:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;terraform&lt;/span&gt; &lt;span class="nx"&gt;init&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;✅ Esto descargará los plugins necesarios y preparará tu entorno de trabajo:&lt;br&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%2Fegrm512zuogj3tdfb8tx.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%2Fegrm512zuogj3tdfb8tx.png" alt="Image description" width="800" height="295"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TAREA 2️⃣&lt;/strong&gt;: Configura los archivos .tf&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Main.tf&lt;/strong&gt;&lt;br&gt;
Este archivo define el recurso principal, en este caso, una instancia de máquina virtual en GCP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"google_compute_instance"&lt;/span&gt; &lt;span class="s2"&gt;"vm_instance"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;         &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"${var.instance_name}"&lt;/span&gt;       &lt;span class="c1"&gt;#Nombre de la instancia&lt;/span&gt;
  &lt;span class="nx"&gt;zone&lt;/span&gt;         &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"${var.instance_zone}"&lt;/span&gt;       &lt;span class="c1"&gt;#Zona donde se desplegará&lt;/span&gt;
  &lt;span class="nx"&gt;machine_type&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"${var.instance_type}"&lt;/span&gt;       &lt;span class="c1"&gt;#Tipo de máquina (e.g. e2-medium)&lt;/span&gt;

  &lt;span class="nx"&gt;boot_disk&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;initialize_params&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;image&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"debian-cloud/debian-11"&lt;/span&gt;        &lt;span class="c1"&gt;#Imagen base del disco (Debian 11)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;network_interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;network&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"${var.instance_network}"&lt;/span&gt;       &lt;span class="c1"&gt;#Red en la que estará la VM&lt;/span&gt;
    &lt;span class="nx"&gt;access_config&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Variables.tf&lt;/strong&gt;&lt;br&gt;
Aquí definimos las variables utilizadas en el módulo de la instancia:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"instance_name"&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"instance_zone"&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"instance_type"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;default&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"e2-micro"&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nx"&gt;variable&lt;/span&gt; &lt;span class="s2"&gt;"instance_network"&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mynetwork.tf&lt;br&gt;
Este archivo define tres componentes fundamentales para tu infraestructura:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Una red VPC en modo automático&lt;/li&gt;
&lt;li&gt;Una regla de firewall que permite tráfico HTTP, SSH, RDP e ICMP.&lt;/li&gt;
&lt;li&gt;Dos máquinas virtuales (instancias) desplegadas en diferentes regiones.
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Crear la red "mynetwork" en modo automático&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"google_compute_network"&lt;/span&gt; &lt;span class="s2"&gt;"mynetwork"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;                    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"mynetwork"&lt;/span&gt;
  &lt;span class="nx"&gt;auto_create_subnetworks&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"true"&lt;/span&gt;  &lt;span class="c1"&gt;# Crea subredes automáticamente en todas las regiones&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Añadir una regla de firewall para permitir tráfico HTTP, SSH, RDP e ICMP&lt;/span&gt;
&lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="s2"&gt;"google_compute_firewall"&lt;/span&gt; &lt;span class="s2"&gt;"mynetwork-allow-http-ssh-rdp-icmp"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;name&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"mynetwork-allow-http-ssh-rdp-icmp"&lt;/span&gt;
  &lt;span class="nx"&gt;network&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;google_compute_network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mynetwork&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;self_link&lt;/span&gt;  &lt;span class="c1"&gt;# Apunta a la red creada&lt;/span&gt;

  &lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;protocol&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"tcp"&lt;/span&gt;
    &lt;span class="nx"&gt;ports&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"22"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"80"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"3389"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# SSH (22), HTTP (80), RDP (3389)&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;allow&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;protocol&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"icmp"&lt;/span&gt;  &lt;span class="c1"&gt;# Permite ping&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nx"&gt;source_ranges&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"0.0.0.0/0"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;  &lt;span class="c1"&gt;# Permite tráfico desde cualquier IP&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Crear la instancia "mynet-vm-1" en la zona us-west1-a usando un módulo&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="s2"&gt;"mynet-vm-1"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;source&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"./instance"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_name&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"mynet-vm-1"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_zone&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"us-west1-a"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_network&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;google_compute_network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mynetwork&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;self_link&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;# Crear la instancia "mynet-vm-2" en la zona asia-south1-b usando el mismo módulo&lt;/span&gt;
&lt;span class="nx"&gt;module&lt;/span&gt; &lt;span class="s2"&gt;"mynet-vm-2"&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;source&lt;/span&gt;           &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"./instance"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_name&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"mynet-vm-2"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_zone&lt;/span&gt;    &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;"asia-south1-b"&lt;/span&gt;
  &lt;span class="nx"&gt;instance_network&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;google_compute_network&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;mynetwork&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;self_link&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;strong&gt;TAREA 3️⃣&lt;/strong&gt;: Despliegue de infraestructura&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight hcl"&gt;&lt;code&gt;&lt;span class="nx"&gt;terraform&lt;/span&gt; &lt;span class="nx"&gt;plan&lt;/span&gt;
&lt;span class="nx"&gt;terraform&lt;/span&gt; &lt;span class="nx"&gt;apply&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;El resultado&lt;br&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%2Fenk2svbs3auu3y49s5ab.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%2Fenk2svbs3auu3y49s5ab.png" alt="Image description" width="800" height="327"&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%2F2wy6lx7ri62fung4mehz.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%2F2wy6lx7ri62fung4mehz.png" alt="Image description" width="800" height="237"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎯 Terraform te da el poder de automatizar tu infraestructura desde código, garantizando entornos replicables, consistentes y fáciles de mantener.&lt;/p&gt;

</description>
      <category>terraform</category>
      <category>googlecloud</category>
      <category>iac</category>
      <category>devops</category>
    </item>
    <item>
      <title>Crear una imágen personalizada en Google Cloud</title>
      <dc:creator>Robert Orozco </dc:creator>
      <pubDate>Mon, 02 Jun 2025 02:39:23 +0000</pubDate>
      <link>https://forem.com/robertdev/crear-una-imagen-personalizada-en-google-cloud-cn3</link>
      <guid>https://forem.com/robertdev/crear-una-imagen-personalizada-en-google-cloud-cn3</guid>
      <description>&lt;p&gt;Hola 👋 En este blog te mostraré cómo crear una imagen personalizada en Google Cloud que podrás reutilizar para desplegar múltiples instancias de forma rápida y consistente.&lt;/p&gt;

&lt;p&gt;1️⃣ Crear una instancia&lt;br&gt;
2️⃣ Configurar los siguientes parámetros:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Nombre: webserver&lt;/li&gt;
&lt;li&gt;Región: us-east1&lt;/li&gt;
&lt;li&gt;Zona: us-east1-c
3️⃣ Disco de arranque (Boot Disk): configurar la opción "Keep boot disk" para que el disco se mantenga incluso si se elimina la instancia.
4️⃣ Usa una etiqueta de red &lt;code&gt;allow-health-check&lt;/code&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%2Fo49l24nwh10ikr98tczt.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%2Fo49l24nwh10ikr98tczt.png" alt="Image description" width="800" height="214"&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%2F7x4yeg8jvwzx9dvxy2w4.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%2F7x4yeg8jvwzx9dvxy2w4.png" alt="Image description" width="800" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;5️⃣ Selecciona la red &lt;code&gt;default&lt;/code&gt;. En IP externa selecciona &lt;code&gt;none&lt;/code&gt;&lt;br&gt;
6️⃣ Conectate por SSH  la instancia y ejecuta:&lt;br&gt;
&lt;code&gt;sudo apt-get update&lt;br&gt;
sudo apt-get install -y apache2&lt;/code&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%2Fdzbpafh4mfexjagauig9.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%2Fdzbpafh4mfexjagauig9.png" alt="Image description" width="800" height="298"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Comprueba que el disco esté configurado como persistente y que el servicio web esté corriendo en la instancia.&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%2Fx4hzkk9tdf74i7lkafo6.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%2Fx4hzkk9tdf74i7lkafo6.png" alt="Image description" width="800" height="676"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;7️⃣ Elimina la instancia. (Tranquilo, el disco no se eliminará gracias a la opción "Keep boot disk")&lt;br&gt;
8️⃣ Ve a Images y crear imágen.&lt;br&gt;
9️⃣ En Source Disk usa el disco webserver para crear la imágen.&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%2Fl1iwmtzyljune3xth210.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%2Fl1iwmtzyljune3xth210.png" alt="Image description" width="800" height="841"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🎉 ¡Y eso es todo! Ahora tienes una imagen personalizada que puedes usar como base para tus futuras instancias.&lt;/p&gt;

</description>
      <category>googlecloud</category>
      <category>cloud</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>🌍 Cómo configurar un Balanceador de Carga de Aplicaciones con Escalado Automático en Google Cloud</title>
      <dc:creator>Robert Orozco </dc:creator>
      <pubDate>Mon, 02 Jun 2025 02:17:36 +0000</pubDate>
      <link>https://forem.com/robertdev/como-configurar-un-balanceador-de-carga-de-aplicaciones-con-escalado-automatico-en-google-cloud-kme</link>
      <guid>https://forem.com/robertdev/como-configurar-un-balanceador-de-carga-de-aplicaciones-con-escalado-automatico-en-google-cloud-kme</guid>
      <description>&lt;p&gt;Cuando hablamos de alto rendimiento y disponibilidad global, el balanceo de carga de aplicaciones &lt;strong&gt;(HTTP/HTTPS)&lt;/strong&gt; en Google Cloud es una pieza clave. Este tipo de balanceador opera directamente en el borde de la red de Google, es decir, en sus puntos de presencia (POP) distribuidos por todo el mundo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ ¿Qué significa esto?&lt;/strong&gt;&lt;br&gt;
Que el tráfico de los usuarios entra primero por el POP más cercano geográficamente, y desde ahí es enrutado de manera inteligente a través de la red global de Google hasta el backend más adecuado, considerando la capacidad disponible y la cercanía.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Arquitectura del laboratorio.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwg75qhvy94l8zmn9uw3u.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%2Fwg75qhvy94l8zmn9uw3u.png" alt="Image description" width="800" height="777"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TAREA 1️⃣&lt;/strong&gt; Crear una regla de firewall para Health Check&lt;/p&gt;

&lt;p&gt;Los healthcheck determinan qué instancias de un balanceador de carga de aplicaciones (HTTP) pueden recibir nuevas conexiones. Los Healthcheck dirigidos a las instancias provienen de direcciones en los rangos *&lt;em&gt;130.211.0.0/22 y 35.191.0.0/16 *&lt;/em&gt;. Las reglas del firewall deben permitir estas conexiones.&lt;/p&gt;

&lt;p&gt;1 Crear regla de firewall.&lt;br&gt;
2 En nombre colocar “fw-allow-health-check”&lt;br&gt;
3 Colocar la etiqueta “allow-health-checks”. En Source IPv4 ranges colocar &lt;code&gt;130.211.0.0/22 y 35.191.0.0/16.&lt;/code&gt; Especificar el protocolo TCP y el puerto 80.&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%2Ftipjrin4dx9u8uobhsiv.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%2Ftipjrin4dx9u8uobhsiv.png" alt="Image description" width="800" height="463"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TAREA 2️⃣&lt;/strong&gt; Configurar Cloud NAT con Cloud Router&lt;/p&gt;

&lt;p&gt;Las instancias no tendrán IPs públicas, en su lugar se configurará el servicio Cloud NAT para permitir que las instancias de VM envíen tráfico saliente solo a través de Cloud NAT y reciban tráfico entrante a través del balanceador de carga.&lt;/p&gt;

&lt;p&gt;1 Crear Cloud Nat&lt;br&gt;
2 Nat Type: Publico. Para el Cloud Router seleccionar la red “default” y la región us-east1.&lt;br&gt;
3 Se debe crear el Cloud Router. En nombre colocar: nat-router-us1&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%2Fq5s9q7r1uph0fmif16as.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fq5s9q7r1uph0fmif16as.jpg" alt="Image description" width="800" height="582"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TAREA 3️⃣&lt;/strong&gt; Crear una imagen personalizada para el Web Server&lt;/p&gt;

&lt;p&gt;Usaremos una imagen personalizada para crear instancias consistentes del servidor web.&lt;br&gt;
🔗 Sigue esta guía para crearla:&lt;br&gt;
👉 &lt;a href="https://dev.to/robertdev/crear-una-imagen-personalizada-en-google-cloud-cn3"&gt;https://dev.to/robertdev/crear-una-imagen-personalizada-en-google-cloud-cn3&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;TAREA 4️⃣&lt;/strong&gt; Crear una plantilla de instancia y un grupo de instancias. (Instance Template e Instance Groups)&lt;/p&gt;

&lt;p&gt;En esta tarea se configuran instance templates y se crean managed instance groups, que son esenciales para construir los backends del balanceador &lt;strong&gt;HTTP&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;1 Crear una instance template&lt;br&gt;
2 Nombre: mywebserver-template y en location selecciona global.&lt;br&gt;
3 El tipo de máquina E2 "Shared-Core"&lt;br&gt;
4 En boot disk click en cambiar.&lt;br&gt;
5 Selecciona la imágen personalizada que se configuró en la TAREA 3️⃣&lt;br&gt;
6 No asignes una ip pública a la instancia.&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%2Frmjk7migiyo11lga8s3o.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%2Frmjk7migiyo11lga8s3o.png" alt="Image description" width="800" height="774"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez creada la plantilla, crea el grupo de instancias.&lt;/p&gt;

&lt;p&gt;1 Crear un &lt;strong&gt;Instance Group&lt;/strong&gt;&lt;br&gt;
2 Usa la plantilla creada en la &lt;strong&gt;TAREA 4️⃣&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fpglp92loau2vet7k8cl4.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%2Fpglp92loau2vet7k8cl4.png" alt="Image description" width="800" height="690"&gt;&lt;/a&gt;&lt;/p&gt;

</description>
      <category>googlecloud</category>
      <category>loadbalancing</category>
      <category>architecture</category>
    </item>
    <item>
      <title>🔐 Cómo configurar una HA CLOUD VPN en Google Cloud paso a paso</title>
      <dc:creator>Robert Orozco </dc:creator>
      <pubDate>Sun, 01 Jun 2025 06:46:39 +0000</pubDate>
      <link>https://forem.com/robertdev/como-configurar-una-vpn-ha-en-google-cloud-paso-a-paso-gjo</link>
      <guid>https://forem.com/robertdev/como-configurar-una-vpn-ha-en-google-cloud-paso-a-paso-gjo</guid>
      <description>&lt;p&gt;En este artículo aprenderás a desplegar una VPN de Alta Disponibilidad (HA VPN) en Google Cloud con enrutamiento dinámico mediante BGP. Esta configuración es ideal para escenarios donde se requiere conectividad resiliente entre entornos on-premise simulados y redes VPC.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🎯 Objetivos del laboratorio&lt;/strong&gt;&lt;br&gt;
Crear dos redes VPC (una para cloud y otra que simula un entorno on-premise).&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Configurar puertas de enlace VPN HA en cada red.&lt;/li&gt;
&lt;li&gt;Crear túneles IPsec redundantes.&lt;/li&gt;
&lt;li&gt;Establecer emparejamientos BGP para enrutamiento dinámico.&lt;/li&gt;
&lt;li&gt;Probar conectividad entre ambas redes.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Arquitectura del laboratorio.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fchtinckw02hgb8c8hvkp.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%2Fchtinckw02hgb8c8hvkp.png" alt="Image description" width="800" height="253"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*&lt;em&gt;🧱 Paso 1: Crear red VPC y máquinas virtuales&lt;br&gt;
*&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gcloud compute networks create vpc-demo --subnet-mode custom

gcloud compute networks subnets create vpc-demo-subnet1 \
  --network vpc-demo --range 10.1.1.0/24 --region us-central1

gcloud compute networks subnets create vpc-demo-subnet2 \
  --network vpc-demo --range 10.2.1.0/24 --region us-east1

gcloud compute firewall-rules create vpc-demo-allow-custom \
  --network vpc-demo --allow tcp:0-65535,udp:0-65535,icmp \
  --source-ranges 10.0.0.0/8

gcloud compute firewall-rules create vpc-demo-allow-ssh-icmp \
  --network vpc-demo --allow tcp:22,icmp

gcloud compute instances create vpc-demo-instance1 \
  --machine-type=e2-medium --zone us-central1-c --subnet vpc-demo-subnet1

gcloud compute instances create vpc-demo-instance2 \
  --machine-type=e2-medium --zone us-east1-b --subnet vpc-demo-subnet2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📸 Instancia creada en la subred vpc-demo-subnet1&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%2Frx4rduw5hrrnwqcxjnbc.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%2Frx4rduw5hrrnwqcxjnbc.png" alt="Image description" width="591" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📸 Instancia creada en la subred vpc-demo-subnet2&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%2Fipj8wwlwz5kprfddy25r.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%2Fipj8wwlwz5kprfddy25r.png" alt="Image description" width="591" height="153"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧪 Paso 2: Crear VPC para entorno on-premise simulado&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gcloud compute networks create on-prem --subnet-mode custom

gcloud compute networks subnets create on-prem-subnet1 \
  --network on-prem --range 192.168.1.0/24 --region us-central1

gcloud compute firewall-rules create on-prem-allow-custom \
  --network on-prem --allow tcp:0-65535,udp:0-65535,icmp \
  --source-ranges 192.168.0.0/16

gcloud compute firewall-rules create on-prem-allow-ssh-icmp \
  --network on-prem --allow tcp:22,icmp

gcloud compute instances create on-prem-instance1 \
  --machine-type=e2-medium --zone us-central1-b --subnet on-prem-subnet1

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

&lt;/div&gt;



&lt;p&gt;📸 Instancia creada en la subred on-prem-subnet1&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%2Fzxs4qphwfqkujyjr0pcr.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%2Fzxs4qphwfqkujyjr0pcr.png" alt="Image description" width="591" height="152"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🌐 Paso 3: Crear VPN Gateways y Cloud Routers&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gcloud compute vpn-gateways create vpc-demo-vpn-gw1 \
  --network vpc-demo --region us-central1

gcloud compute vpn-gateways create on-prem-vpn-gw1 \
  --network on-prem --region us-central1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📸 VPN gateways creados para demo y on-prem.&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%2Fq1avdj4cga0p3p5fd858.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%2Fq1avdj4cga0p3p5fd858.png" alt="Image description" width="591" height="249"&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%2F0bdggemybh3dk9i81hvj.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%2F0bdggemybh3dk9i81hvj.png" alt="Image description" width="591" height="314"&gt;&lt;/a&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;gcloud compute routers create vpc-demo-router1 \
  --region us-central1 --network vpc-demo --asn 65001

gcloud compute routers create on-prem-router1 \
  --region us-central1 --network on-prem --asn 65002
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📸 Cloud Routers creados para demo y on-prem.&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%2Fjduzptwpgt3gvq689gh3.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%2Fjduzptwpgt3gvq689gh3.png" alt="Image description" width="591" height="343"&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%2Fjxs9dmfx4nc3aca9x2v1.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%2Fjxs9dmfx4nc3aca9x2v1.png" alt="Image description" width="591" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔄 Paso 4: Crear túneles HA VPN (Usa la misma clave compartida [SHARED_SECRET] para todos los túneles.)&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Desde VPC-DEMO
gcloud compute vpn-tunnels create vpc-demo-tunnel0 \
  --peer-gcp-gateway on-prem-vpn-gw1 --region us-central1 \
  --ike-version 2 --shared-secret [SHARED_SECRET] \
  --router vpc-demo-router1 --vpn-gateway vpc-demo-vpn-gw1 --interface 0

gcloud compute vpn-tunnels create vpc-demo-tunnel1 \
  --peer-gcp-gateway on-prem-vpn-gw1 --region us-central1 \
  --ike-version 2 --shared-secret [SHARED_SECRET] \
  --router vpc-demo-router1 --vpn-gateway vpc-demo-vpn-gw1 --interface 1

# Desde ON-PREM
gcloud compute vpn-tunnels create on-prem-tunnel0 \
  --peer-gcp-gateway vpc-demo-vpn-gw1 --region us-central1 \
  --ike-version 2 --shared-secret [SHARED_SECRET] \
  --router on-prem-router1 --vpn-gateway on-prem-vpn-gw1 --interface 0

gcloud compute vpn-tunnels create on-prem-tunnel1 \
  --peer-gcp-gateway vpc-demo-vpn-gw1 --region us-central1 \
  --ike-version 2 --shared-secret [SHARED_SECRET] \
  --router on-prem-router1 --vpn-gateway on-prem-vpn-gw1 --interface 1
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;📸 Interfaz Virtual de creación de Tuneles VPN.&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%2Fv7n5wk6jld49ro0g54xt.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%2Fv7n5wk6jld49ro0g54xt.png" alt="Image description" width="591" height="579"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🔁 Paso 5: Configurar interfaces de túnel y BGP Peers&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# Interfaces y Peers para VPC-DEMO
gcloud compute routers add-interface vpc-demo-router1 \
  --interface-name if-tunnel0-to-on-prem \
  --ip-address 169.254.0.1 --mask-length 30 \
  --vpn-tunnel vpc-demo-tunnel0 --region us-central1

gcloud compute routers add-bgp-peer vpc-demo-router1 \
  --peer-name bgp-on-prem-tunnel0 --interface if-tunnel0-to-on-prem \
  --peer-ip-address 169.254.0.2 --peer-asn 65002 --region us-central1

gcloud compute routers add-interface vpc-demo-router1 \
  --interface-name if-tunnel1-to-on-prem \
  --ip-address 169.254.1.1 --mask-length 30 \
  --vpn-tunnel vpc-demo-tunnel1 --region us-central1

gcloud compute routers add-bgp-peer vpc-demo-router1 \
  --peer-name bgp-on-prem-tunnel1 --interface if-tunnel1-to-on-prem \
  --peer-ip-address 169.254.1.2 --peer-asn 65002 --region us-central1

# Interfaces y Peers para ON-PREM
gcloud compute routers add-interface on-prem-router1 \
  --interface-name if-tunnel0-to-vpc-demo \
  --ip-address 169.254.0.2 --mask-length 30 \
  --vpn-tunnel on-prem-tunnel0 --region us-central1

gcloud compute routers add-bgp-peer on-prem-router1 \
  --peer-name bgp-vpc-demo-tunnel0 --interface if-tunnel0-to-vpc-demo \
  --peer-ip-address 169.254.0.1 --peer-asn 65001 --region us-central1

gcloud compute routers add-interface on-prem-router1 \
  --interface-name if-tunnel1-to-vpc-demo \
  --ip-address 169.254.1.2 --mask-length 30 \
  --vpn-tunnel on-prem-tunnel1 --region us-central1

gcloud compute routers add-bgp-peer on-prem-router1 \
  --peer-name bgp-vpc-demo-tunnel1 --interface if-tunnel1-to-vpc-demo \
  --peer-ip-address 169.254.1.1 --peer-asn 65001 --region us-central1

#Reglas de firewall
gcloud compute firewall-rules create vpc-demo-allow-subnets-from-on-prem \
  --network vpc-demo --allow tcp,udp,icmp \
  --source-ranges 192.168.1.0/24

gcloud compute firewall-rules create on-prem-allow-subnets-from-vpc-demo \
  --network on-prem --allow tcp,udp,icmp \
  --source-ranges 10.1.1.0/24,10.2.1.0/24

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;📸 Sesiones BGP establecidas entre Cloud Routers&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;La imagen muestra todas las sesiones BGP activas entre los routers vpc-demo-router1 y on-prem-router1, confirmando que los túneles de la VPN HA están operativos y enrutando tráfico dinámicamente mediante BGP.&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%2Fsr2921ycdiqn7vuec0a6.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%2Fsr2921ycdiqn7vuec0a6.png" alt="Image description" width="591" height="245"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;✅ Paso 6: Verificar conectividad&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Una vez configurados los túneles VPN y emparejamientos BGP, es momento de probar la conectividad entre las instancias de ambas VPC.&lt;/p&gt;

&lt;p&gt;Primero, accedemos a la instancia que simula el entorno on-premise, ubicada en la zona us-central1-b:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gcloud compute ssh on-prem-instance1 --zone us-central1-b&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Desde allí, realizamos una prueba de conectividad hacia una instancia en la subred vpc-demo-subnet1 (en la misma región):&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%2Fgv6untccy1rphrq20agc.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%2Fgv6untccy1rphrq20agc.png" alt="Image description" width="591" height="189"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una respuesta satisfactoria confirma que el túnel y el enrutamiento dinámico están funcionando correctamente dentro de la región.&lt;/p&gt;

&lt;p&gt;🌍 Habilitar enrutamiento global para alcanzar otras regiones&lt;/p&gt;

&lt;p&gt;Por diseño, los routers de VPN HA son recursos regionales, lo que significa que solo tienen visibilidad de las rutas dentro de su propia región. Si necesitas alcanzar subredes ubicadas en regiones distintas, como en este caso la us-east1, es necesario activar el modo de enrutamiento global en la VPC.&lt;/p&gt;

&lt;p&gt;Hagamos prueba de ping para validar la llegada a otra región.&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%2Fqyqqp5dt0vmjnoerzpgi.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%2Fqyqqp5dt0vmjnoerzpgi.png" alt="Image description" width="591" height="96"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Por el momento no se llega, por lo tanto ejecutamos:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gcloud compute networks update vpc-demo --bgp-routing-mode GLOBAL&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
📸 Prueba de conectividad entre regiones tras habilitar enrutamiento global&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%2F6dhcxq8q2lw2m7wcf6n7.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%2F6dhcxq8q2lw2m7wcf6n7.png" alt="Image description" width="800" height="251"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🧩 Conclusión&lt;/p&gt;

&lt;p&gt;La implementación de una VPN de Alta Disponibilidad (HA VPN) en Google Cloud, junto con Cloud Router y BGP dinámico, permite establecer una conexión segura, escalable y resiliente entre redes VPC y entornos on-premise o simulados.&lt;/p&gt;

&lt;p&gt;A través de este laboratorio, configuramos múltiples túneles redundantes, establecimos sesiones BGP para el intercambio dinámico de rutas y validamos la conectividad entre regiones activando el modo de enrutamiento global.&lt;/p&gt;

</description>
      <category>googlecloud</category>
      <category>cloudvpn</category>
      <category>bgp</category>
    </item>
    <item>
      <title>📊 Explorando tu facturación en Google Cloud con BigQuery (de forma sencilla)</title>
      <dc:creator>Robert Orozco </dc:creator>
      <pubDate>Sat, 31 May 2025 23:29:07 +0000</pubDate>
      <link>https://forem.com/robertdev/explorando-tu-facturacion-en-google-cloud-con-bigquery-de-forma-sencilla-35l9</link>
      <guid>https://forem.com/robertdev/explorando-tu-facturacion-en-google-cloud-con-bigquery-de-forma-sencilla-35l9</guid>
      <description>&lt;p&gt;¿Quieres tener visibilidad clara sobre en qué se va tu presupuesto en Google Cloud? Con BigQuery puedes analizar fácilmente los detalles de tu facturación y detectar patrones, gastos excesivos o servicios poco usados.&lt;/p&gt;

&lt;p&gt;En este mini laboratorio te muestro cómo importar tu data de facturación a BigQuery y aplicar consultas básicas para entender mejor tu consumo en la nube. 🧠☁️&lt;/p&gt;

&lt;p&gt;🚀 Paso 1: Crear el dataset&lt;/p&gt;

&lt;p&gt;Primero, ve a BigQuery desde la consola de GCP y crea un nuevo dataset. Es como una carpeta donde vas a guardar tus tablas.&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%2Fd6c3ihpdpp6hkoa2kx4c.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%2Fd6c3ihpdpp6hkoa2kx4c.png" alt="Image description" width="800" height="392"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Configuración recomendada:&lt;/p&gt;

&lt;p&gt;ID del dataset: &lt;strong&gt;billing_dataset&lt;/strong&gt;&lt;br&gt;
Ubicación: &lt;strong&gt;US&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi52k1iul2mhb4xv7qig7.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%2Fi52k1iul2mhb4xv7qig7.png" alt="Image description" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📥 Paso 2: Cargar la tabla desde Cloud Storage&lt;br&gt;
Ahora importa el archivo CSV o JSON de facturación que descargaste desde Cloud Billing hacia BigQuery. Para eso:&lt;/p&gt;

&lt;p&gt;Dentro del dataset, haz clic en "Crear tabla" y configura el origen y destino.&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%2Fevgokkn5lhya07dywngg.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%2Fevgokkn5lhya07dywngg.png" alt="Image description" width="800" height="296"&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%2Frlfo7o37t1t3w6uapks4.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%2Frlfo7o37t1t3w6uapks4.png" alt="Image description" width="800" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;🔎 Hagamos una consulta para explorar el gasto.&lt;/p&gt;

&lt;p&gt;📈 ¿Cuál es el producto con mayor costo total?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;SELECT
  service.description AS servicio,
  ROUND&lt;span class="o"&gt;(&lt;/span&gt;SUM&lt;span class="o"&gt;(&lt;/span&gt;cost&lt;span class="o"&gt;)&lt;/span&gt;, 2&lt;span class="o"&gt;)&lt;/span&gt; AS costo_total
FROM
  &lt;span class="sb"&gt;`&lt;/span&gt;billing_dataset.sampleinfotable&lt;span class="sb"&gt;`&lt;/span&gt;
GROUP BY
  servicio
ORDER BY
  costo_total DESC
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&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%2F3lkib3thx70wvzcyiygc.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%2F3lkib3thx70wvzcyiygc.png" alt="Image description" width="800" height="558"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Así detectas rápidamente qué servicio está consumiendo la mayor parte de tu presupuesto.&lt;/p&gt;

&lt;p&gt;✅ Conclusión&lt;/p&gt;

&lt;p&gt;BigQuery no es solo para grandes volúmenes de datos; también es una excelente herramienta para analizar tus gastos en la nube. En pocos minutos puedes importar tus datos de facturación y comenzar a tomar decisiones más inteligentes sobre tu infraestructura.&lt;/p&gt;

</description>
      <category>googlecloud</category>
      <category>bigquery</category>
    </item>
    <item>
      <title>[Boost]</title>
      <dc:creator>Robert Orozco </dc:creator>
      <pubDate>Sat, 31 May 2025 23:14:28 +0000</pubDate>
      <link>https://forem.com/robertdev/-16h1</link>
      <guid>https://forem.com/robertdev/-16h1</guid>
      <description></description>
    </item>
  </channel>
</rss>
