En este instructivo, se explica cómo puedes usar Terraform para crear y ejecutar trabajos de Batch con un trabajo cron de Cloud Scheduler.
Terraform es una herramienta de código abierto que te permite aprovisionar y administrar infraestructura especificando el estado deseado en archivos de configuración. Estos archivos se pueden tratar como código y almacenar en sistemas de control de versión, como GitHub.
Si bien Terraform no tiene recursos para Batch, 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 tenga como objetivo la API de Batch para crear y ejecutar trabajos de Batch. Cloud Scheduler es un Google Cloud servicio que te permite programar automáticamente trabajos cron y es compatible con Terraform.
Este instructivo está dirigido a los usuarios de Batch que ya administran la infraestructura con Terraform y desean incorporar trabajos de Batch en Terraform.
Crea el directorio y el archivo de configuración de Terraform
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 un 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 del trabajo por lotes definido.
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.tfEste comando crea el directorio
terraform, te dirige a él y comienza a definir un nuevo archivo de configuraciónmain.tfen la siguiente línea.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_id}/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: Es el ID del proyecto de tu proyecto.PROJECT_NUMBER: El número del proyecto.CLOUD_SCHEDULER_SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico de la cuenta de servicio que preparaste para el trabajo cron de Cloud Scheduler.Por ejemplo, para usar la cuenta de servicio predeterminada de Compute Engine, especifica lo siguiente:
PROJECT_NUMBER-compute@developer.gserviceaccount.comBATCH_SERVICE_ACCOUNT_EMAIL: La dirección de correo electrónico de la cuenta de servicio que preparaste para los trabajos 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 de Batch.
Para guardar y cerrar el archivo, presiona
Ctrl+D(oCommand+Den macOS).
Implementa la configuración de Terraform para crear el trabajo cron
Implementa la configuración de Terraform inicializando Terraform, generando los cambios planificados y aplicando estos cambios. Después de implementar la configuración de Terraform, puedes describir los recursos de tu proyecto para verificar que Terraform haya creado correctamente el trabajo cron de batch-job-invoker.
Inicializa Terraform en el directorio:
terraform initEl 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 planEl resultado es similar al siguiente, que muestra que el plan es crear 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_ID/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.Para aplicar el plan y crear el trabajo cron
batch-job-invoker, sigue estos pasos:Ingresa el siguiente comando:
terraform applyEl resultado es similar al del comando
terraform plananterior, 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-invokerexista y esté habilitado, descríbelo:gcloud scheduler jobs describe batch-job-invoker --location us-central1El 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_ID/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
stateesté establecido enENABLED.
Verifica que el trabajo cron cree un trabajo de Batch
Verifica que el trabajo cron batch-job-invoker cree correctamente trabajos por lotes.
Espera 5 minutos a que se ejecute el trabajo cron automáticamente o activa el trabajo cron para que se ejecute de inmediato:
gcloud scheduler jobs run batch-job-invoker --location us-central1Enumera los trabajos de Batch que creó el trabajo cron
batch-job-invoker:gcloud batch jobs list \ --filter labels.source=\"terraform_and_cloud_scheduler_tutorial\" \ --sort-by ~createTime- La marca
--filter labels.source=\"terraform_and_cloud_scheduler_tutorial\"filtra la lista para incluir solo los trabajos por lotes que tienen una etiqueta con la clavesourcey el valorterraform_and_cloud_scheduler_tutorial. - La marca
--sort-by ~createTimeordena la lista de la más reciente a la más antigua.
- La marca
Actualiza la configuración de Terraform para pausar el trabajo cron
Después de tener la cantidad deseada de trabajos por lotes, actualiza e implementa la configuración de Terraform para pausar el trabajo cron batch-job-invoker. Si deseas actualizar otras propiedades del trabajo cron o de los trabajos de Batch futuros, se aplica el mismo proceso.
Actualiza el archivo de configuración de Terraform para pausar el trabajo cron. Para ello, establece el campo
pausedentrue:sed -i 's/paused = false # this cron job is enabled/paused = true # this cron job is paused/g' main.tfGenera el plan de ejecución de Terraform según el estado actual de tu proyecto y el archivo de configuración:
terraform planEl resultado es similar al siguiente, que muestra que el plan es actualizar el valor del campo
pauseddefalseatrue: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 el trabajo cron de
batch-job-invoker, sigue estos pasos:Ingresa el siguiente comando:
terraform applyEl resultado es similar al del comando
terraform plananterior, 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-invokeresté detenido, descríbelo:gcloud scheduler jobs describe batch-job-invoker --location us-central1El 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_ID/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
stateesté establecido enPAUSED.