Este artículo es una continuación de este anterior, en el que se desplegó una aplicación MERN sobre contenedores usando docker-compose.
Algunos de los pasos llevados a cabo en el presente artículo son inspirados en los seguidos por Umair Nadeem en este artículo.
Los pasos a desarrollar son los siguientes:
Desarrollar un boilerplate de aplicación MERN. (Artículo anterior)
Configurar docker-compose. (Artículo anterior)
3. Crear una instancia de EC2.
4. Copiar los archivos de proyecto a la instancia de EC2 y configurar instancia para docker-compose.
5. Crear una imagen (AMI) de la instancia para replicarla.
6. Desarrollar interfaz (botón) para automatizar despliegue de instancia basada en imagen.
3 Crear una instancia de EC2.
Para crear una instancia de EC2 se debe ingresar primero a la consola de AWS. Allí, en EC2 se pueden crear instancias:
Se escoge como imagen base Amazon Linux 2 AMI (HVM), SSD Volume Type
Se escoge el tipo de instancia, en este artículo solo se utilizarán instancias dentro de la capa gratuita de AWS:
Se dejan los detalles de instancias predeterminados y el almacenamiento predeterminado, las etiquetas son opcionales.
Ahora se configura el grupo de seguridad de la instancia. El grupo de seguridad de la instancia permite tráfico de entrada (inbound) y de salida (outbount) en los puertos especificados. En tanto que se está desarrollando un entorno de desarrollo MERN en la nube se necesitan configurar los siguientes puertos de entrada:
- 80 para HTTP.
- 8080 para el servidor de express del MERN app.
- 22 para acceder via SSH a la instancia
- 3000 para el cliente react del MERN app
En esta guía se llamará dev0 el grupo de seguridad:
Finalmente se lanza la instancia:
Se crea una nueva llave de seguridad, esta es la que permite el acceso a la instancia.
Finalmente, vemos la instancia mern_app_boilerplate0 corriendo en Instancias de EC2:
Para utilizar la llave de seguridad MyLinuxKP.pem se deben configurar su propietario con:
chown 400 MyLinuxKP.pem
4 Copiar los archivos de proyecto a la instancia de EC2 y configurar instancia para docker-compose.
Luego, se copian los archivos del boilerplate del app MERN del disco local a la instancia de EC2, usando su dirección IP pública:
scp -r -i MyLinuxKP.pem ~/path/to/your/project/folder/from/root ec2-user@54.89.125.233:~/
Luego de copiar los archivos a la instancia, se accede a ella a través de ssh con el siguiente comando:
ssh ec2-user@54.89.125.233 -i MyLinuxKP.pem
Ahora dentro de la instancia de EC2 se corren los siguientes 5 comandos:
sudo yum update
sudo yum install docker
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
Los comandos anteriores actualizan dependencias en la instancia, instalan docker y docker-compose.
Para iniciar el servicio de docker en la instancia se usa:
sudo service docker start
Para desplegar los contenedores se usa:
sudo docker-compose up --build
Se puede verificar el funcionamiento correcto del boilerplate al acceder a la instancia a través de los puertos de desarrollo (3000 y 8080)
5 Crear una imagen (AMI) de la instancia para replicarla.
En esta sección se creará una imagen de máquina de amazon (AMI) con base en la instancia anterior para automatizar su replicación. Para ello se accede al dashboard de instancias de EC2 y se crea una imagen a partir de la instancia en cuestión:
Instancia > Acciones > Imagen > Crear Imagen
Ahora se tiene una imagen de la instancia que se creó como boilerplate. Con base en esta imagen se pueden generar instancias identicas a la original en el momento de captura de la imagen.
Para lanzar una instancia a partir de la imagen desde la consola de AWS se selecciona la imagen como imagen base de la instancia:
Esto último, esto es, la creación de la instancia boilerplate a partir de la imágen es lo que se busca automatizar con un botón.
6 Desarrollar interfaz (botón) para automatizar despliegue de instancia basada en imagen.
Para desarrollar un botón en JavaScript para automatizar el despliegue de una instancia basada en una imagen de boilerplate, el primer paso es instalar el SDK de AWS para JavaScript:
npm install -save aws-sdk
Segundo, se tiene el siguiente script (provisto por Amazon aquí) para crear instancias de EC2 usando el SDK de AWS para JavaScript:
// Load the AWS SDK for Node.js
var AWS = require('aws-sdk');
// Load credentials and set region from JSON file
AWS.config.update({region: 'REGION'});
// Create EC2 service object
var ec2 = new AWS.EC2({apiVersion: '2016-11-15'});
// AMI is amzn-ami-2011.09.1.x86_64-ebs
var instanceParams = {
ImageId: 'AMI_ID',
InstanceType: 't2.micro',
KeyName: 'KEY_PAIR_NAME',
MinCount: 1,
MaxCount: 1
};
// Create a promise on an EC2 service object
var instancePromise = new AWS.EC2({apiVersion: '2016-11-15'}).runInstances(instanceParams).promise();
// Handle promise's fulfilled/rejected states
instancePromise.then(
function(data) {
console.log(data);
var instanceId = data.Instances[0].InstanceId;
console.log("Created instance", instanceId);
// Add tags to the instance
tagParams = {Resources: [instanceId], Tags: [
{
Key: 'Name',
Value: 'SDK Sample'
}
]};
// Create a promise on an EC2 service object
var tagPromise = new AWS.EC2({apiVersion: '2016-11-15'}).createTags(tagParams).promise();
// Handle promise's fulfilled/rejected states
tagPromise.then(
function(data) {
console.log("Instance tagged");
}).catch(
function(err) {
console.error(err, err.stack);
});
}).catch(
function(err) {
console.error(err, err.stack);
});
En esta función se cambian las constantes: 'AMI_ID', 'KEY_PAIR_NAME' y 'SDK Sample'.
El id del ami se obtiene en la consola de AWS navegando EC2 > IMAGES (AMIs) > Seleccionar AMI deseada > AMI ID
El 'KEY_PAIR_NAME' es el nombre de las credenciales que se usaran para acceder a la instancia, en este caso se tiene MyLinuxKP.pem
El 'SDK Sample' se cambia por el nombre que se le quiera poner a la instancia.
Finalmente, se añade la función al onClick de un botón en React:
Conclusiones
En este post se pudo ver como automatizar con un botón el despliegue de instancias de EC2 con el código base y la configuración (boilerplate) para desarrollar aplicaciones MERN y ejecutarlas usando docker-compose.
Top comments (0)