Creación de la infraestructura en Google Cloud
Utilizando una plantilla de terraform crea 2 instancias de máquina virtuales en tu proyecto en Google Cloud:
-
Instancia para instalar Jenkins mediante un contenedor Docker.
-
Instancia de despliegue (VM Deploy) con Docker y Docker Composer instalados.
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:
# 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.
| 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
Selecciona el rol Administrador de Compute Engine (también es suficiente con Proyecto → Editor), y pulsa Continuar
Deja en blanco los siguiente campos, y pulsa Listo.
A continuación, accede a la cuenta de servicio recien creada:
Ve a la pestaña Claves, Agregar Claves, Crear nueva Clave.
Dejar JSON en el tipo de clave.
Seleccionar Crear. A continuación se descargará la clave privada.
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 |
|
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
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 correctoSi por el contrario recibes algún mensaje de error, revisa el motivo del error:
-
Terraform puede que no esté accesible. Debería estar en el
PATH -
Revisa si la variable de entorno si se ha guardado correctamente, ejecuta
echo $GOOGLE_CLOUD_KEYFILE_JSONy 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 correctoterraform 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.
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. |
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.
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.
-
En el menú de la consola de Google Cloud, entra en Servicios de red, Cloud DNS.
-
Haz clic en Crear Zona.
-
A continuación, haz clic en Añadir Conjunto de registros. Para cada instancia, crea un conjunto de registros.
Tras la creación, debes tener un resultado similar a este:
-
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.
-
Modifica los nombres de los servidores con los valores de tu zona en Cloud DNS
-
Guarda los cambios. Hasta pasadas 24 horas no estarán disponibles.