Crear una instancia EC2 con CloudFormation

¿Qué es CloudFormation?

CloudFormation es el servicio de Amazon AWS que permite crear recursos de manera automática a partir de una plantilla escrita en JSON o YAML. Yo voy a utilizar JSON para añadir una nueva instancia EC2 dentro de un VPC que ya existe para no complicarlo demasiado y que se entienda mejor.

Podemos complicar las plantillas de CloudFormation todo lo que queramos.

Conocer el ID del VPC de AWS

Primero de todo, voy a mostrar el ID del VPC que ya tengo creado, así como los IDs del grupo de seguridad, subred a la que va a pertenecer la nueva instancia y la AMI que voy a utilizar para crearla.

Amazon AWS - VPC ID
Amazon AWS - AMI ID
Amazon AWS - Security Group ID
Amazon AWS - Subnet ID

Creación de la plantilla JSON para Cloud Formation

Una vez que ya tenemos los IDs de todos los recursos donde vamos a ubicar nuestra instancia, vamos a proceder a crear la plantilla en JSON para automatizar su creación con CloudFormation:

{
Pasamos como parámetro el ID del VPC
«Parameters» : {
«VPCID» : {
«Type» : «AWS::EC2::VPC::Id»,
«Description» : «Select Virtual Private Cloud ID»,
«Default» : «vpc-1c99ee7b«
},
Indicamos la subred donde va a estar ubicada la instancia
«Subnet» : {
«Type» : «List<AWS::EC2::Subnet::Id>»,
«Description» : «Availables subnets»,
«Default» : «subnet-a1a9dde8«
}
},
Creamos la instancia EC2 a partir de una AMI existente
«Resources» : {
«ec2prt53ws1test»: {
«Type»: «AWS::EC2::Instance»,
«Properties»: {
«AvailabilityZone»: «eu-west-1a»,
«ImageId»: «ami-0f787c3b4e39b11e7«,
«InstanceType»: «t2.small»,
«Tags»: [
{
«Key»: «Customer»,
«Value»: «Puerto53.com»
}
],
Definimos el grupo de seguridad
«NetworkInterfaces» : [{
«AssociatePublicIpAddress» : «true»,
«DeviceIndex» : «0»,
«DeleteOnTermination» : «true»,
«SubnetId» : «subnet-a1a9dde8»,
«GroupSet» : [ «sg-341e2b4c» ]
}]
}
}
}
}

Esta es una plantilla muy sencilla y faltan algunas cosas pero el objetivo es entender el funcionamiento de CloudFormation.

Despliegue de la plantilla de CloudFormation para crear los recursos de EC2 automáticamente

Una vez la tenemos creada, la subimos a un bucket S3 y lanzamos el Stack, que se encarga de crear en paralelo todos los recursos de AWS que acabamos de definir.

Entramos en el servicio CloudFormation y hacemos click en el botón «Create Stack».

Amazon AWS - Create Stack

Seleccionamos la URL de la plantilla que hemos subido al bucket S3.

Amazon AWS Create Stack Template URL

Aparecen los parámetros por defecto que hemos definido en la plantilla.

Amazon AWS - Create Stack - Parameters

Cuando hacemos click en el botón de creación del stack, vemos en la pestaña de eventos como se empiezan a crear cada uno de los recursos.

Amazon AWS - CloudFormation - Creating stack

Si vamos a la consola de EC2, veremos cómo nuestra instancia ya se está creando con los parámetros que hemos configurado.

Amazon AWS - CloudFormation - Instance EC2 Created

Finalmente, como esto sólo era un test de aprendizaje, elimino el stack, el cual, también elimina los recursos que hemos creado.

Uso de variables con CloudFormation

Imaginemos que ahora queremos poder elegir el tipo de instancia que queremos crear desde un desplegable con una serie de tipos de instancias a elegir:

CloudFormation Variable InstanceType

La plantilla JSON quedaría de la siguiente manera (marco en rojo donde definimos las variables y la referenciamos):

{
«Parameters» : {
«VPCID» : {
«Type» : «AWS::EC2::VPC::Id»,
«Description» : «Select Virtual Private Cloud ID»,
«Default» : «vpc-1c99ee7b»
},
«Subnet» : {
«Type» : «List<AWS::EC2::Subnet::Id>»,
«Description» : «Availables subnets»,
«Default» : «subnet-a1a9dde8»
},
«InstanceTypeParameter» : {
«Type» : «String»,
«Default» : «t2.small»,
«AllowedValues» : [«t2.small», «t2.micro», «m1.small», «m1.large»],
«Description» : «Enter t2.small, t2.micro, m1.small, or m1.large. Default is t2.small.»
}
},
«Resources» : {
«ec2prt53ws1test»: {
«Type»: «AWS::EC2::Instance»,
«Properties»: {
«ImageId»: «ami-0f787c3b4e39b11e7»,
«InstanceType»: { «Ref» : «InstanceTypeParameter» },
«Tags»: [
{
«Key»: «Customer»,
«Value»: «Puerto53.com»
}
],
«NetworkInterfaces» : [{
«AssociatePublicIpAddress» : «true»,
«DeviceIndex» : «0»,
«DeleteOnTermination» : «true»,
«SubnetId» : «subnet-a1a9dde8»,
«GroupSet» : [ «sg-341e2b4c» ]
}]
}
}
}
}

0&bids=507388
COMPÁRTEME

Deja un comentario