Receta para el Caos: ¿Cómo aprovisionar un ambiente para experimentar con Gremlin en AWS con Terraform?

Yury Niño
5 min readJan 12, 2020

--

Cooking like Chaos Experimenting is a combination of art and science! Eso fue algo que se me ocurrió mientras cocinaba croquetas de arracacha con espinacas :) y es que preparar recetas de cocina y experimentar usando Ingeniería del Caos son actividades con varias cosas en común. En los dos casos se requiere imaginación, ingredientes frescos, un método juicioso y riguroso de ejecución, concentración, observabilidad, capacidad para resolver problemas en vivo y por supuesto fuego e inspiración.

Esta es una de mis recetas favoritas para experimentar con caos. Me gusta porque es como el café: para algunos es lo primero que se toma en la mañana; con los ingredientes disponibles, es fácil de preparar y da mucha energía. Esta receta está escrita en español por dos razones: no hay muchas en nuestro idioma y Ho Ming Li ya la escribió en inglés. A continuación se mencionan los ingredientes y las instrucciones para aprovisionar una instacia EC2 de AWS con Gremlin usando Terraform. Terraform tiene providers para Azure y GCP, así que un par de búsquedas en la documentación deberían permitir que se adapte a cualquiera de los dos.

Tiempo: 30 minutos.

Ingredientes:

  • Una máquina local con un sistema operativo basado en UNIX.
  • Una cuenta en AWS.
  • Una cuenta en Gremlin (con un Team ID y un Secret listos).
  • Terraform 12 instalado.
  • Aunque no es obligatorio, un AWS CLI instalado.

Instrucciones:

Paso 0: Verifique la instalación de Terraform

Si no tiene Terraform instalado, puede descargar el binario aquí. En una máquina local, verifique la instalación con el siguiente comando:

$ terraform
Usage: terraform [--version] [--help] <command> [args]
The available commands for execution are listed below.
The most common, useful commands are shown first, followed by
less common or more advanced commands. If you're just getting
started with Terraform, stick with the common commands. For the
other commands, please read the help and docs before usage.
Common commands:
apply Builds or changes infrastructure
console Interactive console for Terraform interpolations
<...>
$ terraform --version 
Terraform v0.12.7

Paso 1: Cree un ambiente VPC

Para evitar conflictos cuando se ejecuten los comandos de Terraform, cree dos carpetas: una para la especificación de la VPC y otra la especificación de la instacia EC2. En una máquina local ejecute los siguientes comandos:

$ mkdir -p ~/terraform/vpc ~/terraform/instance
$ cd ~/terraform/vpc

Dentro del directorio VPC, usando vim, cree el archivo vpc.tf. En el siguiente ejemplo reemplace los valores de los campos region, name, cidr, azs, public_subnets, owner, environment, name, y description con los su cuenta AWS.

$ vim vpc.tfprovider "aws" {
region = "us-west-2"
}
module "vpc" {
source = "terraform-aws-modules/vpc/aws"
name = "gremlin_vpc"
cidr = "10.10.0.0/16" azs = ["us-west-2a"]
public_subnets = ["10.10.1.0/24"]
tags = {
Owner = "your_name"
Environment = "chaos"
}
}
module "security_group" {
source = "terraform-aws-modules/security-group/aws"
name = "ssh"
description = "ssh from anywhere"
vpc_id = "${module.vpc.vpc_id}"
ingress_cidr_blocks = ["0.0.0.0/0"]
ingress_rules = ["ssh-tcp","all-icmp"]
egress_rules = ["all-all"]
}

El contenido del archivo vpc.tf de terraform usa un aws provider, para definir una VPC con una subnet pública y un security group que permite conexiones por SSH.

Corra los siguientes comandos de Terraform para inicializar y aplicar la especificación definida en el archivo vpc.tf

$ terraform init
$ terraform apply

Terraform le pedirá una confirmación y creará los recursos.

Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value:Apply complete! Resources: 12 added, 0 changed, 0 destroyed.

Tomé nota del Security Group ID (sg-xxxxxxxx) y la Subnet ID (subnet-xxxxxxxx) para el paso 2. Puede hacerlo a través de la consola web o del CLI de AWS.

That’s it! Tenemos nuestra VPC.

Paso 2: Aprovisione una instancia con un agente de Gremlin instalado.

Dentro del directorio instance, en la máquina local cree el archivo instance.tf que definirá la especificación de la instancia EC2. Copie la siguiente especificación reemplazando los valores: your_name, region, name, subnet_id, key_name, vpc_security_group_ids, y key_name con la información de su cuenta y los valores obtenidos en el paso anterior. En este ejemplo se está usando el security group sg-91155cee y la subnet-cbbd68b2

$ vim instance.tfprovider "aws" {
region = "us-west-2"
}
data "aws_ami" "amazon_linux" {
most_recent = true
filter {
name = "name"
values = [ "amzn-ami-hvm-*-x86_64-gp2", ]
}
filter {
name = "owner-alias"
values = [ "amazon" ]
}
}
module "ec2" {
source = "terraform-aws-modules/ec2-instance/aws"
instance_count = 1
name = "gremlin-instance"
ami = "${data.aws_ami.amazon_linux.id}"
associate_public_ip_address = true
instance_type = "t2.micro"
subnet_id = "subnet-cbbd68b2"
vpc_security_group_ids = ["sg-91155cee"]
key_name = "changeme"
user_data = "${file("userdata.sh")}"
tags = {
Owner = "your_name"
Environment = "chaos"
DeployFrom = "terraform"
}
}

Esta especificación define la creación de una instancia t2.micro EC2 Amazon Linux AMI, para ser lanzada en una subnet especificada con el security group especificado en el paso 1.

En este punto haremos uso de la cuenta en Gremlin, así que después de haberse registrado aquí, ingrese usando sus crendenciales y el nombre de la compañía que registró. Haga clic en la configuración de la cuenta y luego en el team que corresponda. Descargue un .zip llamado certificates.zip con las llaves pública y privada.

Add description

Descomprima el .zip y copie las llaves en un servidor que pueda ser accedido desde la instancia EC2 que va a aprovisionar. AWS S3 es una buena solución para este desafío.

En un siguiente paso, cree el archivo userdata.sh que tendrá los comandos en bash para instalar el agente de gremlin. Aquí una recomendación muy importante, no deje expuestas claves o llaves en el archivo. Copie el contenido que se muestra a continuación en el archivo y reemplace los valores de los campos: GREMLIN_TEAM_ID, GREMLIN_TEAM_CERTIFICATE, GREMLIN_TEAM_PRIVATE_KEY_OR_FILE.

#!/bin/bashyum update -ycurl https://rpm.gremlin.com/gremlin.repo -o /etc/yum.repos.d/gremlin.repoyum install -y gremlin gremlindexport INSTANCE_ID=$(curl -s http://169.254.169.254/latest/meta-data/instance-id)export GREMLIN_TEAM_ID=YOUR_TEAM_IDGREMLIN_TEAM_ID="3f242793-018a-5ad5-9211-fb958f8dc084"GREMLIN_TEAM_CERTIFICATE_OR_FILE="file:///var/lib/gremlin/your
companyname-client.pub_cert.pem"GREMLIN_TEAM_PRIVATE_KEY_OR_FILE="file:///var/lib/gremlin/yourcompanyname-client.priv_key.pem"
gremlin init -s autoconnect --tag instance_id=$INSTANCE_ID --tag owner=your_name

Este script agrega el repositorio de Gremlin, instala el cliente y el demonio, configura las variables de ambiente e inicia el agente.

Finalmente, aplique la especificación con Terraform, confirme la operación y disfrute de una instancia con Gremlin!

$ terraform init
$ terraform apply
module.ec2.aws_instance.this: Creation complete after 22s
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.

Paso 3: Lance un ataque desde la consola de gremlin

  1. Ingrese al panel de control de Gremlin.
  2. Haga clic en Create Attack.
  3. Seleccione un ataque de los que están disponibles.
  4. Seleccione la instancia que acaba de aprovisionar y lancé un asalto!

Serve & Enjoy!

Add description

Paso 4: Termine los recursos aprovisionados

En la máquina local, ejecute el comando de Terraform:

$ cd ~/terrafor/instance$ terraform destroyDo you really want to destroy?  Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value:Destroy complete! Resources: 1 destroyed.

Eso es todo!

Si encuentra un error en la redacción, los conceptos, los nombres de los ingredientes, los comandos, las especificaciones, por favor no dude en hacermelo saber :)

--

--

Yury Niño
Yury Niño

Written by Yury Niño

Cloud Infrastructure Engineer @Google. Chaos Engineer Advocate. Loves building software applications, DevOps, Security and SRE

No responses yet