Manejo de instancias en AWS con SDK

Una instancia en Amazon Web Services (AWS) es algo así como un servidor donde podemos colocar nuestras aplicaciones. Se pueden crear y administrar mediante la consola web de servicios de Amazon. También mediante el SDK que proporciona para ello.

A continuación pongo una serie de comandos que permiten realizar esas tareas. Estarán como si fueran parte de una sola función en un único script.

Lo primero es el conjunto de requires necesarios.

const {
  EC2Client,
  AuthorizeSecurityGroupIngressCommand,
  CreateKeyPairCommand,
  CreateSecurityGroupCommand,
  RunInstancesCommand,
  DescribeInstancesCommand,
  TerminateInstancesCommand,
  CreateImageCommand
} = require('@aws-sdk/client-ec2');

const paramsClient = {...};
const client = new EC2Client(paramsClient); // la región en que se encontrarán las instancias.
const paramsSecGp = {...};
const cmdSecGp = new CreateSecurityGroupCommand(paramsSecGp);
const dataSecGp = client.send(cmdSecGp); // esto se puede devolver mediante un "return"
const paramsRule = {...}; // incluye el valor devuelto en dataSecGp.GroupId.
const cmdAuth = new AuthorizeSecurityGroupIngressCommand(paramsRule);
const dataAuth = client.send(cmdAuth);
const paramsKeyPair = {...};
const cmdKey = new CreateKeyPairCommand(paramsKeyPair);
const dataKey = client.send(cmdKey);
const paramsInstance = {...};
const cmdInstance = new RunInstanceCommand(paramsInstance);
const dataInstance = client.send(cmdInstance);

Hasta aquí estoy creando un objeto de un cliente de EC2 que se encarga del manejo de las instancias, creo un grupo de seguridad, el par de llaves, luego creo la instancia.

A continuación crearé una imagen de la instancia, estas imágenes se pueden utilizar para crear nuevas instancias que incluyan ya las dependencias y la aplicación correspondiente. Estas imágenes se pueden aprovechar para grupos de auto escalado y balanceadores de carga.

const paramsImg = {...};
const cmdImg = new CreateImageCommand(paramsImg);
const dataImg = client.send(cmdImg);

Ahora procedo a listar y terminar las instancias creadas.

const cmdList = new DescribeInstancesCommand({});
const dataList = client.send(cmdList);
const result = dataList.Reservations.reduce((item, reservation) => {
return item.concat(reservation.Instances); }, []);
const paramsTerminate = {...};
const cmdTerminate = new TerminateInstances(paramsTerminate);
const dataTerminate = client.send(cmdTerminate);

Terminado el código, describo la estructura de cada uno de los parámetros utilizados previamente.

paramsClient = {
  region: process.env.AWS_REGION
}

paramsSecGp = {
  Description: secGpDescription, // string con cualquier valor excepto NULL
  GroupName: secGpName // string con cualquier valor excepto NULL
}

paramsRule = {
  GroupId: dataSecGp.GroupId,
  IpPermissions: [
    {
      IpProtocol: protocolo, // string con el nombre del protocolo
      FromPort: puerto_inicial, // entero positivo
      ToPort: puerto_final, // entero positivo
      IpRanges: [
        {
          CidrIp: ip_con_mascara // string en formato '0.0.0.0/0'
        }
      ]
    } // pueden ser tantos como se necesiten
  ]
}

paramsKeyPair = {
  KeyName: keyName // string para identificar a las llaves generadas
}

paramsInstance = {
  ImageId: imgIdFromCatalog, // string obtenido desde el catálogo.
  InstanceType: instanceType. // string del tipo de instancia.
  KeyName: keyName,
  MaxCount: maxCount, // entero positivo. Máximo de instancias a crear
  MinCOunt: minCount, // entero positivo. Mínimo de instancias
  SecurityGroups: [ sgName ], // lista de strings con los nombres de
          // los grupos de seguridad.
  UserData: usrData // string base 64 con los comandos a ejecutar.
}

paramsImg = {
  InstanceId: seedInstanceId, // string id de la instancia base
  Name: imageName // string nombre de la imagen.
}

paramsTerminate = {
  instanceIds: [ instanceId ] // lista de string con los ids de las instancias
}

Comentarios

Entradas populares