Chamando Funções
Descubra as diferentes maneiras de chamar funções implantadas no OCI Functions.
Você pode chamar uma função que implantou no OCI Functions de diversas maneiras:
- Usando a CLI do Fn Project.
- Usando a CLI do Oracle Cloud Infrastructure.
- Usando os SDKs do Oracle Cloud Infrastructure.
- Fazendo uma solicitação HTTP assinada para o ponto final de chamada da função. Cada função tem um ponto final de chamada.
Cada uma das chamadas acima chama a função por meio de solicitações à API. Qualquer solicitação à API deve ser autenticada incluindo uma assinatura e o OCID do compartimento ao qual a função pertence no cabeçalho da solicitação. Tal solicitação é referenciada como uma solicitação 'assinada'. A assinatura inclui credenciais do Oracle Cloud Infrastructure em um formato criptografado.
Se você usar a CLI do Fn Project ou a CLI do Oracle Cloud Infrastructure para chamar uma função, a autenticação será tratada para você. Consulte Usando a CLI do Fn Project para Chamar Funções e Usando a CLI do Oracle Cloud Infrastructure para Chamar Funções.
Se você usar um SDK do Oracle Cloud Infrastructure para chamar uma função, poderá usar o SDK para tratar a autenticação. Consulte Usando SDKs para Chamar Funções.
Se você fizer uma solicitação HTTP assinada para um ponto final de chamada da função, você terá de tratar a autenticação incluindo uma assinatura e o OCID do compartimento ao qual a função pertence no cabeçalho da solicitação. Você pode fazer isso de diversas maneiras:
- Usando o comando
raw-request
da CLI do Oracle Cloud Infrastructure. Consulte Enviando uma Solicitação Assinada ao Ponto Final de Chamada de uma Função (usando o comando raw-request da CLI do Oracle Cloud Infrastructure). - O código de gravação para assinar solicitações de forma programática. Para obter informações sobre as credenciais necessárias e sobre como assinar as solicitações, consulte Assinaturas de Solicitação.
Observe que a forma como você chama uma função determina o tempo máximo pelo qual a função pode ser executada, da seguinte forma:
- Se você chamar uma função usando a CLI do Fn Project, o Timeout especificado na definição da função será aplicado (o padrão é 30 segundos). Consulte Alterando Definições de Memória e Timeout Padrão.
- Se você chamar uma função usando a CLI do Oracle Cloud Infrastructure, o valor do parâmetro global
--read-timeout
da CLI do OCI será aplicado (o padrão é 60 segundos). Consulte chamada de função oci fn. - Se você chamar uma função usando os SDKs do Oracle Cloud Infrastructure, o timeout de leitura especificado para o cliente será aplicado. Por exemplo, consulte a documentação do Java SDK e do Python SDK.
- Se você chamar uma função usando o SDK PL/SQL, o valor de
UTL_HTTP.set_transfer_timeout
será aplicado (o padrão é 60 segundos). - Se você chamar uma função da API REST DBMS_CLOUD usando DBMS_CLOUD.SEND_REQUEST, o valor de
UTL_HTTP.set_transfer_timeout
será aplicado (o padrão é 60 segundos).
Se você não puder concluir com sucesso uma das etapas deste tópico, consulte as soluções para problemas comuns (consulte Diagnóstico e Solução de Problemas do OCI Functions).
Tipos de Chamada Síncrona e Desanexada
Ao chamar uma função, você pode especificar um tipo para a chamada de função. O tipo de chamada de função determina a responsabilidade pelo tratamento de resultados, quando o controle é retornado ao chamador e o código de status HTTP retornado, da seguinte forma:
- Sincronização: Se você especificar Sincronização como o tipo de chamada de função (o padrão), o OCI Functions executará a solicitação. Em seguida, na conclusão bem-sucedida, o OCI Functions emite um código de status HTTP 200 e retorna o resultado ao chamador, juntamente com o controle.
- Desanexado: Se você especificar Desanexado como o tipo de chamada de função, o OCI Functions executará a solicitação. Então, assim que o processamento começa, o OCI Functions emite um código de status HTTP 202 e retorna o controle ao chamador. A função em si é responsável pelo tratamento dos resultados.
Para especificar o tipo de chamada de função:
- Ao chamar uma função usando o comando
fn function invoke
da CLI do OCI, use o parâmetro--fn-invoke-type
. Por exemplo:oci fn function invoke --function-id ocid1.fnfunc.oc1.phx.aaaa____uxoa --file "-" --body "" --fn-invoke-type "detached"
- Ao chamar uma função de outra função usando uma das FDKs, especifique o tipo de chamada na chamada de função. Por exemplo, usando o Python FDK:
resp = client.invoke_function(function_id=function_ocid, invoke_function_body=function_body, fn_invoke_type='detached')
- Ao chamar uma função usando o comando
raw-request
da CLI do OCI, inclua"fn-invoke-type"
no parâmetro--request- headers
. Por exemplo:oci raw-request --http-method POST --target-uri https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke --request-body "" --request-headers '{"fn-invoke-type" : "detached"}'
Usando a CLI do Fn Project para Chamar Funções
Para chamar uma função implantada no OCI Functions usando a CLI do Fn Project:
-
Acesse o ambiente de desenvolvimento como desenvolvedor de funções.
-
Em uma janela de terminal, digite:
fn invoke <app-name> <function-name>
em que:
-
<app-name>
é o nome do aplicativo que contém a função que você deseja chamar -
<function-name>
é o nome da função que você deseja chamar
Por exemplo:
fn invoke helloworld-app helloworld-func
Saída:
Hello World !
Dica
Se quiser passar argumentos e valores para uma função, coloque no prefixo o comando
fn invoke
comecho -n '<argument>=<value>' |
Se a função estiver esperando o argumento e o valor como JSON, use um formato JSON válido. Por exemplo:
echo -n '{"name":"John"}' | fn invoke helloworld-app helloworld-func
Saída:
Hello John !
-
Usando a CLI do Oracle Cloud Infrastructure para Chamar Funções
Se você tiver instalado a CLI do Oracle Cloud Infrastructure, poderá usá-la para enviar solicitações de API para chamar funções. Entre outras coisas, a CLI do Oracle Cloud Infrastructure facilitará a autenticação do Oracle Cloud Infrastructure. Para obter informações sobre como usar a CLI do Oracle Cloud Infrastructure, consulte Interface de Linha de Comandos (CLI).
Estas instruções consideram que:
- você já instalou e configurou a CLI do Oracle Cloud Infrastructure
- você deseja chamar uma função como desenvolvedor de funções que está configurada para o seu ambiente de desenvolvimento
Para chamar uma função usando a CLI do Oracle Cloud Infrastructure:
-
Acesse o ambiente de desenvolvimento como desenvolvedor de funções.
-
Em uma janela de terminal, digite:
oci fn function invoke --function-id <function-ocid> --file "<output-filepath>" --body "<request-parameters>"
em que:
-
<function-ocid>
é o OCID da função que você deseja chamar. Para descobrir o OCID de uma função, use o comandofn inspect
para ver o valor da propriedadeid
da função (consulte Listando Funções). -
<output-filepath>
é o caminho e o nome de um arquivo para gravar a resposta. Para gravar a resposta em stdout, especifique--file "-"
<request-parameters>
são argumentos e valores opcionais para passar para a função. Se a função estiver esperando argumentos e valores como JSON, use um formato JSON válido. Por exemplo,--body '{"name":"John"}'
. Observe que você deve incluir--body ""
na solicitação, mesmo se não houver parâmetros de solicitação a serem aprovados.
Por exemplo:
oci fn function invoke --function-id ocid1.fnfunc.oc1.phx.aaaa____uxoa --file "-" --body ""
Saída:
Hello World !
oci fn function invoke --function-id ocid1.fnfunc.oc1.phx.aaaa____uxoa --file "-" --body '{"name":"John"}'
Saída:
Hello John !
-
Usando SDKs para Chamar Funções
Se você estiver gravando um programa para chamar uma função em uma linguagem para a qual existe um SDK do Oracle Cloud Infrastructure, recomendamos que você use esse SDK para enviar solicitações de API para chamar a função. Entre outras coisas, o SDK facilitará a autenticação do Oracle Cloud Infrastructure.
Observe que, ao usar um SDK para chamar uma função, você não especifica todo o ponto final de chamada especificado ao usar o comando raw-request
da CLI do Oracle Cloud Infrastructure (consulte Obtendo o Ponto Final de Chamada de uma Função). Em vez disso, especifique apenas a primeira parte do ponto final de chamada da função. Por exemplo, ao usar um SDK, não especifique o ponto final de chamada da função como https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke
. Em vez disso, especifique o ponto final de chamada da função como https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com
.
Para obter informações sobre como usar a API e assinar solicitações, consulte a documentação da API REST e Credenciais de Segurança. Para obter informações sobre SDKs, consulte SDKs e a CLI.
Use a operação API InvokeFunction para chamar funções.
Obtendo um Ponto Final de Chamada da Função
Ao chamar uma função usando o comando raw-request
da CLI do Oracle Cloud Infrastructure, você precisa especificar o ponto final de chamada da função.
Para obter o ponto final de chamada de uma função:
-
Acesse o ambiente de desenvolvimento como desenvolvedor de funções.
-
Em uma janela de terminal, digite:
fn inspect function <app-name> <function-name>
em que:
-
<app-name>
é o nome do aplicativo que contém a função para a qual você deseja obter o ponto final da chamada -
<function-name>
é o nome da função para a qual você deseja obter o ponto final de chamada
Por exemplo:
fn inspect function helloworld-app helloworld-func
Saída:
{ "annotations": { "fnproject.io/fn/invokeEndpoint": "https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke", ... }
O ponto final de chamada da função é o valor de
"fnproject.io/fn/invokeEndpoint"
. Por exemplo,"https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke"
(abreviado para legibilidade). -
Enviando uma Solicitação Assinada ao Ponto Final de Chamada de uma Função (usando o comando raw-request da CLI do Oracle Cloud Infrastructure)
Se você tiver instalado a CLI do Oracle Cloud Infrastructure, poderá usá-la para enviar solicitações de API para chamar funções. Entre outras coisas, a CLI facilitará a autenticação do Oracle Cloud Infrastructure. Para obter mais informações sobre como usar a CLI do Oracle Cloud Infrastructure, consulte Interface de Linha de Comandos (CLI).
Estas instruções consideram que:
- você já instalou e configurou a CLI do Oracle Cloud Infrastructure
- você deseja chamar uma função como desenvolvedor de funções que está configurada para o seu ambiente de desenvolvimento
Para chamar uma função implantada no OCI Functions enviando uma solicitação assinada para o ponto final de chamada da função usando o comando raw-request
da CLI do Oracle Cloud Infrastructure:
-
Acesse o ambiente de desenvolvimento como desenvolvedor de funções.
-
Obtenha o ponto final de chamada da função (consulte Obtendo um Ponto Final de Chamada da Função).
Por exemplo,
"fnproject.io/fn/invokeEndpoint": "https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke"
(abreviado para legibilidade). -
Use o comando
raw-request
da CLI do Oracle Cloud Infrastructure para chamar a função enviando uma solicitação POST assinada para o ponto final de chamada da função informando:oci raw-request --http-method POST --target-uri <invoke-endpoint> --request-body "<request-parameters>"
em que:
<invoke-endpoint>
é o ponto final que você obteve na etapa anterior.<request-parameters>
são argumentos e valores opcionais para passar para a função. Se a função estiver esperando argumentos e valores como JSON, use um formato JSON válido. Observe que você deve incluir--request-body ""
na solicitação, mesmo se não houver parâmetros de solicitação a serem aprovados.
Por exemplo:
oci raw-request --http-method POST --target-uri https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke --request-body ""
Saída:
Hello World !
oci raw-request --http-method POST --target-uri https://fht7ns4mn2q.us-phoenix-1.functions.oci.oraclecloud.com/20181201/functions/ocid1.fnfunc.oc1.phx.aaaa____uxoa/actions/invoke --request-body '{"name":"John"}'
Saída:
Hello John !
- Se uma senha tiver sido fornecida para criptografar a chave de assinatura da API, informe a senha quando solicitado.