Creación de la infraestructura en Google Cloud

Objetivos

Utilizando una plantilla de terraform crea 2 instancias de máquina virtuales en tu proyecto en Google Cloud:

  1. Instancia para instalar Jenkins mediante un contenedor Docker.

  2. Instancia de despliegue (VM Deploy) con Docker y Docker Composer instalados.

terraform vm schema
Fig. 1. Máquinas virtuales creadas con Terraform

Estructura del proyecto terraform

Para crear las instancias, utiliza la plantilla de terraform disponible en el repositorio https://github.com/ualcnsa/terraformGoogleCloudSample. En primer lugar realiza un fork del repositorio, para hacer las modificaciones al mismo que sean necesarias. Después, sobre tu fork, modifica las variables correspondientes para usar tu proyecto en la plantilla, tal y como se describe a continuación.

El repositorio consta de tres archivos con extension .tf, y una carpeta con un template para la creación de instancias.

terraformGoogleCloudSample
├── instance
│   └── main.tf (4)
├── .gitignore
├── README.md
├── mynetwork.tf (2)
├── output.tf (3)
└── provider.tf (1)
1 Descripción del proveedor sobre el que ejecutar la plantilla, en nuestro caso Google Cloud.
2 Plantilla principal. Crea la red, las reglas de firewall, las 2 instancias llamando al módulo main.tf de la carpeta instance, y por último realiza la inicialización de cada instancia.
3 Plantilla con los valores que se muestran de salida al finalizar la ejecución
4 Módulo genérico para crear una instancia. Es llamado desde network.tf pasándole las variables que necesita para crear la instancia.

El archivo provider.tf deberás modificarlo:

provider.tf
# Descargar json con credenciales de aquí:
# https://console.cloud.google.com/apis/credentials/serviceaccountkey
# Tras ello definir la variable de entorno apuntando a el json
# export GOOGLE_CLOUD_KEYFILE_JSON=path/file.json

variable "gcp_project" {
  # Configurar el nombre del proyecto en GCP
  default = "cnsa-2022" (1)
}

terraform {
  required_providers {
    google = {
      source  = "hashicorp/google"
      version = "4.11.0"
    }
  }
}

provider "google" {
  project = var.gcp_project
  region  = "us-central1"
  zone    = "us-central1-c"
}
1 Sustituye este valor por el nombre de tu proyecto (cnsa2022-abc123)

Creación de la clave para la Cuenta de servicio

Para que terraform pueda conectar al provider Google Cloud desde tu máquina local, debes proporcionar clave para la Cuenta de servicio.

  • Seleccionar el proyecto Google Cloud.

  • En el menú de navegación seleccionar IAM y administración | Cuentas de servicio.

crear clave cuenta servicio
Fig. 2. Creación del archivo de credenciales Google Cloud
1 Selecciona el proyecto
2 Selecciona Crear Cuenta de Servicio

Da un nombre a la cuenta de servicio (p.e. terraform), y pulsa Crear y Continuar

crear clave cuenta servicio2
Fig. 3. Propiedades del archivo de credenciales Google Cloud

Selecciona el rol Administrador de Compute Engine (también es suficiente con Proyecto → Editor), y pulsa Continuar

crear clave cuenta servicio3
Fig. 4. Rol de administrador de la cuenta de servicio

Deja en blanco los siguiente campos, y pulsa Listo.

A continuación, accede a la cuenta de servicio recien creada:

crear clave cuenta servicio4
Fig. 5. Detalles de la nueva cuenta de servicio

Ve a la pestaña Claves, Agregar Claves, Crear nueva Clave.

crear clave cuenta servicio5
Fig. 6. Nueva clave de cuenta de servicio

Dejar JSON en el tipo de clave.

crear clave cuenta servicio6
Fig. 7. Nueva clave de cuenta de servicio JSON

Seleccionar Crear. A continuación se descargará la clave privada.

crear clave cuenta servicio7
Fig. 8. Nueva clave descargada

Guarda el archivo .json en la carpeta credentials del proyecto terraform. A continuación, en tu terminal define la variable de entorno apuntando a el archivo recién descargado, sustituyendo path/file.json por la ruta relativa y el nombre del archivo de credenciales:

export GOOGLE_CLOUD_KEYFILE_JSON=path/file.json

Recuerda: NUNCA subas tu archivo de credenciales json a un repositorio público como GitHub. Para evitarlo, añade el nombre el archivo de credenciales al .gitignore. Se recomienda guardar el archivo .json en una carpeta llamada credentials, porque ya estaría ignorado, puedes verlo en el .gitignore del repositorio que has forkeado.

En el archivo de credenciales va tu clave privada que sustituye a tu usuario y contraseña para crear recursos en GCP. Hay robots que continuamente analizan repositorios públicos de GitHub buscando PRIVATE KEYS y API TOKENS. Si un hacker accede a ese archivo, lo usará para crear servicios hasta agotar tu crédito por completo, fundamentalmente para minar bitcoins.

Ejecución de terraform

Videotutorial

Accede al videotutorial explicativo de esta sección (mp4, 20 minutos, 171M).

terraform init

Una vez configurado el provider comprueba que la conexión es correcta: en tu terminal, ejecuta el comando terraform init para inicializar el proyecto como un proyecto terraform. Si todo es correcto aparecerá un mensaje de éxito.

terraform init ok
Fig. 9. terraform init correcto

Si por el contrario recibes algún mensaje de error, revisa el motivo del error:

  1. Terraform puede que no esté accesible. Debería estar en el PATH

  2. Revisa si la variable de entorno si se ha guardado correctamente, ejecuta echo $GOOGLE_CLOUD_KEYFILE_JSON y comprueba que es la ruta y nombre de archivo correctos.

terraform plan

Ejecuta el comando terraform plan para ver el resultado de elementos que se crearán o eliminarán al ejecutar la plantilla. Debe aparecer que se crearán 7 elementos.

terraform plan ok
Fig. 10. terraform plan correcto

terraform apply

Ejecuta el comando terraform apply --auto-approve para ejecutar la plantilla. Comenzará a crear los 7 elementos definidos en la plantilla. Tardará unos 5 minutos o incluso más, así que ten paciencia. Sobre todo tardará en ejecutar los bloques de inicialización de las instancias, en las que se actualizan los paquetes, se instala Docker y otros paquetes. En todo momento verás en pantalla el log de las operaciones que se están realizando.

Si la primera vez que aplicas el plan aparece un mensaje de error`Error: …​ Error 403: Compute Engine API has not been used in project…​` es debido a que aun no se ha activado la API de Compute Engine en el proyecto. Haz clic en el enlace del error y activa la API. Espera un par de minutos y vuelve a lanzar terraform.

habilitar ComputeEngineAPI
Fig. 11. Habilitar la API de Compute Engine

Tras la ejecución, comprueba que las instancias se han creado correctamente en tu proyecto Google Cloud.

Apaga las instancias cuando dejes de usarlas, para evitar que consuman crédito.

terraform destroy

Cuando desees eliminar todos los recursos que hemos creado con esta plantilla, simplemente ejecuta terraform destroy. Por ahora debes simplemente apagar las instancias cuando no las uses, porque las necesitaremos en el resto de la asignatura.

Cloud DNS

Google Cloud ha asignado una IP pública estática a cada una de tus instancias (la IP no cambiará al apagar la instancia y volver a encenderla). A continuación, vamos a asignar nombres de DNS a esas IPs con Cloud DNS y uno de los servicios de DNS disponibles en el Student Pack de GitHub.

Alta de nombre de dominio

GitHub Student pack ofrece varios servicios de nombres dominios gratuitos durante 1 año. Puedes usar name.com, namecheap, o .tech domains. En uno de ellos vamos a dar de alta un nombre de dominio para nuestras instancias en Google Cloud. Voy a describir cómo hacerlo con .tech.

Accede a get.tech y prueba un nombre de dominio que te guste y que esté disponible. Cuando encuentres el adecuado, añadeló al carrito con la opción Buy for 1 year seleccionada.

tech domain disponible
Fig. 12. Comprobar si el dominio está disponible en get.tech

A continuación, inicia sesión con tu cuenta de github, y verás que tienes el descuento por un año. Procede a la compra gratuita. Además, tendrás que registrarte para poder acceder posteriormente a la configuración. Debes completar los datos de registro ya que te identifican como propietario del nombre de dominio. Si lo deseas, usa como dirección Universidad de Almería, Ctra. Sacramento s/n, 04120, Almería, Spain.

Configuración de nombres de dominio

Para configurar el nombre de dominio que acabas de adquirir a las IPs reservadas, debes usar Cloud DNS en Google Cloud. Cloud DNS permite asignar los nombres de dominio a las direcciones IP públicas de las instancias. Recuerda comprobar que las IPs son estáticas.

  1. En el menú de la consola de Google Cloud, entra en Servicios de red, Cloud DNS.

cloud dns
Fig. 13. Cloud DNS
  1. Haz clic en Crear Zona.

cloud dns crear zona
Fig. 14. Cloud DNS, crear zona
  1. A continuación, haz clic en Añadir Conjunto de registros. Para cada instancia, crea un conjunto de registros.

cloud dns crear conjunto de registros
Fig. 15. Cloud DNS. Crear conjunto de registros, instancia Jenkins
cloud dns crear conjunto de registros2
Fig. 16. Cloud DNS. Crear conjunto de registros, instancia de despliegue de apps

Tras la creación, debes tener un resultado similar a este:

cloud dns detalles zona
Fig. 17. Cloud DNS. Detalles de la Zona
  1. El último paso será modificar los servidores de DNS de la configuración en la web .tech, para poner los valores de los servidores de Google Cloud. Para ello, inicia sesión en get.tech. Entra en tu pedido.

get tech manage orders
Fig. 18. get.tech. Acceso al pedido
  1. Modifica los nombres de los servidores con los valores de tu zona en Cloud DNS

get tech manage servers
Fig. 19. get.tech. Nombres de los servidores
  1. Guarda los cambios. Hasta pasadas 24 horas no estarán disponibles.