Executar tarefas com base numa programação

Esta página descreve como executar tarefas do Cloud Run de forma programada através do crontab.

Funções necessárias

Para receber as autorizações necessárias para as operações descritas nesta página, peça ao seu administrador que lhe conceda uma das seguintes funções da IAM no seu trabalho do Cloud Run:

  • Para executar tarefas através da CLI do Google Cloud: Cloud Run Invoker (roles/run.invoker) na tarefa do Cloud Run.
  • Para executar tarefas através da Cloud de Confiance consola, substituir configurações de tarefas ou cancelar execuções de tarefas: programador do Cloud Run (roles/run.developer) na tarefa do Cloud Run.

Para ver uma lista de funções e autorizações de IAM associadas ao Cloud Run, consulte os artigos Funções de IAM do Cloud Run e Autorizações de IAM do Cloud Run. Se a sua tarefa do Cloud Run interagir com Cloud de Confiance APIs, como as bibliotecas de cliente da Google Cloud, consulte o guia de configuração da identidade do serviço. Para mais informações sobre a concessão de funções, consulte as autorizações de implementação e a gestão do acesso.

Conceda acesso da conta de serviço ao seu projeto

Se não tiver criado uma conta de serviço para a tarefa do Cloud Run, crie uma conta de serviço. Por 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 autorizações de que a sua conta de serviço precisa para executar tarefas, peça ao seu administrador para conceder à sua conta de serviço a função de executor de tarefas (roles/run.jobsExecutor) no seu projeto. Por 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 seu projeto.

Antes de começar

Crie uma tarefa do Cloud Run se ainda não tiver criado nenhuma.

Configure uma tarefa do Cloud Run para ser executada de acordo com uma programação

Para executar uma tarefa do Cloud Run com base numa programação:

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

    mkdir cloud-run-jobs-sched
    cd cloud-run-jobs-sched
  2. Crie um ficheiro Dockerfile e cole as seguintes linhas no mesmo:

    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 ficheiro entrypoint.sh e cole as seguintes linhas no mesmo:

    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 ficheiro main.py e cole o seguinte código Python no mesmo:

    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 ficheiro requirements.txt e cole as seguintes dependências no mesmo:

    Flask==3.0.3
    gunicorn==23.0.0
    Werkzeug==3.0.3
  6. Crie um ficheiro cron no seu diretório e adicione uma programação cron para executar a tarefa. Por exemplo:

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

    Este comando executa uma tarefa denominada test-job todos os dias às 02:00. Todos os erros ao iniciar a execução da tarefa são apresentados nos registos do serviço.

    Para criar várias programações para várias tarefas, atualize o ficheiro cron com todas as tarefas que quer executar, juntamente com a respetiva programação associada. Por 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. Implemente o serviço do programador de tarefas:

    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 o seguinte:

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

O que se segue?

Depois de usar esta funcionalidade, pode fazer o seguinte: