AWS: Balanceador de carga y grupo de autoescalamiento.

Para crear load balancers y Auto scaling groups se requieren ciertos comandos que a continuación detallo comenzando por las referencias o requires.

const {
  CreateLaunchTemplateCommand
} = require('@aws-sdk/client-ec2');

const {
  CreateListenerCommand,
  CreateLoadBalancerCommand,
  CreateTargetGroupCommand
} = require('@aws-sdk/client-elastic-load-balancing-v2');

const {
  CreateAutoScalingGroupCommand,
  PutScalingPolicyCommand,
  AdjustmentType
} = require('@aws-sdk/client-auto-scaling');

const paramsClient = {...};
const client = new EC2Client(paramsClient);
const clientIAM = new IAMClient(paramsClient);

Antes de crear el load balancer y el Auto scaling group hay que crear un grupo de seguridad y asignar una política al mismo

const profileName = RoleName_Profile; // string con el nombre del rol-perfil

const paramsRole = {...};
const cmdCreateRole = new CreateRoleCommand(paramsRole);
const dataRole = clientIAM.send(cmdCreateRole);

const paramsPolicy = {...};
const cmdAttachPolicy = new AttachRolePolicyCommand(paramsPolicy);
const dataAttach = clientIAM.send(cmdAttachPolicy)

const paramsIp = {...};
const cmdIP = new CreateInstanceProfileCommand(paramsIp);
const dataIP = clientIAM.send(cmdIP);

const paramsAddIP = {...};
const cmdAddRole = new AddRoleToInstaceProfileCommand(paramsAddIP);
const dataAddRole = clientIAM.send(cmdAddRole);

Ahora hay que crear la Launch Template con su Security group requerida por el Load balancer

const profileArn = await dataAddRole;

const paramsLaunchTemplate = {...};
const cmdLaunchTemplate = new CreateLaunchTemplateCommand(paramsLaunchTemplate);
const dataLaunchTemplate = clientIAM.send(cmdLaunchTemplate);

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

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

const paramsSecGp = {...};
const cmdSecGp = new CreateSecurityGroupCommand(paramsSecGp);
const dataSecGp = clientIAM.send(cmdSecGp); // esto se puede devolver mediante un "return"

Finalmente se debe crear el Load balancer con su Target group, su Listener y el Auto scaling group con su política.

const paramsTargetGp = {...};
const cmdTargetGp = new CreateTargetGroupCommand(paramsTargetGp);
const dataTargetGp = client.send(cmdTargetGp);

const paramsLoadBal = {...};
const cmdLoadBal = new CreateLoadBalancerCommand(paramsLoadBal);
const dataLoadBal = client.send(cmdLoadBal);

const paramsListener = {...};
const cmdListener = new CreateListenerCommand(paramsListener);
const dataListener = client.send(cmdListener);

const paramsAutoScalingGp = {...};
const cmdAutoScalingGp = new CreateAutoScalingGroupCommand(paramsAutoScalingGp);
const dataAutoScalingGp = client.send(cmdAutoScalingGp);

const paramsASGPolicy = {...};
const cmdASGPolicy = new PutScalingPolicyCommand(paramsASGPolicy);
const dataASGPolicy = client.send(cmdASGPolicy);

Ahora, al igual que en la entrada anterior, aquí pongo la descripción de los diferentes parámetros

const paramsClient = {
  region: process.env.AWS_REGION
};

const paramsRole = {
  RoleName: roleName, // string con el nombre del rol
  AssumeRolePolicyDocument = '{"Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "ec2.amazonaws.com" }, "Action": "sts:AssumeRole" } ]}' // string con datos de ejemplo.
};

const paramsPolicy = {
  PolicyArn: policyArn, // string con el ARN de la política
  RoleName: roleName // string con el nombre del rol
};

const paramsIp = {
  InstanceProfileName: profileName // string con el nombre del perfil de la instancia
};

const paramsAddIP = {
    InstanceProfileName: profileName, // string con el nombre del perfil
    RoleName: roleName // string con el nombre del rol
};

const paramsLaunchTemplate = {
  LaunchTemplateName: ltName, // string con el nombre de la plantilla
  LaunchTemplateData: {
    IamInstanceProfile: {
      Arn: profileArn // string ARN del perfil
    },
    ImageId: imageId, // string con el Id de la imagen
    InstanceType: instanceType, // string con tipo de instancia
    KeyName: keyName, // string con el nombre de las llaves
    SecurityGroupIds: [ sgIds ], // lista de string con los Ids de los grupos
    UserData: usrData // string base 64 con los comandos a ejecutar
  }
};

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

const paramsRules = {
  GroupId: dataSecGp.GroupId,
  IpPermissions: [
    {
      IpProtocol: protocol, // string con el protocolo
      FromPort: port, // entero positivo
      ToPort: port, // entero positivo
      IpRanges: [
        {
        CidrIp: '0.0.0.0/0'
        }
      ]
    }
  ]
};

const paramsTargetGp = {
  Name: tgName, // string con el nombre del grupo
  Port: port, // entero positivo
  Protocol: protocol, // string con el nombre del protocolo
  VpcId: vcpId // string con el Id de la VPC
};

const paramsLoadBal = {
  Name: lbName, // string con el nombre del balanceador
  SecurityGroups: [ sgId ], // lista de string con los Id de los grupos de seguridad
  Subnets: [ subnets ], // lista de string con las redes a utilizar
  type: applicationType // string con el tipo de aplicación
};

const paramsListener = {
  DefaultActions: [
    {
      TargetGroupArn: tgArn, // string con el ARN del grupo,
      Type: type // string con el tipo de grupo
    }
  ],
  LoadBalancerArn: lbArn, // string con el ARN del balanceador
  Port: port, // entero positivo
  Protocol: protocol // string con el protocolo
};

const paramsAutoScalingGp = {
  AutoScalingGroupName: asgName, // string con el nombre del grupo
  AvailabilityZones: [ aZones ], // lista de string con las zonas de disponibilidad
  LaunchTemplate: {
    LaunchTemplateName: ltName // string con el nombre de la plantilla
  },
  MaxSize: maxSize, // entero positivo
  MinSize: minSize, // entero positivo
  TargetGroupARNs: [ tgArn ] // lista de string con los ARN de los grupos
};

const paramsASGPolicy = {
  AdjustmentType: adjustmentType, // string con el tipo de ajuste
  AutoScalingGroupName: asgName, // string con el nombre del grupo
  PolicyName: policyName, // string con el nombre de la política
  PolicyType: policyType, // string con el tipo de política
  TargetTrakingConfiguration: {
    TargetValue: targetValue, // entero positivo
    PredefinedMetricSpecification: {
      PredefinedMetricType: predefinedMetricType // string con el tipo de
    }
  }
};

Comentarios

Entradas populares