Jekyll2023-12-19T22:48:00-06:00https://lgallardo.com/es/lgallardo.comLuis M. Gallardo D.AWS (re)Certified Solutions Architect - Professional2023-12-18T09:00:55-06:002023-12-18T09:00:55-06:00https://lgallardo.com/es/2023/12/18/aws-certified-solutions-architect-professional-2023<p><img src="/assets/images/aws-csap-2023.jpg" alt="OctoPrints" style="display:block; margin-left:auto; margin-right:auto" /><br />
Este artículo es para comentar mi experiecia con el examen para AWS Certified Solutions Architect - Professional (recertificación):</p>
<p>Si vas a presentar el examen por primera vez o como mi caso buscas una recertificación, te recomiendo que revises los nuevos contenidos y que chequees qué ha cambiado respecto al examen anterior. Ejemplo de estos pueden ser AWS SSO por AWS Identity Center. También te recomiendo que sepas de qué van nuevos servicios como AWS Elastic Desaster Recovery, EventBridge, Amazon Managed Services for Apache Flink, entre otros.</p>
<p>Fueron 75 preguntas en 180 minutos. Como ya es clásico en las certificaciones profresionales de AWS, el examen es largo y tiene enunciados extensos y con respuestas también extensas. Para quienes el inglés no es su lengua nativa puede llegar a ser confuso, por lo que seguro te tocará leer varias preguntas mas de una vez (y sus opcione).
Si vas a presentar el examen por primera vex o como mi caso buscas una recertificación, te recomiendo que revises los nuevos contenidos y que chequees qué ha cambiado respecto al examen anterior. Ejemplo de estos pueden ser AWS SSO por AWS Identity Center. También te recomiendo que sepas de qué van nuevos servicios como AWS Elastic Desaster Recovery, EventBridge, Amazon Managed Services for Apache Flink, entre otros.
Mis recomendaciones para ganar tiempo en este examen son:</p>
<ul>
<li>Las preguntas fáciles respóndelas rápidamente, no te quedes mucho tiempo pensando en si es la respuesta correcta porque seguro lo es.</li>
<li>Marcar las preguntas en las que realmente tienes dudas, así al momento de revisarlas puedes enfocarte en solo esas y si queda tiempo empezar a revisar el resto.</li>
<li>Las preguntas con opciones míltiples márcalas para revisión, incluso si crees que están correctas. Te conviene estar 100% seguro de las opciones porque si te equivocas en una la respuesta puede ser considerada como inclorrecta.</li>
<li>Lee bien las preguntas porque el eneunciado contiene la información que te va a ayudar a descartar opciones, o eligier las opciones correctas.</li>
<li>Piensen que es una certificación de Amazon, en ese sentido siempre preguntarse cuál servicio de Amazon corresponde.</li>
<li>Descartar cosas que se pueden hacer a nivel de S.O. si un servicio de Amazon lo provee, y solo considerarlo cuando no hay mas opción.</li>
<li>No todo se resuelve con Lambda + SQS, aunque suene correcto. Revisa qué opciones o servicios cumplen con lo que se esté solicitando y no dejarse marear por ociones que en principio parecen correctas.</li>
</ul>
<p>Si estás interesado en esta certificación te recomiendo algunos enlaces:</p>
<p><strong>Cursos en línea</strong></p>
<p>Para este examen seguí fiel a AWS A Cloud Guru, pero para ser sinceros me parece que los conteidos los tratan superficialmente y el curso tal cual como está hoy en día parece un Frankeinstain ya que hay al menos dos instructores con formatos de contenidos distintos, como si hubiesen agarrado lo mejor de los curso de Linux Academy con los de A Cloud Guru . De Igual forma, si estás interesado acá lo tienes disponible:</p>
<ul>
<li><a href="https://www.pluralsight.com/courses/aws-certified-solutions-architect-professional-sap-c02" target="_blank">A Cloud Guru - AWS Certified Solutions Architect Professional</a></li>
</ul>
<p><strong>Documentación de AWS</strong></p>
<ul>
<li><a href="https://aws.amazon.com/whitepapers/" target="_blank">Whitepapers</a></li>
<li><a href="https://aws.amazon.com/documentation/" target="_blank">Documentation</a></li>
<li><a href="https://aws.amazon.com/faqs/" target="_blank">FAQs</a></li>
</ul>Luis GallardoEste artículo es para comentar mi experiecia con el examen para AWS Certified Solutions Architect - Professional (recertificación):OctoPrint con múltiples impresoras 3D2022-09-24T19:00:00-05:002022-09-24T19:00:00-05:00https://lgallardo.com/es/2022/09/25/octoprint-multiple-printers<p><img src="/assets/images/OctoPrint.jpg" alt="OctoPrints" style="display:block; margin-left:auto; margin-right:auto" /><br />
Una de las herramientas más útiles a la hora de gestionar una impresora 3D es <a href="https://octoprint.org" target="_blank">OctoPrint</a>, ya que entre varias cosas permite administrar tu impresora desde una interfaz web, así como agregar un montón de funcionalidades (por ejemplo, monitoreo y gestión de la impresora a través de Telegram, plugins para generar los videos timelapse de las impresiones, o incluso detectar cuando hay problemas tipo espagueti en nuestra impresiones usando otro plugin con AI).</p>
<h2 id="múltiples-impresoras">Múltiples impresoras</h2>
<p>¿Pero qué pasa si tenemos más de una impresora? ¿Puede <strong>OctoPrint</strong> gestionar mas de una impresora?</p>
<p>La respuesta corta es: NO! El software en sí no está diseñado para múltiples impresoras, pero se puede buscar formas alternativas para tener más de una instancia de <strong>OctoPrint</strong> corriendo en nuestro dispositivo o computadora.</p>
<p>Existen varias formas para esto, por ejemplo se puede <a href="http://thomas-messmer.com/index.php/14-free-knowledge/howtos/79-setting-up-octoprint-for-multiple-printers" target="_blank">modificar los scripts de OctoPi para agregar más instancias</a>, crear scripts que lancen varias instancias del mismo programa , pero la opción que terminé usando fue la de contenedores Docker.</p>
<h2 id="raspberry-pi--ubuntu">Raspberry Pi + Ubuntu</h2>
<p>En mi caso tengo una <strong>Raspberry Pi 4</strong>, de 8 GB de RAM, más que suficiente para correr múltiples instancias de <strong>OctoPrint</strong>.</p>
<p>En principio tenía instalado en mi Raspberry un sistema operativo específico llamado <a href="https://github.com/guysoft/OctoPi" target="_blank">OctoPi</a>, un derivado de Debian con <strong>OctoPrint</strong> como el programa principal que se lanza cuando se enciende el dispositivo, pero al querer tener contenedores pensé en usar Ubuntu que es una distribución menos especializada y donde seguramente se puede encontrar todo lo necesario para trabajar con contenedores.</p>
<h2 id="requisitos-y-componentes">Requisitos y componentes:</h2>
<p>Para esta configuración usé lo siguiente:</p>
<ul>
<li>Impresora 3D - Artillery Genius Pro</li>
<li>Impresora 3D - Artillery SideWinder X2</li>
<li>2x WebCam - Logitech C270 (una por impresora)</li>
<li>Raspberry Pi 4 - 8G RAM</li>
<li>SD Card 64 GB</li>
<li>Ubuntu 22.04 LTS ARM 64 bits</li>
<li>Docker 20.10.17</li>
<li>OctoPrint lastest (1.8.3)</li>
</ul>
<h2 id="instalación-de-ubuntu">Instalación de Ubuntu</h2>
<p>Para instalar <strong>Ubuntu</strong> en la Raspberry Pi ahora es más sencillo que nunca, solo tienes que descargar <strong>Raspberry Pi Imager,</strong> el cual generará la imagen en tu tarjeta SD, seleccionar el sistema operativo, que en este caso es <strong>Ubuntu 22.04 LTS</strong> y listo. Hay versiones de Raspberry Pi Imager para Linux, Mac y Windows, así que podrás generar la imagen en el sistema operativo que más te convenga.</p>
<p><img src="/assets/images/Raspberry-Pi-Imager.jpg" alt="Raspberry Pi Imager" /></p>
<p>Desde este mismo software vas a tener la posibilidad de configurar la contraseña de la red WiFi en caso de que la estés usando la Raspberry de forma inalámbrica y que no quieras usar un televisor y un teclado (headless), o tocar la SD para configurar la red. Como yo lo estoy usando headless, fue lo que hice y luego me conecté por <strong>ssh</strong>.</p>
<p><img src="/assets/images/OctoPi-WiFi-Setting.jpg" alt="WiFi Settings" /></p>
<p>Para la configuración headless el truco es dejar que corran los scripts de inicialización de <strong>Ubuntu</strong> y luego conectarte por ssh. Ahora si ves que no puedes conectarse por ssh puedes buscar un cable HDMI y un teclado para revisar qué pueda estar pasando.</p>
<h2 id="instalación-del-software-en-ubuntu">Instalación del software en Ubuntu</h2>
<p>Aparte de <strong>Docker</strong> vamos a necesitar, <strong>docker-compose</strong>, y los utilitarios que nos ayudarán a instalarlos.</p>
<h2 id="docker-y-docker-compose">Docker y docker-compose</h2>
<p>Para instalar docker debemos descargarlo usando el script. Necesitaremos entrar como usuario administrador con la cuenta root:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pi@octopi:~<span class="nv">$ </span><span class="nb">sudo </span>su
root@octopi:~#
root@octopi:~# apt install curl
root@octopi:~# curl <span class="nt">-sSL</span> https://get.docker.com | sh
root@octopi:~# apt update
root@octopi:~# apt install docker-compose
</code></pre></div></div>
<h2 id="octoprint-con-una-impresora">OctoPrint con una impresora</h2>
<p>Lo primero que haremos es crear un carpeta para OctoPrint, y luego entrar en ella:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>root@octopi:~# mkdir octoprint
root@octopi:~#
root@octopi:~# <span class="nb">cd </span>octoprint/
root@octopi:~/octoprint#
</code></pre></div></div>
<p>Vamos a empezar con una impresora, en este caso empezaré con la <code class="highlighter-rouge">Artillery Genius Pro</code>. Para esto creamos una carpeta que identifique a esta impresora:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>root@octopi:~# mkdir geniuspro
root@octopi:~# chmod <span class="nt">-R</span> 777 geniuspro/
</code></pre></div></div>
<p>Es importante saber la ruta actual porque luego la usaremos en la definición del contenedor junto con el nombre de esta carpeta. Para ello ejecutamos la siguiente orden:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>root@octopi:~# <span class="nb">pwd</span>
/root/octoprint
</code></pre></div></div>
<p>Ya con esto podemos indicar luego que los archivos de esta primera instancia de OctoPrint residirán en <code class="highlighter-rouge">/root/octoprint/geniuspro</code>.</p>
<p>Ahora para configurar la impresora vamos a usar <code class="highlighter-rouge">docker-compose</code> por lo que creamos el archivo <code class="highlighter-rouge">docker-compose.yml</code> con la siguiente información:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>version: '2.4'
services:
geniuspro:
image: octoprint/octoprint
restart: unless-stopped
ports:
- 5000:5000
- 8080:8080
devices:
- /dev/ttyACM0:/dev/ttyACM0
- /dev/video0:/dev/video0
volumes:
- /root/octoprint/geniuspro:/octoprint
# uncomment the lines below to ensure camera streaming is enabled when
# you add a video device
environment:
- ENABLE_MJPG_STREAMER=true
- CAMERA_DEV=/dev/video0
- MJPG_STREAMER_INPUT="-y -n -r 1280x960 -f 30
</code></pre></div></div>
<p>Este archivo define varias cosas relacionadas a OctoPrint, como la cámara web y la impresora como tal. Por ejemplo, con <code class="highlighter-rouge">image</code> indicamos cuál es la imagen Docker a usar para el servicio <code class="highlighter-rouge">geniuspro</code>.</p>
<p>En esta definición hay que destacar los puertos, los cuales serán usados para acceder a los servicios, siendo el <code class="highlighter-rouge">5000</code> para la interfaz web y el <code class="highlighter-rouge">8080</code> para el streaming de video de la cámara web.</p>
<p>Por otro lado se define como dispositivo la impresora en <code class="highlighter-rouge">/dev/ttyACM0</code>, y la cámara web en <code class="highlighter-rouge">/dev/video0</code></p>
<p>Algo a tener en cuenta y que se diferencia del <a href="https://docs.google.com/document/d/1aU7LGYAe6r45LqEBQ8opuXCiNKeJl3XrPTrobvEvdOM/edit" target="_blank">ejemplo en cuál me basé</a>, es que el streamer ahora es parte de la imagen Docker y es atendido en el puerto <code class="highlighter-rouge">8080</code>, por los que no hace falta tener una definición aparte a otra imagen Docker apuntando al streamer.</p>
<p>Luego en <code class="highlighter-rouge">volumes</code> es donde se hace la referencia al directorio de la impresora que habíamos creado en la ruta <code class="highlighter-rouge">/root/octoprint/geniuspro</code>, que será mapeada dentro del contenedor en la carpeta <code class="highlighter-rouge">/octoprint</code>. Es decir, cuando levantemos el contenedor todos los archivos de OctoPrint para esta impresora quedarán en la ruta <code class="highlighter-rouge">/root/octoprint/geniuspro</code> del sistema operativo.</p>
<p>Por último, en <code class="highlighter-rouge">environment</code> definimos los parámetros para el streamer, pasando la información del dispositivo de la cámara web referido desde el contenedor, que en este caso coincide con el del sistema operativo afitrión, es decir, <code class="highlighter-rouge">/dev/video0</code>. También le proporcionamos los parámetros de la cámara, en mi caso le indico que la resolución es de 1280x960 a 30 frames por segundos, que es lo que corresponde com mi Logitech C270. Para otros modelos puedes consultar el <a href="https://community.octoprint.org/t/usb-webcams-known-to-work-with-mjpg-streamer/21149" target="_blank">listado desde la página de cámaras soportadas</a>.</p>
<p>Una vez creado el archivo <code class="highlighter-rouge">docker-compose.yml</code> con la información mostrada arriba, solo basta con levantar el servicio con Docker:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>root@octopi:~/octoprint# docker-compose up -d
Creating octoprint_geniuspro_1 ... done
</code></pre></div></div>
<p>Ya con esto podemos acceder a la interfaz web de OctoPrint desde la ip de la Raspberry en el puerto que le habíamos indicado, que en mi caso la url es http://192.168.68.102:5000:</p>
<p><img src="/assets/images/octoprint-multi-web.jpg" alt="OctoPrint Web 1" /></p>
<h2 id="agregar-una-segunda-impresora">Agregar una segunda impresora</h2>
<p>Para agregar una segunda impresora solo hay que replicar la configuración que teníamos antes, pero especificando la nueva impresora y la cámara de video correspondiente. Entonces para mi Artillery Sidewinder X2 esto sería:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>version: '2.4'
services:
geniuspro:
image: octoprint/octoprint
restart: unless-stopped
ports:
- 5000:5000
- 8080:8080
devices:
- /dev/ttyACM0:/dev/ttyACM0
- /dev/video0:/dev/video0
volumes:
- /root/octoprint/geniuspro:/octoprint
# uncomment the lines below to ensure camera streaming is enabled when
# you add a video device
environment:
- ENABLE_MJPG_STREAMER=true
- CAMERA_DEV=/dev/video0
- MJPG_STREAMER_INPUT="-y -n -r 1280x960 -f 30
sidewinder_x2:
image: octoprint/octoprint
restart: unless-stopped
ports:
- 5000:5000
- 8080:8080
devices:
- /dev/ttyACM1:/dev/ttyACM0
- /dev/video2:/dev/video0
volumes:
- /root/octoprint/geniuspro:/octoprint
# uncomment the lines below to ensure camera streaming is enabled when
# you add a video device
environment:
- ENABLE_MJPG_STREAMER=true
- CAMERA_DEV=/dev/video0
- MJPG_STREAMER_INPUT="-y -n -r 1280x960 -f 30
</code></pre></div></div>
<p>Aquí hay que aclarar que en el apartado devices físicamente la impresora está identificada en la Raspberry como <code class="highlighter-rouge">/dev/ttyACM1</code>, pero al crear el contenedor internamente se identificará como <code class="highlighter-rouge">/dev/ttyACM0</code>. Lo mismo pasa con la cámara de video, donde físicamente se identifca como <code class="highlighter-rouge">/dev/video2</code> pero internamente el contenedor la verá como <code class="highlighter-rouge">/dev/video0</code>.</p>
<p>Una vez creada la configuración se debe levantar el contendor de la siguiente manera:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>root@octopi:~/octoprint# docker-compose up -d
octoprint_geniuspro_1 is up-to-date
Creating octoprint_sidewinderx2_1 ... done
</code></pre></div></div>
<p>Con esto ya se podrá acceder a la segunda instancia de OctoPrint en el puerto 5001:</p>
<p><img src="/assets/images/octoprint-multi-web2.jpg" alt="OctoPrint Web 2" /></p>
<h2 id="cómo-diferenciar-las-impresoras">¿Cómo diferenciar las impresoras?</h2>
<p>En el anterior ejemplo usé los dipositivos <code class="highlighter-rouge">/dev/ttyACM0</code> y <code class="highlighter-rouge">/dev/ttyACM1</code> para hacer referencia a mi primera impresora, la Artillery Genius Pro, y a la segunda impresora la Artillery SideWinder X2, pero el sistema operativo no siempre las tomará en ese orden, ya que dependerá de cuál encienda primero . Para poder identificar las impresoras sin importar el orden de conexión podemos crear un enlace simbólico usando <code class="highlighter-rouge">udev</code> con la información del fabricante y del producto.</p>
<p>Para esto primero hay que listar los dispositivos USB:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>root@octopi:~/octoprint# lsusb
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 003: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 015: ID 0483:5740 STMicroelectronics Virtual COM Port
Bus 001 Device 016: ID 0483:5740 STMicroelectronics Virtual COM Port
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
</code></pre></div></div>
<p>Acá hay dos dispositivos de <strong>STMicroelectronics Virtual COM Port</strong>, que corresponden a las dos impresoras, pero cuál es cuál? Vamos a pedir el detalle de estos dispositivos:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code> root@octopi:~/octoprint# lsusb -v -d 0483:5740
Bus 001 Device 015: ID 0483:5740 STMicroelectronics Virtual COM Port
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 2 Communications
bDeviceSubClass 2 Abstract (modem)
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0483 STMicroelectronics
idProduct 0x5740 Virtual COM Port
bcdDevice 0.00
iManufacturer 1 STMicroelectronics
iProduct 2 ARTILLERY_RUBY CDC in FS Mode
iSerial 3 386F39543538
...
Bus 001 Device 016: ID 0483:5740 STMicroelectronics Virtual COM Port
Device Descriptor:
bLength 18
bDescriptorType 1
bcdUSB 2.00
bDeviceClass 2 Communications
bDeviceSubClass 2 Abstract (modem)
bDeviceProtocol 0
bMaxPacketSize0 64
idVendor 0x0483 STMicroelectronics
idProduct 0x5740 Virtual COM Port
bcdDevice 0.00
iManufacturer 1 STMicroelectronics
iProduct 2 ARTILLERY_RUBY CDC in FS Mode
iSerial 3 3594398F3538
...
</code></pre></div></div>
<p>Lo que diferenica una impresora de la otra es el número serial del dispositivo. Como inicialmente la Artillery Genius Pro estaba mapeada en <code class="highlighter-rouge">/dev/ttyACM0</code>, podemos consultar cuál es su número de serial:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>root@octopi:~/octoprint# udevadm info -a -n /dev/ttyACM0 | grep serial
ATTRS{serial}=="3594398F3538"
ATTRS{serial}=="0000:01:00.0"
</code></pre></div></div>
<p>Ahora para la ver el código serial de la Artillery Sidewinder X2 se debe consultar por el dispositivo <code class="highlighter-rouge">/dev/ttyACM1</code>:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
root@octopi:~/octoprint# udevadm info -a -n /dev/ttyACM1 | grep serial
ATTRS{serial}=="386F39543538"
ATTRS{serial}=="0000:01:00.0"
</code></pre></div></div>
<p>Para que <code class="highlighter-rouge">udev</code> reconozca estas reglas debemos crear el siguiente archivo <code class="highlighter-rouge">/etc/udev/rules.d/40-printers.rules</code> , con este contenido:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code> # Genius Pro
KERNEL=="ttyACM[0-9]*", SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", ATTRS{serial}=="3594398F3538", SYMLINK="ttyGeniusPro"
# Sidewinder X2
KERNEL=="ttyACM[0-9]*", SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", ATTRS{serial}=="386F39543538", SYMLINK="ttySidewinderX2"
</code></pre></div></div>
<p>Luego se debe reiniciar <code class="highlighter-rouge">udev</code> para que tome estos cambios:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>root@octopi:~/octoprint# udevadm control --reload-rules && udevadm trigger
</code></pre></div></div>
<p>De esta manera quedarán las impresoras mapeadas de la siguiente forma:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>root@octopi:~/octoprint# ls -l /dev/tty{GeniusPro,Sidewinder}*
lrwxrwxrwx 1 root root 7 Aug 22 21:10 /dev/ttyGeniusPro -> ttyACM0
lrwxrwxrwx 1 root root 7 Aug 22 21:10 /dev/ttySidewinderX2 -> ttyACM1
</code></pre></div></div>
<p>Por lo que la configuración de Docker podemos modificarla para reflejar estos cambios:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>version: '2.4'
services:
geniuspro:
image: octoprint/octoprint
restart: unless-stopped
ports:
- 5000:5000
- 8080:8080
devices:
- /dev/ttyGeniusPro:/dev/ttyACM0
- /dev/video0:/dev/video0
volumes:
- /root/octoprint/geniuspro:/octoprint
# uncomment the lines below to ensure camera streaming is enabled when
# you add a video device
environment:
- ENABLE_MJPG_STREAMER=true
- CAMERA_DEV=/dev/video0
- MJPG_STREAMER_INPUT="-y -n -r 1280x960 -f 30
sidewinderx2:
image: octoprint/octoprint
restart: unless-stopped
ports:
- 5001:5000
- 8081:8080
devices:
- /dev/ttySidewinderX2:/dev/ttyACM0
- /dev/video2:/dev/video0
volumes:
- /root/octoprint/sidewinderx2:/octoprint
# uncomment the lines below to ensure camera streaming is enabled when
# you add a video device
environment:
- ENABLE_MJPG_STREAMER=true
- CAMERA_DEV=/dev/video0
- MJPG_STREAMER_INPUT="-y -n -r 1280x960 -f 30
</code></pre></div></div>
<h2 id="cámaras-de-video">Cámaras de video</h2>
<p>A diferencia de las impresoras las cuales tienen seriales distintos, tengo dos cámaras de video <strong>Logitech C270</strong> que son exaxtamente iguales. ¿Cómo hacemos para diferenciarlas? ¿Cómo podemos hacer que siempre tome la cámara correcta?</p>
<p>Nuevamente hacemos el análisis con <code class="highlighter-rouge">lsusb</code>:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>root@octopi:~/octoprint# lsusb
Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 004: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 003: ID 046d:0825 Logitech, Inc. Webcam C270
Bus 001 Device 015: ID 0483:5740 STMicroelectronics Virtual COM Port
Bus 001 Device 016: ID 0483:5740 STMicroelectronics Virtual COM Port
Bus 001 Device 002: ID 2109:3431 VIA Labs, Inc. Hub
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
</code></pre></div></div>
<p>Ambas cámaras están en el mismos bus pero identificadas como dispositivos USB diferentes, lo cual podemos aprovechar. En este caso no usaremos el id del producto para diferenciarlas sino el id de dispositivo USB. Tomaremos como referencia el subsystem <code class="highlighter-rouge">video4linux</code> en vez de <code class="highlighter-rouge">tty</code>, por lo que estaremos usando <code class="highlighter-rouge">KERNELS</code> en vez de <code class="highlighter-rouge">KERNEL</code> para diferenciar las cámaras. Por ejemplo, para saber en qué dispositivo USB está la cámara en <code class="highlighter-rouge">/dev/video0</code> podemos ejecutar lo siguiente:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>root@octopi:~/octoprint# udevadm info -a -p $(udevadm info -q path -n /dev/video0) | grep KERNELS
KERNELS=="1-1.4:1.0"
KERNELS=="1-1.4"
KERNELS=="1-1"
KERNELS=="usb1"
KERNELS=="0000:01:00.0"
KERNELS=="0000:00:00.0"
KERNELS=="pci0000:00"
KERNELS=="fd500000.pcie"
KERNELS=="scb"
KERNELS=="platform"
</code></pre></div></div>
<p>Para la otra cámara hacemos lo mismo:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>root@octopi:~/octoprint# udevadm info -a -p $(udevadm info -q path -n /dev/video2) | grep KERNELS
KERNELS=="1-1.3:1.0"
KERNELS=="1-1.3"
KERNELS=="1-1"
KERNELS=="usb1"
KERNELS=="0000:01:00.0"
KERNELS=="0000:00:00.0"
KERNELS=="pci0000:00"
KERNELS=="fd500000.pcie"
KERNELS=="scb"
KERNELS=="platform"
</code></pre></div></div>
<p>Ya con esta información podemos modificar las reglas de <code class="highlighter-rouge">udev</code> de la siguiente manera:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code># Genius Pro
KERNEL=="ttyACM[0-9]*", SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", ATTRS{serial}=="3594398F3538", SYMLINK="ttyGeniusPro"
SUBSYSTEM=="video4linux", KERNELS=="1-1.3", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="0825", SYMLINK="videoGeniusPro"
# Sidewinder X2
KERNEL=="ttyACM[0-9]*", SUBSYSTEM=="tty", ATTRS{idVendor}=="0483", ATTRS{idProduct}=="5740", ATTRS{serial}=="386F39543538", SYMLINK="ttySidewinderX2"
SUBSYSTEM=="video4linux", KERNELS=="1-1.4", ATTRS{idVendor}=="046d", ATTRS{idProduct}=="0825", SYMLINK="videoSidewinderX2"
</code></pre></div></div>
<p>Recuerden reiniciar las reglas de udev con:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>root@octopi:~/octoprint# udevadm control --reload-rules && udevadm trigger
</code></pre></div></div>
<p>De esta forma ahora tenemos las cámaras mapeadas como <code class="highlighter-rouge">/dev/videoGeniusPro</code>y <code class="highlighter-rouge">/dev/videoSidewinderX2</code> respectivamente. Ahora podemos modificar el archivo <strong>docker-compose.yml</strong> para que tome esta nueva configuración:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>version: '2.4'
services:
geniuspro:
image: octoprint/octoprint
restart: unless-stopped
ports:
- 5000:5000
- 8080:8080
devices:
- /dev/ttyGeniusPro:/dev/ttyACM0 # use `python -m serial.tools.miniterm` to see what the name is of the printer, this requires pyserial
- /dev/videoGeniusPro:/dev/video0
volumes:
- /root/octoprint/geniuspro:/octoprint
# uncomment the lines below to ensure camera streaming is enabled when
# you add a video device
environment:
- ENABLE_MJPG_STREAMER=true
- CAMERA_DEV=/dev/video0
- MJPG_STREAMER_INPUT="-y -n -r 1280x960 -f 30
sidewinderx2:
image: octoprint/octoprint
restart: unless-stopped
ports:
- 5001:5000
- 8081:8080
devices:
- /dev/ttySidewinderX2:/dev/ttyACM0 # use `python -m serial.tools.miniterm` to see what the name is of the printer, this requires pyserial
- /dev/videoSidewinderX2:/dev/video0
volumes:
- /root/octoprint/sidewinderx2:/octoprint
# uncomment the lines below to ensure camera streaming is enabled when
# you add a video device
environment:
- ENABLE_MJPG_STREAMER=true
- CAMERA_DEV=/dev/video0
- MJPG_STREAMER_INPUT="-y -n -r 1280x960 -f 30
</code></pre></div></div>
<h2 id="desempeño-con-dos-instancias-de-octoprint">Desempeño con dos instancias de OctoPrint</h2>
<p>Seguramente te estarás preguntando sobre el consumo de estos contenedores en el sistema operativo y si las Raspberry puede manejarlo. Aquí te dejo una imagen de <code class="highlighter-rouge">htop</code> con los dos contenedores arriba imprimiendo en cada una de las impresoras a la vez.</p>
<p><img src="/assets/images/octoprint-htop.jpg" alt="htop" /></p>
<p>Como pordás notar la Raspberry está holgada, ya que de los 8GB de RAM apenas está consumiendo 0.5 GB incluyendo el sistema operativo. De esto podemos sacar dos conclusiones: la primera es que se pueden agregar más impresoras sin problemas, el único límite es la cantidad de puertos USB que ofrece las Raspberry (4 en mi modelo), pero podrías agregar un hub USB para agregar puertos; y lo segundo es que para dos impresoras se podría usar una Raspberry con menos RAM, por ejemplo de 2 GB o 4 GB, y así economizar un poco.</p>
<h2 id="cómo-luce-las-impresoras-y-la-raspberry-pi">¿Cómo luce las impresoras y la Raspberry Pi?</h2>
<p>Para cerrar este artículo les dejo una foto de mis impresoras conectadas a la RaspBerry Pi:</p>
<p><img src="/assets/images/3dprinters.jpg" alt="3D printers" /></p>
<p>En la impresora más chica puede verse una caja pequeña gris que es la Raspberry Pi, junto a las dos cámaras web.</p>
<h1 id="referencias">Referencias</h1>
<ul>
<li><a href="https://octoprint.org" target="_blank">OctoPrint</a></li>
<li><a href="https://github.com/guysoft/OctoPi" target="_blank">OctoPi</a></li>
<li><a href="http://thomas-messmer.com/index.php/14-free-knowledge/howtos/79-setting-up-octoprint-for-multiple-printers" target="_blank">Setting up OctoPrint on a Raspberry Pi for multiple printers</a></li>
<li><a href="https://youtu.be/LcA9o6OGfEg" target="_blank">Installing OctoPrint using Docker in Linux (video tutorial)</a></li>
<li><a href="https://docs.google.com/document/d/1aU7LGYAe6r45LqEBQ8opuXCiNKeJl3XrPTrobvEvdOM/edit" target="_blank">Installing OctoPrint using Docker in Linux (instructions)</a></li>
<li><a href="https://community.octoprint.org/t/usb-webcams-known-to-work-with-mjpg-streamer/21149" target="_blank">USB webcams known to work with mjpg-streamer</a>.</li>
<li><a href="https://askubuntu.com/questions/49910/how-to-distinguish-between-identical-usb-to-serial-adapters" target="_blank">How to distinguish between identical USB-to-serial adapters?</a></li>
<li><a href="https://unix.stackexchange.com/questions/424887/udev-rule-to-discern-2-identical-webcams-on-linux" target="_blank">Udev Rule to discern 2 identical webcams on Linux</a></li>
</ul>Luis GallardoUna de las herramientas más útiles a la hora de gestionar una impresora 3D es OctoPrint, ya que entre varias cosas permite administrar tu impresora desde una interfaz web, así como agregar un montón de funcionalidades (por ejemplo, monitoreo y gestión de la impresora a través de Telegram, plugins para generar los videos timelapse de las impresiones, o incluso detectar cuando hay problemas tipo espagueti en nuestra impresiones usando otro plugin con AI).PaperLike Pencil Grips2022-04-16T19:00:00-05:002022-04-16T19:00:00-05:00https://lgallardo.com/es/2022/04/17/paperlike-pencil-grips<p><img src="/assets/images/PaperLike-Pencil-Grip.jpg" alt="PaperLike Pencil Grips" style="display:block; margin-left:auto; margin-right:auto" /><br />
Vengo usando ya desde hace un tiempo mi iPad para tomar notas con el Apple Pencil y decidí escribir este artículo para comentarles sobre un producto que me ha sorprendido gratamente y que pienso que es una excelente mejora a considerar: <strong>Paper Like Pencil Grips</strong>.</p>
<p>Puede que te haya pasado que al usar por mucho tiempo el Apple Pencil se te cansa la mano? Esto es algo común incluso con lápices tradicionales, y para esto ya existía una solución, los clásicos agarradores que se adaptan al lápiz para mejorar la postura de los dedos al escribir. Esto fue lo que terminó diseñando el equipo de PaperLike, pero para el Apple Pencil.</p>
<p>Seguramente dirás que son unos simple agarradores y que puedes usar unos agarradores tradicionales y adaptarlos al Apple Pencil…Si, por poco dinero puedes colocarle un agarrador genérico pero hay algunas cosas que debes considerar, que ya resolvió el equipo de PaperLike y que no tendrás con un producto genérico:</p>
<h2 id="la-carga-magnética-del-apple-pencil">La carga magnética del Apple Pencil</h2>
<p><img src="/assets/images/Grip-on-iPad.jpg" alt="Blink config" style="display:block; margin-left:auto; margin-right:auto" /></p>
<p>Esto lo consiguen gracias a que sus agarradores están diseñadas especialmente para el Apple Pencil, ya que tienen la forma del lápiz, y el lado que se usa para la carga magnética es ligeramente más delgado.</p>
<h2 id="la-postura-de-los-dedos">La postura de los dedos.</h2>
<p>La gente de PaperLike tomaron en cuenta dos casos de borde: precisión y periodos prolongados de uso. Si, vienen dos agarradores de lápiz distintos: El primero está orientado a tener una máxima precisión al agarrar el lápiz para, por ejemplo, cuando necesitas detalles finos a la hora de dibujar. El segundo está pensado para ayudar a quienes toman notas por mucho tiempo, ideal para estudiantes universitarios.</p>
<p>En mi caso particular disfruto mucho el agarrador de uso extendido (aunque hace tiempo que dejé los estudios universitarios atrás), pero estoy seguro que a los estudiantes les será de mucha utilidad, así como a los artistas (profesionales o no) les será de mucha utilidad poder tener trazos más precedidos a la hora de hacer sus creaciones.</p>
<h2 id="función-de-doble-tap">Función de doble tap</h2>
<p>El Apple Pencil tiene una segunda función que se activa haciendo un doble toque sobre la parte plana del lápiz. Con un agarrador genérico no hay forma que el doble tap funcione. En el caso de los agarradores de lápiz PaperLike, esto lo consiguen con la parte más delgada del agarrador. Pero debo comentar que para usarlo hay que girar el lápiz para poder hacer el double tap. Esto lo uso mucho en <strong>GoodNotes 5</strong>, y no es tan natural. De hecho el fundador del PaperLike en el video de explicación comenta que una opción es usar el agarrador con esa parte hacia arriba, pero considero que pierde la gracia ya que la forma del agarrador está diseñada para los dedos índices y el pulgar. Me parede que mejor opción es acostunbrarse a girar el lapiz antes de hacer el double tap, y volverlo a girar para contunuar escribiendo.</p>
<h1 id="el-empaque">El empaque</h1>
<p>Por último, me gustaría resaltar algo grato que es el empaque en el que vino. Como los agarradores las compré en una etapa temprana, los mismos vinieron en un sobre de papel, que de hecho aclaran que no es el empaque final del producto.</p>
<p><img src="/assets/images/PaperLike-Pencil-Grips-Envelop.jpg" alt="Envoltorio de los PaperLike Pencil Grips" style="display:block; margin-left:auto; margin-right:auto" /></p>
<p>En particular no me molesta para nada y de hecho hasta diría que debería ser la version final, una presentación sencilla y bastante amigable con el medio ambiente. Lo único que mejoraría es el material del sobre sea un poco más duro para que resista los embates del viaje, o en su defecto que las envíen en correspondencia “frágil”, ya que el envío no fue nada económico (€ 39.99). En mi caso los míos llegaron en ese sobre un poco arrugado, y el contenido también se arrugó.</p>
<p>Otros detalles que me gustaron fueron la nota de agradecimiento que colocan en el empaqué, escrita a mano por el fundador de PaperLike (y luego impresa de manera industrial), así como un sticker muy bonito que agregan de la comunidad de artistas que usan sus productos.</p>
<p><img src="/assets/images/PaperLike-Pencil-Grips-thanks.jpg" alt="Agradecimientos de PaperLike Pencil Grips" style="display:block; margin-left:auto; margin-right:auto" /></p>
<p><img src="/assets/images/PaperLike-Pencil-Grips-Sticker.jpg" alt="Stricker de regalo PaperLike Pencil Grips" style="display:block; margin-left:auto; margin-right:auto" /></p>
<h1 id="dónde-comprar-las-agarraderas-de-paperlike">¿Dónde comprar las agarraderas de PaperLike?</h1>
<p>Como les comenté, están en una etapa temprana,por lo que de momento el único sitio donde los encontrarás es en la tienda de PaperLike, en <a href="https://paperlike.com/collections/ipad-accessories" target="_blank">los accesorios para iPad</a> , en particular acá están publicados los <a href="https://paperlike.com/collections/ipad-accessories/products/pencil-grip-set" target="_blank">PaperLike Pencil Grips </a></p>
<h1 id="conclusión">Conclusión</h1>
<p>Si necesitas un agarrador para tu Apple Pencil, ten en cuenta esta opción que ofrece la gente de PaperLike, que sin duda mejorará notablemente tu experiencia de uso en tu iPad.</p>
<h2 id="nota">Nota</h2>
<p>Este artículo lo hice para compartir mi experiencia con los agarradores de lápiz de PaperLike, y no recibí ningún patrocinio ni tengo ninguna ganancia o participación en las ventas de los mismas.</p>
<p>ß# Referencias</p>
<ul>
<li><a href="https://paperlike.com" target="_blank">Página de PaperLike</a></li>
<li><a href="https://paperlike.com/collections/ipad-accessories" target="_blank">Accesorios para iPad</a></li>
<li><a href="https://paperlike.com/collections/ipad-accessories/products/pencil-grip-set" target="_blank">Agarradores de lápiz de PaperLike</a></li>
</ul>Luis GallardoVengo usando ya desde hace un tiempo mi iPad para tomar notas con el Apple Pencil y decidí escribir este artículo para comentarles sobre un producto que me ha sorprendido gratamente y que pienso que es una excelente mejora a considerar: Paper Like Pencil Grips.iPad Pro como estación de trabajo portátil2022-01-24T23:00:07-06:002022-01-24T23:00:07-06:00https://lgallardo.com/es/2022/01/25/ipad-pro-as-a-portable-workstation<p><img src="/assets/images/ipad-pro-2021.jpg" alt="iPad Pro" style="display:block; margin-left:auto; margin-right:auto" /><br />
Hace un tiempo que no escribía en el blog, primero porque no encontraba algo interesante para compartir y segundo porque no había mucho tiempo de sobra (no es que ahora haya mucho tiempo de sobra pero bueno, se busca siempre un espacio para escribir unas líneas).</p>
<p>Lo cierto es que hace poco me hice con un iPad Pro de 11” y dentro de las cosas que estuve probando fue la posibilidad de usarlo como equipo de trabajo ligero, es decir, un equipo que pueda tener a la mano en mi mesa de noche sin que sea una computadora completa.</p>
<p>Si bien el iPad tiene muchas ventajas y cosas que me gustaron, el termino “Pro” no da como para tener una terminal completa de un sistema operativo o tener una <a href="https://youtu.be/LrLDKYFyLMM" target="_blank">máquina virtual funcional</a>, por lo que decidí investigar a ver si existía alguna opción y de las cosas que más tuvieron sentido para mí fue la de usar el iPad Pro como un cliente que se conecta a alguna otra parte donde si pueda tener acceso a un sistema operativo completo.</p>
<p>De hecho en un <a href="https://arslan.io/2019/01/07/using-the-ipad-pro-as-my-development-machine/" target="_blank">artículo</a> que conseguí sugerían la opción de usar un Digital Ocean Droplet para tener una máquina virtual en la nube y desde ahí poder trabajar. Esta opción no es mala, pero teniendo una estación de trabajo en casa no vi la necesidad de irme a la nube.</p>
<p>Siguiendo algunas de estas sugerencias terminé instalando <strong>Blink Shell</strong> que viene con soporte para <code class="highlighter-rouge">mosh</code>, y usando <code class="highlighter-rouge">tmux</code> en mi laptop con Linux como sitio remoto pude hacerlo. A continuación les comento el detalle de esta configuración.</p>
<h1 id="blink-shell-ssh--mosh">Blink Shell (ssh / mosh)</h1>
<p>Lo primero que tuve que buscar fue un cliente <code class="highlighter-rouge">ssh</code> decente para iPad. Dentro de las recomendaciones recurrentes en Internet <strong><a href="https://blink.sh" target="_blank">Blink Shell</a></strong> aparecía como una opción. En principio el hecho de que haya que comprarlo sin un trial no gustaba pero como insistían en que era la mejor opción decidí probarlo (USD 19,99 a la fecha de publicación de este post).</p>
<p>Tengo que decir que <strong>Blink Shell</strong> es muy pero muy bueno, está diseñado para dispositivos móviles y tiene soporte para <code class="highlighter-rouge">mosh</code>.</p>
<h2 id="mosh">Mosh</h2>
<p>Te estarás preguntando como en su momento lo hice yo ¿Qué es <code class="highlighter-rouge">mosh</code>? La <a href="https://mosh.org" target="_blank">página de mosh</a> dice lo siguiente:</p>
<blockquote>
<p>Aplicación de terminal remoto que permite la itinerancia, admite conectividad intermitente y proporciona eco local inteligente y edición de línea de las pulsaciones de teclado del usuario.</p>
</blockquote>
<p>¿Sigues sin entender para qué sirve <code class="highlighter-rouge">mosh</code> como me pasaba a mí? Es como <code class="highlighter-rouge">screen</code> pero sin tener que aprender comandos para crear y manejar sesiones, además por debajo utliza <code class="highlighter-rouge">ssh</code>. En otras palabras, vas a tener la posibilidad de continuar con tu sesión de trabajo donde la dejaste, o si por ejemplo se te cortó la conexión y logras conectarte de nuevo con otra red.</p>
<p>Como por debajo se seguimos teniendo <code class="highlighter-rouge">ssh</code>, para usar <code class="highlighter-rouge">mosh</code> la sintaxis es prácticamente la misma. Es decir, si antes te conectabas con <code class="highlighter-rouge">ssh</code> a un servidor de esta manera:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ssh lgallard@192.168.1.65
</code></pre></div></div>
<p>Ahora con <code class="highlighter-rouge">mosh</code> lo haces de esta forma:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mosh lgallard@192.168.1.65
</code></pre></div></div>
<p>Parece sencillo el cambio y con esto ganamos que al cerrar nuestro iPad o el equipo donde estanos usando el cliente <code class="highlighter-rouge">mosh</code> vamos a poder recuperar mágicamente la sesión de trabajo al volvernos a conectar.</p>
<p>Puedes configurar las opciones de <strong>Blink Shell</strong> accediendo a un asistente de configuración para tener distintos hosts y facilitar la conexión con un nombre en vez de una dirección IP. Para acceder a este asistente basta con escribir <code class="highlighter-rouge">config</code> desde el terminal:</p>
<p><img src="/assets/images/Blink_config.png" alt="Blink config" style="display:block; margin-left:auto; margin-right:auto" /></p>
<p>En mi caso ahora me puedo conectar a mi estación de trabajo de la siguiente forma:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mosh dauntless
</code></pre></div></div>
<h2 id="mosh-lo-malo">Mosh, lo malo</h2>
<p>El gran punto en contra de <code class="highlighter-rouge">mosh</code> es que no puedes hacer scroll del terminal, es decir, si necesitas consultar la salida de comandos que hayas ejecutado previamente y que ya no estén en la pantalla, no los vas a poder ver. Esto para mí era un gran problema porque al usar <code class="highlighter-rouge">terraform</code> perdía los planes con los cambios a ser aplicados.</p>
<p>Esta es la forma en que trabaja <code class="highlighter-rouge">mosh</code>, para tener un óptimo rendimiento hacen un rendering del texto. Hay un <a href="https://github.com/mobile-shell/mosh/issues/122" target="_blank">issue abierto</a> de varios años donde los desarrolladores comentan que está a modo de referencia pero que no tienen ninguna intención de implementarlo. ¿Entonces no hay solución? Si, <code class="highlighter-rouge">tmux</code>.</p>
<h1 id="qué-es-tmux">¿Qué es tmux?</h1>
<p><code class="highlighter-rouge">tmux</code> es una herramienta que permite tener varias terminales abiertas (o ventanas) para que sean accedidas y controladas desde un solo terminal como haríamos con <code class="highlighter-rouge">screen</code>.</p>
<p>Debes instalar <code class="highlighter-rouge">tmux</code> en el equipo donde deseamos iniciar sesión y una vez instalado basta con ejecutar esto desde el cliente <code class="highlighter-rouge">mosh</code> (el iPad Pro en mi caso):</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>mosh danuntless -- tmux new -s terminal-1
</code></pre></div></div>
<p>De esta forma creamos una sessión nueva cuyo nombre es <strong>terminal-1</strong>. Luego para acceder a esta sesión posteriormente debemos ejecutar lo siguiente:</p>
<p><code class="highlighter-rouge">mosh danuntless -- tmux a -t terminal-1</code></p>
<h2 id="activar-scrolling--en-tmux">Activar scrolling en tmux</h2>
<p>En la estación de trabajo remota se debe configurar <code class="highlighter-rouge">mosh</code> para tener el scrroling con <code class="highlighter-rouge">tmux</code>, esto se consigue editando el archivo <code class="highlighter-rouge">~/.tmux.conf</code> con este contenido:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>new-session
set -g history-limit 30000
set -g mouse on
</code></pre></div></div>
<h2 id="blink--ssh---mosh--tmux--eh">Blink + ssh + mosh + tmux … eh?</h2>
<p>“Espera un momento… <strong>Blink + ssh + mosh + tmux</strong>, no es medio complicado todo? No es mejor usar <code class="highlighter-rouge">ssh</code> con <code class="highlighter-rouge">screen</code>? “. Sí, es una alternativa pero con <code class="highlighter-rouge">ssh</code> no te reconectarás automáticamente y tendrás que loguearte nuevamente si por ejemplo cierras el iPad, si tu dirección IP cambia por algún motivo (por ejemplo cambias de WiFI a línea telefónica) o si la sesión <code class="highlighter-rouge">ssh</code> expira.</p>
<p>Reconozco que hay una curva de aprendizaje con <code class="highlighter-rouge">tmux</code> pero una vez superada te va a encantar y te preguntarás por qué no usaste antes <code class="highlighter-rouge">mosh</code> y <code class="highlighter-rouge">tmux</code></p>
<h2 id="más-sobre-tmux">Más sobre tmux</h2>
<p>Si quieres aprender a usar <code class="highlighter-rouge">tmux</code> te dejo una <a href="https://tmuxcheatsheet.com" target="_blank">cheat sheet</a> con los comandos que puedes usar. En particular encontré muy útil la división en paneles y el uso del zoom entre ellos, pero debo admitir que copiar texto entre paneles es algo complicado en el iPad y a veces prefiero usar <code class="highlighter-rouge">vim</code> para esto, pero seguro ya le encontraré la vuelta.</p>
<h1 id="palabras-finales">Palabras finales</h1>
<p>Si bien acá comento la experiencia con el iPad Pro, todo esto se puede replicar en un iPad Air e incluso usar <code class="highlighter-rouge">mosh</code> y <code class="highlighter-rouge">tmux</code> desde otras estaciones de trabajo con Linux o Windows.</p>
<h1 id="referencias">Referencias</h1>
<ul>
<li><a href="https://youtu.be/LrLDKYFyLMM" target="_blank">Run ANY OS on iPad or iPhone! - YouTube</a></li>
<li><a href="https://arslan.io/2019/01/07/using-the-ipad-pro-as-my-development-machine/" target="_blank">Using the iPad Pro as my development machine</a></li>
<li><a href="https://blink.sh" target="_blank">Blink Shell</a></li>
<li><a href="https://blink.sh" target="_blank">Mosh</a></li>
<li><a href="https://tmuxcheatsheet.com">Tmux cheat sheet</a></li>
<li><a href="https://github.com/mobile-shell/mosh/issues/122" target="_blank">mosh prevents the use of scrollback</a></li>
</ul>Luis GallardoHace un tiempo que no escribía en el blog, primero porque no encontraba algo interesante para compartir y segundo porque no había mucho tiempo de sobra (no es que ahora haya mucho tiempo de sobra pero bueno, se busca siempre un espacio para escribir unas líneas).Repositorio local de Helm 32021-06-14T19:00:00-05:002021-06-14T19:00:00-05:00https://lgallardo.com/es/2021/06/15/helm3-local-repo<p><img src="/assets/images/helm.jpg" alt="Repositorio local para Helm 3" style="display:block; margin-left:auto; margin-right:auto" />
En Helm 3, el soporte del comando <strong>helm serve</strong> se eliminó debido a algunos problemas de diseño, por lo tanto, si necesita una herramienta similar debes instalar el complemento <strong>helm servecm</strong>, que usa <strong>ChartMuseum</strong> para publicar los charts en tu medio de almacenamiento local (también se admiten otros medios de almacenamientos, como los buckets de S3).</p>
<p>En esta artículo aprenderá cómo instalar y publicar un repositorio local en Helm 3.</p>
<ol>
<li>Instala <strong>ChartMuseum</strong><br />
En primer lugar, debes instalar <strong>ChartMuseum</strong>. En la página del proyecto encontrará diferentes formas de instalarlo, pero yo lo instalo como una aplicación Go de la siguiente manera:
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">GO111MODULE</span><span class="o">=</span><span class="s2">"on"</span> go get github.com/helm/chartmuseum@v0.13.1
</code></pre></div> </div>
</li>
<li>
<p>Instala <strong>helm servecm plugin</strong><br /></p>
<p><br />Entonces necesitas instalar <strong>servecm</strong> como un complemento de helm:<br /><br /></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>helm plugin install https://github.com/jdolitsky/helm-servecm
</code></pre></div> </div>
</li>
<li>
<p>Instala <strong>helm push plugin</strong><br />
Para alojar tus charts, usarás <strong>ChartMuseum</strong> y <strong>helm servecm</strong> pluing, pero aún tendrás que publicarlos en <strong>ChartMuseum</strong>. Puedes hacerlo manualmente o usar otro complemento llamado <strong>helm push</strong> que lo hace por ti:<br /><br /></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>helm plugin install https://github.com/chartmuseum/helm-push.git
</code></pre></div> </div>
</li>
<li>
<p>Agrega el repo local repo en helm:<br /><br /></p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>helm repo add local http://127.0.0.1:8879/charts
</code></pre></div> </div>
</li>
<li>
<p>Corre <strong>helm servecm plugin</strong>:</p>
<p><br />El siguiente paso es correr el plugin <strong>helm servecm</strong>:<br /><br /></p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>helm servecm <span class="nt">--port</span><span class="o">=</span>8879 <span class="nt">--storage</span> <span class="nb">local</span> <span class="nt">--storage-local-rootdir</span> ./local <span class="nt">--context-path</span><span class="o">=</span>/charts
</code></pre></div> </div>
<p>Ahora puedes publicar tus charts en http://127.0.0.1:8879/charts</p>
</li>
<li>
<p>Publica tu chart en tu repositorio local:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>helm push your-chart <span class="nb">local</span>
</code></pre></div> </div>
</li>
</ol>
<p>En este punto ya podrás utilizar tus charts locales en tu clúster ejecutando:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>helm install your-chart
</code></pre></div></div>
<h2 id="referencias">Referencias</h2>
<ul>
<li><a href="https://helm.sh/docs/faq/#removal-of-helm-serve" target="_blank">Removal of helm serve</a></li>
<li><a href="https://github.com/jdolitsky/helm-servecm" target="_blank">helm servecm plugin</a></li>
<li><a href="https://github.com/helm/chartmuseum" target="_blank">ChartMuseum</a></li>
<li><a href="https://github.com/chartmuseum/helm-push" target="_blank">helm push plugin</a></li>
</ul>Luis GallardoEn Helm 3, el soporte del comando helm serve se eliminó debido a algunos problemas de diseño, por lo tanto, si necesita una herramienta similar debes instalar el complemento helm servecm, que usa ChartMuseum para publicar los charts en tu medio de almacenamiento local (también se admiten otros medios de almacenamientos, como los buckets de S3).Módulo de Terraform para AWS ECR2021-04-14T19:00:00-05:002021-04-14T19:00:00-05:00https://lgallardo.com/es/2021/04/15/terraform-module-for-aws-ecr<center><img src="/images/terraform-aws-ecr.jpg" alt="Terraform" /></center>
<p><br />
Les comparto acá otro módulo de Terraform que publiqué como código Open Source, el cual permite crear registries en AWS ECR.</p>
<p>Puedes ver el módulo <strong>terraform-aws-ecr</strong> en el <a href="https://registry.terraform.io/modules/lgallard/ecr/aws" target="_blank">Terraform Registry</a> o clonarlo desde <a href="https://github.com/lgallard/terraform-aws-ecr.git" target="_blank">Github</a>.</p>
<p>Si quieres echar un vistazo al módulo, también dejé el archivo README en esta publicación:</p>
<p><img src="https://lgallardo.com/images/terraform.jpg" alt="Terraform" target="_blank" /></p>
<h1 id="terraform-aws-ecr">terraform-aws-ecr</h1>
<p>Terraform module to create <a href="https://aws.amazon.com/ecr/" target="_blank">AWS ECR</a> (Elastic Container Registry) which is a fully-managed Docker container registry.</p>
<h2 id="usage">Usage</h2>
<p>You can use this module to create an ECR registry using few parameters (simple example) or define in detail every aspect of the registry (complete example).</p>
<p>Check the <a href="https://github.com/lgallard/terraform-aws-ecr/tree/master/examples" target="_blank">examples</a> for the <strong>simple</strong> and the <strong>complete</strong> snippets.</p>
<h3 id="simple-example">Simple example</h3>
<p>This example creates an ECR registry using few parameters</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>module "ecr" {
source = "lgallard/ecr/aws"
name = "ecr-repo-dev"
# Tags
tags = {
Owner = "DevOps team"
Environment = "dev"
Terraform = true
}
}
</code></pre></div></div>
<h3 id="complete-example">Complete example</h3>
<p>In this example the register is defined in detailed.</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>module "ecr" {
source = "lgallard/ecr/aws"
name = "ecr-repo-dev"
scan_on_push = true
timeouts_delete = "60m"
image_tag_mutability = "MUTABLE"
# Note that currently only one policy may be applied to a repository.
policy = <<EOF
{
"Version": "2008-10-17",
"Statement": [
{
"Sid": "repo policy",
"Effect": "Allow",
"Principal": "*",
"Action": [
"ecr:GetDownloadUrlForLayer",
"ecr:BatchGetImage",
"ecr:BatchCheckLayerAvailability",
"ecr:PutImage",
"ecr:InitiateLayerUpload",
"ecr:UploadLayerPart",
"ecr:CompleteLayerUpload",
"ecr:DescribeRepositories",
"ecr:GetRepositoryPolicy",
"ecr:ListImages",
"ecr:DeleteRepository",
"ecr:BatchDeleteImage",
"ecr:SetRepositoryPolicy",
"ecr:DeleteRepositoryPolicy"
]
}
]
}
EOF
# Only one lifecycle policy can be used per repository.
# To apply multiple rules, combined them in one policy JSON.
lifecycle_policy = <<EOF
{
"rules": [
{
"rulePriority": 1,
"description": "Expire untagged images older than 14 days",
"selection": {
"tagStatus": "untagged",
"countType": "sinceImagePushed",
"countUnit": "days",
"countNumber": 14
},
"action": {
"type": "expire"
}
},
{
"rulePriority": 2,
"description": "Keep last 30 dev images",
"selection": {
"tagStatus": "tagged",
"tagPrefixList": ["dev"],
"countType": "imageCountMoreThan",
"countNumber": 30
},
"action": {
"type": "expire"
}
}
]
}
EOF
# Tags
tags = {
Owner = "DevOps team"
Environment = "dev"
Terraform = true
}
}
</code></pre></div></div>
<h2 id="providers">Providers</h2>
<table>
<thead>
<tr>
<th>Name</th>
<th>Version</th>
</tr>
</thead>
<tbody>
<tr>
<td>aws</td>
<td>n/a</td>
</tr>
</tbody>
</table>
<h2 id="inputs">Inputs</h2>
<table>
<thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>Type</th>
<th>Default</th>
<th style="text-align: center">Required</th>
</tr>
</thead>
<tbody>
<tr>
<td>encryption_type</td>
<td>The encryption type to use for the repository. Valid values are <code class="highlighter-rouge">AES256</code> or <code class="highlighter-rouge">KMS</code></td>
<td><code class="highlighter-rouge">string</code></td>
<td><code class="highlighter-rouge">"AES256"</code></td>
<td style="text-align: center">no</td>
</tr>
<tr>
<td>image_scanning_configuration</td>
<td>Configuration block that defines image scanning configuration for the repository. By default, image scanning must be manually triggered. See the ECR User Guide for more information about image scanning.</td>
<td><code class="highlighter-rouge">map</code></td>
<td><code class="highlighter-rouge">{}</code></td>
<td style="text-align: center">no</td>
</tr>
<tr>
<td>image_tag_mutability</td>
<td>The tag mutability setting for the repository. Must be one of: <code class="highlighter-rouge">MUTABLE</code> or <code class="highlighter-rouge">IMMUTABLE</code>.</td>
<td><code class="highlighter-rouge">string</code></td>
<td><code class="highlighter-rouge">"MUTABLE"</code></td>
<td style="text-align: center">no</td>
</tr>
<tr>
<td>kms_key</td>
<td>The ARN of the KMS key to use when encryption_type is <code class="highlighter-rouge">KMS</code>. If not specified when encryption_type is <code class="highlighter-rouge">KMS</code>, uses a new KMS key. Otherwise, uses the default AWS managed key for ECR.</td>
<td><code class="highlighter-rouge">string</code></td>
<td>n/a</td>
<td style="text-align: center">no</td>
</tr>
<tr>
<td>lifecycle_policy</td>
<td>Manages the ECR repository lifecycle policy</td>
<td><code class="highlighter-rouge">string</code></td>
<td>n/a</td>
<td style="text-align: center">yes</td>
</tr>
<tr>
<td>name</td>
<td>Name of the repository.</td>
<td><code class="highlighter-rouge">string</code></td>
<td>n/a</td>
<td style="text-align: center">yes</td>
</tr>
<tr>
<td>policy</td>
<td>Manages the ECR repository policy</td>
<td><code class="highlighter-rouge">string</code></td>
<td>n/a</td>
<td style="text-align: center">yes</td>
</tr>
<tr>
<td>scan_on_push</td>
<td>Indicates whether images are scanned after being pushed to the repository (true) or not scanned (false).</td>
<td><code class="highlighter-rouge">bool</code></td>
<td><code class="highlighter-rouge">true</code></td>
<td style="text-align: center">no</td>
</tr>
<tr>
<td>tags</td>
<td>A mapping of tags to assign to the resource.</td>
<td><code class="highlighter-rouge">map(string)</code></td>
<td><code class="highlighter-rouge">{}</code></td>
<td style="text-align: center">no</td>
</tr>
<tr>
<td>timeouts</td>
<td>Timeouts map.</td>
<td><code class="highlighter-rouge">map</code></td>
<td><code class="highlighter-rouge">{}</code></td>
<td style="text-align: center">no</td>
</tr>
<tr>
<td>timeouts_delete</td>
<td>How long to wait for a repository to be deleted.</td>
<td><code class="highlighter-rouge">string</code></td>
<td>n/a</td>
<td style="text-align: center">no</td>
</tr>
</tbody>
</table>
<h2 id="outputs">Outputs</h2>
<table>
<thead>
<tr>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>arn</td>
<td>Full ARN of the repository</td>
</tr>
<tr>
<td>name</td>
<td>The name of the repository.</td>
</tr>
<tr>
<td>registry_id</td>
<td>The registry ID where the repository was created.</td>
</tr>
<tr>
<td>repository_url</td>
<td>The URL of the repository (in the form <code class="highlighter-rouge">aws_account_id.dkr.ecr.region.amazonaws.com/repositoryName</code>)</td>
</tr>
</tbody>
</table>
<h2 id="references">References</h2>
<ul>
<li><a href="https://github.com/lgallard/terraform-aws-ecr.git" target="_blank">terraform-aws-ecr module at Github</a></li>
<li><a href="https://registry.terraform.io/modules/lgallard/ecr/aws" target="_blank">terraform-aws-ecr module at Terraform Registry</a></li>
</ul>Luis GallardoLes comparto acá otro módulo de Terraform que publiqué como código Open Source, el cual permite crear registries en AWS ECR.Ratón Logitech MX Anywhere 2s Flounder on Linux2020-08-05T19:00:00-05:002020-08-05T19:00:00-05:00https://lgallardo.com/es/2020/08/06/logitech-mx-anywhere-2s-flounder-on-linux<center><img src="/images/logitech-mouse.jpg" alt="Logitech Mx Anywhere 2s Flounder on Linux" width="340" height="340" /></center>
<p><br />
Me compré un ratón Logitech Mx Anywhere 2s Flounder para poder liberar un puerto USB, y tener la posibilidad de configurar más bototones adicionales al del ratón que tenía.</p>
<p>El ratón al conectarlo funciona a la primera sin necesidad de hacer ninguna magia. Los dos botones del lado derecho del ratón se configuan para Adelante y Atrás (Forward y Back) en el navegador y cualquier aplicación en general.</p>
<p>Para Windows y para Mac viene con un software del fabricante que permite personalizar estos botones (con soporte para gestos también), pero para Linux no tienen disponible el software.</p>
<p>Si quieres mapear estos botones en Linux debes utilizar algo como <code class="highlighter-rouge">xbindkeys</code> o <code class="highlighter-rouge">xmodmap</code>. A continuación explico lo que tuve que hacer para ponerlo a andar como quería.</p>
<h2 id="1-instalación-del-software-necesario">1. Instalación del software necesario</h2>
<p>Necesitará <code class="highlighter-rouge">xbindkeys</code> para asignar las teclas y <code class="highlighter-rouge">xdotool</code> para ejecutar acciones de teclado.</p>
<p><code class="highlighter-rouge">apt install xbindkeys xdotool</code></p>
<h2 id="2-detectando-los-botones">2. Detectando los botones</h2>
<p>Puede averiguar qué teclas están asociadas a su mouse usando <strong>xev</strong>:</p>
<p><code class="highlighter-rouge">xev | grep button</code></p>
<p>Esto abrirá una ventana chica en blanco que es donde deberas colocar el puntero del ratón y presionar os botones para obtener los valores asociados a cada key:</p>
<center><img src="/images/xev.jpg" alt="xev" width="340" height="340" /></center>
<p><br /></p>
<p>Yo probé todos los botones y sus valores correspondientes se muestran en la primera imagen de este artículo mas arriba. En total son 9 posibles botones / valores.</p>
<h2 id="3-mapeo-de-botones">3. Mapeo de botones</h2>
<p>Debes crear un archivo para <strong>xbindkeys</strong> con los valores por omisión, el cual es un archivo con algunos ejemplos comentados:</p>
<p><code class="highlighter-rouge">xbindkeys --defaults > ~/.xbindkeysrc</code></p>
<p>Y agregar luego el mapeo que desees. En mi caso agregué en el <code class="highlighter-rouge">~/.xbindkeysrc</code> lo sigueiente:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>"guake"
b:9
"xdotool key Super_L"
b:8
</code></pre></div></div>
<p>Por último debes ejecutar la orden <code class="highlighter-rouge">xbindkeys</code>.</p>
<p><code class="highlighter-rouge">$ xbindkeys</code></p>
<p>Ahora al oprimir en el botón 9 (Adelante) correrá <strong>Guake</strong>, mientras que si oprimo el botón 8 (Back) le indico que presione <code class="highlighter-rouge">Super_L</code> (tecla Start o también mal conocida como la tecla de Windows).</p>
<p>La orden <code class="highlighter-rouge">xbindkeys</code> puedes agregarla en tus scripts de inicio de sesión o en las aplicaciones de inicio de to majejador de escritorio.</p>
<h1 id="referencias">Referencias</h1>
<ul>
<li><a href="https://www.logitech.com/en-roeu/product/mx-anywhere-2s-flow.910-005153.html#specs" target="_blank">Logitech MX Anywhere 2S </a></li>
<li><a href="https://askubuntu.com/questions/101105/how-to-assign-back-and-forward-actions-to-logitech-anywhere-mouse-mx-horizo" target="_blank">How to assign “back” and “forward” actions to Logitech Anywhere Mouse MX’ horizontal scroll wheel?</a></li>
<li><a href="https://wiki.archlinux.org/index.php/Xbindkeys#Identifying_keycodes" target="_blank">Xbindkeys (ArchLinux)</a></li>
</ul>Luis GallardoMe compré un ratón Logitech Mx Anywhere 2s Flounder para poder liberar un puerto USB, y tener la posibilidad de configurar más bototones adicionales al del ratón que tenía.Certified Kubernetes Administrator (CKA)2020-07-25T19:00:00-05:002020-07-25T19:00:00-05:00https://lgallardo.com/es/2020/11/23/certified-kubernetes-administrator-cka<center><img src="/images/ckad.jpg" alt="Certified Kubernetes Application Developer" width="340" height="340" /></center>
<p><br />
Este artículo describe my experiencia y recomendacion para afrontar el examen <strong>Certified Kubernetes Administrator (CKA)</strong> elaborado por The Linux Foundation.</p>
<h1 id="el-examen">El examen</h1>
<p>El examen es 100% práctico con 20 preguntas que se deben resolver en 2 horas, con un supervisor (proctor) que verifica que estés solo durante el examen, así como que cumplas todas <a href="https://docs.linuxfoundation.org/tc-docs/certification/lf-candidate-handbook/exam-rules-and-policies" target="_blank">las reglas</a>.
Por ejemplo en mi caso el supervidor me pidió que le mostrara la habitación con una vista 360º, y que le mostrata debajo de mi escritorio. También me pedía de tanto en tanto que le mostrara mis manos cuando realizaba el examen.</p>
<p>Primero que nada, el examen abarca más que el CKAD en términos de complejidad. Teencontrarás con retos más difíciles, tales como arreglar un cluster roto o detectar por qué un servicio no está corriendo apropiadamente y hacer que funcione nuevamente.</p>
<p>En mi caso hubo pocas preguntas fáciles y diría que la mayoría eran de mediana o mayor dificultad, por ende ve preparado! Debes manejar muy bien tu tiempo. La preguntas se te mostrarán en un panel del lado izquierdo y tendrás acceso a un terminal donde deberás ejecutar las órdenes para resolverlas.</p>
<center><img src="/images/exam_ui.jpg" alt="Exam UI" width="340" height="340" /></center>
<p><br /></p>
<p>Habrán preguntas para crear recursos y otras para identificar y resolver problemas (troubleshooting & fixing). Podrás copiar y pegar desde las instrucciones, además de tener acceso a un lugar para notas, por ejemplo para llevar el conteo de las preguntas pendientes.</p>
<p>Podrás consultar la documentación de Kubernetes desde estos sitios h<a href="https://kubernetes.io/docs/" target="_blank">https://kubernetes.io/docs/</a>, <a href="https://github.com/kubernetes/" target="_blank">https://github.com/kubernetes/</a>, <a href="https://kubernetes.io/blog/" target="_blank">https://kubernetes.io/blog/</a>,, abriendo una y solo uno pestaña adicional al examen.</p>
<p>El examen lo puedes presentar con Chrome, por lo que de los sitios mencionados arriba puedes acceder desde tus marcadores (sí, está permitido).</p>
<h1 id="mi-experiencia">Mi experiencia</h1>
<p>Con este examen no tuve ningún inconveniente (mira mi experiencia con el examen CKAD). Lo que si es que no tenía un reloj para llevar el tiempo en la interfaz del examen sino una barra de progreso que en ocasiones no estaba, pero esta vez estaba consiente del tiempo. El proctor solo me interrumpió 15 minutos antes de finalizar el examen para indicarme que casi había finalizado el tiempo.</p>
<p>Fui con muchas expectativas, pero esta vez referente a la dificultad del examen.</p>
<h1 id="cómo-prepararse">¿Cómo prepararse?</h1>
<p>Existen varios recursos gratuitos y otros pagos, todos válidos para prepararse, pero es fundamental tener experiencia práctica. Listo algunos de ellos:</p>
<h2 id="libros">Libros</h2>
<ul>
<li><a href="https://www.amazon.com/gp/product/B072TS9ZQZ/ref=ppx_yo_dt_b_d_asin_title_o06?ie=UTF8&psc=1" target="_blank">The Kubernetes Book: Updated Feb 2020</a> by Nigel Poulton: This book is good for an overview of Kubernetes, and is an extension of Nigel’s course (see below).</li>
<li><a href="https://www.amazon.com/Kubernetes-Running-Dive-Future-Infrastructure-ebook/dp/B07YP1XSZ9/ref=sr_1_1?dchild=1&keywords=kubernetes+up+and+running&qid=1595782565&s=digital-text&sr=1-1" target="_blank">Kubernetes up and running</a>: Este libro está bueno para tener una vista general de Kubernetes, y es una extensión del curso de Nigel (ver más abajo).</li>
</ul>
<h2 id="cursos-en-línea">Cursos en línea</h2>
<ul>
<li><a href="https://www.udemy.com/course/certified-kubernetes-application-developer/" target="_blank">Kubernetes Certified Application Developer (CKAD) with Tests (Mumshad Mannambeth)</a>: Este curso está muy bien diseñado y explica en detalle y con muchas animaciones los conceptos necesarios para aprender a desplegar aplicaciones en un cluster de Kubernetes. Adicionalmente da acceso a una plataforma llamada <em><strong>Kloud Kode</strong></em> creada con <em><strong>Teachable</strong></em> y con entornos de <em><strong>Katacoda</strong></em> diseñados para cada tema tratado, dos laboratorios tipo examen (con un grado de dificultad alto) y dos examenes para practicar y preparase para trabajar bajo la presión del examen real.</li>
<li><a href="https://linuxacademy.com/course/certified-kubernetes-application-developer-ckad/" target="_blank">Certified Kubernetes Application Developer (CKAD) - Linux Academy</a>: Si tienes una suscripción de LinuxAcademy puedes seguir este curso. Ten en cuenta dos cosas: 1) Se enfocan en editar los yamls y poco en cómo generarlos. 2) Los exámenes que tienen para practicar no son tan difíciles y pueden resultar insuficientes para aprobar sin haber practicado más allá de estos. Es recomendable hacer los laboratorios, los exámenes y otras preguntas para ejercitarse (ver abajo)</li>
<li><a href="https://acloud.guru/learn/kubernetes-deep-dive" target="_blank">Kubernetes Deep Dive - A Cloud Guru</a>: Este curso es para tener una visión general de Kubernetes, por ejemplo de su arquitectura (API Server, Kubelet, etc) así como para dar los primeros pasos en despliegues de aplicaciones. No incluye laboratorios prácticos.</li>
</ul>
<h2 id="entornos-para-prácticar">Entornos para prácticar</h2>
<ul>
<li><a href="https://www.katacoda.com/" target="_blank">Katacoda</a>: Esta plataforma permite interactuar con un cluster de un nodo, desde una consola web, similar a lo que conseguiríamos en el examen. Lo interesante es que hay escenarios creados por otros usuarios que se pueden utilizar para aprender conceptos básicos, como por ejemplo secrets, configmaps, volumes, etc. Ten en cuenta que cada escenario dura máximo una hora.</li>
<li><a href="https://kubernetes.io/docs/tasks/tools/install-minikube/" target="_blank">Minikube</a>: Con esta opción podrás instalar una máquina virtual para tener tu propio cluster de un nodo.</li>
</ul>
<h2 id="ejercicios-para-practicar">Ejercicios para practicar</h2>
<ul>
<li><a href="https://github.com/dgkanatsios/CKAD-exercises" target="_blank">CKAD Exercises</a>: Un conjunto de ejercicios que te ayudaran a prepararte para el examen y también pueden servirte para aprender y practicar con Kubernetes.</li>
<li><a href="https://medium.com/bb-tutorials-and-thoughts/practice-enough-with-these-questions-for-the-ckad-exam-2f42d1228552" target="_blank">Practice Enough With These 150 Questions for the CKAD Exam</a>: Este es otro conjunto de ejercicios que sirven para prepararte y tener todos los conceptos frescos antes de ir al examen.</li>
<li><a href="https://codeburst.io/kubernetes-ckad-weekly-challenges-overview-and-tips-7282b36a2681" target="_blank">Kubernetes CKAD Example Exam Questions Practical Challenge Series</a>: En esta página se presentan algunos retos para completar y algunos tips para el examen. También ofrecen un simulador del examen con un costo de €30 (no me suscribí, por lo que no sé exactamente cómo es el simulador o si de verdad tiene preguntas similares al del examen).</li>
</ul>
<h1 id="notas-finales">Notas finales</h1>
<p>Nuevamente te recomiendo que practiques mucho antes de presentar el examen, incluso si tienes experiencia con Kubernetes. La gestión del tiempo es importante, por lo que debes estar preparado para usar rápidamente la documentación de Kubernetes (desde la página o desde la consola con kubectl), estar preparado a generar yamls (no editarlos), y manejar los nervios y la presión.</p>
<h1 id="references">References</h1>
<ul>
<li><a href="https://docs.linuxfoundation.org/tc-docs/certification/lf-candidate-handbook/exam-rules-and-policies" target="_blank">Exam Rules and Policies</a></li>
<li><a href="https://www.amazon.com/gp/product/B072TS9ZQZ/ref=ppx_yo_dt_b_d_asin_title_o06?ie=UTF8&psc=1" target="_blank">The Kubernetes Book: Updated Feb 2020</a> by Nigel Poulton.</li>
<li><a href="https://www.amazon.com/Kubernetes-Running-Dive-Future-Infrastructure-ebook/dp/B07YP1XSZ9/ref=sr_1_1?dchild=1&keywords=kubernetes+up+and+running&qid=1595782565&s=digital-text&sr=1-1" target="_blank">Kubernetes up and running</a></li>
<li><a href="https://www.udemy.com/course/certified-kubernetes-application-developer/" target="_blank">Kubernetes Certified Application Developer (CKAD) with Tests (Mumshad Mannambeth)</a></li>
<li><a href="https://linuxacademy.com/course/certified-kubernetes-application-developer-ckad/" target="_blank">Certified Kubernetes Application Developer (CKAD) - Linux Academy</a></li>
<li><a href="https://acloud.guru/learn/kubernetes-deep-dive" target="_blank">Kubernetes Deep Dive - A Cloud Guru</a></li>
<li><a href="https://acloud.guru/learn/kubernetes-fundamental/" target="_blank">Kubernetes Fundamentals - A Cloud Guru</a></li>
<li><a href="https://www.katacoda.com/" target="_blank">Katacoda</a></li>
<li><a href="https://kubernetes.io/docs/tasks/tools/install-minikube/" target="_blank">Minikube</a></li>
<li><a href="https://github.com/dgkanatsios/CKAD-exercises" target="_blank">CKAD Exercises</a></li>
<li><a href="https://medium.com/bb-tutorials-and-thoughts/practice-enough-with-these-questions-for-the-ckad-exam-2f42d1228552" target="_blank">Practice Enough With These 150 Questions for the CKAD Exam</a></li>
<li><a href="https://codeburst.io/kubernetes-ckad-weekly-challenges-overview-and-tips-7282b36a2681" target="_blank">Kubernetes CKAD Example Exam Questions Practical Challenge Series</a></li>
</ul>Luis GallardoEste artículo describe my experiencia y recomendacion para afrontar el examen Certified Kubernetes Administrator (CKA) elaborado por The Linux Foundation.Certified Kubernetes Application Developer (CKAD)2020-07-25T19:00:00-05:002020-07-25T19:00:00-05:00https://lgallardo.com/es/2020/07/26/certified-kubernetes-application-developer-ckad<center><img src="/images/ckad.jpg" alt="Certified Kubernetes Application Developer" width="340" height="340" /></center>
<p><br />
Recientemente aprobé el examen <strong>Certified Kubernetes Application Developer (CKAD</strong>) elaborado por The Linux Foundation. Comparto mi experiencia y algunas recomendaciones para prepararse para el examen.</p>
<h1 id="el-examen">El examen</h1>
<p>El examen es 100% práctico con 19 preguntas que se deben resolver en 2 horas, con un supervisor (proctor) que verifica que estés solo durante el examen, así como que cumplas <a href="https://docs.linuxfoundation.org/tc-docs/certification/lf-candidate-handbook/exam-rules-and-policies" target="_blank">todas las reglas</a> para presentar (por ejemplo en mi caso me pidieron cerrar todas las puertas que daban acceso a mi comedor, que fue donde presenté el examen)</p>
<p>Algunas preguntas serán fáciles, otras tendrán varios pasos a seguir, por lo que debes administrar muy bien el tiempo. La preguntas se te mostrarán en un panel del lado izquierdo y tendrás acceso a un terminal donde deberás ejecutar las órdenes para resolverlas.</p>
<center><img src="/images/exam_ui.jpg" alt="Exam UI" width="340" height="340" /></center>
<p><br /></p>
<p>Habrán preguntas para crear recursos y otras para identificar y resolver problemas (troubleshooting). Podrás copiar y pegar desde las instrucciones, además de tener acceso a un lugar para notas, por ejemplo para llevar el conteo de las preguntas pendientes.</p>
<p>Podrás consultar la documentación de Kubernetes desde estos sitios <a href="https://kubernetes.io/docs/" target="_blank">https://kubernetes.io/docs/</a>, <a href="https://github.com/kubernetes/" target="_blank">https://github.com/kubernetes/</a>, <a href="https://kubernetes.io/blog/" target="_blank">https://kubernetes.io/blog/</a>, abriendo una y solo uno pestaña adicional al examen.</p>
<p>El examen lo puedes presentar con Chrome, por lo que de los sitios mencionados arriba puedes acceder desde tus marcadores (sí, está permitido)</p>
<h1 id="mi-experiencia">Mi experiencia</h1>
<p>Tenía algo de expectativa porque es un examen práctico, y como era el primero de este estilo que presentaba no sabía con qué me iba a encontrar ni cómo iba a poder manejar el tiempo.</p>
<p>Durante el examen me pasaron me varias cosas que me retrasaron, por ejemplo al utilizar una combinación de teclas de Vim para moverme entre ventanas cerré accidentalmente el examen, con lo cual tuve que reconectarme y contactar al proctor.</p>
<p>Por otro lado, ese día mi proveedor de Internet tenía problemas y hacía que mi conexión estuviese muy lenta, por lo que los cambios en los yamls los veía con retardos de aproximadamente 5 segundos.</p>
<p>En algún momento la conexión se perdió completamente, y el examen se cerró, teniendo que ingresar nuevamente y coordinar con el proctor.</p>
<p>Otra de las cosas que me pasó fue que la alarma del celular que estaba cerca empezó a sonar (el examen lo hice a las 5:00 AM), asi que le pedí permiso al proctor para apagarla, con lo cual tuvo que pausar el examen.</p>
<p>Todas estás desconexiones y pausas no detienen el tiempo, cuando se comienza el examen se tienen 2 horas exactas.</p>
<p>Otro inconveniente que tuve fue que no tenía un reloj para llevar el tiempo en la interfaz del examen sino una barra de progreso que en ocasiones no estaba, por lo que el proctor me recordaba el tiempo restante cada tanto, interrumpiendo mi concentración.</p>
<h1 id="cómo-prepararse">¿Cómo prepararse?</h1>
<p>Existen varios recursos gratuitos y otros pagos, todos válidos para prepararse, pero es fundamental tener experiencia práctica. Listo algunos de ellos:</p>
<h2 id="libros">Libros</h2>
<ul>
<li><a href="https://www.amazon.com/gp/product/B072TS9ZQZ/ref=ppx_yo_dt_b_d_asin_title_o06?ie=UTF8&psc=1" target="_blank">The Kubernetes Book: Updated Feb 2020</a> by Nigel Poulton: Este libro está bueno para tener una vista general de Kubernetes, y es una extensión del curso de Nigel (ver más abajo).</li>
<li><a href="https://www.amazon.com/Kubernetes-Running-Dive-Future-Infrastructure-ebook/dp/B07YP1XSZ9/ref=sr_1_1?dchild=1&keywords=kubernetes+up+and+running&qid=1595782565&s=digital-text&sr=1-1" target="_blank">Kubernetes up and running</a>: Referencia obligada para aprender Kubernetes, cubre varios tópicos de CKAD y también de CKA.</li>
</ul>
<h2 id="cursos-en-línea">Cursos en línea</h2>
<ul>
<li><a href="https://www.udemy.com/course/certified-kubernetes-application-developer/" target="_blank">Kubernetes Certified Application Developer (CKAD) with Tests (Mumshad Mannambeth)</a>: Este curso está muy bien diseñado y explica en detalle y con muchas animaciones los conceptos necesarios para aprender a desplegar aplicaciones en un cluster de Kubernetes. Adicionalmente da acceso a una plataforma llamada <em><strong>Kloud Kode</strong></em> creada con <em><strong>Teachable</strong></em> y con entornos de <em><strong>Katacoda</strong></em> diseñados para cada tema tratado, dos laboratorios tipo examen (con un grado de dificultad alto) y dos examenes para practicar y preparase para trabajar bajo la presión del examen real.</li>
<li><a href="https://linuxacademy.com/course/certified-kubernetes-application-developer-ckad/" target="_blank">Certified Kubernetes Application Developer (CKAD) - Linux Academy</a>: Si tienes una suscripción de LinuxAcademy puedes seguir este curso. Ten en cuenta dos cosas: 1) Se enfocan en editar los yamls y poco en cómo generarlos. 2) Los exámenes que tienen para practicar no son tan difíciles y pueden resultar insuficientes para aprobar sin haber practicado más allá de estos. Es recomendable hacer los laboratorios, los exámenes y otras preguntas para ejercitarse (ver abajo)</li>
<li><a href="https://acloud.guru/learn/kubernetes-deep-dive" target="_blank">Kubernetes Deep Dive - A Cloud Guru</a>: Este curso es para tener una visión general de Kubernetes, por ejemplo de su arquitectura (API Server, Kubelet, etc) así como para dar los primeros pasos en despliegues de aplicaciones. No incluye laboratorios prácticos.</li>
<li><a href="https://acloud.guru/learn/kubernetes-fundamental/" target="_blank">Kubernetes Fundamentals - A Cloud Guru</a>: Este curso es para iniciarse con Kubernetes, para tener los conceptos fundamentales. Ideal para quienes no han tenido contacto con Kubernetes. No incluye laboratorios prácticos.</li>
</ul>
<h2 id="entornos-para-prácticar">Entornos para prácticar</h2>
<ul>
<li><a href="https://www.katacoda.com/" target="_blank">Katacoda</a>: Esta plataforma permite interactuar con un cluster de un nodo, desde una consola web, similar a lo que conseguiríamos en el examen. Lo interesante es que hay escenarios creados por otros usuarios que se pueden utilizar para aprender conceptos básicos, como por ejemplo secrets, configmaps, volumes, etc. Ten en cuenta que cada escenario dura máximo una hora.</li>
<li><a href="https://kubernetes.io/docs/tasks/tools/install-minikube/" target="_blank">Minikube</a>: Con esta opción podrás instalar una máquina virtual para tener tu propio cluster de un nodo.</li>
</ul>
<h2 id="ejercicios-para-practicar">Ejercicios para practicar</h2>
<ul>
<li><a href="https://github.com/dgkanatsios/CKAD-exercises" target="_blank">CKAD Exercises</a>: Un conjunto de ejercicios que te ayudaran a prepararte para el examen y también pueden servirte para aprender y practicar con Kubernetes.</li>
<li><a href="https://medium.com/bb-tutorials-and-thoughts/practice-enough-with-these-questions-for-the-ckad-exam-2f42d1228552" target="_blank">Practice Enough With These 150 Questions for the CKAD Exam</a>: Este es otro conjunto de ejercicios que sirven para prepararte y tener todos los conceptos frescos antes de ir al examen.</li>
<li><a href="https://codeburst.io/kubernetes-ckad-weekly-challenges-overview-and-tips-7282b36a2681" target="_blank">Kubernetes CKAD Example Exam Questions Practical Challenge Series</a>: En esta página se presentan algunos retos para completar y algunos tips para el examen. También ofrecen un simulador del examen con un costo de €30 (no me suscribí, por lo que no sé exactamente cómo es el simulador o si de verdad tiene preguntas similares al del examen).</li>
</ul>
<h1 id="notas-finales">Notas finales</h1>
<p>Nuevamente te recomiendo que practiques mucho antes de presentar el examen, incluso si tienes experiencia con Kubernetes. La gestión del tiempo es importante, por lo que debes estar preparado para usar rápidamente la documentación de Kubernetes (desde la página o desde la consola con kubectl), estar preparado a generar yamls (no editarlos), y manejar los nervios y la presión.</p>
<h1 id="referencias">Referencias</h1>
<ul>
<li><a href="https://docs.linuxfoundation.org/tc-docs/certification/lf-candidate-handbook/exam-rules-and-policies" target="_blank">Exam Rules and Policies</a></li>
<li><a href="https://www.amazon.com/gp/product/B072TS9ZQZ/ref=ppx_yo_dt_b_d_asin_title_o06?ie=UTF8&psc=1" target="_blank">The Kubernetes Book: Updated Feb 2020</a> by Nigel Poulton.</li>
<li><a href="https://www.amazon.com/Kubernetes-Running-Dive-Future-Infrastructure-ebook/dp/B07YP1XSZ9/ref=sr_1_1?dchild=1&keywords=kubernetes+up+and+running&qid=1595782565&s=digital-text&sr=1-1" target="_blank">Kubernetes up and running</a></li>
<li><a href="https://www.udemy.com/course/certified-kubernetes-application-developer/" target="_blank">Kubernetes Certified Application Developer (CKAD) with Tests (Mumshad Mannambeth)</a></li>
<li><a href="https://linuxacademy.com/course/certified-kubernetes-application-developer-ckad/" target="_blank">Certified Kubernetes Application Developer (CKAD) - Linux Academy</a></li>
<li><a href="https://acloud.guru/learn/kubernetes-deep-dive" target="_blank">Kubernetes Deep Dive - A Cloud Guru</a></li>
<li><a href="https://acloud.guru/learn/kubernetes-fundamental/" target="_blank">Kubernetes Fundamentals - A Cloud Guru</a></li>
<li><a href="https://www.katacoda.com/" target="_blank">Katacoda</a></li>
<li><a href="https://kubernetes.io/docs/tasks/tools/install-minikube/" target="_blank">Minikube</a></li>
<li><a href="https://medium.com/bb-tutorials-and-thoughts/practice-enough-with-these-questions-for-the-ckad-exam-2f42d1228552" target="_blank">Practice Enough With These 150 Questions for the CKAD Exam</a></li>
<li><a href="https://codeburst.io/kubernetes-ckad-weekly-challenges-overview-and-tips-7282b36a2681" target="_blank">Kubernetes CKAD Example Exam Questions Practical Challenge Series</a></li>
</ul>Luis GallardoRecientemente aprobé el examen Certified Kubernetes Application Developer (CKAD) elaborado por The Linux Foundation. Comparto mi experiencia y algunas recomendaciones para prepararse para el examen.Módulo de Terraform para Secrets Manager2020-06-25T19:00:00-05:002020-06-25T19:00:00-05:00https://lgallardo.com/es/2020/06/26/terraform-module-for-amazon-secrets-manager<center><img src="/images/terraform-aws-secrets-manager.jpg" alt="AWS Secrets Manager" /></center>
<p><br />
Acabo de publicar un módulo Terraform llamado <strong>terraform-aws-secrets-manager</strong> en Github, así que decidí compartirlo también en el Registro público de Terraform.</p>
<p>Puedes ver el módulo <strong>terraform-aws-secrets-manager</strong> en el <a href="https://registry.terraform.io/modules/lgallard/secrets-manager/aws/" target="_blank">Terraform Registry</a> o clonarlo desde <a href="https://github.com/lgallard/terraform-aws-secrets-manager" target="_blank">Github</a>.</p>
<p>Si quieres echar un vistazo al módulo, también dejé el archivo README en esta publicación:</p>
<p><img src="https://lgallardo.com/images/terraform.jpg" alt="Terraform" /></p>
<h1 id="terraform-aws-secrets-manager">terraform-aws-secrets-manager</h1>
<p>Terraform module to create <a href="https://aws.amazon.com/secrets-manager/" target="_blank">Amazon Secrets Manager</a> resources.</p>
<p>AWS Secrets Manager helps you protect secrets needed to access your applications, services, and IT resources. The service enables you to easily rotate, manage, and retrieve database credentials, API keys, and other secrets throughout their lifecycle.</p>
<h2 id="examples">Examples</h2>
<p>Check the <a href="https://github.com/lgallard/terraform-aws-secrets-manager/tree/master/examples/" target="_blank">examples</a> folder where you can see the complete compilation of snippets.</p>
<h2 id="usage">Usage</h2>
<p>You can create secrets for plain texts, keys/values and binary data:</p>
<h3 id="plain-text-secrets">Plain text secrets</h3>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>module "secrets-manager-1" {
source = "lgallard/secrets-manager/aws"
secrets = [
{
name = "secret-1"
description = "My secret 1"
recovery_window_in_days = 7
secret_string = "This is an example"
},
{
name = "secret-2"
description = "My secret 2"
recovery_window_in_days = 7
secret_string = "This is another example"
}
]
tags = {
Owner = "DevOps team"
Environment = "dev"
Terraform = true
}
}
</code></pre></div></div>
<h3 id="keyvalue-secrets">Key/Value secrets</h3>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>module "secrets-manager-2" {
source = "lgallard/secrets-manager/aws"
secrets = [
{
name = "secret-kv-1"
description = "This is a key/value secret"
secret_key_value = {
key1 = "value1"
key2 = "value2"
}
recovery_window_in_days = 7
},
{
name = "secret-kv-2"
description = "Another key/value secret"
secret_key_value = {
username = "user"
password = "topsecret"
}
tags = {
app = "web"
}
recovery_window_in_days = 7
},
]
tags = {
Owner = "DevOps team"
Environment = "dev"
Terraform = true
}
}
</code></pre></div></div>
<h3 id="binary-secrets">Binary secrets</h3>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>module "secrets-manager-3" {
source = "lgallard/secrets-manager/aws"
secrets = [
{
name = "secret-binary-1"
description = "This is a binary secret"
secret_binary = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQDt4TcI58h4G0wR+GcDY+0VJR10JNvG92jEKGaKxeMaOkfsXflVGsYXbfVBBCG/n3uHtTse7baYLB6LWQAuYWL1SHJVhhTQ7pPiocFWibAvJlVo1l7qJEDu2OxKpWEleCE+p3ufNXAy7v5UFO7EOnj0Zg6R3F/MiAWbQnaEHcYzNtogyC24YBecBLrBXZNi1g0AN1hM9k+3XvWUYTf9vPv8LIWnqo7y4Q2iEGWWurf37YFl1LzX4mG/Co+Vfe5TlZSe2YPMYWlw0ZKaKvwzInRR6dPMAflo3ABzlduiIbSdp110uGqB8i2M8eGXNDxR7Ni4nnLWnT9r1cpWhXWP6pAG4Xg8+x7+PIg/pgjgJNmsURw+jPD6+hkCw2Vz16EIgkC2b7lj0V6J4LncUoRzU/1sAzCQ4tspy3SKBUinYoxbDvXleF66FHEjfparnvNwfslBx0IJjG2uRwuX6zrsNIsGF1stEjz+eyAOtFV4/wRjRcCNDZvl1ODzIvwf8pAWddE= lgallard@server1"
},
{
name = "secret-binary-2"
description = "Another binary secret"
secret_binary = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCzc818NSC6oJYnNjVWoF43+IuQpqc3WyS8BWZ50uawK5lY/aObweX2YiXPv2CoVvHUM0vG7U7BDBvNi2xwsT9n9uT27lcVQsTa8iDtpyoeBhcj3vJ60Jd04UfoMP7Og6UbD+KGiaqQ0LEtMXq6d3i619t7V0UkaJ4MXh2xl5y3bV4zNzTXdSScJnvMFfjLW0pJOOqltLma3NQ9ILVdMSK2Vzxc87T+h/jp0VuUAX4Rx9DqmxEU/4JadXmow/BKy69KVwAk/AQ8jL7OwD2YAxlMKqKnOsBJQF27YjmMD240UjkmnPlxkV8+g9b2hA0iM5GL+5MWg6pPUE0BYdarCmwyuaWYhv/426LnfHTz9UVC3y9Hg5c4X4I6AdJJUmarZXqxnMe9jJiqiQ+CAuxW3m0gIGsEbUul6raG73xFuozlaXq3J+kMCVW24eG2i5fezgmtiysIf/dpcUo+YLkX+U8jdMQg9IwCY0bf8XL39kwJ7u8uWU8+7nMcS9VQ5llVVMk= lgallard@server2"
recovery_window_in_days = 7
tags = {
app = "web"
}
}
]
tags = {
Owner = "DevOps team"
Environment = "dev"
Terraform = true
}
}
</code></pre></div></div>
<h2 id="secrets-rotation">Secrets Rotation</h2>
<p>If yo need to rotate your secrets, use <code class="highlighter-rouge">rotate_secrets</code> list to define them. Take into account that the lambda function must exist and it must have the right permissions to rotate the secrets in AWS Secret manager:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>module "secrets-manager-4" {
source = "lgallard/secrets-manager/aws"
rotate_secrets = [
{
name = "secret-rotate-1"
description = "This is a secret to be rotated by a lambda"
secret_string = "This is an example"
rotation_lambda_arn = "arn:aws:lambda:us-east-1:123455678910:function:lambda-rotate-secret"
recovery_window_in_days = 15
},
{
name = "secret-rotate-2"
description = "This is another secret to be rotated by a lambda"
secret_string = "This is another example"
rotation_lambda_arn = "arn:aws:lambda:us-east-1:123455678910:function:lambda-rotate-secret"
recovery_window_in_days = 7
},
]
tags = {
Owner = "DevOps team"
Environment = "dev"
Terraform = true
}
}
</code></pre></div></div>
<h2 id="several-secret-definitions">Several secret definitions</h2>
<p>You can define different type of secrets (string, key/balue or binary) in the same <code class="highlighter-rouge">secrets</code> or <code class="highlighter-rouge">rotate_secrets</code> list:</p>
<div class="highlighter-rouge"><div class="highlight"><pre class="highlight"><code>module "secrets-manager-5" {
source = "lgallard/secrets-manager/aws"
secrets = [
{
name = "secret-plain"
description = "My plain text secret"
recovery_window_in_days = 7
secret_string = "This is an example"
},
{
name = "secret-key-value"
description = "This is a key/value secret"
secret_key_value = {
username = "user"
password = "topsecret"
}
tags = {
app = "web"
}
recovery_window_in_days = 7
},
]
tags = {
Owner = "DevOps team"
Environment = "dev"
Terraform = true
}
}
</code></pre></div></div>
<h2 id="providers">Providers</h2>
<table>
<thead>
<tr>
<th>Name</th>
<th>Version</th>
</tr>
</thead>
<tbody>
<tr>
<td>aws</td>
<td>n/a</td>
</tr>
</tbody>
</table>
<h2 id="inputs">Inputs</h2>
<table>
<thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>Type</th>
<th>Default</th>
<th style="text-align: center">Required</th>
</tr>
</thead>
<tbody>
<tr>
<td>automatically_after_days</td>
<td>Specifies the number of days between automatic scheduled rotations of the secret.</td>
<td><code class="highlighter-rouge">number</code></td>
<td><code class="highlighter-rouge">30</code></td>
<td style="text-align: center">no</td>
</tr>
<tr>
<td>recovery_window_in_days</td>
<td>Specifies the number of days that AWS Secrets Manager waits before it can delete the secret. This value can be 0 to force deletion without recovery or range from 7 to 30 days.</td>
<td><code class="highlighter-rouge">number</code></td>
<td><code class="highlighter-rouge">30</code></td>
<td style="text-align: center">no</td>
</tr>
<tr>
<td>rotate_secrets</td>
<td>List of secrets to keep and rotate in AWS Secrets Manager</td>
<td><code class="highlighter-rouge">any</code></td>
<td><code class="highlighter-rouge">[]</code></td>
<td style="text-align: center">no</td>
</tr>
<tr>
<td>secrets</td>
<td>List of secrets to keep in AWS Secrets Manager</td>
<td><code class="highlighter-rouge">any</code></td>
<td><code class="highlighter-rouge">[]</code></td>
<td style="text-align: center">no</td>
</tr>
<tr>
<td>tags</td>
<td>Specifies a key-value map of user-defined tags that are attached to the secret.</td>
<td><code class="highlighter-rouge">any</code></td>
<td><code class="highlighter-rouge">{}</code></td>
<td style="text-align: center">no</td>
</tr>
</tbody>
</table>
<h2 id="outputs">Outputs</h2>
<table>
<thead>
<tr>
<th>Name</th>
<th>Description</th>
</tr>
</thead>
<tbody>
<tr>
<td>rotate_secret_arns</td>
<td>Rotate secret arn list</td>
</tr>
<tr>
<td>rotate_secret_ids</td>
<td>Rotate secret id list</td>
</tr>
<tr>
<td>secret_arns</td>
<td>Secret arn list</td>
</tr>
<tr>
<td>secret_ids</td>
<td>Secret id list</td>
</tr>
</tbody>
</table>
<h2 id="references">References</h2>
<ul>
<li><a href="https://github.com/lgallard/terraform-aws-secrets-manager.git" target="_blank">terraform-aws-secrets-manager module at github</a></li>
<li><a href="https://registry.terraform.io/modules/lgallard/secrets-manager/aws/" target="_blank">terraform-aws-secrets-manager module at Terraform registry</a></li>
</ul>Luis GallardoAcabo de publicar un módulo Terraform llamado terraform-aws-secrets-manager en Github, así que decidí compartirlo también en el Registro público de Terraform.