Crie um trabalho Python no Cloud Run

Saiba como criar uma tarefa simples do Cloud Run e, em seguida, implementá-la a partir da origem, que embala automaticamente o seu código numa imagem de contentor, carrega a imagem de contentor para o Artifact Registry e, em seguida, implementa-a no Cloud Run. Pode usar outros idiomas além dos apresentados.

Antes de começar

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Verify that billing is enabled for your Google Cloud project.

  4. Make sure that you have the following role or roles on the project: Cloud Run Admin, Cloud Run Source Developer, Logs Viewer

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      Aceder ao IAM
    2. Selecione o projeto.
    3. Clique em Conceder acesso.
    4. No campo Novos responsáveis, introduza o identificador do utilizador. Normalmente, este é o endereço de email de uma Conta Google.

    5. Na lista Selecionar uma função, selecione uma função.
    6. Para conceder funções adicionais, clique em Adicionar outra função e adicione cada função adicional.
    7. Clique em Guardar.
  5. Install the Google Cloud CLI.

  6. Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a sua identidade federada.

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

    gcloud init
  8. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  9. Verify that billing is enabled for your Google Cloud project.

  10. Make sure that you have the following role or roles on the project: Cloud Run Admin, Cloud Run Source Developer, Logs Viewer

    Check for the roles

    1. In the Google Cloud console, go to the IAM page.

      Go to IAM
    2. Select the project.
    3. In the Principal column, find all rows that identify you or a group that you're included in. To learn which groups you're included in, contact your administrator.

    4. For all rows that specify or include you, check the Role column to see whether the list of roles includes the required roles.

    Grant the roles

    1. In the Google Cloud console, go to the IAM page.

      Aceder ao IAM
    2. Selecione o projeto.
    3. Clique em Conceder acesso.
    4. No campo Novos responsáveis, introduza o identificador do utilizador. Normalmente, este é o endereço de email de uma Conta Google.

    5. Na lista Selecionar uma função, selecione uma função.
    6. Para conceder funções adicionais, clique em Adicionar outra função e adicione cada função adicional.
    7. Clique em Guardar.
  11. Install the Google Cloud CLI.

  12. Se estiver a usar um fornecedor de identidade (IdP) externo, primeiro, tem de iniciar sessão na CLI gcloud com a sua identidade federada.

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

    gcloud init
  14. Ative a API Cloud Run Admin e a API Cloud Build:

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

    Depois de ativar a API Cloud Run Admin, a conta de serviço predefinida do Compute Engine é criada automaticamente.

  15. Certifique-se de que tem a função Utilizador da conta de serviço concedida na identidade de serviço. Por predefinição, a identidade do serviço é a conta de serviço predefinida do Compute Engine.

    Conceda as funções

    Para conceder acesso ao recurso de identidade do serviço, use o comando gcloud iam service-accounts add-iam-policy-binding, substituindo as variáveis realçadas pelos valores adequados:

          gcloud iam service-accounts add-iam-policy-binding SERVICE_ACCOUNT_EMAIL \
              --member="PRINCIPAL" \
              --role="roles/iam.serviceAccountUser"
          

    Substitua o seguinte:

    • SERVICE_ACCOUNT_EMAIL: o endereço de email da conta de serviço que está a usar como identidade de serviço, como:
      • A conta de serviço predefinida do Compute Engine: PROJECT_NUMBER-compute@developer.gserviceaccount.com
      • Uma conta de serviço que criou: SERVICE_ACCOUNT_NAME@PROJECT_ID.iam.gserviceaccount.com
    • PRINCIPAL: o identificador do utilizador. Normalmente, este é o endereço de email de uma Conta Google.
  16. Conceda à conta de serviço do Cloud Build a seguinte função do IAM.

    Clique para ver as funções necessárias para a conta de serviço do Cloud Build

    O Cloud Build usa automaticamente a conta de serviço predefinida do Compute Engine como a conta de serviço predefinida do Cloud Build para compilar o seu código-fonte e o recurso do Cloud Run, a menos que substitua este comportamento. Para que o Cloud Build compile as suas origens, peça ao administrador para conceder a função Cloud Run Builder (roles/run.builder) à conta de serviço predefinida do Compute Engine no seu projeto:

      gcloud projects add-iam-policy-binding PROJECT_ID \
          --member=serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com \
          --role=roles/run.builder
      

    Substitua PROJECT_NUMBER pelo seu Google Cloud número do projeto e PROJECT_ID pelo seu Google Cloud ID do projeto. Para ver instruções detalhadas sobre como encontrar o ID e o número do projeto, consulte o artigo Criar e gerir projetos.

    A concessão da função de criador do Cloud Run à conta de serviço predefinida do Compute Engine demora alguns minutos a propagar.

  17. Escrever a tarefa de exemplo

    Para escrever um trabalho em Python:

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

      mkdir jobs
      cd jobs
      
    2. Crie um ficheiro main.py para o código do trabalho real. Copie as seguintes linhas de exemplo para o ficheiro:

      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

      As tarefas do Cloud Run permitem que os utilizadores especifiquem o número de tarefas que a tarefa deve executar. Este código de exemplo mostra como usar a variável de ambiente CLOUD_RUN_TASK_INDEX integrada. Cada tarefa representa uma cópia em execução do contentor. Tenha em atenção que as tarefas são normalmente executadas em paralelo. A utilização de várias tarefas é útil se cada tarefa puder processar independentemente um subconjunto dos seus dados.

      Cada tarefa tem conhecimento do respetivo índice, armazenado na variável de ambiente CLOUD_RUN_TASK_INDEX. A variável de ambiente CLOUD_RUN_TASK_COUNT incorporada contém o número de tarefas fornecidas no momento da execução do trabalho através do parâmetro --tasks.

      O código apresentado também mostra como repetir tarefas, usando a variável de ambiente CLOUD_RUN_TASK_ATTEMPT incorporada, que contém o número de vezes que esta tarefa foi repetida, começando em 0 para a primeira tentativa e aumentando 1 para cada repetição sucessiva, até --max-retries.

      O código também permite gerar falhas como forma de testar novas tentativas e gerar registos de erros para que possa ver o aspeto dos mesmos.

    3. Crie um ficheiro de texto com o nome Procfile sem extensão de ficheiro, que contenha o seguinte:

      web: python3 main.py

    O seu código está completo e pronto para ser incluído num contentor.

    Crie um contentor de tarefas de compilação, envie-o para o Artifact Registry e implemente-o no Cloud Run

    Importante: este início rápido pressupõe que tem funções de proprietário ou editor no projeto que está a usar para o início rápido. Caso contrário, consulte a função de programador de origem do Cloud Run para ver as autorizações necessárias para implementar um recurso do Cloud Run a partir da origem.

    Este início rápido usa a implementação a partir da origem, que cria o contentor, carrega-o para o Artifact Registry e implementa a tarefa 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

    onde PROJECT_ID é o ID do seu projeto e REGION é a sua região, por exemplo, europe-west1. Tenha em atenção que pode alterar os vários parâmetros para os valores que quiser usar para fins de teste. SLEEP_MS simula o trabalho e FAIL_RATE faz com que X% das tarefas falhem para que possa experimentar o paralelismo e tentar novamente as tarefas com falhas.

    Execute uma tarefa no Cloud Run

    Para executar a tarefa que acabou de criar:

    gcloud run jobs execute job-quickstart --region REGION

    Substitua REGION pela região que usou quando criou e implementou a tarefa, por exemplo, europe-west1.

    O que se segue?

    Para mais informações sobre a criação de um contentor a partir do código-fonte e o envio para um repositório, consulte: