En este instructivo, se explica cómo puedes usar Terraform para crear y ejecutar trabajos de procesamiento por lotes con un trabajo cron de Cloud Scheduler.
Terraform es una herramienta de código abierto que permite aprovisionar y administrar de tu infraestructura especificando el estado deseado en los archivos de configuración. Estos archivos se pueden tratar como código y almacenarse en sistemas de control de versión. como GitHub.
Aunque Terraform no tiene recursos para Batch, esta En este instructivo, se muestra cómo puedes usar Terraform para crear trabajos de Batch. Específicamente, puedes usar Terraform para programar y ejecutar un trabajo cron de Cloud Scheduler que se orienta a la API de Batch para crear y ejecutar trabajos de Batch. Cloud Scheduler es un servicio de Google Cloud que te permite programar trabajos cron automáticamente y admite Terraform.
Este instructivo está dirigido a usuarios de Batch que ya administran infraestructura con Terraform y quieres incorporar Trabajos por lotes en Terraform
Objetivos
- Crea un directorio de Terraform y un archivo de configuración que defina un trabajo cron de Cloud Scheduler que cree trabajos por lotes.
- Implementar la configuración de Terraform para ejecutar el trabajo cron
- Verifica que el trabajo cron cree trabajos por lotes.
- Actualiza la configuración de Terraform para pausar el trabajo cron para que deje de crear trabajos por lotes.
Costos
En este documento, usarás los siguientes componentes facturables de Google Cloud:
Para generar una estimación de costos en función del uso previsto, usa la calculadora de precios.
Cuando finalices las tareas que se describen en este documento, puedes borrar los recursos que creaste para evitar que continúe la facturación. Para obtener más información, consulta Cómo realizar una limpieza.
Antes de comenzar
-
Prepara tu entorno de desarrollo, ya sea Cloud Shell o un shell local:
Cloud Shell
Para usar una terminal en línea con gcloud CLI y Terraform ya está configurado, activa Cloud Shell.
Al final de esta página, se inicia una sesión de Cloud Shell y muestra un símbolo del sistema de la línea de comandos. La sesión puede tardar unos segundos en inicializarse.
Shell local
Para usar un entorno de desarrollo local, sigue estos pasos:
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- Instala Terraform.
-
Create or select a Google Cloud project.
-
Create a Google Cloud project:
gcloud projects create PROJECT_ID
Replace
PROJECT_ID
with a name for the Google Cloud project you are creating. -
Select the Google Cloud project that you created:
gcloud config set project PROJECT_ID
Replace
PROJECT_ID
with your Google Cloud project name.
-
-
Asegúrate de que la facturación esté habilitada para tu proyecto de Google Cloud.
-
Enable the Batch, Compute Engine, Cloud Logging, Cloud Scheduler, and Resource Manager APIs:
gcloud services enable batch.googleapis.com
compute.googleapis.com logging.googleapis.com cloudscheduler.googleapis.com cloudresourcemanager.googleapis.com -
Asegúrate de que tu proyecto tenga al menos una cuenta de servicio con el los permisos necesarios para este instructivo.
Específicamente, puedes usar la misma cuenta de servicio o dos cuentas de servicio a las cuentas de servicio otorgar los siguientes permisos:
- Permite que la tarea de cron cree trabajos por lotes y adjunte la cuenta de servicio para los trabajos por lotes.
- Permitir que los trabajos por lotes creen y accedan a la los recursos necesarios para ejecutarse.
Para asegurarte de que las cuentas de servicio de este instructivo tengan los elementos permisos para usar Terraform y crear trabajos por lotes a través de un trabajo cron de Cloud Scheduler, pídele a tu administrador que otorgue el acceso a las cuentas de servicio para este instructivo los siguientes roles de IAM:
-
Cuenta de servicio para el trabajo cron de Cloud Scheduler:
-
Editor de trabajos por lotes (
roles/batch.jobsEditor
) en el proyecto -
Usuario de cuenta de servicio (
roles/iam.serviceAccountUser
) en la cuenta de servicio para los trabajos por lotes (incluso si son en sí mismos)
-
Editor de trabajos por lotes (
-
Cuenta de servicio para los trabajos por lotes:
-
Informes del agente por lotes (
roles/batch.agentReporter
) en el proyecto -
Escritor de registros (
roles/logging.logWriter
) en el proyecto
-
Informes del agente por lotes (
Para obtener más información sobre cómo otorgar roles, consulta Administra el acceso a proyectos, carpetas y organizaciones.
Es posible que el administrador también pueda proporcionar a las cuentas de servicio para este instructivo. los permisos requeridos a través de la configuración rolesu otros predefinidos roles.
-
Asegúrate de tener los permisos necesarios para este instructivo.
En particular, necesitas permisos para hacer lo siguiente:
- Crea un trabajo cron y adjúntalo a la cuenta de servicio.
- Consulta y borra los trabajos cron y por lotes.
Para obtener los permisos que necesitas para usar Terraform y crear trabajos de lotes a través de un trabajo cron de Cloud Scheduler, pídele a tu administrador que te otorgue los siguientes roles de IAM:
-
Usuario de la cuenta de servicio (
roles/iam.serviceAccountUser
) en la cuenta de servicio del trabajo cron de Cloud Scheduler -
Administrador de Cloud Scheduler (
roles/cloudscheduler.admin
) en el proyecto -
Editor de trabajos por lotes (
roles/batch.jobsEditor
) en el proyecto -
Visor de registros (
roles/logging.viewer
) en el proyecto
Crea el directorio de Terraform y el archivo de configuración
Crea un directorio para Terraform y un archivo de configuración
que defina los recursos que deseas crear o actualizar con Terraform.
El archivo de configuración de ejemplo para este instructivo define una
Trabajo cron de Cloud Scheduler llamado batch-job-invoker
.
Cuando está habilitado, el trabajo cron batch-job-invoker
se ejecuta cada 5 minutos para crear una instancia nueva de la red
Trabajo por lotes.
Para crear un directorio y un nuevo archivo de configuración de Terraform (
.tf
) dentro de ese directorio, escribe el siguiente comando y, luego, presionaEnter
:mkdir terraform && cd terraform && cat > main.tf
Este comando crea el directorio
terraform
, te lleva a él y comienza a definir un nuevo archivo de configuraciónmain.tf
en la línea siguiente.Copia y pega la siguiente configuración de Terraform:
# define variables variable "project_id" { type = string description = "The project name to use." default = "PROJECT_ID" } variable "project_number" { type = string description = "The project number to use." default = "PROJECT_NUMBER" } variable "region" { type = string description = "The region where resources are created." default = "us-central1" } variable "cloud_scheduler_service_account_email" { type = string description = "The service account email." default = "CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL" } variable "batch_service_account_email" { type = string description = "The service account email." default = "BATCH_SERVICE_ACCOUNT_EMAIL" } # define a Cloud Scheduler cron job which triggers Batch jobs resource "google_cloud_scheduler_job" "batch-job-invoker" { paused = false # this cron job is enabled name = "batch-job-invoker" project = var.project_id region = var.region schedule = "*/5 * * * *" # when enabled, run every 5 minutes time_zone = "America/Los_Angeles" attempt_deadline = "180s" retry_config { max_doublings = 5 max_retry_duration = "0s" max_backoff_duration = "3600s" min_backoff_duration = "5s" } # when this cron job runs, create and run a Batch job http_target { http_method = "POST" uri = "https://batch.googleapis.com/v1/projects/${var.project_number}/locations/${var.region}/jobs" headers = { "Content-Type" = "application/json" "User-Agent" = "Google-Cloud-Scheduler" } # Batch job definition body = base64encode(<<EOT { "taskGroups":[ { "taskSpec": { "runnables":{ "script": { "text": "echo Hello world! This job was created using Terraform and Cloud Scheduler." } } } } ], "allocationPolicy": { "serviceAccount": { "email": "${var.batch_service_account_email}" } }, "labels": { "source": "terraform_and_cloud_scheduler_tutorial" }, "logsPolicy": { "destination": "CLOUD_LOGGING" } } EOT ) oauth_token { scope = "https://www.googleapis.com/auth/cloud-platform" service_account_email = var.cloud_scheduler_service_account_email } } }
Reemplaza lo siguiente:
PROJECT_ID
: el ID del proyecto de tu proyecto.PROJECT_NUMBER
: El número de proyecto de tu proyecto.CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL
: el correo electrónico de la cuenta de servicio que preparaste para el Trabajo cron de Cloud Scheduler.Por ejemplo, para usar Cuenta de servicio predeterminada de Compute Engine, especifica lo siguiente:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
BATCH_SERVICE_ACCOUNT_EMAIL
: La dirección de correo electrónico de la cuenta de servicio que preparaste para las tareas por lotes.Por ejemplo, para usar la cuenta de servicio predeterminada de Compute Engine, especifica lo siguiente:
PROJECT_NUMBER-compute@developer.gserviceaccount.com
Esta configuración de Terraform define algunas variables de entrada y un trabajo cron que se comunica con el método de la API para crear un trabajo por lotes.
Para guardar y cerrar el archivo, presiona
Ctrl+D
(oCommand+D
en macOS).
Implementa la configuración de Terraform para crear el trabajo cron
Implementa la configuración de Terraform a través de la inicialización y generación de
los cambios planificados y cómo se aplican. Después de implementar el comando
puedes describir los recursos de tu proyecto para verificar que
Terraform creó correctamente el trabajo cron batch-job-invoker
.
Inicializa Terraform en el directorio:
terraform init
El resultado es similar a este:
... Terraform has been successfully initialized! You may now begin working with Terraform. Try running "terraform plan" to see any changes that are required for your infrastructure. All Terraform commands should now work. If you ever set or change modules or backend configuration for Terraform, rerun this command to reinitialize your working directory. If you forget, other commands will detect it and remind you to do so if necessary.
Genera el plan de ejecución de Terraform según el estado actual de tu proyecto y el archivo de configuración:
terraform plan
El resultado es similar al siguiente, que muestra que el plan es Crea el trabajo cron
batch-job-invoker
:Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: + create Terraform will perform the following actions: # google_cloud_scheduler_job.batch-job-invoker will be created + resource "google_cloud_scheduler_job" "batch-job-invoker" { + id = (known after apply) + name = "batch-job-invoker" + paused = false + project = "PROJECT_ID" + region = "us-central1" + schedule = "*/5 * * * *" + state = (known after apply) + time_zone = "America/Los_Angeles" + http_target { + body = "..." + headers = { + "Content-Type" = "application/json" + "User-Agent" = "Google-Cloud-Scheduler" } + http_method = "POST" + uri = "https://batch.googleapis.com/v1/projects/PROJECT_NUMBER/locations/us-central1/jobs" + oauth_token { + scope = "https://www.googleapis.com/auth/cloud-platform" + service_account_email = "CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL" } } + retry_config { + max_backoff_duration = "3600s" + max_doublings = 5 + max_retry_duration = "0s" + min_backoff_duration = "5s" + retry_count = (known after apply) } } Plan: 1 to add, 0 to change, 0 to destroy. ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.
Si deseas aplicar el plan para crear la
batch-job-invoker
, sigue estos pasos:Ingresa el siguiente comando:
terraform apply
El resultado es similar al comando
terraform plan
anterior, excepto que finaliza con un mensaje de confirmación.Para confirmar y aplicar el plan, ingresa
yes
.El resultado es similar a este:
google_cloud_scheduler_job.batch-job-invoker: Creating... google_cloud_scheduler_job.batch-job-invoker: Creation complete after 0s [id=projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker] Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Para verificar que el trabajo cron
batch-job-invoker
exista y esté habilitado, haz lo siguiente: descríbelo:gcloud scheduler jobs describe batch-job-invoker --location us-central1
El resultado es similar a este:
attemptDeadline: 180s httpTarget: body: ... headers: Content-Type: application/json User-Agent: Google-Cloud-Scheduler httpMethod: POST oauthToken: scope: https://www.googleapis.com/auth/cloud-platform serviceAccountEmail: CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL uri: https://batch.googleapis.com/v1/projects/PROJECT_NUMBER/locations/us-central1/jobs lastAttemptTime: '...' name: projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker retryConfig: maxBackoffDuration: 3600s maxDoublings: 5 maxRetryDuration: 0s minBackoffDuration: 5s schedule: '*/5 * * * *' scheduleTime: '...' state: ENABLED status: {} timeZone: America/Los_Angeles userUpdateTime: '...'
En el resultado, verifica que el campo
state
esté configurado comoENABLED
.
Verifica que la tarea cron cree un trabajo por lotes
Verifica que se cree correctamente el trabajo cron batch-job-invoker
Trabajos por lotes.
Espera 5 minutos a que se ejecute el trabajo cron automáticamente o activar el trabajo cron para que se ejecute de inmediato:
gcloud scheduler jobs run batch-job-invoker --location us-central1
Enumera los trabajos por lotes que creó el trabajo cron
batch-job-invoker
:gcloud batch jobs list \ --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \ --sort-by ~createTime
- El
--filter labels.source=\"terraform_and_cloud_scheduler_tutorial\"
marca filtra la lista para incluir solo los trabajos por lotes que tienes una etiqueta con la clavesource
y el valorterraform_and_cloud_scheduler_tutorial
. - La marca
--sort-by ~createTime
ordena la lista de la más reciente a la más antigua.
- El
Actualiza la configuración de Terraform para pausar el trabajo cron
Una vez que tengas la cantidad deseada de trabajos por lotes,
actualiza y, luego, implementa la configuración de Terraform para pausar el
trabajo de cron batch-job-invoker
. Si deseas actualizar otras propiedades de la tarea de cron o de las tareas de Batch futuras, se aplica este mismo proceso.
Actualiza el archivo de configuración de Terraform para pausar la tarea cron. Para ello, establece el campo
paused
entrue
:sed -i 's/paused = false # this cron job is enabled/paused = true # this cron job is paused/g' main.tf
Genera el plan de ejecución de Terraform según el estado actual de tu proyecto y el archivo de configuración:
terraform plan
El resultado es similar al siguiente, que muestra que el plan es Actualiza el valor del campo
paused
defalse
atrue
:google_cloud_scheduler_job.batch-job-invoker: Refreshing state... [id=projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker] Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the following symbols: ~ update in-place Terraform will perform the following actions: # google_cloud_scheduler_job.batch-job-invoker will be updated in-place ~ resource "google_cloud_scheduler_job" "batch-job-invoker" { id = "projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker" name = "batch-job-invoker" ~ paused = false -> true # (6 unchanged attributes hidden) ~ http_target { ~ headers = { + "User-Agent" = "Google-Cloud-Scheduler" # (1 unchanged element hidden) } # (3 unchanged attributes hidden) # (1 unchanged block hidden) } # (1 unchanged block hidden) } Plan: 0 to add, 1 to change, 0 to destroy. ──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── Note: You didn't use the -out option to save this plan, so Terraform can't guarantee to take exactly these actions if you run "terraform apply" now.
Para aplicar el plan y actualizar la tarea cron de
batch-job-invoker
, sigue estos pasos:Ingresa el siguiente comando:
terraform apply
El resultado es similar al comando
terraform plan
anterior, excepto que finaliza con un mensaje de confirmación.Para confirmar y aplicar el plan, ingresa
yes
.El resultado es similar a este:
google_cloud_scheduler_job.batch-job-invoker: Modifying... [id=projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker] google_cloud_scheduler_job.batch-job-invoker: Modifications complete after 1s [id=projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker] Apply complete! Resources: 0 added, 1 changed, 0 destroyed.
Para verificar que el trabajo cron
batch-job-invoker
esté en pausa, descríbelo:gcloud scheduler jobs describe batch-job-invoker --location us-central1
El resultado es similar a este:
attemptDeadline: 180s httpTarget: body: ... headers: Content-Type: application/json User-Agent: Google-Cloud-Scheduler httpMethod: POST oauthToken: scope: https://www.googleapis.com/auth/cloud-platform serviceAccountEmail: CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL uri: https://batch.googleapis.com/v1/projects/PROJECT_NUMBER/locations/us-central1/jobs lastAttemptTime: '...' name: projects/PROJECT_ID/locations/us-central1/jobs/batch-job-invoker retryConfig: maxBackoffDuration: 3600s maxDoublings: 5 maxRetryDuration: 0s minBackoffDuration: 5s schedule: '*/5 * * * *' scheduleTime: '...' state: PAUSED status: {} timeZone: America/Los_Angeles userUpdateTime: '...'
En el resultado, verifica que el campo
state
esté configurado comoPAUSED
.
Limpia
Para evitar que se apliquen cargos a tu cuenta de Google Cloud por los recursos usados en este instructivo, borra el proyecto que contiene los recursos o conserva el proyecto y borra los recursos individuales.
Borra el proyecto
Borra un proyecto de Google Cloud:
gcloud projects delete PROJECT_ID
Ve al directorio superior y, luego, borra el directorio Terraform y todos sus archivos.
cd .. && rm -r terraform
Borra los recursos individuales
Borra el trabajo cron
batch-job-invoker
.terraform destroy
Para borrar todos los trabajos por lotes de este instructivo, sigue estos pasos:
Enumerar todos los trabajos por lotes que creó el Trabajo cron
batch-job-invoker
:gcloud batch jobs list \ --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \ --sort-by ~createTime
Registra el nombre de cada trabajo que debes borrar.
Borra un trabajo por lotes de este instructivo:
gcloud batch jobs delete JOB_NAME --location us-central1
Reemplaza
JOB_NAME
por el nombre de un Trabajo por lotes.Repite este paso para todas las tareas por lotes.
Si creaste una cuenta de servicio para este instructivo, bórala:
gcloud iam service-accounts delete SERVICE_ACCOUNT_EMAIL
Reemplaza
SERVICE_ACCOUNT_EMAIL
por la dirección de correo electrónico de una cuenta de servicio que creaste para este instructivo. Es decir, usaste las siguientes cuentas de servicio:CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL
: Es la cuenta de servicio de Cloud Scheduler.BATCH_SERVICE_ACCOUNT_EMAIL
: la cuenta de servicio para Batch.
Si creaste dos cuentas de servicio separadas, repite este paso.
Ve al directorio superior y, luego, borra el directorio Terraform y todos sus archivos.
cd .. && rm -r terraform
¿Qué sigue?
- Obtén más información para usar Terraform con Google Cloud:
- Obtén más información sobre los trabajos cron de Cloud Scheduler.
- Obtén más información sobre los trabajos por lotes.