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:
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
.