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
Publicar un comentario