Crie funções em contentores

O Cloud Run suporta a implementação direta de funções. No entanto, também pode criar a sua função numa imagem de contentor através dos buildpacks da Google Cloud e, em seguida, implementar esta imagem de contentor no Cloud Run.

Alguns exemplos de utilização comuns para criar funções no contentor incluem:

  • Integração e entrega contínuas: os programadores criam e enviam código de funções para um repositório de origem. Um sistema de CI/CD compila automaticamente a função num contentor, executa testes e implementa-a automaticamente num ambiente de preparação.
  • Infraestrutura como código: os recursos do Cloud Run geridos através de YAML ou Terraform fazem referência a um URL de imagem de contentor. O código da função escrito pelos programadores tem de ser incorporado numa imagem de contentor.

Esta página detalha como pode replicar o processo de compilação exato das funções do Cloud Run de duas formas:

  • Usar a CLI pack
  • Usar o Cloud Build como sistema de compilação remoto

Ponto de entrada da função

Para criar funções com buildpacks:

  • Inclua a biblioteca Functions Framework.

  • Defina a variável de ambiente GOOGLE_FUNCTION_TARGET com o nome da função que usa como ponto de entrada. Pode fazê-lo incluindo um project.toml na mesma pasta que o código-fonte. O ficheiro project.toml tem de ter a seguinte configuração:

[[build.env]]     name = "GOOGLE_FUNCTION_TARGET"     value =  "ENTRY_POINT" 

Substitua ENTRY_POINT pelo método da função.

Para ver detalhes sobre como usar variáveis de ambiente com funções do Cloud Run, consulte o artigo Configure serviços de funções do Cloud Run.

Construtores

As funções do Cloud Run são criadas com base em imagens base mantidas e publicadas nos buildpacks do Google Cloud.

As compilações são imagens que consistem em buildpacks e pacotes do sistema operativo (também conhecidos como Stacks). Os criadores são usados para converter o código fonte da sua função num contentor em execução.

Pode escolher a partir da lista de criadores de buildpacks do Google Cloud suportados.

Criar com o pack

Pack é uma ferramenta de CLI mantida pelo projeto CNB para suportar a utilização de buildpacks. Use a CLI para criar localmente as suas funções numa imagem de contentor.pack

Antes de começar

  1. Instale o Docker Community Edition (CE) na sua estação de trabalho. O Docker é usado pelo pack como um criador de imagens OCI.
  2. Instale a CLI Pack.
  3. Instale a ferramenta Git source control para obter a aplicação de exemplo do GitHub.

Crie uma função localmente

Use o comando pack build e especifique o criador predefinido --builder=gcr.io/buildpacks/builder para criar as imagens de contentores localmente.

pack build --builder=gcr.io/buildpacks/builder IMAGE_NAME 

Substitua IMAGE_NAME pelo nome da imagem do contentor.

Também pode personalizar a imagem do contentor estendendo as imagens de compilação e execução.

Crie uma função de exemplo localmente

Os exemplos seguintes demonstram como criar uma amostra localmente.

  1. Clone o repositório de exemplo para a sua máquina local:
    git clone https://github.com/GoogleCloudPlatform/buildpack-samples.git
  2. Altere para o diretório que contém o exemplo de código da aplicação:

    Ir

    cd buildpack-samples/sample-functions-framework-go

    Java

    cd buildpack-samples/sample-functions-framework-java-mvn

    Node.js

    cd buildpack-samples/sample-functions-framework-node

    Python

    cd buildpack-samples/sample-functions-framework-python

    Ruby

    cd buildpack-samples/sample-functions-framework-ruby
  3. Use pack para criar a função de exemplo:

    Ir

    pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-go

    Java

    pack build --builder gcr.io/buildpacks/builder:v1 sample-functions-java-mvn

    Node.js

    pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-node

    Python

    pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-python

    Ruby

    pack build --builder=gcr.io/buildpacks/builder sample-functions-framework-ruby
  4. Execute a imagem através do docker:

    Ir

    docker run -p8080:8080 sample-functions-framework-go

    Java

    docker run -it -ePORT=8080 -p8080:8080 sample-functions-java-mvn

    Node.js

    docker run -it -ePORT=8080 -p8080:8080 sample-functions-framework-node

    Python

    docker run -it -ePORT=8080 -p8080:8080 sample-functions-framework-python

    Ruby

    docker run -it -ePORT=8080 -p8080:8080 sample-functions-framework-ruby
  5. Visite a função em execução navegando para localhost:8080.

Compilar com um sistema de compilação remoto

Use o Cloud Build para criar a sua função numa imagem de contentor e o Artifact Registry como repositório de contentores para armazenar e implementar cada imagem.

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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

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

  4. Enable the Cloud Build and Artifact Registry APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  5. Install the Google Cloud CLI.

  6. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro 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.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

    Go to project selector

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

  10. Enable the Cloud Build and Artifact Registry APIs.

    Roles required to enable APIs

    To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

    Enable the APIs

  11. Install the Google Cloud CLI.

  12. Se estiver a usar um fornecedor de identidade (IdP) externo, tem primeiro 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. Certifique-se de que o seu Google Cloud projeto tem acesso a um repositório de imagens de contentores.

    Para configurar o acesso a um repositório do Docker no Artifact Registry:

    1. Crie um novo repositório do Docker na mesma localização do seu Google Cloud projeto.
      gcloud artifacts repositories create REPO_NAME \ --repository-format=docker \ --location=REGION --description="DESCRIPTION"
      Substituir:
      • REPO_NAME com o nome que escolher para o seu repositório do Docker.
      • REGION com a localização em ou mais próxima da localização do seu Google Cloud projeto.
      • DESCRIPTION com uma descrição à sua escolha.

      Por exemplo, para criar um repositório docker em us-west2 com a descrição "Repositório do Docker", execute:

      gcloud artifacts repositories create buildpacks-docker-repo --repository-format=docker \ --location=us-west2 --description="Docker repository"
    2. Verifique se o repositório foi criado:
      gcloud artifacts repositories list

      Deve ver o nome que escolheu para o seu repositório do Docker na lista.

  15. Crie uma função remotamente

    Use o comando gcloud builds submit para criar e carregar a imagem do contentor para o seu repositório.

    Pode optar por especificar a imagem do contentor no próprio comando ou usar um ficheiro de configuração.

    Crie com comandos

    Para criar sem um ficheiro de configuração, especifique a flag image:

    gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME

    Substituição:

  • LOCATION com o nome da região do seu repositório de contentores, por exemplo, us-west2
  • PROJECT_ID com o ID do seu Google Cloud projeto.
  • REPO_NAME com o nome do seu repositório do Docker.
  • IMAGE_NAME com o nome da imagem do contentor.

Exemplo:

gcloud builds submit --pack image=us-west2-docker.pkg.dev/my-project-id/my-buildpacks-docker-repo

Crie com ficheiros de configuração

Pode usar um ficheiro de configuração para definir os detalhes de configuração do repositório de imagens para simplificar o comando de compilação. O ficheiro de configuração usa o formato de ficheiro YAML e tem de incluir um passo de compilação que use a CLI pack.

  1. Crie um nome de ficheiro YAML cloudbuild.yaml que inclua o URI do repositório de imagens de contentores.
  options:     logging: CLOUD_LOGGING_ONLY     pool: {}   projectId: PROJECT_ID   steps:   - name: gcr.io/k8s-skaffold/pack     entrypoint: pack     args:     - build     - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME     - --builder     - gcr.io/buildpacks/builder:latest     - --network     - cloudbuild   images:   - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME

Substituição:

  • LOCATION com o nome da região do seu repositório de contentores, por exemplo, us-west2.
  • PROJECT_ID com o ID do seu Google Cloud projeto.
  • REPO_NAME com o nome do seu repositório do Docker.
  • IMAGE_NAME com o nome da imagem do contentor.
  1. Crie a aplicação.

    Se deu o nome cloudbuild.yaml ao ficheiro de configuração, pode executar o seguinte comando:

    gcloud builds submit . 

Exemplo: crie uma função de exemplo remotamente

Os exemplos seguintes demonstram como criar uma amostra remotamente e verificar se a imagem do contentor foi enviada para o seu repositório no Artifact Registry.

  1. Clone o repositório de exemplo para a sua máquina local:
    git clone https://github.com/GoogleCloudPlatform/buildpack-samples.git
  2. Altere para o diretório que contém o exemplo de código da aplicação:

    Ir

    cd buildpack-samples/sample-functions-framework-go

    Java

    cd buildpack-samples/sample-functions-framework-java-mvn

    Node.js

    cd buildpack-samples/sample-functions-framework-node

    Python

    cd buildpack-samples/sample-functions-framework-python

    Ruby

    cd buildpack-samples/sample-functions-framework-ruby
  3. Use gcloud para enviar o código-fonte da aplicação para o Cloud Build:

    Ir

    gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-go

    Java

    gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-gradle

    Node.js

    gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-node

    Python

    gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-python

    Ruby

    gcloud builds submit --pack image=LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/sample-functions-framework-ruby

    Substituição:

    • LOCATION com o nome da região do seu repositório de contentores. Exemplo: us-west2-docker.pkg.dev
    • PROJECT_ID com o ID do seu Google Cloud projeto.
    • REPO_NAME com o nome do seu repositório do Docker.

  4. Confirme se a função de exemplo foi publicada com êxito em REPO_NAME:
    gcloud artifacts docker images list LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME

    Substituição:

    • LOCATION com o nome da região do seu repositório de contentores, por exemplo, us-west2.
    • PROJECT_ID com o ID do seu Google Cloud projeto.
    • REPO_NAME com o nome do seu repositório do Docker.

Criar uma função para atualizações automáticas de imagens base

Os contentores de funções também podem ser criados no scratch, o que permite a sua utilização em combinação com as atualizações de segurança automáticas do Cloud Run.

Ficheiro Docker

Pode usar a sua cadeia de ferramentas de compilação existente para criar uma imagem de contentor de funções compatível com atualizações automáticas de imagens base. Consulte as instruções sobre como criar um contentor a partir do zero.

pack CLI

pack build IMAGE_NAME \   --builder LOCATION-docker.pkg.dev/serverless-runtimes/google-22-full/builder/LANGUAGE:latest   --run-image LOCATION-docker.pkg.dev/serverless-runtimes/google-22/scratch/RUNTIME_ID:latest 

Substituição:

  • LOCATION com o nome da região do seu repositório de contentores, por exemplo, us-west2.
  • IMAGE_NAME com o nome da imagem do contentor.
  • LANGUAGE com o idioma da sua função, por exemplo, nodejs.
  • RUNTIME_ID com o ID de tempo de execução, por exemplo, nodejs22.

Cloud Build

options:   logging: CLOUD_LOGGING_ONLY   pool: {} projectId: PROJECT_ID steps: - name: gcr.io/k8s-skaffold/pack   entrypoint: pack   args:   - build   - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME   - --builder   - LOCATION-docker.pkg.dev/serverless-runtimes/google-22-full/builder/LANGUAGE:latest   - --run-image   - LOCATION-docker.pkg.dev/serverless-runtimes/google-22/scratch/RUNTIME_ID:latest   - --network   - cloudbuild images: - LOCATION-docker.pkg.dev/PROJECT_ID/REPO_NAME/IMAGE_NAME 

Substituição:

  • LOCATION com o nome da região do seu repositório de contentores, por exemplo, us-west2.
  • PROJECT_ID com o ID do seu Google Cloud projeto.
  • REPO_NAME com o nome do seu repositório do Docker.
  • IMAGE_NAME com o nome da imagem do contentor.
  • LANGUAGE com o idioma da sua função, por exemplo, nodejs.
  • RUNTIME_ID com o ID de tempo de execução, por exemplo, nodejs22.

O que se segue?