Criar e implantar uma função HTTP do Cloud Run usando Ruby (1ª geração)

Este guia explica o processo de criação de uma função do Cloud Run usando o ambiente de execução do Ruby. Há dois tipos de funções do Cloud Run:

  • Uma função HTTP, que você invoca a partir de solicitações HTTP padrão.
  • Uma função direcionada a eventos, que você usa para processar eventos da infraestrutura do Cloud, como mensagens em um tópico do Pub/Sub ou alterações em um bucket do Cloud Storage.

O exemplo mostra como criar uma função HTTP simples.

Antes de começar

  1. Faça login na sua conta do Google Cloud . Se você começou a usar o Google Cloud, crie uma conta para avaliar o desempenho de 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 CLI do Google Cloud.

  3. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud 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: não é necessário um papel específico do IAM para selecionar um projeto. Você pode escolher qualquer projeto em que tenha recebido um papel.
    • Criar um projeto: para criar um projeto, é necessário ter o papel de Criador de projetos (roles/resourcemanager.projectCreator), que contém a permissão resourcemanager.projects.create. Saiba como conceder papéis.
    • Crie um projeto do Google Cloud :

      gcloud projects create PROJECT_ID

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

    • Selecione o projeto Google Cloud que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Google Cloud .

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

  7. Ative as APIs Cloud Functions e Cloud Build:

    Funções necessárias para ativar APIs

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

    gcloud services enable cloudfunctions cloudbuild.googleapis.com
  8. Instale a CLI do Google Cloud.

  9. Ao usar um provedor de identidade (IdP) externo, primeiro faça login na CLI gcloud 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: não é necessário um papel específico do IAM para selecionar um projeto. Você pode escolher qualquer projeto em que tenha recebido um papel.
    • Criar um projeto: para criar um projeto, é necessário ter o papel de Criador de projetos (roles/resourcemanager.projectCreator), que contém a permissão resourcemanager.projects.create. Saiba como conceder papéis.
    • Crie um projeto do Google Cloud :

      gcloud projects create PROJECT_ID

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

    • Selecione o projeto Google Cloud que você criou:

      gcloud config set project PROJECT_ID

      Substitua PROJECT_ID pelo nome do projeto do Google Cloud .

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

  13. Ative as APIs Cloud Functions e Cloud Build:

    Funções necessárias para ativar APIs

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

    gcloud services enable cloudfunctions cloudbuild.googleapis.com
  14. Prepare seu ambiente de desenvolvimento.

    Acessar o guia de configuração do Ruby

crie uma função

  1. Crie um diretório no seu sistema local para o código de função:

    Linux ou macOS

    mkdir ~/helloworld
    cd ~/helloworld
    

    Windows

    mkdir %HOMEPATH%\helloworld
    cd %HOMEPATH%\helloworld
    
  2. Crie um arquivo app.rb no diretório helloworld com o seguinte conteúdo:

    require "functions_framework"
    require "cgi/escape"
    require "json"
    
    FunctionsFramework.http "hello_http" do |request|
      # The request parameter is a Rack::Request object.
      # See https://www.rubydoc.info/gems/rack/Rack/Request
      name = request.params["name"] ||
             begin
               request.body.rewind
               JSON.parse(request.body.read)["name"]
             rescue StandardError
               nil
             end ||
             "World"
      # Return the response body as a string.
      # You can also return a Rack::Response object, a Rack response array, or
      # a hash which will be JSON-encoded into a response.
      "Hello #{CGI.escape_html name}!"
    end

    Esse exemplo de função recebe um nome fornecido na solicitação HTTP e retorna uma saudação, ou "Hello World!", quando nenhum nome é fornecido.

Especificar as dependências

Dependências no Ruby são gerenciadas com o Bundler (em inglês) e expressas em um arquivo chamado Gemfile.

Quando você implanta sua função, as funções do Cloud Run faz o download e instala as dependências declaradas em Gemfile e Gemfile.lock usando bundler.

O Gemfile lista os pacotes obrigatórios para a função junto com as restrições de versão opcionais. Para uma função do Cloud Run, um desses pacotes precisa ser o gem functions_framework.

Neste exercício, crie um arquivo chamado Gemfile no mesmo diretório que o app.rb que contém o código da função, com o seguinte conteúdo:

source "https://rubygems.org"

gem "functions_framework", "~> 0.7"

Execute o seguinte comando para instalar o gem functions_framework e outras dependências:

bundle install

Criar e testar localmente

Antes de implantar a função, é possível criá-la e testá-la localmente: Execute o seguinte comando para usar o executável functions-framework-ruby para iniciar um servidor da Web local executando sua função hello_http:

bundle exec functions-framework-ruby --target hello_http
# ...starts the web server in the foreground

Se a função for criada com sucesso, ela exibirá o URL que você pode visitar no navegador da Web para ver a função em ação: http://localhost:8080/. Você verá uma mensagem Hello World!.

Como alternativa, envie solicitações para essa função usando curl de outra janela de terminal:

curl localhost:8080
# Output: Hello World!

Consulte também Como testar funções na documentação do framework de funções do Ruby.

Implantar a função

Para implantar a função com um gatilho HTTP, execute o seguinte comando no diretório helloworld:

gcloud functions deploy hello_http --no-gen2 --runtime ruby40 --trigger-http --allow-unauthenticated

A flag --allow-unauthenticated permite que você atinja a função sem autenticação. Para exigir autenticação, omita a sinalização.

Testar a função de implantação

  1. Quando a implantação da função estiver concluída, anote a propriedade httpsTrigger.url ou encontre-a usando o seguinte comando:

    gcloud functions describe hello_http
    

    A aparência será semelhante a esta:

    https://GCP_REGION-PROJECT_ID.cloudfunctions.net/hello_http
  2. Visite este URL no navegador. Você verá uma mensagem "Hello World!".

    Tente passar um nome na solicitação HTTP, por exemplo, usando este URL:

    https://GCP_REGION-PROJECT_ID.cloudfunctions.net/hello_http?name=NAME

    Você verá uma mensagem "Hello NAME!"

Ver registros

É possível visualizar os registros de funções do Cloud Run na UI do Cloud Logging ou na CLI do Google Cloud.

Conferir os registros com a ferramenta de linha de comando

Para ver os registros da função com a CLI gcloud, use o comando logs read, seguido pelo nome da função:

gcloud functions logs read hello_http

A saída será semelhante a esta:

LEVEL  NAME       EXECUTION_ID  TIME_UTC                 LOG
D      helloHttp  rvb9j0axfclb  2019-09-18 22:06:25.983  Function execution started
D      helloHttp  rvb9j0axfclb  2019-09-18 22:06:26.001  Function execution took 19 ms, finished with status code: 200

Ver registros no painel do Logging

Também é possível ver os registros do Cloud Run functions no console doGoogle Cloud .