Me encanta ser formador en el curso de AWS AWS Advanced Operations, ya que me permite interactuar con gente que ya conoce Amazon Web Services, que tienen experiencia en el servicio y que, por lo tanto, tienen dudas y problemas bastante específicos.

Durante estas formaciones me encanta el reto de tener que pensar en una manera de ayudarles en algo que no es “posible de manera inmediata”, en vez de decir “esto no está soportado”.

Resulta que me consultaron si se podía copiar una clave pública existente de una región a otra.

AWS API tiene un método para importar claves públicas: ImportKeyPair.
Este acepta una clave pública en varias formas, por lo que solamente necesitas una manera de obtener la clave pública.
«¡Fácil! ¡DescribeKeyPairs¡Incorrecto!
DescribeKeyPairs solo devuelve una huella digital clave, ¡no la clave pública!

El enfoque

En publicaciones oficiales anteriores de AWS, con la función BYOK (del inglés “Bring Your Own Keypair, “trae tu propio par de claves”) podías usar una clave pública común en todas las regiones, pero tenías que generar un nuevo par de claves públicas y privadas, y no quería decirle al asistente «cambia todas tus llaves por unas nuevas”…

La cuestión es que AWS no nos manda la llave pública cuando la genera. ¡Solamente obtenemos la clave privada!

Así que, sabiendo que la declaración «no puedo obtener la clave pública» es falsa, traté de darle la vuelta. La respuesta estaba en un procedimiento que hacemos casi todos los días: RunInstance.
Cuando se inicie, ¡AWS expondrá la clave pública a una instancia a través del servicio de metadatos!

La solución

Volviendo al trabajo, y ahora que estamos en ello… ¡intentemos automatizarlo!
La estrategia será lanzar una AMI de Amazon Linux y subir la clave pública de ec2-user a todas las regiones a través de ImportKeyPair.

"Version": "2012-10-17",
"Statement": [
{
"Action": [
"ec2:DescribeKeyPairs",
"ec2:DescribeRegions",
"ec2:ImportKeyPair"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
sudo yum -f install aws-cli
# default region is needed for the describe-regions call. Get the region from metadata stripping off the az (last char)
export AWS_DEFAULT_REGION=`ec2-metadata -z | sed 's/placement: //' | sed 's/.$//'`
# keypair name the instance was launched with
export KEY_PAIR=`ec2-metadata -u | grep keyname | sed 's/^keyname://'`
# key content
export KEY=`cat /home/ec2-user/.ssh/authorized_keys`
# Invoke import-key-pair in all regions except the actual region (we can't overwrite an existing key)
aws --output=text ec2 describe-regions | cut -f3 | grep -v $AWS_DEFAULT_REGION | xargs -I{} aws --region {} ec2 import-key-pair --key-name $KEY_PAIR --public-key-material "$KEY"

¡Trabajo hecho! Ahora, puedes deshacerte de tu instancia 🙂

*Descargo de responsabilidad este es mi enfoque y se aplica a casi todos los casos, pero no soy responsable de cualquier daño que puedas causar en tu infraestructura si ejecutas este proceso antes de pensar si es la solución adecuada para tu proyecto.
Si tienes alguna duda, no dudes en preguntarme y procuraré responderte. Espero que esta pequeña guía te haya ayudado al menos a iluminar el camino hacia tu propia solución..

TAGS: amazon web services, aws, byok, describekeypairs, Llave pública, pares de claves, regiones AWS

speech-bubble-13-icon Created with Sketch.
Comentarios

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

*
*