AWS en la línea de comando

Amazon Web Services (AWS) es el mayor proveedor de nube pública y ha lanzado un conjunto de herramientas para ayudar a los administradores de sistemas y desarrolladores a integrarse con su infraestructura.

Las tres herramientas de las que hablaremos en este artículo son tres de las herramientas más utilizadas y conocidas de AWS:

  • botocore : biblioteca Python de bajo nivel
  • boto3 : biblioteca Python de alto nivel
  • awscli : interfaz de línea de comandos escrita en Python

Todas esas herramientas están actualmente disponibles en Fedora (22+) y EPEL (7).

Introducción a la CLI de AWS

Empecemos a analizar esta aplicación CLI que te permite hacer todo lo que puedes desde el Dashboard de Amazon (y más).

Para instalarlo, ejecute el siguiente comando en una terminal.

                      $ sudo dnf install awscli
                    

Dado que este programa instala bash y zsh shell complete, tendrá que reiniciar su shell para verlo funcionar, ya que ambos shells verifican los scripts de finalización automática solo cuando se inician.

En este punto, deberá configurar su cuenta. Si no tiene una cuenta de AWS, puede configurar una fácilmente siguiendo las guía oficial (tienen una bastante grande nivel libre para nuevos usuarios).

Si inicia sesión en su cuenta desde el panel y va a la página de IAM, puede ver su ID de clave de acceso de AWS y su clave de acceso secreta de AWS. También deberá asociar un conjunto de permisos para el usuario.

Una vez que haya encontrado las claves y asociado un conjunto de permisos, puede moverse a su terminal y continuar con la configuración de su AWS CLI.

                      $ aws configure
AWS Access Key ID [None]: 
                      
                        copy-and-paste-your-access-key
                      
                      
AWS Secret Access Key [None]: 
                      
                        copy-and-paste-your-secret-access-key-here
                      
                      
Default region name [None]:
Default output format [None]: 

                    

Para exampleel mio es:

                      aws configure
AWS Access Key ID [None]: XXXXXXXXXXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXX/XXXXXXXXXXXXXXXXXXXX/XXXXXXX
Default region name [None]: eu-central-1
Default output format [None]
                    

Podemos verificar si todo funcionó ejecutando este comando.

                      $ aws ec2 describe-instances --region eu-west-1
                    

Si algo salió mal, recibirá un error como:

                      A client error (UnauthorizedOperation) occurred when calling the DescribeInstances operation: You are not authorized to perform this operation.
                    

Esto significa que las credenciales que proporcionó a la CLI de AWS no tienen los permisos para el recurso requerido (en este caso, enumere las instancias EC2 en uso para la región).

eu-oeste-1

).

Si todo funcionó como se esperaba, debería recibir algo como:

                      {
    "Reservations": []
}
                    

Esto se debe a que aún no tiene ninguna instancia.

Redes de servicios web de Amazon

A diferencia del caso con otros proveedores, cuando crea una nueva cuenta de AWS, recibe una cuenta con muchas configuraciones ya implementadas. Esto debería ayudar a minimizar la cantidad de cosas que debe hacer antes de poder comenzar a usar sus servicios. Vamos a consultar la interfaz AWS CLI para averiguar cuáles necesitamos crear para nuestra primera instancia.

Para poder mojarse los pies en el mundo de AWS, es importante saber un par de cosas sobre los centros de datos y las redes de AWS.

Los centros de datos en el mundo de AWS no se muestran al usuario. El usuario solo puede ver las zonas de disponibilidad (AZ) y las regiones. Puede pensar en las zonas de disponibilidad como si fueran centros de datos únicos. En realidad, no se sabe si son centros de datos individuales (algunos son probablemente centros de datos únicos y otros no), pero se comportan de manera muy similar. Cada zona de disponibilidad debe comportarse de manera independiente de las demás para lograr una alta disponibilidad, pero están conectadas con otras zonas de disponibilidad en la misma región mediante conexiones privadas de baja latencia. Cada Región es un área geográfica y es completamente independiente de las otras Regiones. Las regiones no están conectadas directamente entre sí y utilizan conexiones (semi)públicas.

En cuanto a las redes, en el mundo de AWS existen Redes Privadas Virtuales (VPC) que se pueden comparar con las redes físicas. Puede tener varias VPC en cada región, incluso con IP en conflicto, porque cada VPC es una red completamente desconectada (a menos que las configure de esa manera). Cada VPC puede tener una o más subredes. Cada VPC no se extenderá entre regiones, mientras que las subredes están limitadas a zonas de disponibilidad únicas.

Para mapear su VPC actual, puede ejecutar:

                      $ aws ec2 describe-vpcs --region eu-west-1
                    

y recibirás como respuesta algo como lo siguiente:

                      {
    "Vpcs": [
        {
            "VpcId": "vpc-f295b597",
            "CidrBlock": "172.31.0.0/16",
            "IsDefault": true,
            "State": "available",
            "DhcpOptionsId": "dopt-4700ee22",
            "InstanceTenancy": "default"
        }
    ]
}
                    

Ya hay una VPC creada en la Región y utiliza las IP en la clase 172.31.0.0/16. También puede notar que esta VPC tiene una ID (vpc-xxxxxxxx). En AWS, todo tiene una ID y, por lo general, necesitará hacer referencia a objetos (en AWS, los objetos no tienen nombre, por lo que la única forma de hacer referencia a un objeto es usando su ID). Los ID se componen de forma semiconsistente, normalmente por [type]-[8 characters].

Para ver las subredes que tienes en la región, tienes que ejecutar:

                      $ aws ec2 describe-subnets --region eu-west-1
                    

Recibirá algo como el siguiente mensaje en respuesta.

                      {
    "Subnets": [
        {
            "State": "available",
            "AvailabilityZone": "eu-west-1c",
            "CidrBlock": "172.31.32.0/20",
            "VpcId": "vpc-f295b597",
            "SubnetId": "subnet-66301d5c",
            "MapPublicIpOnLaunch": true,
            "DefaultForAz": true,
            "AvailableIpAddressCount": 4091
        },
        {
            "State": "available",
            "AvailabilityZone": "eu-west-1b",
            "CidrBlock": "172.31.16.0/20",
            "VpcId": "vpc-f295b597",
            "SubnetId": "subnet-f37eeeaa",
            "MapPublicIpOnLaunch": true,
            "DefaultForAz": true,
            "AvailableIpAddressCount": 4091
        },
        {
            "State": "available",
            "AvailabilityZone": "eu-west-1a",
            "CidrBlock": "172.31.0.0/20",
            "VpcId": "vpc-f295b597",
            "SubnetId": "subnet-ba89f4cd",
            "MapPublicIpOnLaunch": true,
            "DefaultForAz": true,
            "AvailableIpAddressCount": 4091
        }
    ]
}
                    

Como puede ver, tenemos varias subredes (una por zona de disponibilidad). Al igual que para la VPC, las subredes también tienen ID (subnet-xxxxxxxx). Los ID de subred son muy importantes para crear una instancia EC2, porque cuando crea una EC2, debe decirle a Amazon en qué subred desea colocar la instancia.

Ejecutando su primera instancia a través de AWS CLI

Si desea ejecutar una instancia de Amazon EC2 (un nodo informático), puede hacerlo de forma gratuita, gracias a la Capa gratuita de AWS .

Para hacerlo desde la interfaz CLI, simplemente puede ejecutar:

                      $ aws ec2 run-instances --image-id ami-cf0cd3bc --count 1 --instance-type t1.micro --region eu-west-1 --subnet-id subnet-ba89f4cd
                    

Las API le darán una respuesta larga y detallada que se verá similar al siguiente formato.

                      {
    "OwnerId": "205092332101",
    "ReservationId": "r-020a8fbfb1f03e6d5",
    "Groups": [],
    "Instances": [
        {
            …
        }
    ]
}
                    

El resultado completo se eliminó del artículo, pero verá el resultado completo cuando ejecute el comando.

Las API le brindan mucha información sobre la instancia que se está creando. Un valor interesante que proporciona: close hasta el final de la respuesta— es el Estado. En el example, está pendiente. Esto se debe a que la respuesta al comando es inmediata, pero la instancia no se creará instantáneamente.

Listado de instancias activas

Ahora que tiene una instancia en ejecución, puede volver a ejecutar el primer comando que usamos en el artículo:

                      $ aws ec2 describe-instances --region eu-west-1
                    

y deberías recibir algo como esto:

                      {
    "Reservations": [
        {
            "ReservationId": "r-020a8fbfb1f03e6d5",
            "Groups": [],
            "Instances": [
                 …
            ],
            "OwnerId": "205092332101"
        }
    ]
}
                    

Una vez más, la salida se recortó, pero la tuya se verá mucho más larga.

Esta respuesta puede ser algo confusa, porque parece que enumera reservas en lugar de instancias. Esto se debe a la forma en que Amazon Web Services administra la facturación de las instancias.

Una cosa importante a tener en cuenta es que la Instancia tiene una ID en un formato diferente al estándar que hemos visto hasta ahora. se verá algo como

i-xxxxxxxx

.

Terminar una instancia con AWS CLI

Como tarea final de este tutorial, vamos a terminar (eliminar) la instancia que creamos. Para hacerlo, ejecute el siguiente comando.

                      $ aws ec2 terminate-instances --instance-ids i-02ea0ea7852a2ae86 --region eu-west-1
                    

Las API deben responder de la siguiente manera.

                      {
    "TerminatingInstances": [
        {
            "PreviousState": {
                "Code": 16,
                "Name": "running"
            },
            "CurrentState": {
                "Code": 32,
                "Name": "shutting-down"
            },
            "InstanceId": "i-02ea0ea7852a2ae86"
        }
    ]
}
                    

Ahora que hemos terminado la instancia, podemos volver a ejecutar el primer comando que usamos en el artículo una vez más.

                      $ aws ec2 describe-instances --region eu-west-1
                    

Deberíamos recibir algo como esto.

                      {
    "Reservations": [
        {
            "ReservationId": "r-020a8fbfb1f03e6d5",
            "Groups": [],
            "OwnerId": "205092332101",
            "Instances": [
                {
                    "StateTransitionReason": "User initiated (2016-02-25 16:01:23 GMT)",
                    "PrivateDnsName": "",
                    "ImageId": "ami-cf0cd3bc",
                    "LaunchTime": "2016-02-25T14:34:22.000Z",
                    "State": {
                        "Code": 48,
                        "Name": "terminated"
                    },
                    "VirtualizationType": "paravirtual",
                    "Monitoring": {
                        "State": "disabled"
                    },
                    "AmiLaunchIndex": 0,
                    "NetworkInterfaces": [],
                    "RootDeviceName": "/dev/sda",
                    "Architecture": "x86_64",
                    "SecurityGroups": [],
                    "ClientToken": "",
                    "RootDeviceType": "ebs",
                    "Placement": {
                        "AvailabilityZone": "eu-west-1a",
                        "Tenancy": "default",
                        "GroupName": ""
                    },
                    "EbsOptimized": false,
                    "KernelId": "aki-52a34525",
                    "InstanceType": "t1.micro",
                    "PublicDnsName": "",
                    "ProductCodes": [],
                    "StateReason": {
                        "Message": "Client.UserInitiatedShutdown: User initiated shutdown",
                        "Code": "Client.UserInitiatedShutdown"
                    },
                    "BlockDeviceMappings": [],
                    "Hypervisor": "xen",
                    "InstanceId": "i-02ea0ea7852a2ae86"
                }
            ]
        }
    ]
}
                    

Notará que la instancia no está en un estado “terminado” (por lo tanto, está en proceso de morir) y no la está pagando. Después de un tiempo, las instancias terminadas desaparecerán y volverá al punto de partida.

Imagen de cortesía Nicolás Raimundo publicado originalmente en Flickr como Nubes al atardecer – HDR

Related Posts