Execute funções com o Functions Framework

As funções do Cloud Run usam as bibliotecas de Functions Framework de código aberto para encapsular as funções implementadas numa aplicação HTTP persistente.

O Functions Framework também pode ser executado em qualquer outra plataforma que suporte a própria linguagem, incluindo a sua máquina local, servidores no local, o Compute Engine e o Cloud Run.

Instale dependências

No diretório da sua função, instale a biblioteca Functions Framework para o seu idioma:

Consulte a biblioteca Java Functions Framework para mais informações.

Node.js

npm install --save-dev @google-cloud/functions-framework

Python

pip install functions-framework

Go

go install github.com/GoogleCloudPlatform/functions-framework-go/funcframework

Java

Maven

Se estiver a usar o Maven, adicione o seguinte ao ficheiro pom.xml:

<dependency>
  <groupId>com.google.cloud.functions</groupId>
  <artifactId>functions-framework-api</artifactId>
  <version>1.1.0</version>
  <scope>provided</scope>
</dependency>

Gradle

Se estiver a usar o Gradle, adicione o seguinte ao ficheiro build.gradle:

dependencies {
  // Every function needs this dependency to get the Functions Framework API.
  compileOnly 'com.google.cloud.functions:functions-framework-api:1.1.0'

  // To run function locally using Functions Framework's local invoker
  invoker 'com.google.cloud.functions.invoker:java-function-invoker:1.3.1'
}

C#

Os comandos abaixo usam modelos .NET para criar uma nova base de código da função do Cloud Run .NET com a biblioteca.NET Functions Framework como uma dependência:

# HTTP functions
dotnet new gcf-http

# CloudEvent functions
dotnet new gcf-event

Ruby

Em Ruby, o Functions Framework tem de ser adicionado às dependências da sua função para a implementar em funções do Cloud Run:

bundle add functions_framework

PHP

composer require google/cloud-functions-framework

Configure o Functions Framework

Antes de executar uma função com o Functions Framework, tem de especificar o tipo e o nome da função que quer executar. Estes atributos podem ser especificados como um indicador da interface de linhas de comando (CLI) ou como variáveis de ambiente.

Tipos de funções suportados

O Functions Framework suporta todos os três tipos de funções suportados pelas funções do Cloud Run de 1.ª geração. Todos os runtimes de idiomas suportam http e event ou cloudevent.

Tipo de função Tipo de assinatura Descrição Tempos de execução suportados
Funções acionadas por HTTP http Funções que recebem e respondem a pedidos HTTP. Todos os tempos de execução
Funções em segundo plano event Formato de evento específico das funções do Cloud Run Node.js, Python, Go, Java
Funções CloudEvent cloudevent Formato de evento padrão da indústria .NET, Ruby, PHP

Especifique a função a executar

Antes de executar uma função com o Functions Framework, tem de especificar que função no seu código deve ser executada. Para a maioria dos idiomas, pode fazê-lo especificando o nome do método da função de destino, conforme mostrado nas tabelas abaixo. (As exceções a esta regra, como Java e .NET, também são apresentadas abaixo.)

Instruções por idioma

Consulte a tabela abaixo para ver uma lista de opções de configuração suportadas por cada idioma.

Node.js

Argumento da CLI Variável de ambiente Descrição
--port PORT A porta para ouvir pedidos. (Predefinição: 8080)
--target FUNCTION_TARGET O nome da função exportcom nome a ser invocada. (Predefinição: function)
--signature-type FUNCTION_SIGNATURE_TYPE O tipo de assinatura usado pela sua função. Pode ser um dos seguintes: http (predefinição), event ou cloudevent.

Python

Argumento da CLI Variável de ambiente Descrição
--port PORT A porta para ouvir pedidos. (Predefinição: 8080)
--target FUNCTION_TARGET O nome da função exportcom nome a ser invocada. (Predefinição: function)
--signature-type FUNCTION_SIGNATURE_TYPE O tipo de assinatura usado pela sua função. Pode ser um dos seguintes: http (predefinição), event ou cloudevent.

Go

Variável de ambiente Descrição
PORT A porta para ouvir pedidos. (Predefinição: 8080)

Java

Nome do argumento Variável de ambiente Descrição
run.port PORT A porta para ouvir pedidos. (Predefinição: 8080)
run.functionTarget FUNCTION_TARGET O nome da função exportcom nome a ser invocada. (Predefinição: function)

C#

Argumento da CLI Variável de ambiente Descrição
--port PORT A porta para ouvir pedidos. (Predefinição: 8080)
--target (ou único argumento) FUNCTION_TARGET O nome da classe da função a invocar. (Predefinição: function)

Ruby

Argumento da CLI Variável de ambiente Descrição
--port PORT A porta para ouvir pedidos. (Predefinição: 8080)
--target FUNCTION_TARGET O nome da função exportcom nome a ser invocada. (Predefinição: function)

PHP

Variável de ambiente Descrição
FUNCTION_TARGET O nome da função a invocar. (Predefinição: function)
FUNCTION_SIGNATURE_TYPE O tipo de assinatura usado pela sua função. Pode ser um dos seguintes: http (predefinição), event ou cloudevent.

Siga as instruções abaixo para configurar e executar o Functions Framework:

Node.js

O Functions Framework do Node.js permite-lhe especificar o nome da sua função e o tipo de assinatura como argumentos da linha de comandos ou variáveis de ambiente.

Também pode especificar estes valores no package.json buildfile adicionando um script start com os argumentos da CLI necessários, conforme mostrado no exemplo abaixo.

"scripts": {
  "start": "npx functions-framework --target=YOUR_FUNCTION_NAME [--signature-type=YOUR_SIGNATURE_TYPE]"
}

O mesmo pode ser feito através de variáveis de ambiente:

"scripts": {
  "start": "FUNCTION_TARGET=YOUR_FUNCTION_NAME FUNCTION_SIGNATURE_TYPE=YOUR_SIGNATURE_TYPE npx functions-framework"
}

Substitua YOUR_FUNCTION_NAME pelo nome do método da sua função e YOUR_SIGNATURE_TYPE (se aplicável) pelo tipo de assinatura da sua função, conforme mostrado na tabela acima.

Python

O Python Functions Framework permite-lhe especificar o nome da função e o tipo de assinatura como argumentos da linha de comandos ou variáveis de ambiente. Os argumentos da linha de comandos têm de ser especificados quando executa a framework.

Go

O Go Functions Framework usa funcframework.RegisterHTTPFunctionContext para especificar o destino da função e o tipo de assinatura.

Java

O Java Functions Framework aceita dados de configuração de três origens diferentes, na seguinte ordem de prioridade (do mais específico para o menos específico):

  • Argumentos da linha de comandos
  • Buildfiles
  • Variáveis de ambiente

Argumentos da linha de comandos

Maven

Pode especificar a função que quer executar adicionando a seguinte flag da interface de linhas de comando (CLI) aos seus comandos mvn:

-Drun.functionTarget=YOUR_FUNCTION_NAME

Também pode especificar a porta de destino adicionando a seguinte flag da CLI de forma semelhante:

-Drun.port=12345

Gradle

Os flags da CLI do Gradle são quase idênticos aos do Maven. A única alteração que o Gradle faz é trocar o -D inicial em cada flag por um -P, conforme mostrado no exemplo abaixo:

# Maven version
-Drun.functionTarget=...

# Gradle version
-Prun.functionTarget=...

Buildfiles

Também pode especificar a função que quer executar no ficheiro de compilação do seu projeto. Embora o Maven e o Gradle tenham flags da CLI semelhantes, as respetivas cláusulas do ficheiro de compilação diferem significativamente.

Maven

Os ficheiros de compilação do Maven têm o nome pom.xml. Adicione a seguinte cláusula a este ficheiro para especificar uma função de destino:

<plugin>
  <groupId>com.google.cloud.functions</groupId>
  <artifactId>function-maven-plugin</artifactId>
  <version>0.11.0</version>
  <configuration>
    <functionTarget>functions.HelloWorld</functionTarget>
  </configuration>
</plugin>

Substitua <functionTarget> pelo nome da classe da sua função. (Por exemplo, uma função no pacote functions com o nome da classe HelloCloudFunctions teria o nome da classe functions.HelloCloudFunctions. Isto é relativo ao ficheiro de compilação principal: pom.xml ou build.gradle.

Gradle

Os ficheiros de compilação do Gradle têm o nome build.gradle. Adicione a seguinte cláusula a este ficheiro para especificar uma função de destino:

// Register a "runFunction" task to run the function locally
tasks.register("runFunction", JavaExec) {
  main = 'com.google.cloud.functions.invoker.runner.Invoker'
  classpath(configurations.invoker)
  inputs.files(configurations.runtimeClasspath, sourceSets.main.output)
  args(
    '--target', project.findProperty('run.functionTarget') ?: '',
    '--port', project.findProperty('run.port') ?: 8080
  )
  doFirst {
    args('--classpath', files(configurations.runtimeClasspath, sourceSets.main.output).asPath)
  }
}

C#

Se criar o seu projeto com dotnet new e um dos modelos especificados acima, o .NET Functions Framework deteta automaticamente a sua função.

Se o seu projeto contiver várias funções, consulte a secção Executar a framework para obter informações sobre como executar uma função específica.

Ruby

O Ruby Functions Framework permite-lhe especificar o nome da sua função e o tipo de assinatura como argumentos da linha de comandos ou variáveis de ambiente. Os argumentos da linha de comandos têm de ser especificados quando executa a framework.

PHP

O framework de funções PHP permite-lhe especificar variáveis de ambiente como argumentos da linha de comandos.

Também pode especificar estes valores no composer.jsonbuildfile adicionando um script start, conforme mostrado no exemplo abaixo.

"scripts": {
   "start": [
       "Composer\\Config::disableProcessTimeout",
       "FUNCTION_TARGET=YOUR_FUNCTION_NAME php -S localhost:${PORT:-8080} vendor/bin/router.php"
    ]
}

Substitua YOUR_FUNCTION_NAME pelo nome da sua função e YOUR_SIGNATURE_TYPE (se aplicável) pelo tipo de assinatura da sua função, conforme mostrado na tabela acima.

Execute o Functions Framework

Use o seguinte comando para executar a sua função com o Functions Framework. Por predefinição, a sua função vai estar acessível em localhost:8080, a menos que especifique explicitamente um valor PORT.

Node.js

npm start

Python

Usando argumentos da linha de comandos:

functions-framework --target=YOUR_FUNCTION_NAME

Usando variáveis de ambiente:

FUNCTION_TARGET=YOUR_FUNCTION_NAME functions-framework

Substitua YOUR_FUNCTION_NAME pelo nome do método da sua função.

Go

cd cmd
go build
./cmd

Usando variáveis de ambiente:

cd cmd
go build
PORT=8080 ./cmd

Java

Maven

Use o seguinte comando para executar uma função especificada em pom.xml:

mvn function:run

Use o seguinte comando para executar uma função especificada num argumento da linha de comandos:

mvn function:run -Drun.functionTarget=YOUR_FUNCTION_NAME

Use o seguinte comando para executar uma função especificada como uma variável de ambiente:

FUNCTION_TARGET=YOUR_FUNCTION_NAME mvn function:run

Substitua YOUR_FUNCTION_NAME pelo nome da classe da sua função.

Gradle

Use o seguinte comando para executar uma função especificada em build.gradle:

./gradlew runFunction

Use o seguinte comando para executar uma função especificada num argumento da linha de comandos:

./gradlew runFunction -Prun.functionTarget=YOUR_FUNCTION_NAME

Use o seguinte comando para executar uma função especificada como uma variável de ambiente:

FUNCTION_TARGET=YOUR_FUNCTION_NAME ./gradlew runFunction

Substitua YOUR_FUNCTION_NAME pelo nome da classe da sua função.

C#

Use o seguinte comando para executar a sua função quando existir exatamente uma função no projeto .NET atual. (Esta é a estrutura predefinida para projetos criados com base em modelos.)

dotnet run

Se o seu projeto .NET contiver várias funções, use o seguinte comando para executar uma função específica. Substitua YOUR_FUNCTION_CLASSNAME pelo nome da classe da função, incluindo o espaço de nomes.

dotnet run YOUR_FUNCTION_CLASSNAME

Se quiser executar várias funções em simultâneo, tem de executar várias instâncias do Functions Framework. Para evitar conflitos entre instâncias de frameworks em execução, cada instância deve usar um valor de PORT diferente. O comando seguinte mostra como executar uma função com um valor de PORT de 8080.

Usando argumentos da linha de comandos:

dotnet run --target YOUR_FUNCTION_CLASSNAME --port 8080

Usando variáveis de ambiente:

FUNCTION_TARGET=YOUR_FUNCTION_CLASSNAME PORT=8080 dotnet run

Ruby

Usando argumentos da linha de comandos:

bundle exec functions-framework-ruby --target YOUR_FUNCTION_NAME

Usando variáveis de ambiente:

FUNCTION_TARGET=YOUR_FUNCTION_NAME bundle exec functions-framework-ruby

Substitua YOUR_FUNCTION_NAME pelo nome do método da sua função.

PHP

export FUNCTION_TARGET=YOUR_FUNCTION_NAME
php -S localhost:8080 vendor/bin/router.php

Substitua YOUR_FUNCTION_NAME pelo nome da sua função.

Chame a sua função

Consulte a página Chamar funções locais para ver instruções sobre como interagir com a sua função executada localmente.

Limpar

Quando terminar de executar a função, pare a instância da framework em execução premindo Control+C.