<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>posts on Brian Suarez Santiago (@BrianInTech)</title><link>https://brianintech.com/post.html</link><description>Recent content in posts on Brian Suarez Santiago (@BrianInTech)</description><generator>Hugo -- gohugo.io</generator><language>es</language><lastBuildDate>Sat, 17 Jan 2026 10:30:00 +0200</lastBuildDate><atom:link href="https://brianintech.com/post/index.xml" rel="self" type="application/rss+xml"/><item><title>Cómo instalar Jenkins en AWS</title><link>https://brianintech.com/instalar-jenkins-aws.html</link><pubDate>Sat, 17 Jan 2026 10:30:00 +0200</pubDate><guid>https://brianintech.com/instalar-jenkins-aws.html</guid><description>&lt;p>Jenkins es un servidor de automatización de código abierto que se integra fácilmente con servicios de AWS como CodeCommit, CodeDeploy y Amazon EC2. Esta guía te muestra cómo instalar Jenkins en una instancia de Amazon EC2 y configurarlo para que puedas potenciar tus proyectos sin complicaciones.&lt;/p>
&lt;hr>
&lt;h1 id="instalar-y-configurar-jenkins">Instalar y configurar Jenkins
&lt;/h1>&lt;p>1. Actualiza los paquetes:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo yum update -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>2. Agrega el repositorio de Jenkins:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>3. Instala Java y Jenkins:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo dnf install java-17-amazon-corretto -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo yum install jenkins -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>4. Activa y arranca Jenkins:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> jenkins
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl start jenkins
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>5. Verifica que Jenkins esté funcionando:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl status jenkins
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/49t1auoypun45s6e1k4v.png"
loading="lazy"
alt="Estado del servicio Jenkins"
>&lt;/p>
&lt;h3 id="configura-jenkins">Configura Jenkins
&lt;/h3>&lt;p>1. Abre tu navegador y ve a: &lt;code>http://&amp;lt;public_dns_name&amp;gt;:8080&lt;/code>.&lt;/p>
&lt;p>2. Ingresa la contraseña inicial ejecutando:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo cat /var/lib/jenkins/secrets/initialAdminPassword
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4ns1kiprof1lkihluq93.png"
loading="lazy"
alt="Contraseña de administrador inicial en Jenkins"
>&lt;/p>
&lt;p>3. Sigue el asistente para:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Instalar los plugins sugeridos.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Crear tu primer usuario administrador.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ldry3l2fb9w5u30zq1l7.png"
loading="lazy"
alt="Asistente de instalación 1"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/j8p6jtp1hizblgc9loge.png"
loading="lazy"
alt="Asistente de instalación 2"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vvmyfwaygmjrgffswyea.png"
loading="lazy"
alt="Asistente de instalación 3"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/932xo2qgd3788jmuc7ly.png"
loading="lazy"
alt="Asistente de instalación 4"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/fix0czckbq2f5l56sz41.png"
loading="lazy"
alt="Asistente de instalación 5"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3j067chqm96ecirgnrdk.png"
loading="lazy"
alt="Asistente de instalación 6"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1rzuec5fmwu3t2dcj1an.png"
loading="lazy"
alt="Asistente de instalación 7"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kc5z14jsvzecwbk1mvhl.png"
loading="lazy"
alt="Servidor Jenkins en ejecución"
>&lt;/p>
&lt;hr>
&lt;h1 id="y-listo">¡Y listo!
&lt;/h1>&lt;p>Ahora tienes Jenkins configurado en AWS, listo para automatizar tus tareas y proyectos. Si tienes dudas o comentarios, ¡déjamelos aquí abajo! 👇🏻&lt;/p></description></item><item><title>Cómo instalar SonarQube en una instancia EC2 con Ubuntu</title><link>https://brianintech.com/instalar-sonarqube-ec2.html</link><pubDate>Sun, 04 Jan 2026 10:30:00 +0200</pubDate><guid>https://brianintech.com/instalar-sonarqube-ec2.html</guid><description>&lt;p>Si estás buscando una herramienta potente para analizar la calidad del código y mejorar la gestión de tus proyectos, &lt;strong>SonarQube&lt;/strong> es una opción fantástica.&lt;/p>
&lt;p>En este tutorial, te guiaré paso a paso para instalarlo en una instancia EC2 con Ubuntu. ¡Vamos a ello!&lt;/p>
&lt;hr>
&lt;h3 id="1-actualiza-tu-sistema">1. Actualiza tu sistema
&lt;/h3>&lt;p>Lo primero es asegurarte de que tu sistema esté completamente actualizado. Ejecuta los siguientes comandos:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt update -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt upgrade -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Esto ayudará a evitar problemas derivados de paquetes desactualizados.&lt;/p>
&lt;hr>
&lt;h3 id="2-instala-java">2. Instala Java
&lt;/h3>&lt;p>SonarQube necesita &lt;strong>Java 11&lt;/strong> para funcionar. Instálalo con este comando:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt install openjdk-11-jre -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Después, verifica que la instalación fue exitosa:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">java --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Deberías ver la versión de Java instalada confirmando que todo está en orden.&lt;/p>
&lt;hr>
&lt;h3 id="3-crea-un-usuario-para-sonarqube">3. Crea un usuario para SonarQube
&lt;/h3>&lt;p>Por seguridad, es recomendable crear un usuario dedicado para SonarQube. Hazlo con:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo adduser sonarqube
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Puedes completar la información solicitada (como nombre completo o teléfono) o simplemente presionar &lt;strong>Enter&lt;/strong> para dejarlo vacío.&lt;/p>
&lt;p>Luego, agrega al usuario &lt;code>sonarqube&lt;/code> al grupo de administradores (&lt;code>sudoers&lt;/code>) para que tenga permisos elevados cuando sea necesario:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo usermod -aG sudo sonarqube
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Confirma que el usuario pertenece al grupo correcto:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">groups sonarqube
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="4-cambia-al-usuario-sonarqube-y-configura-su-contraseña">4. Cambia al usuario SonarQube y configura su contraseña
&lt;/h3>&lt;p>Ahora, cambia al usuario recién creado con el siguiente comando:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">su sonarqube
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>Nota:&lt;/strong> La primera vez que te conectas como este usuario, se te pedirá que configures una contraseña obligatoriamente. Si en el futuro deseas cambiarla nuevamente, puedes hacerlo ejecutando:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">passwd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Luego, navega al directorio personal del usuario:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /home/sonarqube
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="5-descarga-e-instala-sonarqube">5. Descarga e instala SonarQube
&lt;/h3>&lt;p>Primero, asegúrate de que la herramienta &lt;code>zip&lt;/code> esté instalada, ya que la necesitarás para descomprimir los archivos de SonarQube. Instálala con:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt install zip -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Descarga la última versión de SonarQube desde su sitio oficial. En este tutorial utilizaremos la versión &lt;strong>9.9.8.100196&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo wget https://binaries.sonarsource.com/Distribution/sonarqube/sonarqube-9.9.8.100196.zip
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Luego, descomprime el archivo descargado:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">unzip sonarqube-9.9.8.100196.zip
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Finalmente, establece los permisos correctos para garantizar el buen funcionamiento:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo chmod -R &lt;span class="m">755&lt;/span> /home/sonarqube/sonarqube-9.9.8.100196
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo chown -R sonarqube:sonarqube /home/sonarqube/sonarqube-9.9.8.100196
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="6-inicia-sonarqube">6. Inicia SonarQube
&lt;/h3>&lt;p>Dirígete al directorio donde se encuentra el script para iniciar SonarQube:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /home/sonarqube/sonarqube-9.9.8.100196/bin/linux-x86-64
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Inicia SonarQube ejecutando:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">./sonar.sh start
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="7-verifica-que-el-puerto-9000-esté-activo">7. Verifica que el puerto 9000 esté activo
&lt;/h3>&lt;p>SonarQube utiliza el puerto &lt;strong>9000&lt;/strong> de forma predeterminada. Asegúrate de que está escuchando:&lt;/p>
&lt;ol>
&lt;li>
&lt;p>Instala la herramienta &lt;code>net-tools&lt;/code> si aún no lo has hecho:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt install net-tools -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;li>
&lt;p>Lista todos los puertos que están en escucha:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo netstat -tulnp
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;li>
&lt;p>Para verificar específicamente el puerto 9000, ejecuta:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo netstat -tuln &lt;span class="p">|&lt;/span> grep :9000
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/li>
&lt;/ol>
&lt;p>Si todo está en orden, el puerto debería estar activo y listo para recibir conexiones.&lt;/p>
&lt;hr>
&lt;h3 id="8-accede-a-sonarqube">8. Accede a SonarQube
&lt;/h3>&lt;p>Abre tu navegador y dirígete a la siguiente dirección:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-plaintext" data-lang="plaintext">&lt;span class="line">&lt;span class="cl">http://&amp;lt;IP_de_tu_EC2&amp;gt;:9000
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Reemplaza &lt;code>&amp;lt;IP_de_tu_EC2&amp;gt;&lt;/code> con la dirección IP pública de tu instancia EC2. Si no estás seguro de cuál es, puedes encontrarla en la consola de AWS.&lt;/p>
&lt;p>Cuando ingreses por primera vez, utiliza las credenciales predeterminadas:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Usuario&lt;/strong>: &lt;code>admin&lt;/code>&lt;/li>
&lt;li>&lt;strong>Contraseña&lt;/strong>: &lt;code>admin&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>En el primer inicio de sesión, SonarQube te pedirá que cambies la contraseña.&lt;/p>
&lt;hr>
&lt;h2 id="listo-">¡Listo! 🎉
&lt;/h2>&lt;p>Ahora tienes SonarQube configurado y listo para usar en tu instancia EC2 con Ubuntu. Desde aquí, puedes comenzar a analizar tus proyectos, rastrear problemas de calidad y mejorar tu código de manera continua.&lt;/p>
&lt;p>¿Tienes dudas o comentarios? Comparte tus experiencias o cualquier problema que hayas enfrentado durante la instalación. Estoy aquí para ayudarte, y tu experiencia podría ayudar a otros también.&lt;/p>
&lt;p>¡Te leo en los comentarios! 👇🏻&lt;/p></description></item><item><title>AWS re:Invent 2025 desde dentro: La experiencia de un primerizo</title><link>https://brianintech.com/aws-reinvent-2025-experiencia.html</link><pubDate>Wed, 10 Dec 2025 20:30:00 +0200</pubDate><guid>https://brianintech.com/aws-reinvent-2025-experiencia.html</guid><description>&lt;img src="https://d1hvrz5kjt6fwi.cloudfront.net/Blog%20Posts%20Covers/Post%2004/Post%2004_horizontal_en.png" alt="Featured image of post AWS re:Invent 2025 desde dentro: La experiencia de un primerizo" />&lt;p>Hace unas semanas tuve la oportunidad de asistir por primera vez a AWS re:Invent, el evento anual que reúne a miles de profesionales, desarrolladores y empresas del ecosistema cloud en Las Vegas. Desde fuera, uno podría imaginar un mar de anuncios, keynotes espectaculares y merchandising por doquier. La realidad, sin embargo, es mucho más compleja y enriquecedora, sobre todo para quienes trabajamos en el mundo cloud.&lt;/p>
&lt;p>En este post quiero compartir mi experiencia, los aprendizajes prácticos que me llevo, y algunos consejos para quienes estén pensando en asistir por primera vez.&lt;/p>
&lt;h2 id="expectativas-vs-realidad">Expectativas vs realidad
&lt;/h2>&lt;p>Antes de llegar, mi idea era simple: asistir a keynotes, probar nuevas herramientas y ver demos en vivo. Lo que no esperaba era la cantidad de información, networking y oportunidades de aprendizaje informal que se producen fuera del escenario principal.&lt;/p>
&lt;p>&lt;strong>Las keynotes son espectaculares&lt;/strong>, sí. Cada anuncio parece revolucionario, pero muchas veces están diseñadas para impresionar más que para explicar cómo aplicar la tecnología en entornos reales.&lt;/p>
&lt;p>&lt;strong>Los breakout sessions son donde ocurre la verdadera magia&lt;/strong>. Ahí es donde encuentras detalles técnicos, arquitecturas, best practices y casos de uso reales que luego puedes aplicar en tu día a día.&lt;/p>
&lt;p>&lt;strong>El networking no es solo social&lt;/strong>; hablar con otros builders, arquitectos o cloud engineers te da perspectivas que no encontrarás en blogs ni en documentación oficial.&lt;/p>
&lt;h2 id="lo-que-nadie-te-dice-sobre-el-reinvent">Lo que nadie te dice sobre el re:Invent
&lt;/h2>&lt;ul>
&lt;li>
&lt;p>&lt;strong>Cansancio y ritmo intenso&lt;/strong>: asistir a varias sesiones al día, caminar por el campus, y combinar networking con aprendizaje técnico es agotador. Planifica descansos estratégicos.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Elegir las sesiones correctas es un arte&lt;/strong>: hay demasiadas opciones. Conviene priorizar según tus objetivos y no intentar asistir a todo.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>El merchandising es tentador, pero no imprescindible&lt;/strong>: los freebies están por todos lados, pero al final lo que te llevas de verdad son conocimientos y contactos.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="consejos-para-un-primerizo">Consejos para un primerizo
&lt;/h2>&lt;ul>
&lt;li>
&lt;p>&lt;strong>Prepara tu agenda con antelación&lt;/strong>: identifica sesiones clave y deja espacio para improvisar según lo que surja en el networking.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Networking activo&lt;/strong>: no subestimes las conversaciones informales en cafeterías, stands o pasillos. A menudo son más útiles que las sesiones oficiales.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Toma notas y comparte&lt;/strong>: ya sea para tu equipo o para tu blog, documentar lo aprendido permite procesar la información y sacarle el máximo provecho.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>Mantente flexible&lt;/strong>: los horarios cambian, las sesiones se llenan y algunas demos se cancelan. La clave es adaptarse y priorizar lo que realmente aporta valor.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;h2 id="reflexión-final">Reflexión final
&lt;/h2>&lt;p>Mi primera experiencia en AWS re:Invent 2025 me hizo darme cuenta de que el valor real del evento no está en las luces, los anuncios ni el swag, sino en la combinación de:&lt;/p>
&lt;ul>
&lt;li>Aprendizaje técnico profundo&lt;/li>
&lt;li>Networking con profesionales del sector&lt;/li>
&lt;li>Exposición a nuevas ideas aplicables directamente en tu trabajo&lt;/li>
&lt;/ul>
&lt;p>Si eres un profesional del mundo cloud o desarrollo en AWS y tienes la oportunidad de asistir, hazlo. No es solo una conferencia, es un entorno de inmersión total en innovación y práctica profesional.&lt;/p>
&lt;p>En próximos posts planeo detallar algunas de las sesiones más técnicas y herramientas que probé, incluyendo demos y ejemplos que puedes aplicar en proyectos reales.&lt;/p>
&lt;hr>
&lt;p>Si este artículo te ha resultado útil o tienes alguna pregunta, puedes contactar conmigo en LinkedIn.&lt;/p></description></item><item><title>All Builders Welcome Grant (ABW): Lo que debes saber antes de aplicar</title><link>https://brianintech.com/all-builders-welcome-grant-tips.html</link><pubDate>Mon, 08 Dec 2025 17:30:00 +0200</pubDate><guid>https://brianintech.com/all-builders-welcome-grant-tips.html</guid><description>&lt;img src="https://d1hvrz5kjt6fwi.cloudfront.net/Blog%20Posts%20Covers/Post%2003/Post%2003_horizontal_en.png" alt="Featured image of post All Builders Welcome Grant (ABW): Lo que debes saber antes de aplicar" />&lt;p>¿Cómo es realmente el proceso de aplicación?&lt;/p>
&lt;p>Aplicar NO es solo rellenar un formulario. Es un proceso que te pide pausa, reflexión profunda y mucha honestidad contigo mismo.&lt;/p>
&lt;p>Lo que NO necesitas&lt;/p>
&lt;p>Años de experiencia en AWS.&lt;/p>
&lt;p>Certificaciones avanzadas.&lt;/p>
&lt;p>Un currículum perfecto.&lt;/p>
&lt;p>Una comunidad de seguidores muy grande.&lt;/p>
&lt;p>Inglés nativo (la diversidad también incluye idiomas).&lt;/p>
&lt;p>Lo que SÍ te van a preguntar&lt;/p>
&lt;p>Tu historia personal: ¿por qué estás en tech?, ¿qué te motiva de verdad?&lt;/p>
&lt;p>Tus desafíos: ¿qué barreras has enfrentado en tu camino profesional?&lt;/p>
&lt;p>Tus metas: ¿qué planeas hacer con esta oportunidad?&lt;/p>
&lt;p>Tu impacto: ¿cómo piensas contribuir a la comunidad tech?&lt;/p>
&lt;p>Essay questions: tu momento de brillar&lt;/p>
&lt;p>Tip clave: NO escribas lo que crees que quieren leer. Escribe TU verdad. La autenticidad se nota.&lt;/p>
&lt;p>Ejemplos de preguntas comunes:&lt;/p>
&lt;p>Describe un desafío técnico que hayas enfrentado y cómo lo resolviste.&lt;/p>
&lt;p>¿Cómo planeas usar esta experiencia para impactar a tu comunidad?&lt;/p>
&lt;p>Cuéntanos sobre una vez que fallaste y qué aprendiste de eso.&lt;/p>
&lt;p>Lo que SÍ funciona&lt;/p>
&lt;p>Ser vulnerable y auténtico.&lt;/p>
&lt;p>Mostrar curiosidad real.&lt;/p>
&lt;p>Demostrar ganas de aprender.&lt;/p>
&lt;p>Conectar tu historia personal con tus metas profesionales.&lt;/p>
&lt;p>Lo que NO funciona&lt;/p>
&lt;p>Respuestas genéricas.&lt;/p>
&lt;p>Textos largos y artificiales hechos con IA.&lt;/p>
&lt;p>Exagerar tu experiencia.&lt;/p>
&lt;p>Copiar respuestas de internet.&lt;/p>
&lt;p>Enfocarte solo en lo que vas a recibir.&lt;/p>
&lt;p>Timeline proceso de aplicación&lt;/p>
&lt;p>Aplicación: tómate el tiempo que necesites. Si te lleva 1 o 2 semanas, está bien.&lt;/p>
&lt;p>Proceso de selección: 6 a 8 semanas.&lt;/p>
&lt;p>Notificación: generalmente entre septiembre y octubre.&lt;/p>
&lt;p>Preparación previa al evento: 2 a 3 meses.&lt;/p>
&lt;p>Puedes aplicar y obtener más información sobre el programa aquí.&lt;/p>
&lt;p>Qué esperar del evento (la realidad sin filtro)&lt;/p>
&lt;p>La magnitud real&lt;/p>
&lt;p>Más de 65.000 asistentes (sí, es enorme)&lt;/p>
&lt;p>5 días intensos de puro aprendizaje (no son vacaciones)&lt;/p>
&lt;p>Más de 400 sesiones (no podrás verlas todas)&lt;/p>
&lt;p>Múltiples venues en el Las Vegas Strip.&lt;/p>
&lt;p>Mitos que debes soltar&lt;/p>
&lt;p>“Todos saben más que yo” → Falso. Todos están aprendiendo.&lt;/p>
&lt;p>“Necesito entender todo” → Falso. Nadie lo entiende todo.&lt;/p>
&lt;p>“No pertenezco aquí” → Falso. Fuiste seleccionado por una razón.&lt;/p>
&lt;p>“Tengo que hacer networking perfecto” → Falso. Sé tú mismo.&lt;/p>
&lt;p>“Necesito muchos seguidores” → Falso. El número no importa en absoluto.&lt;/p>
&lt;p>Realidades que te empoderan&lt;/p>
&lt;p>Tienes una perspectiva única y valiosa.&lt;/p>
&lt;p>Las preguntas “básicas” suelen ser las más importantes.&lt;/p>
&lt;p>A los expertos les encanta enseñar a personas curiosas.&lt;/p>
&lt;p>Tu diversidad es justo lo que la industria necesita.&lt;/p>
&lt;p>El ABWG en números&lt;/p>
&lt;p>¿Qué recibe una persona seleccionada?&lt;/p>
&lt;p>Esto es lo que incluye la beca All Builders Welcome (en cifras):&lt;/p>
&lt;p>Entrada gratuita a AWS re:Invent (2099 $)&lt;/p>
&lt;p>Vuelo de ida y vuelta a Las Vegas, Nevada (1500-2000 $)&lt;/p>
&lt;p>5 días de alojamiento en el Treasure Island Hotel (1500-1700 $)&lt;/p>
&lt;p>Tarjeta Uber de 75 $.&lt;/p>
&lt;p>Tarjeta regalo de 250 $.&lt;/p>
&lt;p>Regalos especiales (hasta 400 $).&lt;/p>
&lt;p>Sala VIP para becarios y asientos reservados para las conferencias magistrales (no tiene precio).&lt;/p>
&lt;p>Eventos especiales y apoyo de mentores (2 veces más valioso que el oro).&lt;/p>
&lt;p>Comunidad y contactos (1000 veces más valioso que el oro).&lt;/p>
&lt;p>Una vez que recibes la beca&lt;/p>
&lt;p>Confirmar que aceptas el grant.&lt;/p>
&lt;p>Asegurarte de tener visa o ESTA (Electronic System for Travel Authorization) a tiempo.&lt;/p>
&lt;p>Reservar tu entrada a re:Invent con el link que te envían.&lt;/p>
&lt;p>Reservar el hotel desde el enlace oficial.&lt;/p>
&lt;p>Coordinar los vuelos con la agencia indicada.&lt;/p>
&lt;p>Cuando todo esté listo, solo queda una cosa: prepararte mental y físicamente para la conferencia.
Más adelante compartiré un post con tips prácticos para grantees y personas que asisten por primera vez.&lt;/p>
&lt;p>Conclusión&lt;/p>
&lt;p>re:Invent no es solo un evento. Es un catalizador.&lt;/p>
&lt;p>Te irás con:&lt;/p>
&lt;p>Conocimiento técnico que puede cambiar tu forma de trabajar.&lt;/p>
&lt;p>Una red global de builders como tú.&lt;/p>
&lt;p>Confianza en que sí perteneces a esta industria.&lt;/p>
&lt;p>Claridad sobre el siguiente paso en tu carrera.&lt;/p>
&lt;p>Una comunidad que te acompaña incluso después del evento.&lt;/p>
&lt;p>La pregunta no es si estás listo para re:Invent.
La pregunta es: ¿estás listo para que re:Invent te transforme?&lt;/p>
&lt;hr>
&lt;p>Si este artículo te ha resultado útil o tienes alguna pregunta, puedes contactar conmigo en LinkedIn.&lt;/p></description></item><item><title>Construyendo agentes con memoria persistente en AWS: Amazon Bedrock AgentCore + LangGraph</title><link>https://brianintech.com/agentes-memoria-persistente-agentcore-langgraph.html</link><pubDate>Thu, 23 Oct 2025 17:30:00 +0200</pubDate><guid>https://brianintech.com/agentes-memoria-persistente-agentcore-langgraph.html</guid><description>&lt;img src="https://d1hvrz5kjt6fwi.cloudfront.net/Blog%20Posts%20Covers/Post%2005/Post%2005_horizontal_en.png" alt="Featured image of post Construyendo agentes con memoria persistente en AWS: Amazon Bedrock AgentCore + LangGraph" />&lt;h1 id="construyendo-agentes-con-memoria-persistente-usando-langgraph-y-amazon-bedrock-agentcore">Construyendo agentes con memoria persistente usando LangGraph y Amazon Bedrock AgentCore
&lt;/h1>&lt;p>AWS lanzó &lt;strong>Amazon Bedrock AgentCore&lt;/strong> para resolver uno de los grandes problemas de los agentes de IA en producción: &lt;strong>cómo desplegarlos y operarlos de forma segura, escalable y desacoplada del framework o modelo utilizado&lt;/strong>.&lt;/p>
&lt;p>En este post vamos un paso más allá.&lt;/p>
&lt;p>Vamos a &lt;strong>combinar LangGraph con Amazon Bedrock AgentCore&lt;/strong> para construir agentes de IA con &lt;strong>memoria persistente&lt;/strong>, capaces de mantener el contexto de conversación &lt;strong>entre sesiones y reinicios del servidor&lt;/strong>. Para ello, aprovecharemos las capacidades de gestión de memoria de AgentCore junto con la flexibilidad de orquestación que ofrece &lt;strong>LangGraph&lt;/strong>, un framework open source basado en grafos.&lt;/p>
&lt;p>Vamos al grano.&lt;/p>
&lt;hr>
&lt;h2 id="requisitos-previos">Requisitos previos
&lt;/h2>&lt;p>Antes de empezar, asegúrate de tener:&lt;/p>
&lt;ul>
&lt;li>Una cuenta de AWS&lt;/li>
&lt;li>AWS CLI configurado localmente&lt;/li>
&lt;li>AWS CDK instalado&lt;/li>
&lt;li>Python 3&lt;/li>
&lt;li>Docker&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="qué-vamos-a-cubrir-en-este-post">Qué vamos a cubrir en este post
&lt;/h2>&lt;p>A lo largo del artículo veremos:&lt;/p>
&lt;ul>
&lt;li>Qué es Amazon Bedrock AgentCore&lt;/li>
&lt;li>Qué es LangGraph y qué papel juega en la arquitectura&lt;/li>
&lt;li>Cuáles son los servicios principales de AgentCore&lt;/li>
&lt;li>Cómo implementar el agente paso a paso en Python&lt;/li>
&lt;li>Cómo probar memoria en local y en producción&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="qué-es-amazon-bedrock-agentcore">¿Qué es Amazon Bedrock AgentCore?
&lt;/h2>&lt;p>Amazon Bedrock AgentCore es una &lt;strong>plataforma centrada en agentes&lt;/strong> que permite &lt;strong>construir, desplegar y operar agentes de IA de forma segura y a escala&lt;/strong>, sin tener que gestionar infraestructura.&lt;/p>
&lt;p>AgentCore se estructura en tres grandes fases:&lt;/p>
&lt;hr>
&lt;h3 id="fase-build">Fase Build
&lt;/h3>&lt;p>Aquí es donde defines &lt;strong>qué puede hacer tu agente&lt;/strong>.&lt;/p>
&lt;ul>
&lt;li>
&lt;p>&lt;strong>AgentCore Gateway&lt;/strong>
Actúa como intermediario entre el agente y las herramientas. Permite convertir funciones Lambda o integraciones API en herramientas consumibles por el agente.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>AgentCore Memory&lt;/strong>
Permite integrar memoria a corto y largo plazo que persiste entre sesiones. Es el componente clave de este post.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>AgentCore Policy&lt;/strong>
Define límites y reglas de comportamiento alineadas con requisitos de negocio.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>AgentCore Identity&lt;/strong>
Gestiona identidad, autenticación y acceso de los agentes de forma segura y escalable.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>AgentCore Code Interpreter (tool integrada)&lt;/strong>
Proporciona un sandbox aislado para ejecución de código.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>AgentCore Browser (tool integrada)&lt;/strong>
Ofrece un entorno de navegador cloud totalmente gestionado para interactuar con aplicaciones web.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="fase-deploy">Fase Deploy
&lt;/h3>&lt;ul>
&lt;li>&lt;strong>AgentCore Runtime&lt;/strong>
Runtime serverless diseñado específicamente para agentes: arranques rápidos, identidad integrada y escalado automático.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="fase-operate">Fase Operate
&lt;/h3>&lt;ul>
&lt;li>
&lt;p>&lt;strong>AgentCore Observability&lt;/strong>
Monitorización centralizada y debugging en producción.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>&lt;strong>AgentCore Evaluations&lt;/strong>
Métricas de calidad para evaluar y optimizar el comportamiento del agente.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="qué-es-langgraph">¿Qué es LangGraph?
&lt;/h2>&lt;p>LangGraph es una librería que utiliza un &lt;strong>enfoque basado en grafos&lt;/strong> para construir y gestionar flujos de agentes &lt;strong>stateful&lt;/strong>.&lt;/p>
&lt;p>En lugar de pensar en prompts aislados, defines nodos, estados y transiciones. Esto facilita:&lt;/p>
&lt;ul>
&lt;li>Mantener estado&lt;/li>
&lt;li>Controlar flujos complejos&lt;/li>
&lt;li>Integrar memoria&lt;/li>
&lt;li>Escalar lógica sin convertir el código en un caos&lt;/li>
&lt;/ul>
&lt;p>En este ejemplo construiremos un agente sencillo que recibe input del usuario y devuelve una respuesta, pero con una arquitectura preparada para crecer.&lt;/p>
&lt;hr>
&lt;h2 id="primeros-pasos-con-agentcore">Primeros pasos con AgentCore
&lt;/h2>&lt;p>Usaremos el &lt;strong>AgentCore Starter Toolkit&lt;/strong>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install bedrock-agentcore-starter-toolkit
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">agentcore create
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Durante el asistente, seleccioné lo siguiente:&lt;/p>
&lt;ul>
&lt;li>Ruta del proyecto: &lt;code>./pythonlanggraph&lt;/code>&lt;/li>
&lt;li>Tipo de inicio: agente listo para producción con CDK&lt;/li>
&lt;li>Framework: LangChain + LangGraph&lt;/li>
&lt;li>Proveedor de modelo: Amazon Bedrock&lt;/li>
&lt;li>Infraestructura como código: CDK&lt;/li>
&lt;li>Ejecutar &lt;code>agentcore configure&lt;/code>: sí&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>Nota: en el momento de escribir este post, el soporte de CDK para AgentCore sigue siendo experimental.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="probando-el-agente-localmente">Probando el agente localmente
&lt;/h2>&lt;p>Reemplaza &lt;code>src/main.py&lt;/code> por el siguiente código base:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">os&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">langchain_core.messages&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">HumanMessage&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">langchain.agents&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">create_agent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">bedrock_agentcore&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">BedrockAgentCoreApp&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">model.load&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">load_model&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">app&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">BedrockAgentCoreApp&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">llm&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">load_model&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@app.entrypoint&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">async&lt;/span> &lt;span class="k">def&lt;/span> &lt;span class="nf">invoke&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">payload&lt;/span>&lt;span class="p">):&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">graph&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">create_agent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">llm&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">prompt&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">payload&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">get&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;prompt&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s2">&amp;#34;What is Agentic AI?&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">result&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="k">await&lt;/span> &lt;span class="n">graph&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">ainvoke&lt;/span>&lt;span class="p">({&lt;/span>&lt;span class="s2">&amp;#34;messages&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="p">[&lt;/span>&lt;span class="n">HumanMessage&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">content&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">prompt&lt;/span>&lt;span class="p">)]})&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="p">{&lt;/span>&lt;span class="s2">&amp;#34;result&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">result&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="s2">&amp;#34;messages&amp;#34;&lt;/span>&lt;span class="p">][&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="mi">1&lt;/span>&lt;span class="p">]&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">content&lt;/span>&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">if&lt;/span> &lt;span class="vm">__name__&lt;/span> &lt;span class="o">==&lt;/span> &lt;span class="s2">&amp;#34;__main__&amp;#34;&lt;/span>&lt;span class="p">:&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">app&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">run&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Ejecuta el agente en local:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> pythonlanggraph
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">agentcore dev
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Y pruébalo desde otro terminal:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">agentcore invoke --dev &lt;span class="s1">&amp;#39;{&amp;#34;prompt&amp;#34;: &amp;#34;who are you?&amp;#34;}&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Todo funciona… pero &lt;strong>no hay memoria persistente&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="añadiendo-memoria-con-langgraph-solo-local">Añadiendo memoria con LangGraph (solo local)
&lt;/h2>&lt;p>Ahora usamos &lt;code>MemorySaver&lt;/code> de LangGraph para mantener contexto dentro de una sesión.&lt;/p>
&lt;p>Esto funciona… &lt;strong>hasta que reinicias el servidor&lt;/strong>.&lt;/p>
&lt;p>En cuanto el proceso se reinicia, el estado se pierde.&lt;/p>
&lt;p>Y aquí aparece el problema real.&lt;/p>
&lt;hr>
&lt;h2 id="el-problema-reinicios--amnesia">El problema: reinicios = amnesia
&lt;/h2>&lt;p>Aunque LangGraph permite memoria en ejecución, esta es:&lt;/p>
&lt;ul>
&lt;li>Volátil&lt;/li>
&lt;li>Dependiente del proceso&lt;/li>
&lt;li>No sobrevive a reinicios&lt;/li>
&lt;/ul>
&lt;p>Para resolver esto necesitamos &lt;strong>memoria externa y persistente&lt;/strong>.&lt;/p>
&lt;p>Aquí entra &lt;strong>Amazon Bedrock AgentCore Memory&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="integrando-amazon-bedrock-agentcore-memory">Integrando Amazon Bedrock AgentCore Memory
&lt;/h2>&lt;p>Ahora actualizamos el agente para:&lt;/p>
&lt;ul>
&lt;li>Guardar conversaciones en AgentCore Memory&lt;/li>
&lt;li>Restaurar contexto incluso tras reinicios&lt;/li>
&lt;li>Mantener sesiones coherentes usando &lt;code>session_id&lt;/code>&lt;/li>
&lt;/ul>
&lt;p>El código crece, pero el concepto es claro:&lt;/p>
&lt;ul>
&lt;li>LangGraph → memoria inmediata&lt;/li>
&lt;li>AgentCore Memory → memoria persistente&lt;/li>
&lt;/ul>
&lt;p>El resultado es un agente que &lt;strong>recuerda incluso después de reiniciar el runtime&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="probando-memoria-persistente">Probando memoria persistente
&lt;/h2>&lt;ol>
&lt;li>Haces una pregunta&lt;/li>
&lt;li>Reinicias el servidor&lt;/li>
&lt;li>Vuelves a preguntar usando el mismo &lt;code>session_id&lt;/code>&lt;/li>
&lt;li>El agente recuerda&lt;/li>
&lt;/ol>
&lt;p>Eso confirma que la memoria ya no depende del proceso, sino de AgentCore.&lt;/p>
&lt;blockquote>
&lt;p>Importante: la extracción de memoria no es instantánea. Puede tardar unos segundos en estar disponible.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="despliegue-en-producción-con-cdk">Despliegue en producción con CDK
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> cdk
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm install
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run cdk synth
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">npm run cdk deploy
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Una vez desplegado, puedes invocar el agente pasando el &lt;code>session_id&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">agentcore invoke &lt;span class="s1">&amp;#39;{&amp;#34;prompt&amp;#34;: &amp;#34;Who are you?&amp;#34;}&amp;#39;&lt;/span> --session-id &lt;span class="s1">&amp;#39;user-123456-conversation-87654321&amp;#39;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Si usas otro &lt;code>session_id&lt;/code>, se crea una nueva sesión.
Si reutilizas el anterior, el agente recuerda.&lt;/p>
&lt;hr>
&lt;h2 id="permisos-necesarios">Permisos necesarios
&lt;/h2>&lt;p>No olvides añadir permisos de AgentCore Memory al rol del runtime:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-ts" data-lang="ts">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">bedrock&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">agentcore&lt;/span>:&lt;span class="kt">CreateMemory&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">bedrock&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">agentcore&lt;/span>:&lt;span class="kt">CreateMemorySession&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">bedrock&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">agentcore&lt;/span>:&lt;span class="kt">ListLongTermMemoryRecords&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">bedrock&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="nx">agentcore&lt;/span>:&lt;span class="kt">SearchLongTermMemories&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Sin esto, la memoria no funcionará en producción.&lt;/p>
&lt;hr>
&lt;h2 id="observabilidad">Observabilidad
&lt;/h2>&lt;p>LangGraph + LangSmith, combinado con:&lt;/p>
&lt;ul>
&lt;li>CloudWatch Logs&lt;/li>
&lt;li>AgentCore Observability&lt;/li>
&lt;/ul>
&lt;p>te da una &lt;strong>visión completa&lt;/strong> tanto del comportamiento del agente como del uso de memoria.&lt;/p>
&lt;p>Es especialmente útil para entender &lt;strong>qué se está almacenando&lt;/strong> y &lt;strong>cuándo se recupera&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h2 id="limpieza-de-recursos">Limpieza de recursos
&lt;/h2>&lt;p>Cuando termines:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">cdk destroy --all
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Y elimina la memoria manualmente:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">aws bedrock-agentcore-control delete-memory --memory-id &amp;lt;MEMORY_ID&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="conclusión">Conclusión
&lt;/h2>&lt;p>La mayoría de agentes hoy en día &lt;strong>hablan bien&lt;/strong>, pero &lt;strong>no recuerdan&lt;/strong>. Y sin memoria, no hay continuidad, solo sesiones aisladas.&lt;/p>
&lt;p>Al combinar &lt;strong>LangGraph&lt;/strong> con &lt;strong>Amazon Bedrock AgentCore Memory&lt;/strong>, pasamos de agentes stateless a &lt;strong>sistemas con contexto real&lt;/strong>, preparados para producción.&lt;/p>
&lt;p>No es solo una mejora técnica.
Es un cambio de paradigma.&lt;/p>
&lt;p>A partir de aquí, los agentes dejan de ser demos… y empiezan a ser productos.&lt;/p>
&lt;hr>
&lt;p>Si este artículo te ha resultado útil o tienes alguna pregunta, puedes contactar conmigo en &lt;a class="link" href="https://www.linkedin.com/in/briansuarezsantiago/" target="_blank" rel="noopener"
>LinkedIn.&lt;/a>&lt;/p></description></item><item><title>Kiro: El nuevo IDE de AWS que revoluciona la programación</title><link>https://brianintech.com/kiro-ide-aws.html</link><pubDate>Mon, 20 Oct 2025 17:30:00 +0200</pubDate><guid>https://brianintech.com/kiro-ide-aws.html</guid><description>&lt;img src="https://d1hvrz5kjt6fwi.cloudfront.net/Blog%20Posts%20Covers/Post%2001/Post%2001_horizontal_es.png" alt="Featured image of post Kiro: El nuevo IDE de AWS que revoluciona la programación" />&lt;p>Hace poco más de un mes salí de la lista de espera de Kiro, el nuevo entorno de desarrollo que AWS lanzó como respuesta a Windsurf y Cursor. En teoría, parecía otro IDE más con IA integrada. En la práctica, me encontré con algo mucho más distinto de lo que esperaba.&lt;/p>
&lt;p>Cuando lo anunciaron en julio, muchos desarrolladores se lanzaron a probarlo, tantos que el acceso se cerró por saturación. Ahora que lo he usado a fondo, puedo decir que Kiro no intenta competir de frente con Windsurf o Cursor, sino que propone una idea un poco más ambiciosa: dejar atrás el “vibe coding” y centrarse en algo que ellos llaman desarrollo basado en especificaciones.&lt;/p>
&lt;p>Aparentemente, hay al menos seis IDE importantes basados en bifurcaciones de Visual Studio Code; conozco Cursor, Windsurf, y ahora Kiro.&lt;/p>
&lt;p>En este post, te cuento más sobre este último.&lt;/p>
&lt;p>¿Qué es exactamente Kiro?&lt;/p>
&lt;p>Según la documentación oficial de AWS, Kiro es un entorno de desarrollo integrado con inteligencia artificial pensado para construir proyectos desde una idea inicial hasta una aplicación completamente funcional (al menos eso aseguran). Suena como marketing, pero la diferencia clave es el proceso: en lugar de escribir prompts al vuelo para que el modelo genere código, aquí se trabaja a partir de especificaciones detalladas, una especie de plano técnico que define lo que quieres construir, cómo debe funcionar y qué tareas implica.&lt;/p>
&lt;p>A diferencia de las herramientas de los competidores, que dependen en gran medida de la generación rápida de código a partir de un prompt, Kiro adopta un enfoque más estructurado conocido como desarrollo basado en especificaciones. En pocas palabras, no le dices “hazme esto”, sino “esto es lo que necesito, y aquí están los detalles”. Y Kiro se encarga de transformar esas especificaciones en código, documentación y hasta pruebas automatizadas. AWS promete que el resultado es más limpio, mantenible y sobre todo entendible por humanos.&lt;/p>
&lt;p>Fun fact: “Kiro” significa encrucijada en japonés (きろ), una metáfora perfecta para la idea de combinar lo mejor del desarrollo de software tradicional con la aceleración impulsada por la IA.&lt;/p>
&lt;p>La herramienta es compatible con los sistemas operativos Windows, macOS y Linux, y funciona con los lenguajes de programación más populares. Está basado en Code OSS (el núcleo de código abierto de Visual Studio Code), por lo que en su esencia es un fork de VSCode (como era de esperar) y está desarrollado y soportado íntegramente por AWS. No obstante, permite el acceso a él sin disponer de una cuenta.&lt;/p>
&lt;p>Actualmente, se encuentra gratuito durante su fase de prueba, lo que supone una gran oportunidad para probarlo sin comprometerse a una suscripción (así que te animo a que le des una oportunidad).&lt;/p>
&lt;p>¿Cómo instalarlo?&lt;/p>
&lt;p>Al momento de escribir este post el acceso a Kiro ha sido liberado y por tanto es accesible para cualquier persona sin necesidad de pasar a través de una waitlist.&lt;/p>
&lt;p>La instalación es muy sencilla, basta con seguir la siguiente guía paso a paso y en pocos minutos tendrás Kiro instalado. Esta guía muestra el proceso de instalación y configuración en el sistema operativo macOS, pero los pasos son prácticamente iguales en Windows y Linux.&lt;/p>
&lt;p>Accede al sitio web oficial de Kiro&lt;/p>
&lt;p>Accede a la página web oficial de Kiro.&lt;/p>
&lt;p>Descargar el instalador&lt;/p>
&lt;p>Haz clic en el botón de descarga en función de tu sistema operativo. En mi caso he utilizado macOS, por lo que descargo el archivo ejecutable .dmg.&lt;/p>
&lt;p>Una vez descargado, ejecuta el instalador y sigue los pasos del asistente de configuración para completar el proceso.&lt;/p>
&lt;p>Registro en Kiro&lt;/p>
&lt;p>Una vez completada la instalación, Kiro te pedirá iniciar sesión. Puedes elegir entre varias opciones de inicio de sesión.&lt;/p>
&lt;p>Ventajas de utilizar AWS Builder ID&lt;/p>
&lt;p>Al iniciar sesión con AWS Builder ID, se desbloquea la integración directa con Amazon Q dentro de Kiro. Si tienes acceso a la versión Amazon Q Developer o Amazon Q Pro, puedes mejorar significativamente la experiencia al integrar el asistente basado en IA de AWS con Kiro y obtener de esta manera un análisis de código más detallado, explicaciones y asistencia durante el desarrollo. No es obligatorio, pero mejora mucho la experiencia.&lt;/p>
&lt;p>Importar la configuración de Visual Studio Code (Opcional)&lt;/p>
&lt;p>Por último, Kiro ofrece la opción de importar los ajustes y configuraciones existentes de VSCode de manera que se mantengan los temas, extensiones y preferencias que tienes en este IDE. Para esta guía, omitiremos este paso y continuaremos con la configuración predeterminada. Si al igual que yo prefieres partir de cero, la configuración por defecto funciona sin problemas.&lt;/p>
&lt;p>¿Qué tiene de novedoso?&lt;/p>
&lt;p>Al abrirlo, el diseño es muy similar a Visual Studio Code, lo que ayuda a sentirse en casa desde el primer minuto. Sin embargo, Kiro añade una barra lateral con secciones que no existen en otros IDE. Al abrir el panel, por defecto muestra 4 elementos: Specs, Agent Hooks, Agent Steering y MCP Servers.&lt;/p>
&lt;p>Specs&lt;/p>
&lt;p>Las Specs son una forma estructurada de construir y documentar funcionalidades que quieres desarrollar con Kiro. Aquí defines las especificaciones de tu proyecto. Es el corazón del sistema. Puedes iterar con el agente sobre los requisitos, el diseño y las tareas de implementación.&lt;/p>
&lt;p>Ejemplos de casos de uso&lt;/p>
&lt;p>Iterar con el agente sobre requerimientos, diseño y tareas de implementación.&lt;/p>
&lt;p>Desarrollar de manera incremental funcionalidades complejas con control y retroalimentación.&lt;/p>
&lt;p>Documentar el proceso desde la concepción hasta la implementación.&lt;/p>
&lt;p>Agent Hooks&lt;/p>
&lt;p>Los Agent Hooks son la capacidad de Kiro para crear acciones automáticas del agente que se ejecutan al producirse ciertos eventos. Básicamente, automatizan acciones que normalmente harías tú a mano.&lt;/p>
&lt;p>Ejemplos de hooks&lt;/p>
&lt;p>Al guardar un archivo de código, se activa automáticamente una acción para actualizar y ejecutar tests unitarios.&lt;/p>
&lt;p>Al modificar strings de traducción, se actualizan y se asegura de que otros idiomas también se actualicen.&lt;/p>
&lt;p>Hook manual de spell-check, en el que al hacer clic en el botón de “spell check”, revisa y corrige errores gramaticales en el archivo README.&lt;/p>
&lt;p>Agent Steering&lt;/p>
&lt;p>Steering permite incluir contexto adicional e instrucciones que guían el comportamiento de las interacciones con Kiro según el archivo o la tarea en la que estés trabajando. Por defecto, se almacenan en .kiro/steering/*.md y pueden ser:&lt;/p>
&lt;p>Tipos de inclusión&lt;/p>
&lt;p>Siempre incluidos (comportamiento por defecto)&lt;/p>
&lt;p>Condicionales cuando se lee un archivo específico (usando front-matter con inclusion fileMatch y fileMatchPattern: &amp;lsquo;README*&amp;rsquo;)&lt;/p>
&lt;p>Manuales cuando los proporcionas vía contexto con &amp;lsquo;#&amp;rsquo; en el chat (configurado con inclusion manual)&lt;/p>
&lt;p>MCP Servers&lt;/p>
&lt;p>El Model Context Protocol (MCP) es un estándar que permite a aplicaciones de IA conectarse con herramientas y servicios externos, extendiendo significativamente sus capacidades más allá del desarrollo básico. En nuestro caso la aplicación de IA que queremos potenciar es Kiro y para ello, se pueden emplear servidores MCP para dotarle de capacidades de conexión con APIs, bases de datos o aplicaciones de terceros con el fin de integrar workflows complejos.&lt;/p>
&lt;p>Ejemplos de uso de MCP Servers&lt;/p>
&lt;p>Integración con GitHub
Conectar Kiro a un servidor MCP que gestione repositorios de GitHub y permita crear, revisar y fusionar pull requests automáticamente, sincronizar issues con las Specs del proyecto, y mantener el historial de cambios sin salir del IDE.&lt;/p>
&lt;p>Conexión con bases de datos
A través de un servidor MCP que exponga acceso a bases de datos (por ejemplo, PostgreSQL o DynamoDB), Kiro puede ejecutar consultas, analizar datos o validar esquemas según las Specs, ayudando en tareas de backend, migraciones o verificaciones de integridad.&lt;/p>
&lt;p>Automatización de servicios externos
Un MCP Server conectado a herramientas como Slack, Notion o Jira que permita a Kiro actualizar tareas, publicar reportes de progreso o notificar eventos del pipeline de desarrollo sin intervención manual, creando un flujo de trabajo más integrado y ágil.&lt;/p>
&lt;p>AWS promete profundizar en esta última función en futuras actualizaciones, y por lo que he visto, hay mucho potencial.&lt;/p>
&lt;p>En un futuro post mostraré el proceso de configuración de diferentes servidores MCP en Kiro y en Amazon Q CLI.&lt;/p>
&lt;p>¿Por qué destaca Kiro?&lt;/p>
&lt;p>En un mundo en el que las herramientas de programación con IA están surgiendo rápidamente, Kiro no intenta ser el más “creativo” ni el que genera más líneas de código por minuto. Su apuesta es la estructura.&lt;/p>
&lt;p>En un panorama donde el “vibe coding” produce montañas de código difícil de mantener, Kiro propone una metodología más controlada y sostenible. Al hacer hincapié en las especificaciones y la automatización frente a las herramientas basadas en prompt únicamente, la filosofía detrás de Kiro pretende producir software listo para producción que no se desmorone cuando sea necesario escalarlo, depurarlo o simplemente, que no se convierta en una pesadilla mantenerlo en el tiempo.&lt;/p>
&lt;p>En un futuro post mostraré un ejemplo completo de un caso de uso real de las features que ofrece Kiro.&lt;/p>
&lt;p>Planes de pago&lt;/p>
&lt;p>La facturación de Kiro se basa en créditos.&lt;/p>
&lt;p>No obstante, actualmente tras el cierre de la fase beta, Kiro está en fase gratuita y, al registrarte, recibirás 500 créditos de bienvenida válidos durante 30 días.&lt;/p>
&lt;p>Luego es posible continuar con el plan gratuito de 50 créditos mensuales o pasar a niveles de pago. AWS ofrece distintos niveles de precios flexibles diseñados en función del uso que los desarrolladores hacen de Kiro. Puedes pasar a niveles de pago que van desde Pro (20$ al mes), Pro+ (40$ al mes) hasta Power (200$ al mes) para aumentar la capacidad y cuota de uso de los modelos. Cada uno de los niveles de pago incluye la posibilidad de pagar los excedentes de uso de los LLM de manera flexible a 0,04$ por crédito adicional.&lt;/p>
&lt;p>Cada acción que le pidas a Kiro que ejecute, desde generar especificaciones hasta ejecutar hooks consume créditos.&lt;/p>
&lt;p>Es un modelo similar al de otras herramientas de IA, pero con la ventaja de poder probarlo a fondo antes de invertir (así que aprovecha la oportunidad).&lt;/p>
&lt;p>En este enlace se encuentra una guía detallada de los modelos de suscripción existentes.&lt;/p>
&lt;p>Novedades y cierre de la beta&lt;/p>
&lt;p>Tras una beta masiva en la que más de 100.000 desarrolladores se lanzaron a probarlo en los primeros días, recientemente AWS ha liberado oficialmente Kiro para todos dejando atrás la fase beta.&lt;/p>
&lt;p>Con esta versión llegan dos grandes mejoras: soporte para el modelo Claude Sonnet 4.5 de Antrophic y un nuevo agente llamado Auto, que selecciona automáticamente la mejor combinación de modelos según la tarea. En la práctica, esto hace que el sistema elija por ti si conviene usar un modelo más rápido, más barato o más preciso.&lt;/p>
&lt;p>Reflexión final&lt;/p>
&lt;p>Después de un mes usando Kiro, tengo la sensación de que AWS está intentando redefinir la programación asistida por IA. En lugar de perseguir la inmediatez del prompt, apuesta por una forma más reflexiva y estructurada de desarrollar.&lt;/p>
&lt;p>No es una herramienta para quien solo quiere generar prototipos rápidos, sino para quienes buscan crear software serio, escalable y bien documentado. Kiro no elimina la necesidad de pensar, la reorganiza y te ayuda a hacerlo mejor.&lt;/p>
&lt;p>En resumen, mientras otros IDEs se centran en “vibrar” con el código, Kiro intenta devolverle forma, orden y propósito. Y eso, sinceramente, se agradece.&lt;/p>
&lt;hr>
&lt;p>Si este artículo te ha resultado útil o tienes alguna pregunta, puedes contactar conmigo en LinkedIn.&lt;/p></description></item><item><title>Strands Agents 101: Introducción práctica a los agentes de IA en AWS</title><link>https://brianintech.com/strands-agents-101-introduccion-practica.html</link><pubDate>Mon, 20 Oct 2025 17:30:00 +0200</pubDate><guid>https://brianintech.com/strands-agents-101-introduccion-practica.html</guid><description>&lt;img src="https://d1hvrz5kjt6fwi.cloudfront.net/Blog%20Posts%20Covers/Post%2005/Post%2005_horizontal_en.png" alt="Featured image of post Strands Agents 101: Introducción práctica a los agentes de IA en AWS" />&lt;p>El desarrollo de la IA está cambiando rápidamente, pasando de interacciones simples basadas en prompts a sistemas agénticos: IA que puede razonar, planificar y ejecutar acciones. El SDK de Strands Agents es un framework open source de AWS diseñado para simplificar la construcción de este tipo de agentes siguiendo un enfoque impulsado por el modelo, en el que los modelos de lenguaje grandes (LLM) se encargan del razonamiento y de la selección de herramientas con un código de orquestación mínimo.&lt;/p>
&lt;p>En lugar de dedicar meses a construir pipelines complejos, Strands permite a los desarrolladores crear agentes inteligentes y listos para producción en cuestión de días. Esta guía introduce a los principiantes en los fundamentos, los recursos necesarios y los bloques de construcción principales para empezar con confianza.&lt;/p>
&lt;h1 id="qué-es-strands-agents">¿Qué es Strands Agents?
&lt;/h1>&lt;p>Strands Agents es un SDK en Python que permite a los desarrolladores crear agentes de IA capaces de:&lt;/p>
&lt;ul>
&lt;li>Razonar y planificar utilizando LLMs.&lt;/li>
&lt;li>Llamar a herramientas (funciones) para realizar acciones reales.&lt;/li>
&lt;li>Integrarse de forma natural con servicios de AWS.&lt;/li>
&lt;li>Ejecutarse sobre múltiples proveedores de LLM.&lt;/li>
&lt;/ul>
&lt;p>A diferencia de los scripts tradicionales de chatbots, Strands se centra en el diseño de agentes preparados para producción, haciendo énfasis en la observabilidad, la flexibilidad y la reducción de boilerplate.&lt;/p>
&lt;h1 id="conceptos-clave-de-strands-agents">Conceptos clave de Strands Agents
&lt;/h1>&lt;p>La definición más simple de un agente es la combinación de tres elementos:&lt;/p>
&lt;ol>
&lt;li>&lt;strong>Modelo LLM&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Herramientas&lt;/strong>&lt;/li>
&lt;li>&lt;strong>Un prompt&lt;/strong>&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://brianintech.com/strands-agents-101-introduccion-practica/prompt-diagram.png"
width="300"
height="122"
srcset="https://brianintech.com/strands-agents-101-introduccion-practica/prompt-diagram_hu14056994132334224882.png 480w, https://brianintech.com/strands-agents-101-introduccion-practica/prompt-diagram_hu13166502678286309423.png 1024w"
loading="lazy"
alt="Propmpt Diagram"
class="gallery-image"
data-flex-grow="245"
data-flex-basis="590px"
>&lt;/p>
&lt;p>El agente utiliza estos tres componentes para completar una tarea, a menudo de forma autónoma. La tarea del agente puede ser responder una pregunta, generar código, planificar unas vacaciones u optimizar una cartera financiera. En un enfoque impulsado por el modelo, el agente utiliza el modelo para dirigir dinámicamente sus propios pasos y para usar herramientas con el fin de completar la tarea especificada.&lt;/p>
&lt;p>Para definir un agente con el SDK de Strands Agents, se definen estos tres componentes en el código:&lt;/p>
&lt;h2 id="modelo">Modelo
&lt;/h2>&lt;p>Strands ofrece un soporte flexible de modelos. Puedes utilizar:&lt;/p>
&lt;ul>
&lt;li>Cualquier modelo de Amazon Bedrock que soporte uso de herramientas y streaming&lt;/li>
&lt;li>Un modelo de la familia Claude de Anthropic a través de la API de Anthropic&lt;/li>
&lt;li>Un modelo de la familia Llama mediante la API de Llama&lt;/li>
&lt;li>Ollama para desarrollo local&lt;/li>
&lt;li>Muchos otros proveedores como OpenAI a través de LiteLLM&lt;/li>
&lt;li>Tu propio proveedor de modelos personalizado con Strands&lt;/li>
&lt;/ul>
&lt;h2 id="herramientas">Herramientas
&lt;/h2>&lt;p>Puedes elegir entre miles de servidores publicados del Model Context Protocol (MCP) para usarlos como herramientas de tu agente. Strands también proporciona más de 20 herramientas de ejemplo preconstruidas, incluidas herramientas para manipular archivos, realizar peticiones API e interactuar con APIs de AWS. Cualquier función en Python puede usarse fácilmente como herramienta simplemente utilizando el decorador &lt;code>@tool&lt;/code> de Strands.&lt;/p>
&lt;h2 id="prompt">Prompt
&lt;/h2>&lt;p>Proporcionas un prompt en lenguaje natural que define la tarea del agente, como responder una pregunta de un usuario final. También puedes proporcionar un system prompt que define instrucciones generales y el comportamiento deseado del agente.&lt;/p>
&lt;p>Un agente interactúa con su modelo y sus herramientas en un bucle hasta completar la tarea proporcionada por el prompt. Este bucle agéntico es el núcleo de las capacidades de Strands. El bucle agéntico de Strands aprovecha al máximo lo potentes que se han vuelto los LLM y su capacidad nativa para razonar, planificar y seleccionar herramientas.&lt;/p>
&lt;p>En cada iteración, Strands invoca al LLM con el prompt y el contexto del agente, junto con una descripción de las herramientas disponibles. El LLM puede:&lt;/p>
&lt;ul>
&lt;li>Responder en lenguaje natural al usuario final&lt;/li>
&lt;li>Planificar una serie de pasos&lt;/li>
&lt;li>Reflexionar sobre pasos anteriores del agente&lt;/li>
&lt;li>Seleccionar una o más herramientas para usar&lt;/li>
&lt;/ul>
&lt;p>Cuando el LLM selecciona una herramienta, Strands se encarga de ejecutarla y de devolver el resultado al LLM. Cuando el LLM completa su tarea, Strands devuelve el resultado final del agente.&lt;/p>
&lt;h3 id="filosofía-de-diseño-principal-enfoque-impulsado-por-el-modelo">Filosofía de diseño principal (enfoque impulsado por el modelo)
&lt;/h3>&lt;p>Strands desplaza la complejidad desde el desarrollador hacia el propio modelo. En lugar de codificar árboles de decisión o flujos de trabajo:&lt;/p>
&lt;ul>
&lt;li>El LLM razona sobre la tarea.&lt;/li>
&lt;li>El LLM decide cuándo usar herramientas.&lt;/li>
&lt;li>El desarrollador define capacidades, no el flujo de control.&lt;/li>
&lt;/ul>
&lt;p>Esto reduce drásticamente el código de orquestación y mejora la mantenibilidad.&lt;/p>
&lt;h1 id="cómo-funcionan-los-strands-agents-agentic-loop">Cómo funcionan los Strands Agents (Agentic Loop)
&lt;/h1>&lt;p>Para entender realmente por qué Strands requiere tan poco código de orquestación, es útil observar cómo opera internamente un agente. En el núcleo de Strands se encuentra un &lt;strong>bucle agéntico&lt;/strong>, en el que el agente razona, actúa y refina continuamente su respuesta coordinando un modelo y un conjunto de herramientas.&lt;/p>
&lt;p>&lt;img src="https://brianintech.com/strands-agents-101-introduccion-practica/agentic-loop.png"
width="1118"
height="555"
srcset="https://brianintech.com/strands-agents-101-introduccion-practica/agentic-loop_hu4412472274191408320.png 480w, https://brianintech.com/strands-agents-101-introduccion-practica/agentic-loop_hu14735983430248618691.png 1024w"
loading="lazy"
alt="Bucle agéntico de Strands Agents"
class="gallery-image"
data-flex-grow="201"
data-flex-basis="483px"
>&lt;/p>
&lt;p>Este bucle comienza cuando un prompt del usuario invoca al agente. El agente reenvía el prompt al modelo, que razona sobre la solicitud y decide si puede responder directamente o si necesita usar una herramienta. Si se requiere una herramienta, el agente la ejecuta y pasa el resultado de vuelta al modelo para un razonamiento adicional. Este ciclo puede repetirse varias veces hasta que el modelo determina que la tarea está completa.&lt;/p>
&lt;p>Una vez finalizado el razonamiento, el agente devuelve una respuesta final, bien estructurada, al usuario. Dado que el propio modelo decide cuándo y cómo usar las herramientas, los desarrolladores no necesitan escribir flujos de trabajo complejos, comprobaciones condicionales ni máquinas de estados. Esto es lo que hace que Strands sea a la vez potente y accesible para principiantes.&lt;/p>
&lt;p>En resumen, los agentes de Strands no solo responden: piensan, actúan y se adaptan a través de este agentic loop.&lt;/p>
&lt;h2 id="proveedor-de-modelos-por-defecto-amazon-bedrock">Proveedor de modelos por defecto: Amazon Bedrock
&lt;/h2>&lt;p>Por defecto, Strands utiliza Amazon Bedrock, un servicio totalmente gestionado de AWS que proporciona acceso a modelos fundacionales de alta calidad, como Anthropic Claude, a través de una API unificada.&lt;/p>
&lt;p>AWS Bedrock se encarga de:&lt;/p>
&lt;ul>
&lt;li>Infraestructura y escalado&lt;/li>
&lt;li>Selección y actualización de modelos&lt;/li>
&lt;li>Seguridad e integración con IAM&lt;/li>
&lt;/ul>
&lt;p>🔗 &lt;a class="link" href="https://aws.amazon.com/bedrock/" target="_blank" rel="noopener"
>AWS Bedrock Overview&lt;/a>&lt;/p>
&lt;h2 id="herramientas-de-strands-agents">Herramientas de Strands Agents
&lt;/h2>&lt;p>Strands proporciona un ecosistema rico de herramientas a través del repositorio oficial de herramientas. Estas herramientas permiten que los agentes vayan más allá de la generación de texto y realicen operaciones reales.&lt;/p>
&lt;p>🔗 &lt;a class="link" href="https://github.com/strands-agents/tools" target="_blank" rel="noopener"
>Strands Agents Tools (Repositorio oficial)&lt;/a>&lt;/p>
&lt;p>Las capacidades disponibles incluyen:&lt;/p>
&lt;ul>
&lt;li>Cálculo matemático y simbólico&lt;/li>
&lt;li>Lectura y escritura de archivos&lt;/li>
&lt;li>Peticiones HTTP&lt;/li>
&lt;li>Ejecución de Python&lt;/li>
&lt;li>Interacción con servicios de AWS&lt;/li>
&lt;li>Memoria y recuperación de conocimiento&lt;/li>
&lt;/ul>
&lt;h2 id="requisitos-previos">Requisitos previos
&lt;/h2>&lt;p>Antes de empezar, asegúrate de contar con:&lt;/p>
&lt;ul>
&lt;li>Python 3.10 o superior&lt;/li>
&lt;li>Una cuenta de AWS configurada localmente&lt;/li>
&lt;li>Conocimientos básicos de Python (recomendado)&lt;/li>
&lt;/ul>
&lt;h2 id="instalación">Instalación
&lt;/h2>&lt;p>Instala el SDK de Strands y el paquete de herramientas usando pip:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">pip install strands-agents strands-agents-tools
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Una vez instalado, ya puedes crear tu primer agente.&lt;/p>
&lt;h1 id="creando-tu-primer-agente-con-strands">Creando tu primer agente con Strands
&lt;/h1>&lt;p>Un agente de Strands puede inicializarse únicamente con un system prompt:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;span class="lnt">8
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">strands&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Agent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">agent&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Agent&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">system_prompt&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;You are a helpful assistant that provides concise answers.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">response&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">agent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Hello! What can you do?&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">response&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Por defecto, este agente se ejecuta sobre AWS Bedrock utilizando un modelo Claude seleccionado según tu región de AWS, sin necesidad de configuración manual del modelo.&lt;/p>
&lt;h1 id="añadiendo-herramientas-a-un-agente">Añadiendo herramientas a un agente
&lt;/h1>&lt;p>Las herramientas otorgan a los agentes la capacidad de actuar. Strands soporta herramientas integradas y herramientas personalizadas mediante el decorador &lt;code>@tool&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">strands&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Agent&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">tool&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">strands_tools&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">calculator&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@tool&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">def&lt;/span> &lt;span class="nf">weather&lt;/span>&lt;span class="p">():&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="s2">&amp;#34;&amp;#34;&amp;#34;Return current weather (dummy implementation).&amp;#34;&amp;#34;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="s2">&amp;#34;sunny&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">agent&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Agent&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">tools&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">calculator&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="n">weather&lt;/span>&lt;span class="p">],&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">system_prompt&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;You can perform calculations and provide weather updates.&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">agent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;What is 12 * 8?&amp;#34;&lt;/span>&lt;span class="p">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h2 id="invocación-directa-de-herramientas-depuración-y-pruebas">Invocación directa de herramientas (depuración y pruebas)
&lt;/h2>&lt;p>Las herramientas también pueden invocarse directamente sin pasar por el bucle de razonamiento del agente:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="n">agent&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">tool&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">calculator&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">expression&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;x^2 + 2x&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">mode&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;derive&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">wrt&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;x&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Esto resulta útil para depurar, probar lógica o utilizar herramientas dentro de otras herramientas.&lt;/p>
&lt;h1 id="logging-y-observabilidad">Logging y observabilidad
&lt;/h1>&lt;p>Strands se integra con el módulo estándar de logging de Python, proporcionando visibilidad sobre el comportamiento del agente:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">import&lt;/span> &lt;span class="nn">logging&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">strands&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Agent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">logging&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">getLogger&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;strands&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">setLevel&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">logging&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">DEBUG&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">logging&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">basicConfig&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">format&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="si">%(levelname)s&lt;/span>&lt;span class="s2"> | &lt;/span>&lt;span class="si">%(name)s&lt;/span>&lt;span class="s2"> | &lt;/span>&lt;span class="si">%(message)s&lt;/span>&lt;span class="s2">&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">handlers&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="n">logging&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">StreamHandler&lt;/span>&lt;span class="p">()]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">agent&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Agent&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">agent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="s2">&amp;#34;Hello!&amp;#34;&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Esto ayuda a rastrear:&lt;/p>
&lt;ul>
&lt;li>Decisiones del modelo&lt;/li>
&lt;li>Uso de herramientas&lt;/li>
&lt;li>Errores y comportamiento de recuperación&lt;/li>
&lt;/ul>
&lt;h1 id="proveedores-de-modelos-en-strands">Proveedores de modelos en Strands
&lt;/h1>&lt;p>Aunque AWS Bedrock es el proveedor por defecto, Strands soporta múltiples proveedores de LLM:&lt;/p>
&lt;ul>
&lt;li>Amazon Bedrock&lt;/li>
&lt;li>APIs compatibles con OpenAI&lt;/li>
&lt;li>Anthropic&lt;/li>
&lt;li>LiteLLM&lt;/li>
&lt;li>Ollama (modelos locales)&lt;/li>
&lt;li>Proveedores personalizados&lt;/li>
&lt;/ul>
&lt;h2 id="especificar-explícitamente-un-modelo-de-bedrock">Especificar explícitamente un modelo de Bedrock
&lt;/h2>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">strands&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Agent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">agent&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Agent&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">model&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;us.anthropic.claude-3-7-sonnet-20250219-v1:0&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">print&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">agent&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="o">.&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="configuración-avanzada-de-modelos">Configuración avanzada de modelos
&lt;/h3>&lt;p>Para un control más preciso, puedes configurar directamente un proveedor:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-python" data-lang="python">&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">strands.models&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">BedrockModel&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="kn">from&lt;/span> &lt;span class="nn">strands&lt;/span> &lt;span class="kn">import&lt;/span> &lt;span class="n">Agent&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">bedrock_model&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">BedrockModel&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">model_id&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;us.anthropic.claude-3-7-sonnet-20250219-v1:0&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">region_name&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;us-west-2&amp;#34;&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">temperature&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="mf">0.3&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">agent&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="n">Agent&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">model&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="n">bedrock_model&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h1 id="por-qué-strands-es-accesible-para-principiantes">Por qué Strands es accesible para principiantes
&lt;/h1>&lt;p>Strands hace que el desarrollo de agentes sea más sencillo al:&lt;/p>
&lt;ul>
&lt;li>Reducir el boilerplate de orquestación&lt;/li>
&lt;li>Utilizar abstracciones claras y declarativas&lt;/li>
&lt;li>Soportar logging estándar de la industria&lt;/li>
&lt;li>Ofrecer integraciones flexibles de modelos&lt;/li>
&lt;li>Alinearse de forma natural con los flujos de trabajo de AWS&lt;/li>
&lt;/ul>
&lt;h1 id="recursos-necesarios-para-principiantes">Recursos necesarios para principiantes
&lt;/h1>&lt;ul>
&lt;li>&lt;strong>Strands SDK&lt;/strong>: &lt;a class="link" href="https://github.com/strands-agents/sdk-python" target="_blank" rel="noopener"
>https://github.com/strands-agents/sdk-python&lt;/a>&lt;/li>
&lt;li>&lt;strong>Strands Tools&lt;/strong>: &lt;a class="link" href="https://github.com/strands-agents/tools" target="_blank" rel="noopener"
>https://github.com/strands-agents/tools&lt;/a>&lt;/li>
&lt;li>&lt;strong>AWS Bedrock&lt;/strong>: &lt;a class="link" href="https://aws.amazon.com/bedrock/" target="_blank" rel="noopener"
>https://aws.amazon.com/bedrock/&lt;/a>&lt;/li>
&lt;li>&lt;strong>Documentación oficial&lt;/strong>: &lt;a class="link" href="https://strandsagents.com/latest" target="_blank" rel="noopener"
>https://strandsagents.com/latest&lt;/a>&lt;/li>
&lt;/ul>
&lt;h1 id="conclusión">Conclusión
&lt;/h1>&lt;p>Strands Agents proporciona una base limpia y preparada para el futuro para cualquiera que empiece con IA agéntica. Al permitir que los modelos gestionen el razonamiento y la toma de decisiones, Strands permite a los desarrolladores centrarse en definir capacidades en lugar de gestionar la complejidad.&lt;/p>
&lt;p>Esta guía para principiantes cubre todo lo necesario para empezar. A medida que tus casos de uso crecen, Strands escala de forma fluida: desde agentes simples hasta sistemas autónomos y multiagente.&lt;/p>
&lt;hr>
&lt;p>Si este artículo te ha resultado útil o tienes alguna pregunta, puedes contactar conmigo en &lt;a class="link" href="https://www.linkedin.com/in/briansuarezsantiago/" target="_blank" rel="noopener"
>LinkedIn.&lt;/a>&lt;/p></description></item><item><title>Configura un repositorio Nexus con Docker y AWS EC2 en minutos</title><link>https://brianintech.com/configurar-nexus-docker-ec2.html</link><pubDate>Tue, 07 Oct 2025 10:30:00 +0200</pubDate><guid>https://brianintech.com/configurar-nexus-docker-ec2.html</guid><description>&lt;p>¿Quieres un repositorio central para manejar dependencias y artefactos en tus proyectos? ¡Sonatype Nexus es la solución! En este tutorial, aprenderás a instalar y configurar un Nexus Repository usando Docker en una instancia de AWS EC2.&lt;/p>
&lt;hr>
&lt;h3 id="requisitos-previos">Requisitos previos
&lt;/h3>&lt;p>Antes de comenzar, asegúrate de tener lo siguiente:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Docker&lt;/strong> instalado en tu instancia de EC2. &lt;a class="link" href="https://dev.to/briansuarezsantiago/aprende-a-instalar-docker-en-una-instancia-ec2-con-amazon-linux-2023-y-ubuntu-3ncn" target="_blank" rel="noopener"
>Revisa mi artículo sobre cómo instalar Docker en una instancia EC2.&lt;/a>&lt;/li>
&lt;li>Conocer los &lt;strong>requisitos del sistema&lt;/strong> de Nexus (revisa la &lt;a class="link" href="https://help.sonatype.com/en/sonatype-nexus-repository-system-requirements.html" target="_blank" rel="noopener"
>documentación oficial&lt;/a>).&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="paso-1-crear-un-volumen-persistente">Paso 1: Crear un volumen persistente
&lt;/h3>&lt;p>Para evitar perder datos si el contenedor se detiene, primero crearemos un volumen en Docker:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker volume create --name nexus-data
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Después de crear el volumen, puedes listar los volúmenes disponibles para asegurarte de que se haya creado correctamente:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker volume ls
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="paso-2-ejecutar-el-contenedor-de-nexus">Paso 2: Ejecutar el contenedor de Nexus
&lt;/h3>&lt;p>Usaremos la imagen oficial de Nexus para lanzar el servicio:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker run -d -p 8081:8081 --name nexus -v nexus-data:/nexus-data sonatype/nexus3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;ul>
&lt;li>&lt;strong>Verifica que la imagen de Nexus se haya descargado correctamente:&lt;/strong>&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker images &lt;span class="p">|&lt;/span> grep nexus3
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;ul>
&lt;li>&lt;strong>Si el contenedor no aparece en ejecución al usar el comando &lt;code>docker ps&lt;/code>, ejecútalo manualmente:&lt;/strong>&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker start nexus
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Por defecto, Nexus Repository Manager estará disponible en el puerto &lt;strong>8081&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h3 id="paso-3-esperar-la-inicialización">Paso 3: Esperar la inicialización
&lt;/h3>&lt;p>Dale uno o dos minutos para que el contenedor se inicie completamente.&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Prueba rápida:&lt;/strong> Abre tu navegador y visita &lt;code>http://&amp;lt;IP_de_tu_EC2&amp;gt;:8081&lt;/code>. Deberías ver la interfaz de Nexus Repository.&lt;/li>
&lt;/ul>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/30zp7bavj8fu0pidrdcw.png"
loading="lazy"
alt="Primera vista inicial de Nexus Repository Manager"
>&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Prueba alternativa con cURL:&lt;/strong>&lt;/li>
&lt;/ul>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl http://&amp;lt;IP_de_tu_EC2&amp;gt;:8081
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="paso-4-obtener-la-contraseña-del-administrador">Paso 4: Obtener la contraseña del administrador
&lt;/h3>&lt;p>Nexus genera una contraseña de administrador única la primera vez que se inicia. Para obtenerla:&lt;/p>
&lt;p>Usa el siguiente comando para leer el archivo &lt;code>admin.password&lt;/code> dentro del contenedor:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker container &lt;span class="nb">exec&lt;/span> nexus cat /nexus-data/admin.password
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>El resultado será algo como:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">90ae9815-05c3-43f1-9ad0-cb83a1d6780e
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lt2h4iv6yr40vz3wdhip.png"
loading="lazy"
alt="Ejemplo contraseña de administrador inicial"
>&lt;/p>
&lt;hr>
&lt;h3 id="paso-5-inicia-sesión-en-el-panel-de-administración">Paso 5: Inicia sesión en el panel de administración
&lt;/h3>&lt;ol>
&lt;li>Ve a &lt;code>http://&amp;lt;IP_de_tu_EC2&amp;gt;:8081&lt;/code>&lt;/li>
&lt;li>Inicia sesión con:
&lt;ul>
&lt;li>Usuario: &lt;code>admin&lt;/code>&lt;/li>
&lt;li>Contraseña: (la que obtuviste en el paso anterior)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ol>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zc3ub9ab6r7eoqwszf6h.png"
loading="lazy"
alt="Pantalla inicial de inicio de sesión"
>&lt;/p>
&lt;hr>
&lt;h3 id="paso-6-configurar-nexus-según-tus-necesidades">Paso 6: Configurar Nexus según tus necesidades
&lt;/h3>&lt;p>Desde el panel de administración, puedes:&lt;/p>
&lt;ul>
&lt;li>Crear repositorios para Maven, NPM, Docker, y más.&lt;/li>
&lt;li>Configurar permisos y usuarios.&lt;/li>
&lt;li>Integrar Nexus con tus pipelines de CI/CD.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="-tips-importantes-para-la-configuración-inicial">🔑 Tips importantes para la configuración inicial
&lt;/h3>&lt;p>&lt;strong>1. Cambio obligatorio de contraseña&lt;/strong>&lt;/p>
&lt;p>Al iniciar sesión por primera vez como administrador, Nexus te solicitará que cambies la contraseña inicial. Asegúrate de que la nueva contraseña cumpla con los siguientes requisitos:&lt;/p>
&lt;ul>
&lt;li>Al menos una letra mayúscula y una minúscula.&lt;/li>
&lt;li>Al menos un número.&lt;/li>
&lt;li>Al menos un símbolo especial (.!@#$%^&amp;amp;*()).&lt;/li>
&lt;li>Longitud mínima de 8 caracteres.&lt;/li>
&lt;/ul>
&lt;p>&lt;strong>2. Acceso anónimo&lt;/strong>&lt;/p>
&lt;p>Durante la configuración inicial, Nexus te dará la opción de habilitar o deshabilitar el acceso anónimo:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Habilitar acceso anónimo:&lt;/strong> Los usuarios podrán buscar, navegar y descargar componentes de los repositorios sin necesidad de credenciales. Esto puede ser útil para proyectos públicos, pero debes evaluar los riesgos para tu organización.&lt;/li>
&lt;li>&lt;strong>Deshabilitar acceso anónimo:&lt;/strong> Requiere credenciales para todos los usuarios y herramientas de compilación, lo que es más seguro pero puede ser menos conveniente.&lt;/li>
&lt;/ul>
&lt;blockquote>
&lt;p>&lt;strong>Recomendación:&lt;/strong> Si estás configurando Nexus para un entorno corporativo, considera deshabilitar el acceso anónimo para mantener un control más estricto sobre quién puede acceder a tus repositorios.&lt;/p>
&lt;/blockquote>
&lt;hr>
&lt;h2 id="listo-para-potenciar-tus-proyectos-">¿Listo para potenciar tus proyectos? 🚀
&lt;/h2>&lt;p>Ahora tienes un Nexus Repository completamente funcional corriendo en tu instancia EC2.&lt;/p>
&lt;p>¿Te quedaron dudas? ¿O quizás ya tienes experiencia usando Nexus? ¡Comparte tus preguntas o experiencias en los comentarios! 👇🏻&lt;/p></description></item><item><title>Cómo instalar MySQL en una instancia EC2 con Amazon Linux 2023</title><link>https://brianintech.com/instalar-mysql-ec2.html</link><pubDate>Wed, 10 Sep 2025 10:30:00 +0200</pubDate><guid>https://brianintech.com/instalar-mysql-ec2.html</guid><description>&lt;img src="https://d1hvrz5kjt6fwi.cloudfront.net/Blog Posts Covers/Posts Unorder/Post11.png" alt="Featured image of post Cómo instalar MySQL en una instancia EC2 con Amazon Linux 2023" />&lt;p>¿Estás trabajando con una instancia EC2 usando Amazon Linux 2023 y necesitas MySQL? A diferencia de versiones anteriores, MySQL ya no viene preinstalado, y el proceso de instalación puede ser algo confuso. ¡Pero no te preocupes! Aquí tienes una guía paso a paso para instalarlo sin complicaciones y configurarlo adecuadamente.&lt;/p>
&lt;hr>
&lt;h3 id="1-descarga-el-archivo-rpm-de-mysql">&lt;strong>1. Descarga el archivo RPM de MySQL&lt;/strong>
&lt;/h3>&lt;p>El primer paso es descargar el archivo del repositorio de MySQL. Esto te permitirá acceder a las versiones más recientes:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo wget https://dev.mysql.com/get/mysql80-community-release-el9-1.noarch.rpm
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="2-instala-el-archivo-rpm">&lt;strong>2. Instala el archivo RPM&lt;/strong>
&lt;/h3>&lt;p>Este archivo configurará el repositorio necesario para la instalación:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo dnf install mysql80-community-release-el9-1.noarch.rpm -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="3-importa-la-clave-pública-de-mysql">&lt;strong>3. Importa la clave pública de MySQL&lt;/strong>
&lt;/h3>&lt;p>Para evitar problemas con la autenticación de los paquetes, importa la clave GPG de MySQL:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="4-instala-mysql-según-tus-necesidades">&lt;strong>4. Instala MySQL según tus necesidades&lt;/strong>
&lt;/h3>&lt;h4 id="solo-cliente-mysql">&lt;strong>Solo cliente MySQL:&lt;/strong>
&lt;/h4>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo dnf install mysql-community-client -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h4 id="servidor-mysql-incluye-cliente">&lt;strong>Servidor MySQL (incluye cliente):&lt;/strong>
&lt;/h4>&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo dnf install mysql-community-server -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="5-configura-el-servidor-mysql">&lt;strong>5. Configura el servidor MySQL&lt;/strong>
&lt;/h3>&lt;p>Inicia el servicio y asegúrate de que arranque automáticamente con el sistema:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl start mysqld
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> mysqld
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Verifica que el servicio esté funcionando:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl status mysqld
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>📸 Aquí tienes un ejemplo de cómo debería verse el estado del servicio:&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/kwg5sl793jqk9krjg4x3.png"
loading="lazy"
alt="Estado de MySQL"
>&lt;/p>
&lt;hr>
&lt;h3 id="6-configuración-inicial-de-mysql">&lt;strong>6. Configuración inicial de MySQL&lt;/strong>
&lt;/h3>&lt;p>Antes de usar MySQL, necesitas realizar una configuración inicial. Primero, encuentra la contraseña temporal generada durante la instalación:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo grep &lt;span class="s1">&amp;#39;temporary password&amp;#39;&lt;/span> /var/log/mysqld.log
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>🔑 Un ejemplo del resultado se muestra a continuación:&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ekb7g531mgoppuivsopw.png"
loading="lazy"
alt="Contraseña temporal"
>&lt;/p>
&lt;p>A continuación, ejecuta el script de configuración inicial:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo mysql_secure_installation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="recomendaciones-al-configurar-la-contraseña">&lt;strong>Recomendaciones al configurar la contraseña&lt;/strong>
&lt;/h3>&lt;p>&lt;strong>1. Cumple con los requisitos de seguridad:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Al menos una letra mayúscula y una minúscula.&lt;/li>
&lt;li>Al menos un número.&lt;/li>
&lt;li>Al menos un símbolo especial (.!@#$%^&amp;amp;*()).&lt;/li>
&lt;li>Longitud mínima de 8 caracteres.&lt;/li>
&lt;/ul>
&lt;p>Si no cumples con estos criterios, verás un error como este:&lt;/p>
&lt;blockquote>
&lt;p>&lt;code>ERROR 1819 (HY000): Your password does not satisfy the current policy requirements.&lt;/code>&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mey9mnwbeip843ky7spp.png"
loading="lazy"
alt="Error de contraseña"
>&lt;/p>
&lt;p>&lt;strong>2. Evalúa el nivel de seguridad:&lt;/strong>&lt;/p>
&lt;p>MySQL te mostrará un porcentaje que indica qué tan segura es tu contraseña. Un nivel del 100% indica la máxima seguridad.&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/858innrpkmo4wwc23vo5.png"
loading="lazy"
alt="Nivel de seguridad"
>&lt;/p>
&lt;p>&lt;strong>3. Ajusta la política de validación (opcional):&lt;/strong>&lt;/p>
&lt;p>Si prefieres contraseñas menos estrictas, puedes modificar la política de validación en el archivo &lt;code>/etc/my.cnf&lt;/code> o mediante comandos dentro de MySQL.&lt;/p>
&lt;hr>
&lt;h3 id="qué-hace-el-script-mysql_secure_installation">&lt;strong>¿Qué hace el script &lt;code>mysql_secure_installation&lt;/code>?&lt;/strong>
&lt;/h3>&lt;p>Este script te guía para realizar ajustes clave en la configuración de seguridad:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Cambiar la contraseña de &lt;code>root&lt;/code>:&lt;/strong> Usa una contraseña fuerte siguiendo las recomendaciones anteriores.&lt;/li>
&lt;li>&lt;strong>Deshabilitar usuarios anónimos:&lt;/strong> Esto evita accesos no autorizados.&lt;/li>
&lt;li>&lt;strong>Eliminar la base de datos de prueba:&lt;/strong> Protege tu sistema eliminando datos predeterminados.&lt;/li>
&lt;li>&lt;strong>Restringir el acceso remoto:&lt;/strong> Asegura que solo se pueda acceder desde la máquina local.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="vista-del-asistente-de-configuración">&lt;strong>Vista del asistente de configuración&lt;/strong>
&lt;/h3>&lt;p>📸 Aquí tienes capturas de pantalla de cómo se ve el asistente durante su ejecución:&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xj52nghe6ox6xb2kd5k2.png"
loading="lazy"
alt="Paso 1 del asistente"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/7yzgw279no58y2g3qx12.png"
loading="lazy"
alt="Paso 2 del asistente"
>&lt;/p>
&lt;hr>
&lt;h2 id="listo-">¡Listo! 🎉
&lt;/h2>&lt;p>Ahora tienes MySQL completamente instalado y configurado en tu instancia EC2 con Amazon Linux 2023.&lt;/p>
&lt;p>¿Tienes alguna duda o quieres compartir tu experiencia? ¡Déjalo en los comentarios! 👇🏻&lt;/p></description></item><item><title>¿Cómo solucionar el error 'GPG key is already installed' al instalar MySQL en Amazon Linux 2023?</title><link>https://brianintech.com/solucionar-error-gpg-mysql-ec2.html</link><pubDate>Sat, 09 Aug 2025 10:30:00 +0200</pubDate><guid>https://brianintech.com/solucionar-error-gpg-mysql-ec2.html</guid><description>&lt;img src="https://d1hvrz5kjt6fwi.cloudfront.net/Blog Posts Covers/Posts Unorder/Post11.png" alt="Featured image of post ¿Cómo solucionar el error 'GPG key is already installed' al instalar MySQL en Amazon Linux 2023?" />&lt;p>Si estás intentando instalar MySQL en una instancia EC2 con &lt;strong>Amazon Linux 2023&lt;/strong>, probablemente te encuentres con este molesto error relacionado con las claves GPG:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">The GPG keys listed &lt;span class="k">for&lt;/span> the &lt;span class="s2">&amp;#34;MySQL 8.0 Community Server&amp;#34;&lt;/span> repository are already installed but they are not correct &lt;span class="k">for&lt;/span> this package.
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Esto sucede porque MySQL actualizó sus claves GPG recientemente y algunas versiones del repositorio intentan utilizar claves obsoletas. Aquí tienes cómo resolver este problema y por qué ocurre.&lt;/p>
&lt;hr>
&lt;h3 id="qué-causa-este-error">&lt;strong>¿Qué causa este error?&lt;/strong>
&lt;/h3>&lt;p>Las claves GPG son utilizadas para verificar la integridad y autenticidad de los paquetes descargados. Sin embargo, la clave antigua &lt;code>RPM-GPG-KEY-mysql-2022&lt;/code> expiró el &lt;strong>14 de diciembre de 2023&lt;/strong>, y los paquetes más recientes (a partir de MySQL 8.0.36) ahora requieren la nueva clave &lt;code>RPM-GPG-KEY-mysql-2023&lt;/code>&lt;/p>
&lt;p>Por esta razón, aunque el repositorio configure automáticamente la clave anterior, falla al verificar los paquetes más recientes.&lt;/p>
&lt;hr>
&lt;h3 id="cómo-resolver-el-error">&lt;strong>Cómo resolver el error&lt;/strong>
&lt;/h3>&lt;p>Sigue estos pasos para importar la nueva clave GPG y completar la instalación de MySQL.&lt;/p>
&lt;p>&lt;strong>1. Eliminar claves GPG obsoletas&lt;/strong>&lt;/p>
&lt;p>Asegúrate de eliminar cualquier clave antigua que pueda estar causando conflictos.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo rpm -e gpg-pubkey-3a79bd29
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Nota: &lt;code>3a79bd29&lt;/code> es la clave antigua. Si ves otra clave conflictiva en los mensajes de error, reemplázala por el identificador correspondiente.&lt;/p>
&lt;p>&lt;strong>2. Importar la nueva clave GPG de 2023&lt;/strong>&lt;/p>
&lt;p>Descarga e importa manualmente la nueva clave GPG:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2023
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;strong>3. Reintentar la instalación de MySQL&lt;/strong>&lt;/p>
&lt;p>Ahora puedes volver a instalar MySQL sin problemas:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo yum install mysql-community-server -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="verifica-las-claves-activas">&lt;strong>Verifica las claves activas&lt;/strong>
&lt;/h3>&lt;p>Para confirmar que las claves correctas están instaladas, utiliza este comando:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">rpm -qa gpg-pubkey
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Deberías ver algo como:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">gpg-pubkey-a8d3785c-&amp;lt;timestamp&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>El identificador &lt;code>a8d3785c&lt;/code> corresponde a la nueva clave GPG válida para los paquetes MySQL recientes.&lt;/p>
&lt;hr>
&lt;h3 id="un-vistazo-al-futuro">&lt;strong>Un vistazo al futuro&lt;/strong>
&lt;/h3>&lt;p>Según el &lt;a class="link" href="https://bugs.mysql.com/bug.php?id=106188" target="_blank" rel="noopener"
>informe de errores de MySQL&lt;/a>, estas claves se actualizan periódicamente. Es buena práctica:&lt;/p>
&lt;ul>
&lt;li>Consultar siempre las notas de lanzamiento o la documentación oficial de MySQL.&lt;/li>
&lt;li>Verificar la vigencia de las claves GPG antes de instalar o actualizar paquetes.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="conclusión">Conclusión
&lt;/h2>&lt;p>Este problema puede parecer frustrante, pero ahora que sabes cómo solucionarlo, podrás instalar MySQL sin contratiempos en tu instancia EC2 con Amazon Linux 2023.&lt;/p>
&lt;p>Si tienes alguna duda o te encuentras con otro error, ¡déjalo en los comentarios! Estoy aquí para ayudarte. 😊&lt;/p></description></item><item><title>Crea tu coach personal para las certificaciones de AWS con Claude y Amazon Bedrock</title><link>https://brianintech.com/aws-certifications-chatbot-bedrock.html</link><pubDate>Thu, 07 Aug 2025 17:30:00 +0200</pubDate><guid>https://brianintech.com/aws-certifications-chatbot-bedrock.html</guid><description>&lt;img src="https://d1hvrz5kjt6fwi.cloudfront.net/Blog%20Posts%20Covers/Post%2002/Post%2002_horizontal_es.png" alt="Featured image of post Crea tu coach personal para las certificaciones de AWS con Claude y Amazon Bedrock" />&lt;p>Prepararse para una certificación de AWS se parece mucho a entrenar para una maratón; es emocionante, desafiante y, en ocasiones, un poco abrumador. Entre el trabajo, la vida personal y la enorme cantidad de material de estudio disponible, mantener la constancia y la claridad puede convertirse en todo un reto. Ahora bien, ¿imaginas contar con un entrenador disponible las 24 horas del día, los 7 días de la semana, que te guíe paso a paso, te plantee preguntas cuando lo necesites y te ayude a estudiar de forma más inteligente?&lt;/p>
&lt;p>En esta guía exploraremos cómo usar la IA generativa a través de los modelos Claude de Anthropic con Amazon Bedrock, el servicio de GenAI totalmente gestionado de AWS con el que podrás crear tu propio entrenador personal de certificación. Este asistente puede ayudarte a reforzar conceptos clave, simplificar ideas complejas y mantener el ritmo hacia tus objetivos de aprendizaje.&lt;/p>
&lt;p>Al final de este artículo, comprenderás cómo aprovechar el poder de Amazon Bedrock y Claude Sonnet 4 para crear una experiencia de estudio personalizada que se adapte a tu estilo, ritmo de aprendizaje y tus objetivos de certificación.&lt;/p>
&lt;p>Así que, si estás list@ para mejorar tu preparación para las certificaciones de AWS con técnicas de estudio basadas en IA, esta guía será tu mejor aliada para transformar por completo tu enfoque de aprendizaje.&lt;/p>
&lt;p>Comprender cómo la IA puede ser tu aliada de estudio&lt;/p>
&lt;p>Antes de configurar nada, conviene entender el papel que puede desempeñar la IA en tu proceso de preparación. Los modelos de lenguaje grandes (LLM), como los de Anthropic, pueden actuar como compañeros de estudio siempre disponibles. Piensa en ellos como un compañero de estudio incansable, dispuesto a ayudarte cuando algo se te atasca.&lt;/p>
&lt;p>Amazon Bedrock ofrece acceso a una amplia gama de modelos de IA desarrollados por empresas líderes del sector como Anthropic, AI21 Labs, Amazon, Cohere, Meta, Mistral AI, OpenAI o Stability AI. Estos modelos son capaces de adaptar sus respuestas a tus necesidades de aprendizaje, desglosar temas complejos en partes más comprensibles y proporcionar retroalimentación inmediata sobre tus preguntas. Lo mejor de todos, es un servicio completamente gestionado por AWS, por lo que, su uso es muy sencillo.&lt;/p>
&lt;p>La gran ventaja es la flexibilidad: puedes estudiar temprano en la mañana, tarde por la noche o en cualquier momento que se adapte a tus necesidades. Tu asistente de IA estará siempre disponible para mantenerte enfocado y ayudarte a progresar a tu ritmo.&lt;/p>
&lt;p>Requisitos previos&lt;/p>
&lt;p>Antes de empezar, asegúrate de contar con los permisos adecuados en Identity and Access Management (IAM) que permita el acceso al modelo en cuestión. En la documentación oficial encontrarás ejemplos de políticas basadas en identidades para Amazon Bedrock.&lt;/p>
&lt;p>Recientemente, AWS ha eliminado la necesidad de habilitar los modelos fundacionales (FM) así que, ahora puedes hacer uso de ellos sin tener que activarlos previamente. Recuerda que el servicio funciona bajo un esquema de pago por uso (pay as you go) por lo que, solo pagarás por el tiempo o los recursos que utilices. Puedes monitorear tus costos fácilmente desde la consola de administración de AWS, lo que te ayudará a controlar y gestionar los costes de forma eficaz.&lt;/p>
&lt;p>En este enlace puedes consultar los precios de Amazon Bedrock para obtener más información sobre los costes específicos de cada modelo básico.&lt;/p>
&lt;p>Configuración del entorno de estudio con IA&lt;/p>
&lt;p>Para configurar el entorno de estudio, siga estos pasos:&lt;/p>
&lt;ol>
&lt;li>Habilitar el acceso de uso al modelo
Los usuarios tienen que tener permisos IAM para acceder al modelo Claude Sonnet 4 (o el LLM elegido) desde la consola de Amazon Bedrock.&lt;/li>
&lt;/ol>
&lt;p>{
&amp;ldquo;Version&amp;rdquo;:&amp;ldquo;2012-10-17&amp;rdquo;,
&amp;ldquo;Statement&amp;rdquo;: [
{
&amp;ldquo;Sid&amp;rdquo;: &amp;ldquo;ProvisionedThroughputModelInvocation&amp;rdquo;,
&amp;ldquo;Effect&amp;rdquo;: &amp;ldquo;Allow&amp;rdquo;,
&amp;ldquo;Action&amp;rdquo;: [
&amp;ldquo;bedrock:InvokeModel&amp;rdquo;,
&amp;ldquo;bedrock:InvokeModelWithResponseStream&amp;rdquo;
],
&amp;ldquo;Resource&amp;rdquo;: &amp;ldquo;arn:aws:bedrock:eu-west-1:${aws:username}:provisioned-model/${aws:modelId}&amp;rdquo;
}
]
}&lt;/p>
&lt;ol start="2">
&lt;li>
&lt;p>Seleccionar el modelo adecuado
En el entorno de pruebas Amazon Bedrock Chat/Text, selecciona Claude Sonnet 4 entre los modelos base disponibles.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Definir un mensaje del sistema (System prompt)
Este mensaje establece el contexto inicial del asistente, es decir, su rol, tono y enfoque. Por ejemplo:&lt;/p>
&lt;/li>
&lt;/ol>
&lt;p>“You are an expert AWS Certification Coach with deep knowledge of AWS services and certification exams. You specialize in the AWS Solutions Architect Associate certification. Use the documentation uploaded to understand the exam you are generating questions for. Always base your answers on official AWS documentation and best practices. Keep explanations clear and focused on exam-relevant details. If unsure about any information, acknowledge the uncertainty and refer to official AWS documentation.”&lt;/p>
&lt;p>Si lo prefieres en español:&lt;/p>
&lt;p>“Eres un experto entrenador en certificaciones de AWS, especializado en el examen de AWS Solutions Architect Associate. Basa tus respuestas en la documentación oficial y las mejores prácticas. Si no estás seguro de una información, indícalo y sugiere consultar la documentación de AWS.”&lt;/p>
&lt;ol start="4">
&lt;li>Ajustar comportamiento del modelo&lt;/li>
&lt;/ol>
&lt;p>El&lt;/p>
&lt;ol start="5">
&lt;li>Subir recursos al entorno de chat
El modelo funcionará mejor si le proporcionas documentación oficial y materiales relevantes. Así podrá generar respuestas precisas y alineadas con los temas del examen. Esto garantiza que tu compañero de IA tenga acceso a los detalles específicos necesarios para una preparación eficaz del examen.&lt;/li>
&lt;/ol>
&lt;p>Junto con el documento adjunto:&lt;/p>
&lt;p>“Please use this AWS Solutions Architect Associate exam guide as reference material for our discussion. This document contains the official exam content and objectives.”&lt;/p>
&lt;p>Si procedes en español:&lt;/p>
&lt;p>“Utiliza esta guía del examen AWS Solutions Architect Associate como material de referencia para nuestra conversación. Este documento contiene el contenido y los objetivos oficiales del examen.”&lt;/p>
&lt;p>Cómo crear indicaciones de estudio efectivas&lt;/p>
&lt;p>La ingeniería de prompts, es decir, la práctica de elaborar instrucciones eficaces para los modelos de IA, es todo un arte: la calidad de tu pregunta define la calidad de la respuesta. Cuanto más específica sea tu instrucción, más útil será el resultado.&lt;/p>
&lt;p>Por ejemplo, en lugar de preguntar simplemente “¿Qué es Amazon S3?”, puedes formular “Menciona tres diferencias clave entre Amazon S3 y Amazon EBS para el examen de AWS Solutions Architect Associate”.&lt;/p>
&lt;p>Algunas ideas de prompts prácticos:&lt;/p>
&lt;p>Caso 1: Preguntas de práctica&lt;/p>
&lt;p>“Generate a multiple choice, scenario-based question about S3 lifecycle policies. Include a detailed explanation for the correct answer.”&lt;/p>
&lt;p>“Generate 5 practice multiple choice questions about Amazon RDS, and explain the correct answers thoroughly.”&lt;/p>
&lt;p>“Generate a multiple choice question about AWS Lambda service pricing model.”&lt;/p>
&lt;p>En español:&lt;/p>
&lt;p>“Genera una pregunta de opción múltiple basada en escenarios sobre políticas de ciclo de vida en Amazon S3 y explica la respuesta correcta.”&lt;/p>
&lt;p>“Crea cinco preguntas de práctica sobre Amazon Aurora y detalla las soluciones.”&lt;/p>
&lt;p>“Genera una pregunta de opción sobre el modelo de pago del servicio AWS Lambda”.&lt;/p>
&lt;p>Caso 2: Aprendizaje basado en escenarios&lt;/p>
&lt;p>Tras realizar un laboratorio en AWS SimuLearn, puedes ampliar tu comprensión con prompts como:&lt;/p>
&lt;p>“Explain how Auto Scaling works with ELB and CloudWatch using a real-world ecommerce scenario. Include key configuration considerations.”&lt;/p>
&lt;p>Si continuas en español:&lt;/p>
&lt;p>“Explica cómo funciona Auto Scaling con ELB y CloudWatch usando un escenario real de comercio electrónico. Incluye consideraciones clave en la configuración de todos los recursos.”&lt;/p>
&lt;p>Caso 3: Refuerzo de conceptos&lt;/p>
&lt;p>Para repasar fundamentos:&lt;/p>
&lt;p>“Explain the AWS shared responsibility model using an analogy. Then highlight 3 key elements that frequently appear on the Solutions Architect Associate exam.”&lt;/p>
&lt;p>Si la conversación es español:&lt;/p>
&lt;p>“Explica el modelo de responsabilidad compartida de AWS usando una analogía y destaca tres puntos clave que suelen aparecer en el examen de Solutions Architect Associate.”&lt;/p>
&lt;p>Equilibrar la IA con métodos tradicionales&lt;/p>
&lt;p>La clave está en usar la IA como complemento, no como sustituto. Para ello, te aconsejo que crees bloques de estudio estructurados con pausas breves entre sesiones. La IA puede ayudarte a reforzar lo aprendido y resolver dudas, pero el conocimiento sólido viene del trabajo práctico y la constancia. Al mismo tiempo, puedes apoyarte en laboratorios de AWS, y de herramientas como AWS Cloud Quest.&lt;/p>
&lt;p>Al final de cada sesión, puedes usar Bedrock para hacer comprobaciones rápidas de conceptos o practicar preguntas tipo examen. Y, por supuesto, verifica siempre tus respuestas con la documentación oficial.&lt;/p>
&lt;p>Reflexión final&lt;/p>
&lt;p>Mientras avanzas hacia tu certificación, prueba tu asistente de IA y descubre cómo puede simplificar temas complejos, ponerte a prueba con ejercicios personalizados y mantener tu motivación constante.&lt;/p>
&lt;p>Si más adelante quieres ir un paso más allá, explora el Generative AI Application Builder en AWS para crear tus propias aplicaciones de IA.&lt;/p>
&lt;p>Y recuerda, tu éxito depende tanto de la tecnología como de tu constancia. Combinar el poder de la IA con una estrategia de estudio disciplinada es, sin duda, la mejor manera de prepararte para cualquier certificación.&lt;/p>
&lt;p>Adicionalmente, complementa tu estudio asistido por IA con los recursos de AWS Skill Builder y AWS Educate. Aprovecha y conecta con compañeros a través de la comunidad certificada de AWS para obtener apoyo adicional y oportunidades de networking.&lt;/p>
&lt;hr>
&lt;p>Si este artículo te ha resultado útil o tienes alguna pregunta, puedes contactar conmigo en LinkedIn.&lt;/p></description></item><item><title>Cómo instalar tu propio servidor Gitea en EC2</title><link>https://brianintech.com/instalar-gitea-ec2.html</link><pubDate>Sun, 20 Jul 2025 10:30:00 +0200</pubDate><guid>https://brianintech.com/instalar-gitea-ec2.html</guid><description>&lt;img src="https://d1hvrz5kjt6fwi.cloudfront.net/Blog Posts Covers/Posts Unorder/Post13.png" alt="Featured image of post Cómo instalar tu propio servidor Gitea en EC2" />&lt;p>¿Buscas tener tu propio servidor Git? Configurar un servidor Gitea en una instancia EC2 con Amazon Linux es más sencillo de lo que parece. Sigue estos pasos para instalar y configurar Gitea y gestionar tus repositorios en la nube.&lt;/p>
&lt;hr>
&lt;h1 id="instalación-de-gitea">Instalación de Gitea
&lt;/h1>&lt;h2 id="1-actualizar-y-preparar-el-entorno">1. Actualizar y preparar el entorno
&lt;/h2>&lt;p>1. Actualiza los paquetes e instala los requisitos:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo yum update -y
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo yum install -y git wget mariadb105-server mariadb105 jq
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>2. Configura y habilita MariaDB:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> mariadb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl start mariadb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo mysql_secure_installation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="2-configurar-la-base-de-datos">2. Configurar la base de datos
&lt;/h2>&lt;p>1. Accede a MariaDB:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo mysql -u root -p
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>2. Crea una base de datos y usuario para Gitea:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">gitea&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;gitea&amp;#39;&lt;/span>&lt;span class="o">@&lt;/span>&lt;span class="s1">&amp;#39;localhost&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">IDENTIFIED&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;tu-contraseña&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">GRANT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ALL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIVILEGES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">gitea&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;gitea&amp;#39;&lt;/span>&lt;span class="o">@&lt;/span>&lt;span class="s1">&amp;#39;localhost&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">FLUSH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIVILEGES&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">EXIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="3-instalar-gitea">3. Instalar Gitea
&lt;/h2>&lt;p>1. Descarga el binario de Gitea:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">wget -O gitea https://dl.gitea.io/gitea/1.21.4/gitea-1.21.4-linux-amd64
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>2. Asigna permisos y mueve el binario:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">chmod +x gitea
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo mv gitea /usr/local/bin/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>3. Crea directorios necesarios:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo mkdir -p /var/lib/gitea/&lt;span class="o">{&lt;/span>custom,data,log&lt;span class="o">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo chown -R ec2-user:ec2-user /var/lib/gitea
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo chmod -R &lt;span class="m">750&lt;/span> /var/lib/gitea
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo mkdir -p /etc/gitea
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo chown -R ec2-user:ec2-user /etc/gitea
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="4-crear-un-servicio-para-gitea">4. Crear un servicio para Gitea
&lt;/h2>&lt;p>1. Crea un archivo de servicio en systemd:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo nano /etc/systemd/system/gitea.service
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>2. Añade la siguiente configuración:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;span class="lnt">17
&lt;/span>&lt;span class="lnt">18
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="k">[Unit]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">Description&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">Gitea&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">After&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">syslog.target&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">After&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">network.target&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">After&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">mariadb.service&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[Service]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">RestartSec&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">2s&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">Type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">simple&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">User&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">ec2-user&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">Group&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">ec2-user&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">WorkingDirectory&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">/var/lib/gitea&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">ExecStart&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">/usr/local/bin/gitea web --config /etc/gitea/app.ini&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">Restart&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">always&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">Environment&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">USER=ec2-user HOME=/var/lib/gitea GITEA_WORK_DIR=/var/lib/gitea&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[Install]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">WantedBy&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">multi-user.target&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>3. Guarda, recarga y habilita el servicio:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl daemon-reload
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> gitea
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl start gitea
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="5-configurar-gitea-desde-el-navegador">5. Configurar Gitea desde el navegador
&lt;/h2>&lt;ul>
&lt;li>Abre un navegador y ve a: &lt;code>http://&amp;lt;tu-ip-pública&amp;gt;:3000&lt;/code>.&lt;/li>
&lt;li>Completa la configuración:
&lt;ul>
&lt;li>&lt;strong>&lt;u>Base de datos:&lt;/u>&lt;/strong>
&lt;ul>
&lt;li>Tipo: MySQL.&lt;/li>
&lt;li>Host: &lt;code>127.0.0.1:3306&lt;/code>.&lt;/li>
&lt;li>Nombre: &lt;code>gitea&lt;/code>.&lt;/li>
&lt;li>Usuario: &lt;code>gitea&lt;/code>.&lt;/li>
&lt;li>Contraseña: Tu contraseña configurada.&lt;/li>
&lt;li>&lt;strong>URL&lt;/strong>: &lt;code>http://&amp;lt;tu-ip-pública&amp;gt;:3000&lt;/code>.&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="6-redirigir-tráfico-al-puerto-80-opcional">6. Redirigir tráfico al puerto 80 (Opcional)
&lt;/h2>&lt;p>1. Haz que Gitea esté disponible en el puerto 80 con &lt;code>iptables&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo iptables -t nat -A PREROUTING -p tcp --dport &lt;span class="m">80&lt;/span> -j REDIRECT --to-port &lt;span class="m">3000&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>2. Guarda los cambios para que sean persistentes:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo yum install -y iptables-services
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo service iptables save
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h1 id="todo-listo">¡Todo listo!
&lt;/h1>&lt;p>Ahora tienes un servidor Gitea corriendo en tu instancia EC2. ¿Qué sigue? Agrega tus repositorios y comienza a colaborar.&lt;/p>
&lt;p>Si tienes preguntas o quieres mejorar la configuración, ¡déjalo en los comentarios! 👇🏻&lt;/p></description></item><item><title>Cómo instalar Docker en una instancia EC2 con Amazon Linux 2023 y Ubuntu</title><link>https://brianintech.com/instalar-docker-ec2.html</link><pubDate>Tue, 17 Jun 2025 10:30:00 +0200</pubDate><guid>https://brianintech.com/instalar-docker-ec2.html</guid><description>&lt;img src="https://d1hvrz5kjt6fwi.cloudfront.net/Blog Posts Covers/Posts Unorder/Post9.png" alt="Featured image of post Cómo instalar Docker en una instancia EC2 con Amazon Linux 2023 y Ubuntu" />&lt;p>Docker es una plataforma increíble que te permite empaquetar, desplegar y ejecutar aplicaciones en contenedores. Estos contenedores son ligeros, portátiles y consistentes, lo que hace que el desarrollo y despliegue de software sean mucho más eficientes.&lt;/p>
&lt;p>En este artículo, te mostraré cómo instalar Docker en una instancia de AWS EC2 usando dos sistemas operativos populares: &lt;strong>Amazon Linux 2023&lt;/strong> y &lt;strong>Ubuntu&lt;/strong>. También incluiré consejos útiles para diagnosticar problemas comunes con contenedores.&lt;/p>
&lt;hr>
&lt;h2 id="configura-tu-instancia-ec2">Configura tu instancia EC2
&lt;/h2>&lt;p>Antes de comenzar, asegúrate de tener:&lt;/p>
&lt;ul>
&lt;li>Una instancia de EC2 lanzada con acceso SSH habilitado.&lt;/li>
&lt;li>Permisos de administrador para instalar paquetes y configurar el sistema.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h1 id="instalación-en-amazon-linux-2023">Instalación en Amazon Linux 2023
&lt;/h1>&lt;p>1. Actualiza tu sistema&lt;/p>
&lt;p>Es importante tener el sistema actualizado antes de instalar Docker:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo dnf update -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>2. Instala Docker&lt;/p>
&lt;p>Amazon Linux 2023 utiliza el administrador de paquetes &lt;code>dnf&lt;/code>. Instala Docker con:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo dnf install docker -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>3. Inicia y habilita Docker&lt;/p>
&lt;p>Después de instalar Docker, debes iniciar el servicio y habilitarlo para que se ejecute automáticamente al reiniciar:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl start docker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> docker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>4. Verifica la instalación&lt;/p>
&lt;p>Asegúrate de que Docker esté instalado y en ejecución:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker --version
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl status docker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>5. Añade tu usuario al grupo Docker&lt;/p>
&lt;p>Esto evita que tengas que usar &lt;code>sudo&lt;/code> cada vez que ejecutas un comando de Docker:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo usermod -aG docker &lt;span class="nv">$USER&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Cierra sesión y vuelve a iniciar para aplicar los cambios.&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h1 id="instalación-en-ubuntu">&lt;strong>Instalación en Ubuntu&lt;/strong>
&lt;/h1>&lt;p>1. Actualiza tu sistema&lt;/p>
&lt;p>Asegúrate de que tu sistema tenga las últimas actualizaciones:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt update &lt;span class="o">&amp;amp;&amp;amp;&lt;/span> sudo apt upgrade -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>2. Instala dependencias necesarias&lt;/p>
&lt;p>Docker requiere ciertos paquetes adicionales para funcionar correctamente:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt install apt-transport-https ca-certificates curl software-properties-common -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>3. Añade la clave GPG y el repositorio oficial de Docker&lt;/p>
&lt;p>Esto asegura que instalaremos la última versión estable de Docker:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -fsSL https://download.docker.com/linux/ubuntu/gpg &lt;span class="p">|&lt;/span> sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu &lt;/span>&lt;span class="k">$(&lt;/span>lsb_release -cs&lt;span class="k">)&lt;/span>&lt;span class="s2"> stable&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> sudo tee /etc/apt/sources.list.d/docker.list &amp;gt; /dev/null
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>4. Instala Docker&lt;/p>
&lt;p>Actualiza los paquetes disponibles e instala Docker:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo apt install docker-ce docker-ce-cli containerd.io -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>5. Inicia y habilita Docker&lt;/p>
&lt;p>Igual que en Amazon Linux, inicia y habilita Docker:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl start docker
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> docker
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>6. Añade tu usuario al grupo Docker&lt;/p>
&lt;p>Al igual que en Amazon Linux:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo usermod -aG docker &lt;span class="nv">$USER&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Cierra sesión y vuelve a iniciar para aplicar los cambios.&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h1 id="diagnóstico-de-problemas-comunes-con-contenedores">Diagnóstico de problemas comunes con contenedores
&lt;/h1>&lt;p>A veces, los contenedores pueden presentar problemas durante su creación o ejecución. Aquí hay algunos pasos útiles para identificar y solucionar errores:&lt;/p>
&lt;h3 id="verifica-el-estado-del-contenedor">Verifica el estado del contenedor
&lt;/h3>&lt;p>Asegúrate de que el contenedor se haya creado y revisa su estado:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker ps -a
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Busca en la columna &lt;code>STATUS&lt;/code> algo como &lt;code>Exited (1)&lt;/code> o similar. Esto indica que el contenedor intentó ejecutarse pero falló.&lt;/p>
&lt;hr>
&lt;h3 id="revisa-los-logs-del-contenedor">Revisa los logs del contenedor
&lt;/h3>&lt;p>Obtén los registros del contenedor para identificar posibles errores o advertencias:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker logs &amp;lt;nombre_contenedor&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Esto te mostrará mensajes útiles para diagnosticar el problema.&lt;/p>
&lt;hr>
&lt;h3 id="verifica-los-requisitos-de-memoria">Verifica los requisitos de memoria
&lt;/h3>&lt;p>Algunas aplicaciones requieren una cantidad mínima de memoria para funcionar. Verifica la memoria disponible en tu instancia con:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">free -h
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Si la memoria es insuficiente, considera aumentar los recursos de tu instancia o utiliza una máquina con más capacidad.&lt;/p>
&lt;hr>
&lt;h3 id="revisa-los-permisos-del-volumen">Revisa los permisos del volumen
&lt;/h3>&lt;p>Si tu contenedor usa volúmenes, asegúrate de que estén correctamente configurados:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker volume inspect &amp;lt;nombre_volumen&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Esto te mostrará detalles del volumen, como su ubicación en el sistema de archivos y los permisos.&lt;/p>
&lt;hr>
&lt;h3 id="elimina-y-recrea-el-contenedor">Elimina y recrea el contenedor
&lt;/h3>&lt;p>Si sospechas que el contenedor está corrupto o mal configurado, elimínalo y vuelve a crearlo:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker stop &amp;lt;nombre_contenedor&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker rm &amp;lt;nombre_contenedor&amp;gt;
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">docker run -d -p &amp;lt;puerto_host&amp;gt;:&amp;lt;puerto_contenedor&amp;gt; --name &amp;lt;nombre_contenedor&amp;gt; &amp;lt;imagen&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="asegúrate-de-tener-la-imagen-correcta">Asegúrate de tener la imagen correcta
&lt;/h3>&lt;p>Confirma que tienes la imagen descargada correctamente:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker images &lt;span class="p">|&lt;/span> grep &amp;lt;nombre_imagen&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Si la imagen no aparece, descárgala de nuevo:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker pull &amp;lt;imagen&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="prueba-un-inicio-interactivo">Prueba un inicio interactivo
&lt;/h3>&lt;p>Ejecuta el contenedor en modo interactivo para ver errores directamente:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">docker run -it &amp;lt;opciones&amp;gt; &amp;lt;imagen&amp;gt;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="conclusión">Conclusión
&lt;/h2>&lt;p>Docker es una herramienta poderosa y versátil, pero como cualquier tecnología, puede presentar desafíos. Con estos pasos, estarás mejor preparado para instalar Docker en tu instancia EC2 y solucionar problemas comunes con contenedores.&lt;/p>
&lt;p>¿Tienes preguntas o te encontraste con algún error? ¡Déjalas en los comentarios y estaré encantado de ayudarte! ☺️👇🏻&lt;/p></description></item><item><title>Cómo instalar PostgreSQL en una instancia EC2 con Amazon Linux 2023</title><link>https://brianintech.com/instalar-postgresql-ec2.html</link><pubDate>Tue, 10 Jun 2025 10:30:00 +0200</pubDate><guid>https://brianintech.com/instalar-postgresql-ec2.html</guid><description>&lt;p>Si necesitas un servidor de base de datos robusto y confiable, &lt;strong>PostgreSQL&lt;/strong> es una excelente opción.&lt;/p>
&lt;p>En este tutorial, te guiaré paso a paso para instalar y configurar PostgreSQL en una instancia EC2 utilizando &lt;strong>Amazon Linux 2023&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h3 id="paso-1-actualizar-el-sistema">Paso 1: Actualizar el sistema
&lt;/h3>&lt;p>Asegúrate de que tu sistema esté actualizado antes de instalar cualquier paquete. Para ello, ejecuta el siguiente comando:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo dnf update -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="paso-2-instalar-postgresql">Paso 2: Instalar PostgreSQL
&lt;/h3>&lt;p>Amazon Linux 2023 incluye PostgreSQL 15 en su repositorio predeterminado, por lo que no necesitas agregar repositorios adicionales. Para instalar PostgreSQL (cliente y servidor), ejecuta:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo dnf install postgresql15.x86_64 postgresql15-server -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>💡 &lt;strong>Tip:&lt;/strong> Si necesitas otra versión, verifica las disponibles con:&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo dnf list postgresql*
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/blockquote>
&lt;hr>
&lt;h3 id="paso-3-inicializar-la-base-de-datos">Paso 3: Inicializar la base de datos
&lt;/h3>&lt;p>Inicializa el clúster de la base de datos PostgreSQL utilizando el siguiente comando:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo postgresql-setup --initdb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="paso-4-iniciar-y-habilitar-el-servicio-de-postgresql">Paso 4: Iniciar y habilitar el servicio de PostgreSQL
&lt;/h3>&lt;p>1. Inicia el servicio:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl start postgresql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>2. Habilita el servicio para que inicie automáticamente al arrancar el sistema:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> postgresql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>3. Verifica el estado del servicio:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl status postgresql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>📸 Aquí tienes un ejemplo de cómo debería verse el estado del servicio:&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/21w84v097jsvqle20wyk.png"
loading="lazy"
alt="Estado del servicio PostgreSQL"
>&lt;/p>
&lt;hr>
&lt;h3 id="paso-5-configurar-postgresql">Paso 5: Configurar PostgreSQL
&lt;/h3>&lt;p>1. Establecer contraseñas para el usuario &lt;code>postgres&lt;/code>&lt;/p>
&lt;p>Cambia la contraseña del usuario de sistema y del administrador de la base de datos:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo passwd postgres
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">su - postgres
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">psql -c &lt;span class="s2">&amp;#34;ALTER USER postgres WITH PASSWORD &amp;#39;your-password&amp;#39;;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">exit&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="-recomendaciones-al-configurar-la-contraseña">⚠️ Recomendaciones al configurar la contraseña
&lt;/h3>&lt;p>Cumple con los requisitos de seguridad:&lt;/p>
&lt;ul>
&lt;li>Al menos una letra mayúscula y una minúscula.&lt;/li>
&lt;li>Al menos un número.&lt;/li>
&lt;li>Al menos un símbolo especial (.!@#$%^&amp;amp;*()).&lt;/li>
&lt;li>Longitud mínima de 8 caracteres.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;p>2. Configurar &lt;code>postgresql.conf&lt;/code>&lt;/p>
&lt;p>Crea un respaldo del archivo de configuración principal y luego edítalo:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo cp /var/lib/pgsql/data/postgresql.conf /var/lib/pgsql/data/postgresql.conf.bck
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo vi /var/lib/pgsql/data/postgresql.conf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Si necesitas que PostgreSQL escuche en todas las direcciones IP, cambia:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-plaintext" data-lang="plaintext">&lt;span class="line">&lt;span class="cl">listen_addresses = &amp;#39;*&amp;#39;
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>3. Configurar autenticación en &lt;code>pg_hba.conf&lt;/code>&lt;/p>
&lt;p>Crea un respaldo del archivo de autenticación y edítalo:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo cp /var/lib/pgsql/data/pg_hba.conf /var/lib/pgsql/data/pg_hba.conf.bck
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo vi /var/lib/pgsql/data/pg_hba.conf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Cambia &lt;code>ident&lt;/code> a &lt;code>md5&lt;/code> para permitir conexiones con autenticación por contraseña:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-plaintext" data-lang="plaintext">&lt;span class="line">&lt;span class="cl">host all all 0.0.0.0/0 md5
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>4. Reinicia el servicio para aplicar los cambios:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl restart postgresql
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>5. Crear un usuario y base de datos&lt;/p>
&lt;p>Conéctate al servidor PostgreSQL como usuario &lt;code>postgres&lt;/code> y ejecuta los siguientes comandos:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo -i -u postgres psql
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">CREATE USER yourusername WITH PASSWORD &lt;span class="s1">&amp;#39;password&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">CREATE DATABASE database_name&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">GRANT ALL PRIVILEGES ON DATABASE database_name TO yourusername&lt;span class="p">;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">exit&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Para listar las bases de datos disponibles:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-plaintext" data-lang="plaintext">&lt;span class="line">&lt;span class="cl">\l
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="paso-6-acceso-a-la-base-de-datos">Paso 6: Acceso a la base de datos
&lt;/h3>&lt;p>Puedes conectarte a PostgreSQL localmente con:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">psql -h localhost -U username -d database_name
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Para conexiones remotas, asegúrate de que el puerto &lt;strong>5432&lt;/strong> esté permitido en el grupo de seguridad de tu instancia EC2.&lt;/p>
&lt;hr>
&lt;h2 id="-configuraciones-importantes-de-postgresql">⚠️ Configuraciones importantes de PostgreSQL
&lt;/h2>&lt;p>Como recordatorio, estas son algunas configuraciones clave de PostgreSQL que debes conocer:&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>&lt;strong>Elemento de configuración&lt;/strong>&lt;/th>
&lt;th>&lt;strong>Valor&lt;/strong>&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Puerto predeterminado de PostgreSQL&lt;/td>
&lt;td>5432&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Usuario predeterminado&lt;/td>
&lt;td>postgres&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ubicación del archivo &lt;code>postgresql.conf&lt;/code>&lt;/td>
&lt;td>&lt;code>/var/lib/pgsql/data&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Ubicación del archivo &lt;code>pg_hba.conf&lt;/code>&lt;/td>
&lt;td>&lt;code>/var/lib/pgsql/data&lt;/code>&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Base de datos predeterminada&lt;/td>
&lt;td>postgres&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Directorio de datos predeterminado&lt;/td>
&lt;td>&lt;code>/var/lib/pgsql/data&lt;/code>&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;hr>
&lt;h2 id="listo-">¡Listo! 🎉
&lt;/h2>&lt;p>¡Eso es todo! Ahora tienes un servidor PostgreSQL configurado en tu instancia EC2 con Amazon Linux 2023.&lt;/p></description></item><item><title>Cómo instalar PrestaShop en una instancia EC2 con Amazon Linux 2023</title><link>https://brianintech.com/instalar-prestashop-ec2.html</link><pubDate>Sun, 01 Jun 2025 10:30:00 +0200</pubDate><guid>https://brianintech.com/instalar-prestashop-ec2.html</guid><description>&lt;p>Si quieres montar una tienda online en AWS, PrestaShop es una gran opción. En este post te explico paso a paso cómo instalarlo en una instancia EC2 con &lt;strong>Amazon Linux 2023&lt;/strong>. ¡Vamos allá!&lt;/p>
&lt;h1 id="instalar-prestahop">Instalar Prestahop
&lt;/h1>&lt;p>1. Actualizar el sistema&lt;/p>
&lt;p>Antes de instalar cualquier cosa, actualiza los paquetes existentes:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo yum update -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>2. Instalar Apache&lt;/p>
&lt;p>PrestaShop necesita un servidor web, así que instalamos &lt;strong>Apache&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo yum install -y httpd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> httpd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl start httpd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Verifica que está corriendo:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl http://localhost
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Si ves la estructura de una página HTML, significa que Apache está funcionando correctamente.&lt;/p>
&lt;p>3. Instalar PHP y extensiones necesarias&lt;/p>
&lt;p>PrestaShop requiere PHP. Instalamos la versión recomendada:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo amazon-linux-extras &lt;span class="nb">enable&lt;/span> php8.2
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo yum install -y php php-mysqlnd php-curl php-dom php-mbstring php-gd php-opcache php-zip
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Comprueba la instalación:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">php -v
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>4. Instalar MariaDB (o MySQL) y configurar la base de datos&lt;/p>
&lt;p>PrestaShop necesita una base de datos, así que instalamos &lt;strong>MariaDB&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo yum install -y mariadb105-server
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> mariadb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl start mariadb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>5. Ejecutamos la configuración inicial:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo mysql_secure_installation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>6. Ahora, creamos la base de datos y un usuario:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">mysql -u root -p
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Dentro de la consola de MySQL, ejecuta:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">prestashop&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;prestashopuser&amp;#39;&lt;/span>&lt;span class="o">@&lt;/span>&lt;span class="s1">&amp;#39;localhost&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">IDENTIFIED&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;tu_contraseña_segura&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">GRANT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ALL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIVILEGES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">prestashop&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;prestashopuser&amp;#39;&lt;/span>&lt;span class="o">@&lt;/span>&lt;span class="s1">&amp;#39;localhost&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">FLUSH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIVILEGES&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">EXIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>7. Descargar la última versión de PrestaShop&lt;/p>
&lt;p>Descarga la última versión desde el repositorio oficial de GitHub:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">wget https://github.com/PrestaShop/PrestaShop/releases/download/8.2.0/prestashop_8.2.0.zip -O prestashop.zip
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>Puedes acceder a otras versiones de Prestashop a través del repositorio oficial en GitHub.
&lt;a class="link" href="https://github.com/PrestaShop/PrestaShop/releases" target="_blank" rel="noopener"
>https://github.com/PrestaShop/PrestaShop/releases&lt;/a>&lt;/p>
&lt;/blockquote>
&lt;p>8. Instala la herramienta &lt;code>unzip&lt;/code> y extrae los archivos:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo yum install -y unzip
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">unzip prestashop.zip -d /var/www/html/prestashop
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>9. Ajusta los permisos:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo chown -R apache:apache /var/www/html/prestashop
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo chmod -R &lt;span class="m">755&lt;/span> /var/www/html/prestashop
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h1 id="configurar-apache-para-prestashop">Configurar Apache para PrestaShop
&lt;/h1>&lt;p>1. Crea un archivo de configuración para PrestaShop:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo nano /etc/httpd/conf.d/prestashop.conf
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Agrega lo siguiente:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-apache" data-lang="apache">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;VirtualHost&lt;/span> &lt;span class="s">*:80&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">ServerAdmin&lt;/span> admin@tudominio.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">DocumentRoot&lt;/span> &lt;span class="sx">/var/www/html/prestashop&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">ServerName&lt;/span> tudominio.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">ServerAlias&lt;/span> www.tudominio.com
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;Directory&lt;/span> &lt;span class="s">/var/www/html/prestashop&lt;/span>&lt;span class="nt">&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">AllowOverride&lt;/span> &lt;span class="k">All&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">Require&lt;/span> &lt;span class="k">all&lt;/span> granted
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nt">&amp;lt;/Directory&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">ErrorLog&lt;/span> &lt;span class="sx">/var/log/httpd/prestashop-error.log&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nb">CustomLog&lt;/span> &lt;span class="sx">/var/log/httpd/prestashop-access.log&lt;/span> combined
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nt">&amp;lt;/VirtualHost&amp;gt;&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>2. Reinicia Apache:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl restart httpd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Verifica que está funcionando:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl status httpd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h1 id="completar-la-instalación-desde-el-navegador">Completar la instalación desde el navegador
&lt;/h1>&lt;p>Ahora, abre tu navegador y accede a:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-plaintext" data-lang="plaintext">&lt;span class="line">&lt;span class="cl">http://direccion-ip-ec2
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;ul>
&lt;li>Sigue el asistente de instalación de PrestaShop.&lt;/li>
&lt;li>Introduce los datos de la base de datos que creaste anteriormente.&lt;/li>
&lt;li>Configura las credenciales de administrador.&lt;/li>
&lt;/ul>
&lt;p>⚠️ &lt;strong>Importante:&lt;/strong> Una vez completada la instalación, &lt;strong>elimina la carpeta de instalación&lt;/strong> por seguridad:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo rm -rf /var/www/html/prestashop/install
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/384jwz8rd7f9zzzwg2va.png"
loading="lazy"
alt="Requisito eliminación directorio instalación"
>&lt;/p>
&lt;p>📸 Aquí tienes algunos ejemplos del proceso de instalación:&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g7kj6e0vwba1j96hl5l2.png"
loading="lazy"
alt="Proceso de instalación 1"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nsjqlyvyvm9c9idn2o5x.png"
loading="lazy"
alt="Proceso de instalación 2"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/cokpfrp6csl4ouugxcw8.png"
loading="lazy"
alt="Proceso de instalación 3"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q95eujbt4gdhzs6pi9ph.png"
loading="lazy"
alt="Proceso de instalación 4"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/d3gxw6tonik0ca9ch6m6.png"
loading="lazy"
alt="Proceso de instalación 5"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c6r70sltv360egbs6l05.png"
loading="lazy"
alt="Proceso de instalación 6"
>&lt;/p>
&lt;hr>
&lt;h1 id="tu-tienda-online-está-lista">¡Tu tienda online está lista!
&lt;/h1>&lt;p>Con estos pasos, ya tienes PrestaShop funcionando en AWS con &lt;strong>Amazon Linux 2023&lt;/strong>. Ahora puedes empezar a personalizar tu tienda, agregar productos y lanzar tu negocio online.&lt;/p>
&lt;p>Si tienes dudas o comentarios, ¡déjamelos aquí abajo! 👇🏻&lt;/p></description></item><item><title>Cómo instalar WordPress en una instancia EC2 con Amazon Linux 2023</title><link>https://brianintech.com/instalar-wordpress-ec2.html</link><pubDate>Fri, 23 May 2025 10:30:00 +0200</pubDate><guid>https://brianintech.com/instalar-wordpress-ec2.html</guid><description>&lt;img src="https://d1hvrz5kjt6fwi.cloudfront.net/Blog Posts Covers/Posts Unorder/Post16.png" alt="Featured image of post Cómo instalar WordPress en una instancia EC2 con Amazon Linux 2023" />&lt;p>WordPress es uno de los sistemas de gestión de contenido más populares, y configurarlo en una instancia EC2 con Amazon Linux 2023 no es tan complicado como parece.&lt;/p>
&lt;p>Aquí tienes una guía paso a paso para hacerlo realidad.&lt;/p>
&lt;hr>
&lt;h3 id="paso-1-actualiza-los-paquetes-de-la-instancia">Paso 1: Actualiza los paquetes de la instancia
&lt;/h3>&lt;p>Mantén tu sistema al día:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo dnf update -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="paso-2-instala-apache-php-y-mariadb">Paso 2: Instala Apache, PHP y MariaDB
&lt;/h3>&lt;p>1. Instalar Apache&lt;/p>
&lt;p>Apache será el servidor web:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo dnf install httpd -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>2. Instalar PHP&lt;/p>
&lt;p>WordPress requiere PHP (7.4 o superior)&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo dnf install php php-mysqlnd php-fpm php-xml php-json php-cli -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>3. Instalar MariaDB (alternativa a MySQL)&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo dnf install -y mariadb105-server
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>4. Iniciar y habilitar los servicios&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;span class="lnt">6
&lt;/span>&lt;span class="lnt">7
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Inicia y habilita Apache&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl start httpd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> httpd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Inicia y habilita MariaDB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl start mariadb
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> mariadb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>5. Verificar el estado de ambos servicios:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;span class="lnt">5
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Verifica el estado de Apache&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl status httpd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="c1"># Verifica el estado de MariaDB&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl status mariadb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="paso-3-configura-la-base-de-datos">Paso 3: Configura la base de datos
&lt;/h3>&lt;p>1. Accede a MySQL:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo mysql -u root
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>2. Crea una base de datos para WordPress:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">DATABASE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">wordpress&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>3. Crea un usuario y dale permisos:&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Nota:&lt;/strong> Sustituye los valores &lt;code>'wp_user'&lt;/code> y &lt;code>'tu_contraseña'&lt;/code> por los valores que deseas utilizar para el usuario y contraseña.&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-sql" data-lang="sql">&lt;span class="line">&lt;span class="cl">&lt;span class="k">CREATE&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">USER&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;wp_user&amp;#39;&lt;/span>&lt;span class="o">@&lt;/span>&lt;span class="s1">&amp;#39;localhost&amp;#39;&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">IDENTIFIED&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">BY&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;tu_contraseña&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="k">GRANT&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ALL&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIVILEGES&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">ON&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="n">wordpress&lt;/span>&lt;span class="p">.&lt;/span>&lt;span class="o">*&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">TO&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;wp_user&amp;#39;&lt;/span>&lt;span class="o">@&lt;/span>&lt;span class="s1">&amp;#39;localhost&amp;#39;&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">FLUSH&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="k">PRIVILEGES&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="n">EXIT&lt;/span>&lt;span class="p">;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="paso-4-descarga-e-instala-wordpress">Paso 4: Descarga e instala WordPress
&lt;/h3>&lt;p>1. Instala &lt;code>wget&lt;/code> (si no está instalado):&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo dnf install wget -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>2. Descarga WordPress:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">wget https://wordpress.org/latest.tar.gz
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>3. Extrae los archivos:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">tar -xvzf latest.tar.gz
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>4. Mueve los archivos al directorio web de Apache:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo rsync -avP wordpress/ /var/www/html/
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>5. Ajusta los permisos:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo chown -R apache:apache /var/www/html/*
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="paso-5-configura-wordpress">Paso 5: Configura WordPress
&lt;/h3>&lt;p>1. Copia el archivo de configuración de muestra:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">cd&lt;/span> /var/www/html
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo cp wp-config-sample.php wp-config.php
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>2. Edita el archivo &lt;code>wp-config.php&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo nano wp-config.php
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Completa estos datos con la información de tu base de datos:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-php" data-lang="php">&lt;span class="line">&lt;span class="cl">&lt;span class="nx">define&lt;/span>&lt;span class="p">(&lt;/span> &lt;span class="s1">&amp;#39;DB_NAME&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;wordpress&amp;#39;&lt;/span> &lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">define&lt;/span>&lt;span class="p">(&lt;/span> &lt;span class="s1">&amp;#39;DB_USER&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;wp_user&amp;#39;&lt;/span> &lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">define&lt;/span>&lt;span class="p">(&lt;/span> &lt;span class="s1">&amp;#39;DB_PASSWORD&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;tu_contraseña&amp;#39;&lt;/span> &lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nx">define&lt;/span>&lt;span class="p">(&lt;/span> &lt;span class="s1">&amp;#39;DB_HOST&amp;#39;&lt;/span>&lt;span class="p">,&lt;/span> &lt;span class="s1">&amp;#39;localhost&amp;#39;&lt;/span> &lt;span class="p">);&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="paso-6-configura-el-firewall-opcional">Paso 6: Configura el firewall (Opcional)
&lt;/h3>&lt;blockquote>
&lt;p>&lt;strong>Nota:&lt;/strong> Si deseas utilizar el comando &lt;code>firewall-cmd&lt;/code>, ten en cuenta que no está disponible de serie en los paquetes de Amazon Linux 2023. Para instalarlo, utiliza el siguiente comando:&lt;/p>
&lt;/blockquote>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo yum install firewalld -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Para comprobar la versión instalada:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo firewall-cmd --version
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Permite el tráfico HTTP y HTTPS:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo firewall-cmd --zone&lt;span class="o">=&lt;/span>public --add-port&lt;span class="o">=&lt;/span>80/tcp --permanent
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo firewall-cmd --zone&lt;span class="o">=&lt;/span>public --add-port&lt;span class="o">=&lt;/span>443/tcp --permanent
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo firewall-cmd --reload
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="paso-7-reinicia-apache">Paso 7: Reinicia Apache
&lt;/h3>&lt;p>Aplica todos los cambios:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl restart httpd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="paso-8-accede-a-wordpress">Paso 8: Accede a WordPress
&lt;/h3>&lt;p>Abre tu navegador y dirígete a la IP pública de tu instancia EC2 o tu dominio:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-fallback" data-lang="fallback">&lt;span class="line">&lt;span class="cl">http://tu-ip-publica
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Sigue las instrucciones en pantalla para completar la instalación: selecciona idioma, crea una cuenta de administrador y configura tu sitio.&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/16a8s033c7xlmujaurxa.png"
loading="lazy"
alt="Asistente de instalación 1"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/soj86fgpagpq8a67c7i3.png"
loading="lazy"
alt="Asistente de instalación 2"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/69n5gnp4eugnmmbtzgtk.png"
loading="lazy"
alt="Asistente de instalación 3"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tlpqtt6qnpua5f238ycs.png"
loading="lazy"
alt="Asistente de instalación 4"
>&lt;/p>
&lt;hr>
&lt;h2 id="listo-">¡Listo! 🎉
&lt;/h2>&lt;p>Ahora tienes WordPress corriendo en tu instancia EC2 con Amazon Linux 2023. ¿Tienes alguna duda o sugerencia? ¡Compártela en los comentarios! 👇🏻&lt;/p></description></item><item><title>Configura un servidor GitLab en AWS EC2 en minutos</title><link>https://brianintech.com/configurar-gitlab-ec2.html</link><pubDate>Tue, 13 May 2025 10:30:00 +0200</pubDate><guid>https://brianintech.com/configurar-gitlab-ec2.html</guid><description>&lt;img src="https://d1hvrz5kjt6fwi.cloudfront.net/Blog Posts Covers/Posts Unorder/Post14.png" alt="Featured image of post Configura un servidor GitLab en AWS EC2 en minutos" />&lt;p>GitLab es una plataforma poderosa para la gestión de repositorios de código, CI/CD y colaboración en equipo.&lt;/p>
&lt;p>En este tutorial, te mostraré cómo instalar y configurar GitLab en una instancia EC2 con Amazon Linux 2023. ¡Manos a la obra!&lt;/p>
&lt;hr>
&lt;h2 id="requisitos-previos">Requisitos previos
&lt;/h2>&lt;p>Antes de empezar, asegúrate de cumplir con estos puntos:&lt;/p>
&lt;p>1. Instancia EC2 configurada:&lt;/p>
&lt;ul>
&lt;li>Asegúrate de que tu grupo de seguridad permita tráfico en los puertos &lt;strong>80 (HTTP)&lt;/strong>, &lt;strong>443 (HTTPS)&lt;/strong> y opcionalmente el &lt;strong>22 (SSH)&lt;/strong>.&lt;/li>
&lt;li>Si planeas usar un dominio o IP estática, asigna un &lt;strong>Elastic IP&lt;/strong>.&lt;/li>
&lt;/ul>
&lt;p>2. Dominio (Opcional)&lt;/p>
&lt;ul>
&lt;li>Configura un registro que apunte a la IP pública de tu instancia si tienes un dominio.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h2 id="pasos-para-instalar-gitlab-en-ec2">Pasos para instalar GitLab en EC2
&lt;/h2>&lt;p>1. Actualiza tu sistema&lt;/p>
&lt;p>Mantén tu sistema operativo al día:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo yum update -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;p>2. Instala las dependencias necesarias&lt;/p>
&lt;p>GitLab requiere ciertos paquetes para funcionar correctamente:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo yum install -y curl policycoreutils-python-utils openssh-server
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Si encuentras un error relacionado con paquetes en conflicto, usa este comando:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo yum install -y curl policycoreutils-python-utils openssh-server --allowerasing
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;p>3. Configura el servicio SSH&lt;/p>
&lt;p>Habilita y arranca el servicio SSH:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> sshd
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl start sshd
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;p>4. Instala GitLab&lt;/p>
&lt;p>4.1. Agrega el repositorio oficial de GitLab&lt;/p>
&lt;p>Usa este comando para configurar el repositorio:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">curl -sS https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh &lt;span class="p">|&lt;/span> sudo bash
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>4.2. Instala GitLab Community Edition (CE)&lt;/p>
&lt;p>Instala GitLab y especifica la URL externa (IP o dominio):&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo &lt;span class="nv">EXTERNAL_URL&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s2">&amp;#34;http://&amp;lt;tu-ip-o-dominio&amp;gt;&amp;#34;&lt;/span> yum install -y gitlab-ce
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Reemplaza &lt;code>&amp;lt;tu-ip-o-dominio&amp;gt;&lt;/code> con la IP pública de tu instancia o tu dominio.&lt;/p>
&lt;hr>
&lt;p>5. Configura GitLab&lt;/p>
&lt;p>Ejecuta el script de configuración inicial para aplicar los ajustes:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo gitlab-ctl reconfigure
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;p>6. Accede a GitLab&lt;/p>
&lt;p>6.1. Obtén la contraseña inicial de root&lt;/p>
&lt;p>Después de la instalación, GitLab genera una contraseña para el usuario &lt;code>root&lt;/code>. Encuéntrala con:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo cat /etc/gitlab/initial_root_password
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>El resultado será algo como:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-plaintext" data-lang="plaintext">&lt;span class="line">&lt;span class="cl"># WARNING: This value is valid only in the initial login.
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">Password: A1b2C3d4E5f6G7h8
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2vyj7m4h1xumyozfp5jt.png"
loading="lazy"
alt="Ejemplo contraseña root inicial"
>&lt;/p>
&lt;p>6.2. Ingresa al navegador&lt;/p>
&lt;p>Abre tu navegador y accede a &lt;code>http://&amp;lt;tu-ip-o-dominio&amp;gt;&lt;/code>. Usa estas credenciales:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Usuario&lt;/strong>: &lt;code>root&lt;/code>&lt;/li>
&lt;li>&lt;strong>Contraseña&lt;/strong>: La generada en el archivo anterior.&lt;/li>
&lt;/ul>
&lt;p>GitLab te pedirá cambiar esta contraseña en el primer inicio de sesión.&lt;/p>
&lt;blockquote>
&lt;p>&lt;strong>Nota&lt;/strong>: Si el archivo &lt;code>/etc/gitlab/initial_root_password&lt;/code> ya no existe, puede haberse eliminado automáticamente después de 24 horas. Si olvidaste la contraseña, puedes restablecerla manualmente.&lt;/p>
&lt;/blockquote>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ogkddch1e393uz477cvk.png"
loading="lazy"
alt="Pantalla inicial GitLab"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c1ag4wux76a20xjlds88.png"
loading="lazy"
alt="Pantalla inicial administrador GitLab"
>&lt;/p>
&lt;hr>
&lt;h3 id="opcional-configura-https-con-lets-encrypt">&lt;strong>Opcional: Configura HTTPS con Let&amp;rsquo;s Encrypt&lt;/strong>
&lt;/h3>&lt;h3 id="edita-la-configuración-de-gitlab">Edita la configuración de GitLab
&lt;/h3>&lt;p>1. Abre el archivo de configuración:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo nano /etc/gitlab/gitlab.rb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>2. Cambia la URL externa para usar HTTPS y habilita Let&amp;rsquo;s Encrypt:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-ruby" data-lang="ruby">&lt;span class="line">&lt;span class="cl">&lt;span class="n">external_url&lt;/span> &lt;span class="s2">&amp;#34;https://&amp;lt;tu-dominio&amp;gt;&amp;#34;&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="n">letsencrypt&lt;/span>&lt;span class="o">[&lt;/span>&lt;span class="s1">&amp;#39;enable&amp;#39;&lt;/span>&lt;span class="o">]&lt;/span> &lt;span class="o">=&lt;/span> &lt;span class="kp">true&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>3. Guarda los cambios y reconfigura GitLab:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo gitlab-ctl reconfigure
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;h3 id="reinicia-gitlab">Reinicia GitLab
&lt;/h3>&lt;p>Reinicia el servicio para asegurarte de que los cambios se apliquen correctamente:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo gitlab-ctl restart
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h2 id="notas-finales">Notas finales
&lt;/h2>&lt;ul>
&lt;li>&lt;strong>Firewall y conectividad&lt;/strong>: Revisa los grupos de seguridad de tu instancia y el firewall local para asegurarte de que los puertos necesarios están abiertos.&lt;/li>
&lt;li>&lt;strong>Documentación oficial&lt;/strong>: Consulta la &lt;a class="link" href="https://docs.gitlab.com/ee/install/" target="_blank" rel="noopener"
>documentación de GitLab&lt;/a> para configuraciones avanzadas.&lt;/li>
&lt;li>&lt;strong>Dominio&lt;/strong>: Usar un dominio con HTTPS mejora la seguridad y profesionalismo de tu plataforma GitLab.&lt;/li>
&lt;/ul>
&lt;p>¿Tienes dudas o comentarios? ¡Déjalos aquí y estaré encantado de ayudarte a resolverlos! ☺️👇🏻&lt;/p></description></item><item><title>Cómo configurar una GUI en una instancia EC2 usando noVNC</title><link>https://brianintech.com/configurar-gui-ec2-novnc.html</link><pubDate>Sat, 03 May 2025 09:30:00 +0200</pubDate><guid>https://brianintech.com/configurar-gui-ec2-novnc.html</guid><description>&lt;img src="https://d1hvrz5kjt6fwi.cloudfront.net/Blog Posts Covers/Posts Unorder/Post15.png" alt="Featured image of post Cómo configurar una GUI en una instancia EC2 usando noVNC" />&lt;p>Si alguna vez has trabajado con una instancia EC2, sabes que AWS no proporciona una interfaz gráfica de usuario (GUI) por defecto. Aunque existen servicios gestionados como &lt;strong>Amazon WorkSpaces&lt;/strong> o &lt;strong>NICE DCV&lt;/strong>, estos pueden resultar menos flexibles o más costosos.&lt;/p>
&lt;p>Pero no te preocupes, &lt;strong>podemos configurar nuestra propia GUI&lt;/strong> en una instancia EC2. Para ello, utilizaremos &lt;strong>VNC&lt;/strong>, un protocolo para compartir escritorios de manera remota, junto con &lt;strong>noVNC&lt;/strong>, una interfaz web que nos permitirá acceder a la GUI desde cualquier navegador sin necesidad de instalar software adicional.&lt;/p>
&lt;p>Vamos a ver cómo hacerlo paso a paso. 🚀&lt;/p>
&lt;hr>
&lt;h1 id="proceso-de-instalación-y-configuración">Proceso de instalación y configuración
&lt;/h1>&lt;h4 id="1-paso-1-lanzar-una-instancia-ec2">1️⃣ Paso 1: Lanzar una instancia EC2
&lt;/h4>&lt;p>Primero, necesitamos una instancia EC2 en AWS. Si ya tienes una funcionando, puedes saltar este paso. Si no, sigue estos pasos:&lt;/p>
&lt;ul>
&lt;li>
&lt;p>Ve a la consola de &lt;strong>AWS EC2&lt;/strong> y haz clic en &lt;strong>&amp;ldquo;Launch Instance&amp;rdquo;&lt;/strong>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Selecciona un AMI basado en &lt;strong>Debian&lt;/strong>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Crea o selecciona un &lt;strong>par de claves SSH&lt;/strong> para acceder a la instancia.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Asegúrate de que el &lt;strong>grupo de seguridad&lt;/strong> permite tráfico en el puerto &lt;strong>22 (SSH)&lt;/strong>.&lt;/p>
&lt;/li>
&lt;li>
&lt;p>Lanza la instancia y anota su &lt;strong>dirección IP pública&lt;/strong>.&lt;/p>
&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h4 id="2-paso-2-conectarse-por-ssh-a-la-instancia">2️⃣ Paso 2: Conectarse por SSH a la instancia
&lt;/h4>&lt;p>Una vez que la instancia esté en ejecución, usa SSH para conectarte desde tu terminal:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">ssh -i &lt;span class="s2">&amp;#34;[NOMBRE_DE_TU_CLAVE].pem&amp;#34;&lt;/span> admin@&lt;span class="o">[&lt;/span>DIRECCIÓN_IP_PÚBLICA&lt;span class="o">]&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Si todo está bien, deberías ver el terminal de tu instancia EC2.&lt;/p>
&lt;hr>
&lt;h4 id="3-paso-3-instalar-xfce-tightvnc-y-novnc">3️⃣ Paso 3: Instalar XFCE, TightVNC y noVNC
&lt;/h4>&lt;p>Ahora instalaremos el entorno de escritorio &lt;strong>XFCE&lt;/strong>, junto con &lt;strong>TightVNC&lt;/strong> (para la conexión VNC) y &lt;strong>noVNC&lt;/strong> (para acceder desde el navegador).&lt;/p>
&lt;p>Ejecuta los siguientes comandos en tu instancia EC2:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo apt-get update
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo &lt;span class="nv">DEBIAN_FRONTEND&lt;/span>&lt;span class="o">=&lt;/span>noninteractive apt-get install -q -y xfce4 xfce4-goodies tightvncserver dbus-x11 novnc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Esto instalará todos los paquetes necesarios.&lt;/p>
&lt;hr>
&lt;h4 id="4-paso-4-crear-un-usuario-para-vnc">4️⃣ Paso 4: Crear un usuario para VNC
&lt;/h4>&lt;p>Para gestionar la sesión VNC, crearemos un usuario llamado &lt;code>vncuser&lt;/code>:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo useradd vncuser -m
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo passwd vncuser
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Te pedirá que ingreses una contraseña. Usa una segura y anótala.&lt;/p>
&lt;hr>
&lt;h4 id="5-paso-5-configurar-tightvnc">5️⃣ Paso 5: Configurar TightVNC
&lt;/h4>&lt;p>Primero, crea la carpeta donde guardaremos la configuración de VNC:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo mkdir /home/vncuser/.vnc
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo chown -R vncuser:vncuser /home/vncuser/.vnc
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Ahora establece una contraseña para VNC:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo su -l -c &lt;span class="s1">&amp;#39;vncpasswd&amp;#39;&lt;/span> vncuser
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Configura la resolución de pantalla (por ejemplo, &lt;strong>1920x1080&lt;/strong>):&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> &lt;span class="s2">&amp;#34;geometry=1920x1080&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> sudo tee /home/vncuser/.vnc/config
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo chmod &lt;span class="m">600&lt;/span> /home/vncuser/.vnc/config
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Configura XFCE como el entorno de escritorio predeterminado para VNC:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="nb">echo&lt;/span> -e &lt;span class="s2">&amp;#34;#!/bin/bash\nxrdb &lt;/span>&lt;span class="nv">$HOME&lt;/span>&lt;span class="s2">/.Xresources\nstartxfce4 &amp;amp;&amp;#34;&lt;/span> &lt;span class="p">|&lt;/span> sudo tee /home/vncuser/.vnc/xstartup
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo chmod +x /home/vncuser/.vnc/xstartup
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h4 id="6-paso-6-configurar-novnc-para-acceso-desde-el-navegador">6️⃣ Paso 6: Configurar noVNC para acceso desde el navegador
&lt;/h4>&lt;p>Para hacer que noVNC sea más accesible, lo configuraremos para que su interfaz web se abra directamente sin necesidad de añadir &lt;code>/vnc.html&lt;/code> en la URL:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo ln -s /usr/share/novnc/vnc.html /usr/share/novnc/index.html
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Ahora crearemos dos scripts para iniciar y detener noVNC fácilmente:&lt;/p>
&lt;p>&lt;strong>Script para iniciar VNC (&lt;code>startvnc.sh&lt;/code>)&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo nano /home/vncuser/startvnc.sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Copia y pega el siguiente contenido:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/usr/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>/usr/bin/vncserver :&lt;span class="nv">$1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">websockify -D --web&lt;span class="o">=&lt;/span>/usr/share/novnc/ &lt;span class="k">$((&lt;/span>&lt;span class="m">6080&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nv">$1&lt;/span>&lt;span class="k">))&lt;/span> localhost:&lt;span class="k">$((&lt;/span>&lt;span class="m">5901&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nv">$1&lt;/span>&lt;span class="k">))&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Guarda el archivo y cierra el editor.&lt;/p>
&lt;p>&lt;strong>Script para detener VNC (&lt;code>stopvnc.sh&lt;/code>)&lt;/strong>&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo nano /home/vncuser/stopvnc.sh
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Copia y pega lo siguiente:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;span class="lnt">4
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">&lt;span class="cp">#!/usr/bin/bash
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="cp">&lt;/span>&lt;span class="nb">kill&lt;/span> &lt;span class="k">$(&lt;/span>lsof -ti tcp:&lt;span class="k">$((&lt;/span>&lt;span class="m">6080&lt;/span>&lt;span class="o">-&lt;/span>&lt;span class="m">1&lt;/span>&lt;span class="o">+&lt;/span>&lt;span class="nv">$1&lt;/span>&lt;span class="k">)))&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">/usr/bin/vncserver -kill :&lt;span class="nv">$1&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nb">exit&lt;/span> &lt;span class="m">0&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Guarda los cambios y cierra el archivo.&lt;/p>
&lt;hr>
&lt;h4 id="7-paso-7-automatizar-el-inicio-de-novnc-con-systemd">7️⃣ Paso 7: Automatizar el inicio de noVNC con systemd
&lt;/h4>&lt;p>Para que noVNC se inicie automáticamente al reiniciar la instancia, configuraremos un servicio en &lt;strong>systemd&lt;/strong>:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo nano /etc/systemd/system/vncserver@.service
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Pega este contenido:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt">10
&lt;/span>&lt;span class="lnt">11
&lt;/span>&lt;span class="lnt">12
&lt;/span>&lt;span class="lnt">13
&lt;/span>&lt;span class="lnt">14
&lt;/span>&lt;span class="lnt">15
&lt;/span>&lt;span class="lnt">16
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-ini" data-lang="ini">&lt;span class="line">&lt;span class="cl">&lt;span class="k">[Unit]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">Description&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">Start VNC server at startup&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">After&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">syslog.target network.target&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[Service]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">Type&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">forking&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">User&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">vncuser&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">Group&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">vncuser&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">WorkingDirectory&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">/home/vncuser&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">PIDFile&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">/home/vncuser/.vnc/%H:%i.pid&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">ExecStartPre&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">/home/vncuser/stopvnc.sh %i&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">ExecStart&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">/home/vncuser/startvnc.sh %i&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">ExecStop&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">/home/vncuser/stopvnc.sh %i&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">[Install]&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="na">WantedBy&lt;/span>&lt;span class="o">=&lt;/span>&lt;span class="s">multi-user.target&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Guarda y cierra el archivo. Luego, recarga systemd y habilita el servicio:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;span class="lnt">2
&lt;/span>&lt;span class="lnt">3
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl daemon-reload
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> vncserver@1.service
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">sudo systemctl start vncserver@1.service
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h4 id="8-paso-8-permitir-tráfico-en-el-puerto-de-novnc">8️⃣ Paso 8: Permitir tráfico en el puerto de noVNC
&lt;/h4>&lt;p>Para acceder a la GUI desde el navegador, necesitamos abrir el puerto &lt;strong>6080&lt;/strong> en el grupo de seguridad de la instancia:&lt;/p>
&lt;ol>
&lt;li>Ve a la consola de &lt;strong>AWS EC2&lt;/strong>.&lt;/li>
&lt;li>Selecciona la instancia y abre la pestaña &lt;strong>&amp;ldquo;Security&amp;rdquo;&lt;/strong>.&lt;/li>
&lt;li>Haz clic en el grupo de seguridad y selecciona &lt;strong>&amp;ldquo;Edit inbound rules&amp;rdquo;&lt;/strong>.&lt;/li>
&lt;li>Agrega una nueva regla:
&lt;ul>
&lt;li>&lt;strong>Tipo:&lt;/strong> Custom TCP&lt;/li>
&lt;li>&lt;strong>Rango de puertos:&lt;/strong> 6080&lt;/li>
&lt;li>&lt;strong>Origen:&lt;/strong> Anywhere (0.0.0.0/0)&lt;/li>
&lt;/ul>
&lt;/li>
&lt;li>Guarda los cambios.&lt;/li>
&lt;/ol>
&lt;hr>
&lt;h4 id="9-paso-9-acceder-a-la-gui-desde-el-navegador">9️⃣ Paso 9: Acceder a la GUI desde el navegador
&lt;/h4>&lt;p>¡Listo! Ahora puedes abrir tu navegador y acceder a la interfaz gráfica escribiendo en la barra de direcciones:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">http://&lt;span class="o">[&lt;/span>DIRECCIÓN_IP_PÚBLICA&lt;span class="o">]&lt;/span>:6080
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Introduce la contraseña de VNC y verás el escritorio XFCE funcionando en tu instancia EC2.&lt;/p>
&lt;h1 id="despliegue-por-cloudformation">Despliegue por CloudFormation
&lt;/h1>&lt;p>Si quieres hacer el despliegue directamente a través de un stack de CloudFormation, puedes hacer uso del siguiente template:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt"> 1
&lt;/span>&lt;span class="lnt"> 2
&lt;/span>&lt;span class="lnt"> 3
&lt;/span>&lt;span class="lnt"> 4
&lt;/span>&lt;span class="lnt"> 5
&lt;/span>&lt;span class="lnt"> 6
&lt;/span>&lt;span class="lnt"> 7
&lt;/span>&lt;span class="lnt"> 8
&lt;/span>&lt;span class="lnt"> 9
&lt;/span>&lt;span class="lnt"> 10
&lt;/span>&lt;span class="lnt"> 11
&lt;/span>&lt;span class="lnt"> 12
&lt;/span>&lt;span class="lnt"> 13
&lt;/span>&lt;span class="lnt"> 14
&lt;/span>&lt;span class="lnt"> 15
&lt;/span>&lt;span class="lnt"> 16
&lt;/span>&lt;span class="lnt"> 17
&lt;/span>&lt;span class="lnt"> 18
&lt;/span>&lt;span class="lnt"> 19
&lt;/span>&lt;span class="lnt"> 20
&lt;/span>&lt;span class="lnt"> 21
&lt;/span>&lt;span class="lnt"> 22
&lt;/span>&lt;span class="lnt"> 23
&lt;/span>&lt;span class="lnt"> 24
&lt;/span>&lt;span class="lnt"> 25
&lt;/span>&lt;span class="lnt"> 26
&lt;/span>&lt;span class="lnt"> 27
&lt;/span>&lt;span class="lnt"> 28
&lt;/span>&lt;span class="lnt"> 29
&lt;/span>&lt;span class="lnt"> 30
&lt;/span>&lt;span class="lnt"> 31
&lt;/span>&lt;span class="lnt"> 32
&lt;/span>&lt;span class="lnt"> 33
&lt;/span>&lt;span class="lnt"> 34
&lt;/span>&lt;span class="lnt"> 35
&lt;/span>&lt;span class="lnt"> 36
&lt;/span>&lt;span class="lnt"> 37
&lt;/span>&lt;span class="lnt"> 38
&lt;/span>&lt;span class="lnt"> 39
&lt;/span>&lt;span class="lnt"> 40
&lt;/span>&lt;span class="lnt"> 41
&lt;/span>&lt;span class="lnt"> 42
&lt;/span>&lt;span class="lnt"> 43
&lt;/span>&lt;span class="lnt"> 44
&lt;/span>&lt;span class="lnt"> 45
&lt;/span>&lt;span class="lnt"> 46
&lt;/span>&lt;span class="lnt"> 47
&lt;/span>&lt;span class="lnt"> 48
&lt;/span>&lt;span class="lnt"> 49
&lt;/span>&lt;span class="lnt"> 50
&lt;/span>&lt;span class="lnt"> 51
&lt;/span>&lt;span class="lnt"> 52
&lt;/span>&lt;span class="lnt"> 53
&lt;/span>&lt;span class="lnt"> 54
&lt;/span>&lt;span class="lnt"> 55
&lt;/span>&lt;span class="lnt"> 56
&lt;/span>&lt;span class="lnt"> 57
&lt;/span>&lt;span class="lnt"> 58
&lt;/span>&lt;span class="lnt"> 59
&lt;/span>&lt;span class="lnt"> 60
&lt;/span>&lt;span class="lnt"> 61
&lt;/span>&lt;span class="lnt"> 62
&lt;/span>&lt;span class="lnt"> 63
&lt;/span>&lt;span class="lnt"> 64
&lt;/span>&lt;span class="lnt"> 65
&lt;/span>&lt;span class="lnt"> 66
&lt;/span>&lt;span class="lnt"> 67
&lt;/span>&lt;span class="lnt"> 68
&lt;/span>&lt;span class="lnt"> 69
&lt;/span>&lt;span class="lnt"> 70
&lt;/span>&lt;span class="lnt"> 71
&lt;/span>&lt;span class="lnt"> 72
&lt;/span>&lt;span class="lnt"> 73
&lt;/span>&lt;span class="lnt"> 74
&lt;/span>&lt;span class="lnt"> 75
&lt;/span>&lt;span class="lnt"> 76
&lt;/span>&lt;span class="lnt"> 77
&lt;/span>&lt;span class="lnt"> 78
&lt;/span>&lt;span class="lnt"> 79
&lt;/span>&lt;span class="lnt"> 80
&lt;/span>&lt;span class="lnt"> 81
&lt;/span>&lt;span class="lnt"> 82
&lt;/span>&lt;span class="lnt"> 83
&lt;/span>&lt;span class="lnt"> 84
&lt;/span>&lt;span class="lnt"> 85
&lt;/span>&lt;span class="lnt"> 86
&lt;/span>&lt;span class="lnt"> 87
&lt;/span>&lt;span class="lnt"> 88
&lt;/span>&lt;span class="lnt"> 89
&lt;/span>&lt;span class="lnt"> 90
&lt;/span>&lt;span class="lnt"> 91
&lt;/span>&lt;span class="lnt"> 92
&lt;/span>&lt;span class="lnt"> 93
&lt;/span>&lt;span class="lnt"> 94
&lt;/span>&lt;span class="lnt"> 95
&lt;/span>&lt;span class="lnt"> 96
&lt;/span>&lt;span class="lnt"> 97
&lt;/span>&lt;span class="lnt"> 98
&lt;/span>&lt;span class="lnt"> 99
&lt;/span>&lt;span class="lnt">100
&lt;/span>&lt;span class="lnt">101
&lt;/span>&lt;span class="lnt">102
&lt;/span>&lt;span class="lnt">103
&lt;/span>&lt;span class="lnt">104
&lt;/span>&lt;span class="lnt">105
&lt;/span>&lt;span class="lnt">106
&lt;/span>&lt;span class="lnt">107
&lt;/span>&lt;span class="lnt">108
&lt;/span>&lt;span class="lnt">109
&lt;/span>&lt;span class="lnt">110
&lt;/span>&lt;span class="lnt">111
&lt;/span>&lt;span class="lnt">112
&lt;/span>&lt;span class="lnt">113
&lt;/span>&lt;span class="lnt">114
&lt;/span>&lt;span class="lnt">115
&lt;/span>&lt;span class="lnt">116
&lt;/span>&lt;span class="lnt">117
&lt;/span>&lt;span class="lnt">118
&lt;/span>&lt;span class="lnt">119
&lt;/span>&lt;span class="lnt">120
&lt;/span>&lt;span class="lnt">121
&lt;/span>&lt;span class="lnt">122
&lt;/span>&lt;span class="lnt">123
&lt;/span>&lt;span class="lnt">124
&lt;/span>&lt;span class="lnt">125
&lt;/span>&lt;span class="lnt">126
&lt;/span>&lt;span class="lnt">127
&lt;/span>&lt;span class="lnt">128
&lt;/span>&lt;span class="lnt">129
&lt;/span>&lt;span class="lnt">130
&lt;/span>&lt;span class="lnt">131
&lt;/span>&lt;span class="lnt">132
&lt;/span>&lt;span class="lnt">133
&lt;/span>&lt;span class="lnt">134
&lt;/span>&lt;span class="lnt">135
&lt;/span>&lt;span class="lnt">136
&lt;/span>&lt;span class="lnt">137
&lt;/span>&lt;span class="lnt">138
&lt;/span>&lt;span class="lnt">139
&lt;/span>&lt;span class="lnt">140
&lt;/span>&lt;span class="lnt">141
&lt;/span>&lt;span class="lnt">142
&lt;/span>&lt;span class="lnt">143
&lt;/span>&lt;span class="lnt">144
&lt;/span>&lt;span class="lnt">145
&lt;/span>&lt;span class="lnt">146
&lt;/span>&lt;span class="lnt">147
&lt;/span>&lt;span class="lnt">148
&lt;/span>&lt;span class="lnt">149
&lt;/span>&lt;span class="lnt">150
&lt;/span>&lt;span class="lnt">151
&lt;/span>&lt;span class="lnt">152
&lt;/span>&lt;span class="lnt">153
&lt;/span>&lt;span class="lnt">154
&lt;/span>&lt;span class="lnt">155
&lt;/span>&lt;span class="lnt">156
&lt;/span>&lt;span class="lnt">157
&lt;/span>&lt;span class="lnt">158
&lt;/span>&lt;span class="lnt">159
&lt;/span>&lt;span class="lnt">160
&lt;/span>&lt;span class="lnt">161
&lt;/span>&lt;span class="lnt">162
&lt;/span>&lt;span class="lnt">163
&lt;/span>&lt;span class="lnt">164
&lt;/span>&lt;span class="lnt">165
&lt;/span>&lt;span class="lnt">166
&lt;/span>&lt;span class="lnt">167
&lt;/span>&lt;span class="lnt">168
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-yaml" data-lang="yaml">&lt;span class="line">&lt;span class="cl">&lt;span class="nt">AWSTemplateFormatVersion&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;2010-09-09&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">Description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s1">&amp;#39;EC2 with browser supported GUI using noVNC&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">Parameters&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Ec2InstanceType&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">String&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Default&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">t2.micro&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Enter EC2 instance type to use for the instance&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Ec2Ami&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">AWS::EC2::Image::Id&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Default&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">ami-0fec2c2e2017f4e7b&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Enter AMI to use for the EC2 instance&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">NoVncPort&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Number&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Default&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">6080&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Starting port for noVNC instance access&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">VncDimensions&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">String&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Default&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">1280x720&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Enter dimensions for VNC session&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">VncPassword&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">String&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Default&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">password&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Enter password for noVNC access&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">Resources&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">VPC&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">AWS::EC2::VPC&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Properties&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">CidrBlock&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">10.0.0.0&lt;/span>&lt;span class="l">/16&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">EnableDnsSupport&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">EnableDnsHostnames&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Tags&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">Key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Name&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Sub ${AWS::StackName}-vpc&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">InternetGateway&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">AWS::EC2::InternetGateway&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Properties&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Tags&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">Key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Name&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Sub ${AWS::StackName}-internet-gateway&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">VPCGatewayAttachment&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">AWS::EC2::VPCGatewayAttachment&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Properties&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">InternetGatewayId&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Ref InternetGateway&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">VpcId&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Ref VPC&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">PublicSubnet&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">AWS::EC2::Subnet&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Properties&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">VpcId&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Ref VPC&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">CidrBlock&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">10.0.1.0&lt;/span>&lt;span class="l">/24&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">AvailabilityZone&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Select [ 0, !GetAZs ]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">MapPublicIpOnLaunch&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Tags&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">Key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Name&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Sub ${AWS::StackName}-subnet&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">PublicRouteTable&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">AWS::EC2::RouteTable&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Properties&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">VpcId&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Ref VPC&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Tags&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">Key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Name&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Sub ${AWS::StackName}-route-table&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">PublicRoute&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">AWS::EC2::Route&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">DependsOn&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">VPCGatewayAttachment&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Properties&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">RouteTableId&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Ref PublicRouteTable&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">DestinationCidrBlock&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0.0.0.0&lt;/span>&lt;span class="l">/0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">GatewayId&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Ref InternetGateway&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">PublicSubnetRouteTableAssociation&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">AWS::EC2::SubnetRouteTableAssociation&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Properties&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">SubnetId&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Ref PublicSubnet&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">RouteTableId&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Ref PublicRouteTable&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">SecurityGroup&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">AWS::EC2::SecurityGroup&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Properties&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">GroupName&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Sub ${AWS::StackName}-security-group&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">GroupDescription&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Security group for VNC access over noVNC&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">VpcId&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Ref VPC&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">SecurityGroupIngress&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">Description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">noVNC&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">IpProtocol&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">tcp&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">FromPort&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Ref NoVncPort&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">ToPort&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Ref NoVncPort&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">CidrIp&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="m">0.0.0.0&lt;/span>&lt;span class="l">/0&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">EC2Instance&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Type&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">AWS::EC2::Instance&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Properties&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">ImageId&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Ref Ec2Ami&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">InstanceType&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Ref Ec2InstanceType&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">NetworkInterfaces&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">AssociatePublicIpAddress&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="kc">true&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">DeviceIndex&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="s2">&amp;#34;0&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Network interface for EC2 instance&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">GroupSet&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- !&lt;span class="l">Ref SecurityGroup&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">SubnetId&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Ref PublicSubnet&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Tags&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>- &lt;span class="nt">Key&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">Name&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Sub ${AWS::StackName}-server&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">UserData&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Fn::Base64&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Sub |&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="c">#!/bin/bash&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo apt-get update&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo DEBIAN_FRONTEND=noninteractive apt-get install -q -y xfce4 xfce4-goodies tightvncserver dbus-x11 novnc&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo useradd vncuser -m&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo echo &amp;#34;vncuser:${VncPassword}&amp;#34; | sudo chpasswd&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo mkdir /home/vncuser/.vnc&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo chown -R vncuser:vncuser /home/vncuser/.vnc&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo su -l -c &amp;#39;printf &amp;#34;${VncPassword}\n${VncPassword}\n\n&amp;#34; | vncpasswd&amp;#39; vncuser&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo chmod 600 /home/vncuser/.vnc/passwd&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo su -l -c &amp;#39;echo -e &amp;#34;geometry=${VncDimensions}&amp;#34; &amp;gt; /home/vncuser/.vnc/config&amp;#39; vncuser&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo chmod 600 /home/vncuser/.vnc/config&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo su -l -c &amp;#39;echo -e &amp;#34;#!/bin/bash\nxrdb $HOME/.Xresources\nstartxfce4 &amp;amp;&amp;#34; &amp;gt; /home/vncuser/.vnc/xstartup&amp;#39; vncuser&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo chmod +x /home/vncuser/.vnc/xstartup&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo ln -s /usr/share/novnc/vnc.html /usr/share/novnc/index.html&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo su -l vncuser -c &amp;#39;echo &amp;#34;#!/usr/bin/bash&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">/usr/bin/vncserver :\$1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">websockify -D --web=/usr/share/novnc/ \$((${NoVncPort}-1+\$1)) localhost:\$((5900+\$1))&amp;#34; &amp;gt; /home/vncuser/startvnc.sh&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo chmod +x /home/vncuser/startvnc.sh&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo su -l vncuser -c &amp;#39;echo &amp;#34;#!/usr/bin/bash&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">kill \$(lsof -ti tcp:\$((${NoVncPort}-1+\$1)))&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">/usr/bin/vncserver -kill :\$1&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">exit 0&amp;#34; &amp;gt; /home/vncuser/stopvnc.sh&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo chmod +x /home/vncuser/stopvnc.sh&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo sh -c &amp;#39;echo &amp;#34;[Unit]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">Description=Start VNC server at startup&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">After=syslog.target network.target&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">Service]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">Type=forking&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">User=vncuser&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">Group=vncuser&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">WorkingDirectory=/home/vncuser&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">PIDFile=/home/vncuser/.vnc/%H:%i.pid&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">ExecStartPre=/home/vncuser/stopvnc.sh %i&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">ExecStart=/home/vncuser/startvnc.sh %i&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">ExecStop=/home/vncuser/stopvnc.sh %i&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="p">[&lt;/span>&lt;span class="l">Install]&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">WantedBy=multi-user.target&amp;#34; &amp;gt; /etc/systemd/system/vncserver@.service&amp;#39;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo systemctl daemon-reload&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo systemctl enable vncserver@1.service&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="l">sudo systemctl start vncserver@1.service&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w">&lt;/span>&lt;span class="nt">Outputs&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">AccessUrl&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Description&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>&lt;span class="l">URL to access the noVNC interface through a web browser&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="w"> &lt;/span>&lt;span class="nt">Value&lt;/span>&lt;span class="p">:&lt;/span>&lt;span class="w"> &lt;/span>!&lt;span class="l">Sub &amp;#34;http://${EC2Instance.PublicIp}:${NoVncPort}&amp;#34;&lt;/span>&lt;span class="w">
&lt;/span>&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h1 id="conclusión">Conclusión
&lt;/h1>&lt;p>Configurar una GUI en EC2 puede parecer complicado, pero con los pasos correctos, es completamente posible. Con noVNC, puedes acceder a tu escritorio desde cualquier navegador sin necesidad de instalar software adicional.&lt;/p>
&lt;p>Si necesitas un entorno gráfico para trabajar con EC2, esta es una excelente solución sin depender de servicios costosos como Amazon WorkSpaces.&lt;/p></description></item><item><title>Cómo instalar MariaDB en una instancia EC2 con Amazon Linux 2023</title><link>https://brianintech.com/instalar-mariadb-ec2.html</link><pubDate>Fri, 25 Apr 2025 10:30:00 +0200</pubDate><guid>https://brianintech.com/instalar-mariadb-ec2.html</guid><description>&lt;img src="https://d1hvrz5kjt6fwi.cloudfront.net/Blog Posts Covers/Posts Unorder/Post12.png" alt="Featured image of post Cómo instalar MariaDB en una instancia EC2 con Amazon Linux 2023" />&lt;p>Si necesitas un servidor de base de datos rápido, confiable y fácil de configurar, &lt;strong>MariaDB&lt;/strong> es una excelente opción. En este tutorial, te guiaré paso a paso para instalar y configurar MariaDB en una instancia EC2 con &lt;strong>Amazon Linux 2023&lt;/strong>.&lt;/p>
&lt;hr>
&lt;h3 id="paso-1-actualizar-el-sistema">Paso 1: Actualizar el sistema
&lt;/h3>&lt;p>Antes de instalar cualquier paquete, asegúrate de que tu sistema está actualizado:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo dnf update -y
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="paso-2-instalar-mariadb">Paso 2: Instalar MariaDB
&lt;/h3>&lt;p>Amazon Linux 2023 incluye MariaDB en sus repositorios predeterminados.&lt;/p>
&lt;p>1. Instala MariaDB Server&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo dnf install -y mariadb105-server
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;blockquote>
&lt;p>💡 &lt;strong>Tip:&lt;/strong> Si necesitas otra versión, verifica las disponibles con:&lt;/p>
&lt;/blockquote>
&lt;blockquote>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo dnf list mariadb*
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;/blockquote>
&lt;p>2. Inicia y habilita el servicio&lt;/p>
&lt;p>Después de instalar, inicia el servicio de MariaDB:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl start mariadb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Y habilítalo para que inicie automáticamente tras un reinicio:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl &lt;span class="nb">enable&lt;/span> mariadb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Verifica que el servicio esté funcionando:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo systemctl status mariadb
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>📸 Aquí tienes un ejemplo de cómo debería verse el estado del servicio:&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3hmzigbmn5x9vtm5tljd.png"
loading="lazy"
alt="Estado MariaDB"
>&lt;/p>
&lt;hr>
&lt;h3 id="paso-3-configurar-mariadb">Paso 3: Configurar MariaDB
&lt;/h3>&lt;h4 id="configuración-de-seguridad-inicial">Configuración de seguridad inicial
&lt;/h4>&lt;p>Antes de usar MariaDB, necesitas realizar una configuración inicial. A continuación, ejecuta el script de configuración inicial:&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo mysql_secure_installation
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;hr>
&lt;h3 id="-recomendaciones-al-configurar-la-contraseña">⚠️ Recomendaciones al configurar la contraseña
&lt;/h3>&lt;p>&lt;strong>Cumple con los requisitos de seguridad:&lt;/strong>&lt;/p>
&lt;ul>
&lt;li>Al menos una letra mayúscula y una minúscula.&lt;/li>
&lt;li>Al menos un número.&lt;/li>
&lt;li>Al menos un símbolo especial (.!@#$%^&amp;amp;*()).&lt;/li>
&lt;li>Longitud mínima de 8 caracteres.&lt;/li>
&lt;/ul>
&lt;h4 id="qué-hace-el-script-mysql_secure_installation">¿Qué hace el script &lt;code>mysql_secure_installation&lt;/code>?
&lt;/h4>&lt;p>Este script te guía para realizar ajustes clave en la configuración de seguridad:&lt;/p>
&lt;ul>
&lt;li>&lt;strong>Cambiar la contraseña de &lt;code>root&lt;/code>:&lt;/strong> Usa una contraseña fuerte siguiendo las recomendaciones anteriores.&lt;/li>
&lt;li>&lt;strong>Deshabilitar usuarios anónimos:&lt;/strong> Esto evita accesos no autorizados.&lt;/li>
&lt;li>&lt;strong>Eliminar la base de datos de prueba:&lt;/strong> Protege tu sistema eliminando datos predeterminados.&lt;/li>
&lt;li>&lt;strong>Restringir el acceso remoto:&lt;/strong> Asegura que solo se pueda acceder desde la máquina local.&lt;/li>
&lt;/ul>
&lt;hr>
&lt;h3 id="vista-del-asistente-de-configuración">Vista del asistente de configuración
&lt;/h3>&lt;p>📸 Aquí tienes capturas de pantalla de cómo se ve el asistente durante su ejecución:&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hjh1gc865bnkvjfcz4mf.png"
loading="lazy"
alt="Paso 1 del asistente de configuración de MariaDB"
>&lt;/p>
&lt;p>&lt;img src="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/uf9gnkyyh1polznlod06.png"
loading="lazy"
alt="Paso 2 del asistente de configuración de MariaDB"
>&lt;/p>
&lt;hr>
&lt;h3 id="paso-4-conéctate-a-mariadb-como-root">Paso 4: Conéctate a MariaDB como root
&lt;/h3>&lt;p>Ejecuta el siguiente comando para acceder al servidor de MariaDB como usuario &lt;code>root&lt;/code>.&lt;/p>
&lt;div class="highlight">&lt;div class="chroma">
&lt;table class="lntable">&lt;tr>&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code>&lt;span class="lnt">1
&lt;/span>&lt;/code>&lt;/pre>&lt;/td>
&lt;td class="lntd">
&lt;pre tabindex="0" class="chroma">&lt;code class="language-bash" data-lang="bash">&lt;span class="line">&lt;span class="cl">sudo mysql -u root -p
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/td>&lt;/tr>&lt;/table>
&lt;/div>
&lt;/div>&lt;p>Ingresa la contraseña configurada anteriormente y accede al shell de MariaDB.&lt;/p>
&lt;hr>
&lt;h2 id="listo-">¡Listo! 🎉
&lt;/h2>&lt;p>¡Eso es todo! Ahora tienes un servidor MariaDB funcionando en tu instancia EC2 con Amazon Linux 2023&lt;/p>
&lt;p>Si tienes preguntas o necesitas ayuda para personalizar tu configuración, ¡déjalo en los comentarios! 👇🏻&lt;/p></description></item><item><title>Recursos AWS</title><link>https://brianintech.com/recursos-aws.html</link><pubDate>Fri, 25 Apr 2025 10:30:00 +0200</pubDate><guid>https://brianintech.com/recursos-aws.html</guid><description>&lt;img src="https://d1hvrz5kjt6fwi.cloudfront.net/Blog Posts Covers/Posts Unorder/Post12.png" alt="Featured image of post Recursos AWS" />&lt;p>&lt;a class="link" href="https://cloudhound.io/calculator?li_fat_id=bf3d7014-927a-48a1-b95d-fc4df5a18962" target="_blank" rel="noopener"
>URL&lt;/a>&lt;/p>
&lt;p>&lt;a class="link" href="https://danielcdmconsultores.github.io/pingaws/" target="_blank" rel="noopener"
>URL&lt;/a>&lt;/p></description></item></channel></rss>