Desenvolver e criar um job do Python no Cloud Run

Aprenda a criar um job simples do Cloud Run e implantá-lo a partir da origem, o que empacota automaticamente o código em uma imagem de contêiner, faz upload da imagem no Artifact Registry e a implanta no Cloud Run. É possível usar outras linguagens além das mostradas.

Antes de começar

  1. Faça login na sua Google Cloud conta do. Se você começou a usar o Google Cloudagora, crie uma conta para avaliar o desempenho dos nossos produtos em situações reais. Clientes novos também recebem US $300 em créditos para executar, testar e implantar cargas de trabalho.
  2. Instale a Google Cloud CLI.

  3. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.

  4. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  5. Crie ou selecione um Google Cloud projeto.

    Funções necessárias para selecionar ou criar um projeto

    • Selecionar um projeto: a seleção de um projeto não exige um papel específico do IAM. Você pode selecionar qualquer projeto em que tenha recebido um papel.
    • Criar um projeto: para criar um projeto, você precisa do papel Criador de projetos (roles/resourcemanager.projectCreator), que contém a resourcemanager.projects.create permissão. Saiba como conceder papéis.
    • Crie um Google Cloud projeto:

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o Google Cloud projeto que você está criando.

    • Selecione o Google Cloud projeto que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do Google Cloud projeto.

  6. Se este guia estiver usando um projeto atual, verifique se você tem as permissões necessárias para concluir o guia. Se você criou um projeto, já tem as permissões necessárias.

  7. Verifique se o faturamento está ativado para o Google Cloud projeto.

  8. Instale a Google Cloud CLI.

  9. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na gcloud CLI com sua identidade federada.

  10. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  11. Crie ou selecione um Google Cloud projeto.

    Funções necessárias para selecionar ou criar um projeto

    • Selecionar um projeto: a seleção de um projeto não exige um papel específico do IAM. Você pode selecionar qualquer projeto em que tenha recebido um papel.
    • Criar um projeto: para criar um projeto, você precisa do papel Criador de projetos (roles/resourcemanager.projectCreator), que contém a resourcemanager.projects.create permissão. Saiba como conceder papéis.
    • Crie um Google Cloud projeto:

      gcloud projects create PROJECT_ID

      Substitua PROJECT_ID por um nome para o Google Cloud projeto que você está criando.

    • Selecione o Google Cloud projeto que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do Google Cloud projeto.

  12. Se este guia estiver usando um projeto atual, verifique se você tem as permissões necessárias para concluir o guia. Se você criou um projeto, já tem as permissões necessárias.

  13. Verifique se o faturamento está ativado para o Google Cloud projeto.

  14. Ative a API Cloud Run Admin e as APIs Cloud Build:

    Funções necessárias para ativar APIs

    Para ativar as APIs, é necessário ter o papel do IAM de administrador de Service Usage role (roles/serviceusage.serviceUsageAdmin), que contém a serviceusage.services.enable permissão. Saiba como conceder papéis.

    gcloud services enable run.googleapis.com cloudbuild.googleapis.com

    Depois que a API Cloud Run Admin for ativada, a conta de serviço padrão do Compute Engine será criadas automaticamente.

  15. Consulte os preços do Cloud Run ou estime os custos com a calculadora de preços.

Funções exigidas

Para conseguir as permissões que você precisa para concluir este guia de início rápido, peça ao administrador para conceder a você os seguintes papéis do IAM:

Para mais informações sobre a concessão de papéis, consulte Gerenciar o acesso a projetos, pastas e organizações.

Também é possível conseguir as permissões necessárias usando personalizados papéis ou outros predefinidos papéis.

Conceder acesso à conta de serviço do Cloud Build ao seu projeto

O Cloud Build usa automaticamente a conta de serviço padrão do Compute Engine como a conta de serviço padrão do Cloud Build para criar o código-fonte e o recurso do Cloud Run, a menos que você substitua esse comportamento.

Para que o Cloud Build crie suas origens, conceda à conta de serviço do Cloud Build o Criador do Cloud Run(roles/run.builder) papel no seu projeto:

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:SERVICE_ACCOUNT_EMAIL_ADDRESS \
    --role=roles/run.builder

Substitua PROJECT_ID pelo ID do seu Google Cloud projeto e SERVICE_ACCOUNT_EMAIL_ADDRESS pelo endereço de e-mail da conta de serviço do Cloud Build. Se você estiver usando a conta de serviço padrão do Compute Engine como a conta de serviço do Cloud Build, use o seguinte formato para o endereço de e-mail da conta de serviço:

PROJECT_NUMBER-compute@developer.gserviceaccount.com

Substitua PROJECT_NUMBER pelo seu Google Cloud número do projeto.

Para instruções detalhadas sobre como encontrar o ID do projeto e o número do projeto, consulte Criar e gerenciar projetos.

A concessão do papel de criador do Cloud Run leva alguns minutos para se propagar.

Como escrever o job de amostra

Para gravar um job em Python, faça o seguinte:

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

    mkdir jobs
    cd jobs
    
  2. Crie um arquivo main.py para o código do job real. Copie nele as seguintes linhas de amostra:

    import json
    import os
    import random
    import sys
    import time
    
    # Retrieve Job-defined env vars
    TASK_INDEX = os.getenv("CLOUD_RUN_TASK_INDEX", 0)
    TASK_ATTEMPT = os.getenv("CLOUD_RUN_TASK_ATTEMPT", 0)
    # Retrieve User-defined env vars
    SLEEP_MS = os.getenv("SLEEP_MS", 0)
    FAIL_RATE = os.getenv("FAIL_RATE", 0)
    
    
    # Define main script
    def main(sleep_ms=0, fail_rate=0):
        """Program that simulates work using the sleep method and random failures.
    
        Args:
            sleep_ms: number of milliseconds to sleep
            fail_rate: rate of simulated errors
        """
        print(f"Starting Task #{TASK_INDEX}, Attempt #{TASK_ATTEMPT}...")
        # Simulate work by waiting for a specific amount of time
        time.sleep(float(sleep_ms) / 1000)  # Convert to seconds
    
        # Simulate errors
        random_failure(float(fail_rate))
    
        print(f"Completed Task #{TASK_INDEX}.")
    
    
    def random_failure(rate):
        """Throws an error based on fail rate
    
        Args:
            rate: a float between 0 and 1
        """
        if rate < 0 or rate > 1:
            # Return without retrying the Job Task
            print(
                f"Invalid FAIL_RATE env var value: {rate}. "
                + "Must be a float between 0 and 1 inclusive."
            )
            return
    
        random_failure = random.random()
        if random_failure < rate:
            raise Exception("Task failed.")
    
    
    # Start script
    if __name__ == "__main__":
        try:
            main(SLEEP_MS, FAIL_RATE)
        except Exception as err:
            message = (
                f"Task #{TASK_INDEX}, " + f"Attempt #{TASK_ATTEMPT} failed: {str(err)}"
            )
    
            print(json.dumps({"message": message, "severity": "ERROR"}))
            sys.exit(1)  # Retry Job Task by exiting the process

    Os jobs do Cloud Run permitem que os usuários especifiquem o número de tarefas que o job precisa executar. Esse exemplo de código mostra como usar a variável de ambiente CLOUD_RUN_TASK_INDEX integrada. Cada tarefa representa uma cópia em execução do contêiner. As tarefas geralmente são executadas em paralelo. É útil usar várias tarefas se cada uma delas puder processar independentemente um subconjunto dos dados.

    Cada tarefa está ciente do índice armazenado na variável de ambiente CLOUD_RUN_TASK_INDEX. A variável de ambiente CLOUD_RUN_TASK_COUNT integrada contém o número de tarefas fornecidas no tempo de execução do job por meio do parâmetro --tasks.

    O código mostrado também mostra como repetir tarefas, usando o método integradoCLOUD_RUN_TASK_ATTEMPT que contém o número de vezes que essa tarefa foi repetida, começando em 0 para a primeira tentativa e aumentando em 1 a cada nova tentativa, até--max-retries de dados.

    O código também permite gerar falhas como uma maneira de testar novas tentativas e gerar registros de erro para que você possa ver como eles são.

  3. Crie um arquivo de texto chamado Procfile sem extensão de arquivo, contendo o seguinte:

    web: python3 main.py

Seu código está completo e pronto para ser empacotado em um contêiner.

Crie um contêiner de jobs, envie-o para o Artifact Registry e implante no Cloud Run

Neste guia de início rápido, usamos a implantação a partir da origem, que cria o contêiner, faz upload dele para o Artifact Registry e implanta o job no Cloud Run:

gcloud run jobs deploy job-quickstart \
    --source . \
    --tasks 50 \
    --set-env-vars SLEEP_MS=10000 \
    --set-env-vars FAIL_RATE=0.1 \
    --max-retries 5 \
    --region REGION \
    --project=PROJECT_ID

em que PROJECT_ID é o ID do projeto e REGION é a sua região, por exemplo, europe-west1. É possível mudar os vários parâmetros para os valores que você quer usar para fins de teste. O SLEEP_MS simula o trabalho, e FAIL_RATE faz com que X% das tarefas falhem. Assim, você pode testar o paralelismo e tentar novamente tarefas com falha.

Executar um job no Cloud Run

Para executar o job que você acabou de criar:

gcloud run jobs execute job-quickstart --region REGION

Substitua REGION pela região que você usou ao criar e implantar o job, por exemplo, europe-west1.

Liberar espaço

Para evitar cobranças adicionais na sua Google Cloud conta, exclua todos os recursos implantados com este guia de início rápido.

Excluir o repositório

O Cloud Run cobra apenas pelo tempo de execução do job. No entanto, ainda é possível que você receba cobranças pelo armazenamento da imagem de contêiner no Artifact Registry. Para excluir repositórios do Artifact Registry, siga as etapas em Excluir repositórios na documentação do Artifact Registry.

Excluir o job

Os jobs do Cloud Run só geram custos quando uma tarefa de job está em execução. Para excluir o job do Cloud Run, siga uma destas etapas:

Console

Para excluir um job, siga estas etapas:

  1. No Google Cloud console, acesse o Cloud Run:

    Acessar o Cloud Run

  2. Localize o job que você quer excluir na lista de jobs e clique na caixa de seleção para marcá-lo.

  3. Clique em Excluir. Isso encerra todas as execuções de jobs em andamento e todas as instâncias de contêiner em execução.

gcloud

Para excluir um job, execute o seguinte comando:

gcloud run jobs delete JOB_NAME

Substitua JOB_NAME pelo nome do job.

Excluir o projeto de teste

A exclusão do seu Google Cloud projeto interrompe o faturamento de todos os recursos nesse projeto. Para liberar todos os Google Cloud recursos no projeto, siga estas etapas:

    Excluir um Google Cloud projeto:

    gcloud projects delete PROJECT_ID

A seguir

Para mais informações sobre como criar um contêiner a partir do código-fonte e enviá-lo para um repositório, consulte: