Implementar Private Worker Pool en Cloud Build con Terraform

Objetos a crear:

  • Dirección IP Global: Reserva una dirección IP global para el rango de trabajadores del Cloud Build, utilizada en la configuración de red.
  • Conexión de Servicio de Red: Establece una conexión de red entre la red VPC del proyecto y los servicios de Google, facilitando la comunicación segura.
  • Configuración de Rutas de Peering: Define cómo se importan y exportan las rutas personalizadas entre la VPC y los servicios de Google, esencial para la gestión del tráfico de red.
  • Pool de Trabajadores de Cloud Build: Crea un pool de trabajadores privados para ejecutar tareas de construcción en un entorno controlado y seguro.

Otros:

  • APIs de GCP Habilitadas: Activación de servicios esenciales para el proyecto como Compute Engine, Service Usage, Cloud Resource Manager, Service Networking, Cloud Build e IAM.
  • Identidad de Servicio de Cloud Build: Genera una identidad de servicio específica para Cloud Build, asegurando la autenticación y autorización adecuadas para el servicio.
  • Permiso IAM: Asigna roles de IAM a la cuenta de servicio de Cloud Build para utilizar el pool de trabajadores privados, permitiendo la ejecución segura de las construccion

Modulo de Terraform Registry

https://registry.terraform.io/modules/mdiloreto/cloud_build-private-worker_pool/google/1.1.3

Como llamar el codigo

module "cloud-build-private-worker-pool" {
  source  = "mdiloreto/cloud_build-private-worker_pool/google"
  project_id = var.project_id
  cb_region = var.region
  network = var.network
  network_id = var.network_id
  workerpool_name = var.workerpool_name
  alloc_range_address = var.alloc_range_address
  allocation_prefix_length = var.allocation_prefix_length
  cb_prefix_length = var.cb_prefix_length
  reserved_peering_ranges = var.reserved_peering_ranges
  workerpool_range_name = var.workerpool_range_name 
  peering_export_custom_routes = var.peering_export_custom_routes
  peering_import_custom_routes = var.peering_import_custom_routes
}

Prerrequisitos

Crear Service Account para Terraform

Primero debemos asegurarnos que de haber creado una Service Account para autenticarnos a GCP con Terraform.

Si aun no lo implementaste, te recomiendo que veas el siguiente blog post:

Habilitar Service Usage API

Habilitar la API de Service Usage en el proyecto:

Habilitar Cloud Resource Manager API

Habilitar la Resource Manager API:

Escenarios posibles

Para ejecutar este módulo de Terraform, hay tres escenarios posibles relacionados con la configuración de la Red Virtual Privada (VPC) en Google Cloud Platform (GCP). Cada escenario tiene sus propios requisitos y consideraciones previas para la correcta implementación del módulo. A continuación, se detallan cada uno de estos escenarios:

VPC Preexistente (fuera de Terraform):

  • Descripción: En este escenario, ya existe una VPC configurada manualmente o mediante otro método fuera de Terraform antes de ejecutar el módulo. La VPC debe estar en el mismo proyecto de GCP donde se planea implementar el módulo.
  • Consideraciones: Es crucial que la VPC esté correctamente configurada con las subredes y las reglas de firewall necesarias para permitir el tráfico hacia y desde los recursos que el módulo creará o utilizará. Esto asegura que el pool de trabajadores de Cloud Build y las conexiones de red funcionen sin problemas.

VPC Preexistente con Acceso a Servicios Privados Habilitado:

  • Descripción: Similar al primer escenario, pero con la adición de que la VPC ya tiene habilitado el Acceso a Servicios Privados (Private Services Access). Esto permite que la VPC se comunique con servicios gestionados de Google Cloud, como Cloud SQL, de forma privada, sin exponer el tráfico a Internet.
  • Consideraciones: La habilitación del Acceso a Servicios Privados es fundamental si el módulo necesita interactuar con servicios gestionados de Google Cloud. Además, se debe verificar que las configuraciones de peering y las rutas estén correctamente establecidas para garantizar la comunicación privada.

Sin VPC Preexistente:

  • Descripción: En este escenario, no existe una VPC configurada previamente. El módulo de Terraform necesitará crear una nueva VPC como parte de su ejecución.
  • Consideraciones: Este escenario requiere que el módulo incluya recursos adicionales de Terraform para la creación y configuración de la VPC, incluidas las subredes y las reglas de firewall adecuadas. Esto puede aumentar la complejidad del módulo pero ofrece la flexibilidad de configurar la red de acuerdo con las necesidades específicas del entorno y los servicios que se van a desplegar.

VPC Preexistente con Acceso

Importante

Debido a limitaciones del Provider de GCP, no tenemos forma de solo agregar nuestro Range a una conexión existente. Por este motivo en versiones de Google-beta 4.x provider, pasaremos a tomar ownership total del recurso “Private connections to services”.

Esto quiere decir que cuando destruyamos nuestros recursos de Terraform, este objeto TAMBIEN SERÁ DESTRUIDO.

Por este motivo tenemos que tener MUCHO CUIDADO a la hora de realizar estas manipulaciones en nuestro entorno productivo.

Para chequear si tenemos PRIVATE SERVICES ACCESS habilitado es lo siguiente:

¿Cómo configurar nuestro modulo de terraform con VPC preexistente y Servicios Privados Habilitado?

Para configurar nuestro modulo con VPC preexistente debemos utilizar el siguiente codigo:

module "cloud-build-private-worker-pool" {
  source  = "mdiloreto/cloud_build-private-worker_pool/google"
  project_id = var.project_id
  cb_region = var.region
  network = var.network
  network_id = var.network_id
  workerpool_name = var.workerpool_name
  alloc_range_address = var.alloc_range_address
  allocation_prefix_length = var.allocation_prefix_length
  cb_prefix_length = var.cb_prefix_length
  reserved_peering_ranges = var.reserved_peering_ranges
  workerpool_range_name = var.workerpool_range_name 
  peering_export_custom_routes = var.peering_export_custom_routes
  peering_import_custom_routes = var.peering_import_custom_routes

}

tfvars:

module "cloud_build_private_worker_pool" {
  source = "mdiloreto/cloud_build-private-worker_pool/google"
  project_id                = "your-project-id"
  cb_region                 = "us-central1"
  network                   = "your-vpc-network"
  network_id                = "projects/your-project-id/global/networks/your-vpc-network"
  workerpool_name           = "your-worker-pool-name"
  alloc_range_address       = "172.16.0.0"
  allocation_prefix_length  = "24"
  cb_prefix_length          = "26"
  reserved_peering_ranges   = ["cloud-build-allocation", "another-reserved-range"]
  workerpool_range_name     = "cloud-build-allocation"
  peering_export_custom_routes = true
  peering_import_custom_routes = false
}

reserved_peering_ranges:

  • Esta variable es una lista en donde debemos colocar el nuevo IP Allocation y los preexistentes.

Sin VPC Preexistente:

Cuando no existe una VPC preexistente, debemos crearla a través de nuestro codigo de terraform:

resource "google_compute_network" "vpc_network" {
  project = var.project_id
  name = var.network
  auto_create_subnetworks = false
}

resource "google_compute_subnetwork" "vpc_network" {
  project       = var.project_id
  name          = var.subnet
  ip_cidr_range = var.subnet_ip_range
  region        = var.region
  network       = google_compute_network.vpc_network.id

}

module "cloud-build-private-worker-pool" {
  source  = "mdiloreto/cloud_build-private-worker_pool/google"
  project_id = var.project_id
  cb_region = var.region
  network = var.network
  network_id = var.network_id
  workerpool_name = var.workerpool_name
  alloc_range_address = var.alloc_range_address
  allocation_prefix_length = var.allocation_prefix_length
  cb_prefix_length = var.cb_prefix_length
  reserved_peering_ranges = var.reserved_peering_ranges
  workerpool_range_name = var.workerpool_range_name 
  peering_export_custom_routes = var.peering_export_custom_routes
  peering_import_custom_routes = var.peering_import_custom_routes
}


Posted

in

, , ,

by

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.