Como programar um job do Cloud Run em um perímetro do VPC Service Controls

1. Introdução

Visão geral

Se o projeto do GCP estiver dentro de um perímetro do VPC SC, você precisará seguir outras etapas para configurar os jobs programados. Como o Cloud Scheduler não pode acionar jobs diretamente nos perímetros do VPC SC, é necessário usar um proxy para a solicitação em outro componente. Recomendamos usar um serviço do Cloud Run como esse proxy.

A arquitetura terá esta aparência:

Diagrama do Cloud Scheduler acionando um serviço do Cloud Run que executa um job do Cloud Run

O que você vai aprender

  • Como executar um job do Cloud Run em uma programação dentro de um perímetro do VPC SC
  • Como criar um serviço do Cloud Run que aciona um job usando as bibliotecas de cliente do Cloud Run
  • Como configurar o Cloud Scheduler para invocar um serviço do Cloud Run em uma programação

2. Antes de começar

Primeiro, siga as etapas para configurar o Cloud Run para o VPC Service Controls.

Em seguida, defina as variáveis de ambiente que serão usadas neste codelab.

PROJECT_ID=<YOUR_PROJECT_ID>
REGION=<YOUR_REGION>
AR_REPO=sample-job-repo
CLOUD_RUN_SERVICE=job-runner-service
CLOUD_RUN_JOB=sample-job
CLOUD_SCHEDULER=job-scheduler
SERVICE_ACCOUNT="cloud-run-invoker-sa"
SERVICE_ACCOUNT_ADDRESS=$SERVICE_ACCOUNT@$PROJECT_ID.iam.gserviceaccount.com
NETWORK=default
SUBNET=default

3. Criar o job do Cloud Run

Este codelab usa o contêiner de jobs do Cloud Run como exemplo.

Primeiro, crie um repositório do Artifact Registry para o contêiner do job do Cloud Run.

gcloud artifacts repositories create $AR_REPO --repository-format=docker --location=$REGION --description="codelab for Cloud Run jobs on schedule within VPC SC"

Em seguida, copie o contêiner de jobs de exemplo do Cloud Run para um Artifact Registry no seu projeto configurado com o VPC SC. Para isso, use a ferramenta gcrane seguindo estas instruções de instalação. Saiba mais sobre o gcrane na documentação sobre como copiar imagens entre repositórios.

gcrane cp us-docker.pkg.dev/cloudrun/container/job:latest $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_JOB:latest

Em segundo lugar, implante o job do Cloud Run que está em conformidade com o VPC Service Controls.

gcloud run jobs create $CLOUD_RUN_JOB --region $REGION \
 --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_JOB:latest \
 --network=$NETWORK \
 --subnet=$SUBNET \
 --vpc-egress=all-traffic

Para mais informações sobre a criação de jobs, siga as etapas listadas na documentação de jobs do Cloud Run.

4. Criar uma conta de serviço

Essa conta de serviço será usada pelo Cloud Run para chamar o job do Cloud Run.

Primeiro, crie a conta de serviço executando este comando:

gcloud iam service-accounts create $SERVICE_ACCOUNT \
  --display-name="Cloud Run to run a Cloud Run job"

Em segundo lugar, conceda o papel de invocador e de leitor do Cloud Run à conta de serviço.

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.invoker

gcloud projects add-iam-policy-binding $PROJECT_ID \
  --member serviceAccount:$SERVICE_ACCOUNT_ADDRESS \
  --role=roles/run.viewer

5. Criar o serviço do Cloud Run

Nesta etapa, você vai implantar um serviço do Cloud Run que funciona como proxy.

mkdir job-runner-service && cd $_

Crie um arquivo chamado main.py com o seguinte código.

import os
from flask import Flask
app = Flask(__name__)

# pip install google-cloud-run
from google.cloud import run_v2

@app.route('/')
def hello():

    client = run_v2.JobsClient()

    # UPDATE TO YOUR JOB NAME, REGION, AND PROJECT ID
    job_name = 'projects/YOUR_PROJECT_ID/locations/YOUR_JOB_REGION/jobs/YOUR_JOB_NAME' 

    print("Triggering job...")
    request = run_v2.RunJobRequest(name=job_name)
    operation = client.run_job(request=request)
    response = operation.result()

    print(response)
    return "Done!"

if __name__ == '__main__':
    app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))

Crie um arquivo chamado requirements.txt com o seguinte código.

google-cloud-run
flask

Por fim, crie um Dockerfile.

FROM python:3.9-slim-buster
# for logging purposes
ENV PYTHONUNBUFFERED=True

WORKDIR /app

COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt

COPY . .

CMD ["python3", "main.py"]

Em seguida, crie o contêiner usando os comandos do Docker a seguir. As implantações baseadas em origem podem ser difíceis de configurar em um ambiente de VPC SC. Se você já tiver um pipeline de build e implantação, use-o para criar o código-fonte em um contêiner e implantar o contêiner como um serviço do Cloud Run.

docker build -t $CLOUD_RUN_SERVICE .

docker tag $CLOUD_RUN_SERVICE $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE

docker push $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE

Agora, implante seu serviço do Cloud Run em conformidade com o VPC Service Controls.

gcloud run deploy $CLOUD_RUN_SERVICE --region $REGION \
 --image $REGION-docker.pkg.dev/$PROJECT_ID/$AR_REPO/$CLOUD_RUN_SERVICE \
 --service-account $SERVICE_ACCOUNT_ADDRESS \
 --network=$NETWORK \
 --subnet=$SUBNET \
 --vpc-egress=all-traffic \
 --no-allow-unauthenticated \
 --ingress internal

Salve o URL do endpoint do serviço executando este comando:

SERVICE_URL=$(gcloud run services describe $CLOUD_RUN_SERVICE --region $REGION --format 'value(status.url)')

6. Criar um job do Cloud Scheduler para acionar o serviço

# create the Cloud Scheduler job
gcloud scheduler jobs create http $CLOUD_SCHEDULER \
  --location=$REGION \
  --schedule="0 0 1 * *" \
  --uri=$SERVICE_URL \
  --http-method=GET \
  --oidc-service-account-email=$SERVICE_ACCOUNT_ADDRESS

Depois que o job do Cloud Scheduler for criado, execute o comando a seguir para executá-lo imediatamente para fins de teste:

gcloud scheduler jobs run $CLOUD_SCHEDULER --location=$REGION

OBSERVAÇÃO:

Talvez seja necessário aguardar alguns minutos para que a execução do job seja concluída. É possível acompanhar o status na página do Cloud Run Scheduler.

Execute os comandos a seguir para verificar se o job do Cloud Run foi executado:

EXECUTION_NAME=$(gcloud run jobs describe $CLOUD_RUN_JOB --region $REGION --format 'value(status.latestCreatedExecution.name)')

gcloud run jobs executions describe $EXECUTION_NAME --region $REGION

e você verá algo parecido com o seguinte:

✔ Execution sample-job-w6hrj in region us-central1
1 task completed successfully
Elapsed time: 28 seconds

7. Parabéns!

Parabéns por concluir o codelab.

O que aprendemos

  • Como executar um job do Cloud Run em uma programação dentro de um perímetro do VPC SC
  • Como criar um serviço do Cloud Run que aciona um job usando as bibliotecas de cliente do Cloud Run
  • Como configurar o Cloud Scheduler para invocar um serviço do Cloud Run em uma programação

8. Limpar

Para evitar cobranças acidentais (por exemplo, se os serviços do Cloud Run forem invocados acidentalmente mais vezes do que sua alocação mensal de invocação do Cloud Run no nível sem custo financeiro), exclua os serviços do GCP ou o projeto criado na etapa 2.

Para excluir o serviço e o job do Cloud Run, acesse o Console do Cloud Run em https://console.cloud.google.com/run e exclua o serviço.

Se você quiser excluir o projeto inteiro, acesse https://console.cloud.google.com/cloud-resource-manager, selecione o projeto criado na etapa 2 e escolha "Excluir". Se você excluir o projeto, vai precisar mudar os projetos no Cloud SDK. Para conferir a lista de todos os projetos disponíveis, execute gcloud projects list.