Automatización de la administración de AWS EC2 con Java

En este artículo, aprenderemos a usar el SDK de Java de AWS para crear una instancia EC2, iniciar, detener y reiniciar la instancia, y realizar una copia de seguridad en una imagen.

Introducción

Uno de los servicios más populares disponibles en Amazon Web Services es EC2, que significa Elastic Compute Cloud. EC2 facilita a los desarrolladores y usuarios la creación y administración de máquinas virtuales alojadas en la nube, también conocidas como instancias EC2.

EC2 proporciona una interfaz web que facilita la puesta en marcha y el trabajo con instancias de VM, lo que incluye configuración, autenticación, conexión, mantenimiento, almacenamiento, escalado y más.

Además de crear y trabajar con el servicio EC2 a través de la interfaz web, AWS proporciona SDK que permiten realizar operaciones de VM directamente desde el código.

En este artículo, analizaremos el uso de Java SDK y API para crear una instancia EC2, iniciar y detener la instancia, reiniciarla, realizar una copia de seguridad en una imagen y restaurarla desde la copia de seguridad.

Configure las credenciales de AWS para el SDK de Java

Comencemos aprendiendo cómo crear un conjunto de credenciales de AWS, que son necesarias para acceder a AWS y realizar llamadas a la API a través del SDK. La forma más sencilla de hacerlo es iniciar sesión en la consola de AWS y crear un nuevo rol de IAM (Administración de identidad y acceso).

Siga estos pasos para hacer esto:

  1. Inicie sesión en la Consola de AWS.

  2. Haga clic en el menú Servicios en la parte superior izquierda de la pantalla, busque IAM y haga clic en la opción desplegable que aparece.

AWS IAM Services Menu

  1. Bajo el encabezado Estado de seguridad, expanda la opción Crear usuarios individuales de IAM y haga clic en el botón Administrar usuarios.

AWS IAM Manage Users

  1. Haga clic en el botón Agregar usuario.

  2. Ingrese el nombre de usuario para su nuevo usuario de IAM y marque la casilla de Acceso programático.

AWS IAM User Details

  1. Haga clic en el botón Siguiente: Permisos y luego seleccione Adjuntar políticas existentes directamente.

  2. Escriba EC2 en el cuadro de búsqueda y, en los resultados, marque la casilla de AmazonEC2FullAccess.

AWS IAM EC2 Permissions

  1. Haga clic en el botón Siguiente: Etiquetas, luego haga clic en el botón Siguiente: Revisar.

  2. Revise la configuración de usuario de IAM y haga clic en el botón Crear usuario.

  3. Accederá a una página de confirmación, donde puede copiar el ID de la clave de acceso y la Clave de acceso secreta, que son las credenciales que utilizará para acceder a la API de AWS a través de la SDK de Java.

De manera predeterminada, el SDK buscará las credenciales en el Archivo de perfil de credenciales predeterminado, que es un archivo que normalmente se encuentra en ~/.aws/credentials en su máquina local. Deberá crear este archivo usted mismo y agregarle las credenciales de IAM.

Para configurar esto usted mismo, cree el nuevo archivo ~/.aws/credentials y agregue los siguientes contenidos, reemplazando la clave de acceso y la clave secreta con los valores de su usuario de IAM recién creado en la consola de AWS:

1
2
aws_access_key_id = YOUR_ACCESS_KEY_ID
aws_secret_access_key = YOUR_SECRET_ACCESS_KEY

Cree un archivo de región predeterminado para que lo use el SDK de AWS agregando un nuevo archivo llamado ~/.aws/config con el siguiente contenido (puede reemplazar la región con una más cercana a donde viven sus usuarios para un rendimiento óptimo):

1
region = US_WEST_2

El entorno local ahora debe configurarse para que AWS Java SDK se autentique correctamente.

Instalación del SDK con Maven

Si está utilizando Maven, agregue la siguiente dependencia para incluir el SDK de Java de AWS:

1
2
3
4
5
<dependency>
    <groupId>com.amazonaws</groupId>
    <artifactId>aws-java-sdk-ec2</artifactId>
    <version>${version}</version>
</dependency>

O, si estás usando Gradle:

1
compile group: 'com.amazonaws', name: 'aws-java-sdk', version: '${version}'

Ahora, en lugar de solo la dependencia de EC2, puede usar aws-java-sdk, que es el SDK completo. Hay muchas dependencias en todo el SDK - 219, para ser exactos, por lo que si solo usa EC2, no es necesario descargarlas todas.

Creación de una instancia EC2

El SDK de AWS Java para EC2 proporciona varias clases que se pueden utilizar para crear una nueva instancia. Estos se encuentran en la biblioteca software.amazon.awssdk. Estas clases son:

  • Región: representa una región de alojamiento de AWS para realizar las operaciones del SDK.
  • Ec2Client: se utiliza para instalar y configurar un cliente para conectarse a AWS EC2 a través de servicios web.
  • InstanceType: representa un tipo/tamaño de instancia de VM como T2.MICRO.
  • RunInstancesRequest: representa una solicitud web para crear instancias EC2.
  • RunInstancesResponse: representa una respuesta web del servicio AWS EC2 después de la creación de la instancia.

Veamos cómo podemos usarlos para crear una instancia EC2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
Region region = Region.US_WEST_2;
String amiId = "ami-0e34e7b9ca0ace12d";

Ec2Client ec2 = Ec2Client.builder()
        .region(region)
        .build();

RunInstancesRequest runRequest = RunInstancesRequest.builder()
        .imageId(amiId)
        .instanceType(InstanceType.T1_MICRO)
        .maxCount(1)
        .minCount(1)
        .build();

RunInstancesResponse response = ec2.runInstances(runRequest);

Aquí, configuramos una “Región” en una región cercana a los usuarios finales para un rendimiento óptimo. Si no se especifica una Región mediante programación, se utiliza la región predeterminada de ~/.aws/config.

Luego, hemos especificado nuestra AMI en un String. Este es un identificador único para la imagen de la máquina que estamos usando y se puede obtener en la consola de AWS.

Con esos dos en su lugar, instanciamos un objeto Ec2Client y configuramos la región. Después de eso, usando la clase RunInstancesRequest, completamos la información para una solicitud.

La solicitud se envía a través del método runInstances() y la respuesta se empaqueta en una instancia RunInstancesResponse.

Después de esto, la instancia se puede ver en la consola de AWS:

Instancia de AWS EC2 ejecutándose en consola

Manipulemos ahora la instancia que creamos, comenzando por iniciarla y detenerla.

Iniciar y detener una instancia {#iniciar y detener una instancia}

Sobre la base de las clases utilizadas en el ejemplo anterior, y de la misma manera, para enviar solicitudes de inicio y detención de una instancia, tenemos:

  • StartInstancesRequest: representa una solicitud web para iniciar instancias EC2.
  • StopInstancesRequest: representa una solicitud web para detener instancias EC2.

Veamos cómo podemos usar estas dos clases para iniciar y detener una instancia EC2:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
Region region = Region.US_WEST_2;
String instanceId = "i-025dea8c69e83bb61";

Ec2Client ec2 = Ec2Client.builder()
        .region(region)
        .build();

StartInstancesRequest request = StartInstancesRequest.builder()
        .instanceIds(instanceId)
        .build();

ec2.startInstances(request);

StopInstancesRequest request = StopInstancesRequest.builder()
        .instanceIds(instanceId)
        .build();

ec2.stopInstances(request);

Establecimos la Región y tomamos nota de nuestra ID de instancia. Luego, construimos un Ec2Client, como la última vez.

Finalmente, hemos formulado un StartInstancesRequest con el ID de la instancia y lo enviamos a través del método startInstances().

La StopInstancesRequest se construye exactamente de la misma manera y se envía a través del método stopInstances().

Después de iniciar o detener una instancia EC2 de esta manera, el nuevo estado de la instancia debería estar visible en la consola de AWS EC2.

Para mayor comodidad, las acciones de inicio y detención se pueden realizar en una sola solicitud de reinicio.

Reinicio de una instancia

De la misma manera, se nos presenta la clase RebootInstancesRequest:

  • RebootInstancesRequest: representa una solicitud web para iniciar instancias EC2.

Veamos cómo podemos construir una solicitud para reiniciar una instancia:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
Region region = Region.US_WEST_2;
String instanceId = "i-025dea8c69e83bb61";

Ec2Client ec2 = Ec2Client.builder()
        .region(region)
        .build();

RebootInstancesRequest request = RebootInstancesRequest.builder()
        .instanceIds(instanceId)
        .build();

ec2.rebootInstances(request);

Establecimos Region e instanceId y construimos un Ec2Client.

Usando el método builder() de RebootInstancesRequest, construimos una solicitud con solo instanceId.

La solicitud se envía a través del método rebootInstances(), después de lo cual, la instancia se reinicia.

A continuación, analizaremos la automatización de la tarea común de realizar una copia de seguridad de una instancia EC2 existente en una AMI. También discutiremos cómo restaurar la imagen a una nueva instancia EC2.

Copia de seguridad de una instancia en una AMI (imagen de Amazon Machine)

Al igual que con las tareas anteriores, esta también se realiza con una solicitud. Para construir solicitudes para realizar copias de seguridad de instancias en imágenes, tenemos:

  • CreateImageRequest: Representa una solicitud web para crear una nueva AMI.

Veamos cómo podemos usar la clase CreateImageRequest para hacer una copia de seguridad de una imagen basada en una instancia existente:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
Region region = Region.US_WEST_2;
String instanceId = "i-025dea8c69e83bb61";

Ec2Client ec2 = Ec2Client.builder()
        .region(region)
        .build();

CreateImageRequest request = CreateImageRequest.builder()
        .instanceId(instanceId)
        .name("newimage")
        .build();

ec2.createImage(request);

Después de crear una nueva AMI a partir de una instancia EC2 existente de esta manera, la nueva AMI será visible en el enlace IMÁGENES > AMIs en la barra lateral derecha de la consola de EC2.

Restaurar una instancia desde una AMI

Afortunadamente, restaurar esta AMI para crear una nueva instancia es muy fácil, ya que aprendimos cómo crear una nueva instancia EC2 en el primer ejemplo de este artículo.

Todo lo que tenemos que hacer es reemplazar la cadena amiId (que originalmente encontramos en la AMI deseada en la consola de AWS) con la ID de AMI de la nueva AMI personalizada que creamos:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
Region region = Region.US_WEST_2;
String amiId = "created_ami";

Ec2Client ec2 = Ec2Client.builder()
        .region(region)
        .build();

RunInstancesRequest runRequest = RunInstancesRequest.builder()
        .imageId(amiId)
        .instanceType(InstanceType.T1_MICRO)
        .maxCount(1)
        .minCount(1)
        .build();

RunInstancesResponse response = ec2.runInstances(runRequest);

Esto nos permitirá utilizar nuestra AMI personalizada como plantilla para crear la nueva instancia EC2 en lugar de la AMI de AWS lista para usar de su mercado.

Conclusión

En este artículo, discutimos cómo instalar y configurar AWS SDK para Java, específicamente para el servicio EC2.

Cubrimos la configuración de las credenciales para la autenticación del SDK de AWS y agregamos las dependencias requeridas mediante Maven. También detallamos el código Java para algunas operaciones EC2 comunes, como crear una nueva instancia, detener/iniciar la instancia, reiniciar la instancia y realizar una copia de seguridad/restauración de la instancia desde una AMI.

Sobre el autor

Este artículo fue escrito por Jacob Stopak, un desarrollador de software y consultor apasionado por ayudar a otros a mejorar sus vidas a través del código. Jacob es el autor de la Guía de Baby Bitcoin para desarrolladores, un libro que se sumerge en el código de Bitcoin para ayudar a los desarrolladores curiosos. entender cómo funciona Bitcoin bajo el capó.