Executar jobs em uma programação

Nesta página, descrevemos como executar jobs do Cloud Run em uma programação usando o crontab.

Funções exigidas

Para receber as permissões necessárias para as operações descritas nesta página, peça ao administrador para conceder a você um dos seguintes papéis do IAM no job do Cloud Run:

  • Para executar jobs usando a Google Cloud CLI: invocador do Cloud Run (roles/run.invoker) no job do Cloud Run.
  • Para executar jobs usando o Cloud de Confiance console, substituir as configurações de jobs ou cancelar execuções de jobs: desenvolvedor do Cloud Run (roles/run.developer) no job do Cloud Run.

Para uma lista de papéis e permissões do IAM associados ao Cloud Run, consulte Papéis do IAM do Cloud Run e Permissões do IAM do Cloud Run. Se o job do Cloud Run interagir com Cloud de Confiance APIs, como bibliotecas de cliente do Cloud, consulte o guia de configuração de identidade de serviço. Para mais informações sobre como conceder papéis, consulte permissões de implantação e gerenciar acesso.

Conceder acesso à conta de serviço para seu projeto

Se você ainda não criou uma conta de serviço para o job do Cloud Run, crie uma. Exemplo:

gcloud iam service-accounts create SERVICE_ACCOUNT_NAME

Substitua SERVICE_ACCOUNT_NAME pelo nome da sua conta de serviço, por exemplo, job-scheduler.

Para receber as permissões necessárias para executar jobs, peça ao administrador para conceder à conta de serviço o papel de executor de jobs (roles/run.jobsExecutor) no projeto. Exemplo:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:job-scheduler@PROJECT_ID.s3ns.iam.gserviceaccount.com \
    --role roles/run.jobsExecutor

Substitua PROJECT_ID pelo nome do ID do projeto.

Antes de começar

Crie um job do Cloud Run se ainda não tiver criado um.

Configurar um job do Cloud Run para ser executado em uma programação

Para executar um job do Cloud Run em uma programação:

  1. Crie um novo diretório com o nome cloud-run-jobs-sched e altere o diretório nele:

    mkdir cloud-run-jobs-sched
    cd cloud-run-jobs-sched
  2. Crie um arquivo Dockerfile e cole as seguintes linhas nele:

    FROM gcr.io/google.com/cloudsdktool/google-cloud-cli:536.0.1
    
    RUN apt-get update -y && \
    apt-get install -y python3-dev python3-pip python3-venv && \
    apt-get install -y cron
    
    ENV APP_HOME /app
    WORKDIR $APP_HOME
    COPY . ./
    
    ENV VIRTUAL_ENV=/opt/venv
    RUN python3 -m venv $VIRTUAL_ENV
    ENV PATH="$VIRTUAL_ENV/bin:$PATH"
    
    RUN pip install --no-cache-dir -r requirements.txt
    
    # Set up the cron schedule.
    RUN crontab /app/cron
    
    CMD /app/entrypoint.sh
  3. Crie um arquivo entrypoint.sh e cole as seguintes linhas nele:

    gcloud config set project $PROJECT
    gcloud config set run/region $REGION
    
    cron
    
    gunicorn --bind :$PORT --workers 1 --threads 8 --timeout 0 main:app
  4. Crie um arquivo main.py e cole o seguinte código Python nele:

    import os
    
    from flask import Flask
    
    app = Flask(__name__)
    
    @app.route("/")
    def hello_world():
        return "Hello World!"
    
    if __name__ == "__main__":
        app.run(debug=True, host="0.0.0.0", port=int(os.environ.get("PORT", 8080)))
  5. Crie um arquivo requirements.txt e cole as seguintes dependências nele:

    Flask==3.0.3
    gunicorn==23.0.0
    Werkzeug==3.0.3
  6. Crie um arquivo cron no diretório e adicione uma programação cron para executar o job. Exemplo:

    0 2 * * * gcloud run jobs execute --async test-job > /proc/1/fd/1 2>&1

    Esse comando executa um job chamado test-job todos os dias às 2h. Todos os erros ao iniciar a execução do job serão mostrados nos registros do serviço.

    Para criar várias programações para vários jobs, atualize o arquivo cron com os jobs que você quer executar, além da programação associada. Exemplo:

    ${cron_schedule} gcloud run jobs execute --async ${job_1} > /proc/1/fd/1 2>&1
    ${cron_schedule} gcloud run jobs execute --async ${job_2} > /proc/1/fd/1 2>&1
    ...
  7. Implante o serviço do programador de jobs:

    gcloud run deploy JOB_NAME \
        --source . \
        --region REGION \
        --set-env-vars PROJECT=PROJECT_ID,REGION=REGION \
        --service-account SERVICE_ACCOUNT \
        --no-allow-unauthenticated \
        --min-instances=1 \
        --no-cpu-throttling

    Substitua:

    • JOB-NAME: o nome do seu job do Cloud Run.
    • PROJECT_ID: o ID do projeto.
    • REGION: a região do seu job do Cloud Run, por exemplo, europe-west1.

A seguir

Após usar esse recurso, você poderá fazer o seguinte: