Creación de BD en Dynamo y RDS para AWS mediante SDK.

En esta publicación estoy creando clientes para EC2, DynamoDB, RDS y ElastiCache para crear una base de datos noSQL, llenar los datos, crear una BD relacional y un cache. Para ello también se necesitan crear grupos de seguridad.

Comienzo con los módulos requeridos para estar operaciones, así como de los clientes requeridos.

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

const {
CreateTableCommand,
DynamoDBClient
} = require('@aws-sdk/client-dynamodb');

const {
BatchWriteCommand,
DynamoDBDocumentClient
} = require('@aws-sdk/lib-dynamodb');

const {
RDSClient
} = require('@aws-sdk/client-rds');

const {
ElastiCacheClient
} = require('@aws-sdk/client-elasticache');

const paramsClient = {...};
const client = new EC2Client(paramsClient);
const clientDynamo = new DynamoDBClient (paramsClient);
const clientRDS = new RDSClient(paramsClient);
const clientElastic = new ElastiCacheClient(paramsClient);

A continuación creo el grupo de seguridad requerido. Ya en otras publicaciones de AWS con SDK lo he puesto

const paramsSecGp = {...};
const cmdSecPg = new CreateSecurityGroupCommand(paramsSecGp);
const dataSecGp = client.send(cmdSecGp);

const paramsRules = {...};
const cmdAuth = new AuthorizeSecurityGroupIngressCommand(paramsRules);
const dataAuth = client.send(cmdAuth);

Ahora procedo a crear la tabla en Dynamo DB y llenarla, así como también crear una BD relacional y un cache

const paramsCreateTable = {...};
const cmdCreateTable = new CreateTableCommand(paramsCreateTable);
const dataCreateTable = clientDynamo.send(cmdCreateTable);

const paramsPopulateTable = {...};
const cmdPopulate = new BatchWriteCommand(paramsPopulateTable);
const dataPopulate = clientDynamo.send(cmdPopulate);

const paramsDB = {...};
const cmdDB = new CreateDBInstanceCommand(paramsDB);
const dataDB = clientRDS.send(cmdDB);

const paramsRedis = {...};
const cmdRedis = new CreateCacheClusterCommand(paramsRedis);
const dataRedis = clientElastic.send(cmdRedis);

Lo interesante viene, la definición básica de los parámetros para cada comando

const paramsClient = {
  region: process.ev.AWS_REGION // string con el nombre de la región
};

const paramsSecGp = {
  Description: sgName, // string con la descripción del grupo
  GroupName: sgName // string con el nombre del grupo
};

const paramsRules = {
  GroupId: groupId, // string con el id del grupo
  IpPermissions: [
    {
      IpProtocol: protocol, // string con el nombre del protocolo
      FromPort: port, // entero positivo
      ToPort: port, // entero positivo
      IpRanges: [
        {
          CidrIp: '0.0.0.0/0' // string con la especificación de IPs
        }
      ]
    }
  ]
};

const attributeDefinition = {
  AttributeName: name, // string con el nombre del atributo
  AttributeType: type // string con el tipo de atributo (un caracter)
};

const keySchema = {
  AttributeName: name, // string con el nombre del atributo
  KeyType: type // string con el tipo de llave
}

const paramsCreateTable = {
  TableName: tableName, // string con el nombre del grupo
  AttributeDefinitions: [ attributeDefinition ], // lista de attributeDefinition
  KeySchema: [ keySchema ], // lista de keySchema
  ProvisionedThroughtput: {
    ReadCapacityUnits: readUnits, // entero positivo
    WriteCapacityUnits: writeUnits // entero positivo
  }
};

const paramsPopulateTable = {
  RequestItems: {
    [ tableName ]: data.map(i => { // "tableName" es lista de string con el nombre de las tablas
      return {
        PutRequest: {
          Item: i
        }
      }
    })
  }
};

const paramsDB = {
  AllocatedStorage: storage, // entero positivo
  DBInstanceClass: instanceClass, // string con el tipo de instancia
  SBInstanceIdentifier: dbName, // string con el nombre de la instancia para la BD
  Engine: engineName, // string con el nombre el motor, p. e.: 'mysql'
  DBName: dbName, // string con el nombre de la BD
  VpcSecurityGroupIds: [ secGpIds ], // lista de string con los nombres de grupos
  MasterUsername: userName, // string con el nombre de usuario
  MasterUserPassword: password // string con la contraseña
};

const paramsRedis = {
  CacheClusterId: clusterName, // string con el nombre del cache
  CacheNodeType: nodeType, // string con el tipo de nodos
  Engine: engine, // string con el nombre del motor
  NumCacheNodes: numNodes, // entero positivo
  SecurityGroupIds: [ secGpIds ] // lista de string con los nombres de los grupos
};

Comentarios

Entradas populares