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:

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).
Dica

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:

  1. Acesse o ambiente de desenvolvimento como desenvolvedor de funções.

  2. 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 com echo -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:

  1. Acesse o ambiente de desenvolvimento como desenvolvedor de funções.

  2. 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 comando fn inspect para ver o valor da propriedade id 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:

  1. Acesse o ambiente de desenvolvimento como desenvolvedor de funções.

  2. 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:

  1. Acesse o ambiente de desenvolvimento como desenvolvedor de funções.

  2. 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).

  3. 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 !
  4. Se uma senha tiver sido fornecida para criptografar a chave de assinatura da API, informe a senha quando solicitado.