Los pasos para conectar vía ssh a una instancia Linux creada en Amazon AWS son los siguientes.
Creación del Key Pair y asociación con la instancia EC2
Cuando se crea una instancia EC2 Linux, uno de los pasos es la asociación de un Key Pair que será el utilizado para conectar vía ssh. No es posible acceder con usuario y clave así que deberemos disponer siempre de la private key para poder conectar a la instancia. Si bien una vez asignada la Key pair a la instancia no se puede modificar, sí que hay formas de añadir nuevos Key Pair haciendo algunos apaños que de momento voy a obviar.
Si no tenemos ningún Key Pair, durante la creación de la instancia nos dará la opción de crearlo y asociarlo. Nos bajaremos el fichero .pem (Private Key) a local, la utilizaremos después para conectar por SSH.
Si queremos crear un Key Pair fuera del asistente de la instancia, podemos hacerlo desde la consola web de AWS (EC2 Dashboard -> Key Pairs) o desde la CLI de AWS (a continuación enseño como instalarla):
$ aws ec2 create-key-pair --key-name MyKeyPair
Instalación de la AWS CLI
La CLI de AWS nos permite gestionar todo lo relacionado con Amazon Web Services sin necesidad de acceder a la consola de administración web. Los pasos de instalación en Linux son muy sencillos:
$ wget https://s3.amazonaws.com/aws-cli/awscli-bundle.zip $ unzip awscli-bundle.zip $ sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws Running cmd: /usr/bin/python virtualenv.py --python /usr/bin/python /usr/local/aws Running cmd: /usr/local/aws/bin/pip install --no-index --find-links file:///home/alexgarcia/awscli-bundle/packages awscli-1.5.6.tar.gz You can now run: /usr/local/bin/aws --version
En la configuración debemos especificar nuestro AWS Access Key ID y AWS Secret Access Key (podemos crear perfiles en la consola web haciendo click en nuestro usuario (parte superior derecha -> Security Profile -> Users), la región por defecto donde se encuentran nuestras instancias y como queremos que se muestre la información de salida estándar (en una tabla, texto…):
$ aws configure AWS Access Key ID [None]: AK************ AWS Secret Access Key [None]: uTY************************ Default region name [None]: eu-west-1 Default output format [None]: text
Con esto ya tenemos configurada nuestra CLI de AWS para poder empezar a gestionar nuestra infraestructura.
Conectar por SSH a instancia EC2
Como comentaba antes, para conectar por ssh no utilizamos usuario y password sino la llave privada del Key Pair generado anteriormente. La llave se almacena en un fichero .pem que hemos descargado previamente. Así pues, esta es la forma de conectar donde ssh_labs es el archivo .pem con la private key, ec2-user es el usuario por defecto de las instancias y el resto es el host de conexión:
$ ssh -i ssh_labs.pem ec2-user@ec2-52-71-***-**.eu-west-1.compute.amazonaws.com
Debemos asegurarnos que la llave privada tiene los permisos restringidos para evitar este mensaje de advertencia que nos impide acceder:
@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: UNPROTECTED PRIVATE KEY FILE! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ Permissions 0644 for 'ssh_labs.pem' are too open. It is recommended that your private key files are NOT accessible by others. This private key will be ignored. bad permissions: ignore key: ssh_labs.pem Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
$ chmod 400 ssh_labs.pem
Cómo averiguar el ID de instancia, IP y su DNS público
Para evitar tener que acceder a la consola web de AWS para averiguar el ID de la instancia, su IP pública o nombre DNS, podemos utilizar la CLI. El parámetro «describe-instances» muestra información relativa a las instancias que tenemos en nuestra infraestructura. Podemos mostrar la salida en formato texto o tabla:
$ aws ec2 describe-instances --output table ----------------------------------------------------------------------------------- | DescribeInstances | +---------------------------------------------------------------------------------+ || Reservations || |+----------------------------------------+--------------------------------------+| || OwnerId | 22767******* || || ReservationId | r-300***** || |+----------------------------------------+--------------------------------------+| ||| Instances ||| ||+------------------------+----------------------------------------------------+|| ||| AmiLaunchIndex | 0 ||| ||| Architecture | x86_64 ||| ||| ClientToken | NEs***** ||| ||| EbsOptimized | False ||| ||| Hypervisor | xen ||| ||| ImageId | ami-8c****** ||| ||| InstanceId | i-e22***** ||| ||| InstanceType | t2.micro ||| ||| KeyName | ssh_labs ||| ||| LaunchTime | 2014-11-10T15:38:21.000Z ||| ||| PrivateDnsName | ip-172-31-2-29.eu-west-1.compute.internal ||| ||| PrivateIpAddress | 172.31.2.29 ||| ||| PublicDnsName | ec2-**-72-***-**.eu-west-1.compute.amazonaws.com ||| ||| PublicIpAddress | 54.72.***.** ||| ||| RootDeviceName | /dev/sda1 ||| ||| RootDeviceType | ebs ||| ||| SourceDestCheck | True ||| ||| StateTransitionReason | None ||| ||| SubnetId | subnet-ce798b97 ||| ||| VirtualizationType | hvm ||| [...]
Como podéis observar, así ya podemos sacar la IP pública de la instancia o el FQDN para poder conectarnos. En el caso de que tengamos muchas instancias podemos utilizar filtros, pudiendo filtrar por cualquiera de los Atributos y sus valores de la salida del comando anterior, ejemplo:
$ aws ec2 describe-instances --filters "Name=instance-type,Values=t2.micro" --output table
Ya tenemos todos los datos necesarios para conectar a nuestra instancia EC2, ya sea por IP pública o por host público DNS:
$ ssh -i ssh_labs.pem ec2-user@ec2-52-71-***-**.eu-west-1.compute.amazonaws.com
Estupenda entrada, muy útil. Me alegra que vuelvas con tan gran contenido.
Saludos desde Canarias.holiday