Trabalhando com Funções

Uma função é um trecho de código sem estado que executa tarefas à medida que é chamada pelas solicitações do site HTTP. Com as funções IBM Code Engine, você pode executar sua lógica de negócios de forma escalonável e sem servidor. IBM Code Engine oferecem um ambiente de tempo de execução otimizado para dar suporte a cenários de baixa latência e rápida expansão. Seu código de função pode ser escrito em um tempo de execução gerenciado que inclui versões específicas de Node.js ou Python.

Um pacote configurável de código é uma coleção de arquivos que representa seu código de função. Este pacote configurável de códigos é injetado no contêiner de tempo de execução Seu pacote configurável de códigos é criado pelo Code Engine e armazenado no registro do contêiner ou sequencial com a função. Um pacote configurável de código não é uma imagem de contêiner padrão do Open Container Initiative (OCI)

Antes de Iniciar

Não tem certeza de qual tipo de carga de trabalho do Code Engine criar? Consulte Planejamento do Code Engine.

Limitações de função

  • Não há suporte para assinar produtores de eventos
  • Nenhum suporte para Terraform.

Como faço para que meu código seja executado como um componente de função Code Engine?

Independentemente de seu código existir como código-fonte em um arquivo local ou em um repositório Git, ou de seu código ser um pacote de código existente localizado em um registro público ou privado, o Code Engine oferece uma maneira simplificada de executar seu código como uma função.

  • Se estiver começando com o código-fonte localizado em um repositório Git, você poderá optar por apontar para o local do código-fonte, e o Code Engine se encarregará de criar o pacote de código a partir do código-fonte e de criar a função com uma única operação. Nesse cenário, Code Engine faz o upload de seu código para IBM Cloud® Container Registry. Para saber mais, consulte Criando uma função a partir do código fonte do repositório.

  • Se estiver começando com o código-fonte em uma estação de trabalho local, você poderá optar por apontar para o local do código-fonte, e o site Code Engine se encarregará de criar a imagem a partir do código-fonte e de criar a função com um único comando da CLI. Nesse cenário, Code Engine faz o upload de seu código para IBM Cloud® Container Registry. Para saber mais, consulte Criando sua função a partir do código-fonte local com a CLI.

  • Se você estiver iniciando com o código-fonte, também será possível executar o código de origem sequencial em linha. Nesse cenário, você cola seu código-fonte ao criar sua função. Para obter mais informações, consulte Criando sua função com código sequencial.

Depois de criar e executar a função, você também pode atualizá-la usando qualquer uma das formas anteriores, independentemente de como criou ou atualizou a função anteriormente.

O que acontece quando eu chamo minha função?

Quando uma função é chamada (iniciada), a instância de Função correspondente é inicializada com o contêiner de Tempo de execução configurado e os parâmetros de Recurso O processo da primeira inicialização é referido como cold start..

Para reduzir a latência de cold start, o Code Engine otimiza a chamada pré-aquecendo determinados tempos de execução com configurações específicas de CPU e memória. As combinações pré-aquecidas para funções incluem os tempos de execução Node.js e Python, bem como a combinação padrão de CPU e memória para funções, que é 0.25 vCPU x 1 GB de memória. Além disso, o sistema é projetado para melhorar a reutilização de instâncias de Função que já estão inicializadas Portanto, uma instância de Função é mantida ativa após a chamada ser concluída para permitir chamadas subsequentes, reutilizando a mesma instância e reutilizando o estado da instância quando a última chamada foi concluída A reutilização de uma instância de Função não é garantida..

Posso manter minha instância de função ativa por mais tempo?

Com o Code Engine, sua função aumenta e para baixo automaticamente, com base na carga de trabalho. Ao criar sua função com a combinação de CPU e memória padrão, sua função é injetada em um contêiner "pré-aquecido", que é otimizado para uso. Ao criar uma função com uma combinação de CPU e memória diferente da combinação padrão, sua função é injetada em um novo contêiner. Por padrão, esse contêiner é mantido ativo por apenas um curto período de tempo após a conclusão da função.. Para obter mais informações, consulte Combinações de CPU e memória suportadas para funções..

É possível mudar a quantia de tempo que seu contêiner é mantido ativo com a opção --scale-down-delay na CLI ou a opção Atraso de Escala no console. Observe que ao manter seu contêiner ativo reduz os horários de cold start para qualquer execução subsequente de sua função, você também é cobrado pela quantia de tempo que o contêiner de função customizada existe.

Solicitações e respostas

As funções são invocadas com o protocolo HTTP. Ao invocar a função, você pode especificar os parâmetros da solicitação personalizada, o corpo e os cabeçalhos da solicitação personalizada, bem como o método HTTP. Os parâmetros de solicitação são disponibilizados para o código de função como parâmetros de entrada O código de função pode configurar o corpo de resposta, cabeçalhos de resposta e código de resposta, que são retornados para o responsável pela chamada a partir do terminal de funções.

Exemplo 1: Gerando uma resposta HTML a partir de uma função

O exemplo a seguir ilustra como gerar uma resposta HTML de uma função.

  function main(params) {
      var msg = 'You did not tell me who you are.';
      if (params.name) {
          msg = `Hello, ${params.name}!`
       } else {
          msg = `Hello, FaaS on CodeEngine!`
      }
      return {
          headers: { 'Content-Type': 'text/html; charset=utf-8' },
          body: `<html><body><h3>${msg}</h3></body></html>`
       }
  }

  module.exports.main = main;

Exemplo 2: configurando um código de resposta e um cabeçalho de resposta

Sua função pode configurar um código de resposta específico e sinalizações de cabeçalho. O exemplo a seguir mostra como você pode definir um código de resposta e um cabeçalho de resposta para adicionar um redirecionamento para um site diferente URL.

function main(params) {
    return {
        headers: { location: 'https://cloud.ibm.com/docs/codeengine' },
        statusCode: 302
    }
}

Exemplo 3: Gerando uma resposta de texto simples a partir de uma função

O exemplo a seguir ilustra como gerar uma resposta de texto simples a partir de uma função.

function main(params) {
    var msg = 'You did not tell me who you are.';
    if (params.name !== "") {
        msg = `Hello, ${params.name}!`
    }
    return {
        headers: { 'Content-Type': 'text/plain;charset=utf-8' },
        body: `${msg}`
    }
}

Manipulação de erros e depuração

Chamadas de função podem retornar erros do sistema ou do aplicativo. Por exemplo, erros do sistema indicam que o código de função não foi executado com êxito, enquanto erros do aplicativo indicam um problema no próprio código de função.

Quando ocorre um erro de sistema, é retornado um código de resposta HTTP semelhante aos códigos a seguir.

Códigos de resposta HTTP
Código Descrição
409 Os recursos que são necessários pela função não foram satisfeitos.
413 A carga útil da solicitação excede o máximo definido
414 O URI de chamada é muito longo
416 A função gerou uma resposta que excedeu o máximo definido.
422 O código de função é inválido e não pode ser processado. Consulte os registros da plataforma para obter detalhes.
424 O código de função não pôde ser executado. Tente novamente mais tarde.
429 Você excedeu sua cota de recurso, não foi possível planejar a função..
431 Os cabeçalhos de solicitação excedem o máximo definido
500 Erro interno do servidor.
502 Gateway ruim.
503 A função não está disponível no momento, tente novamente mais tarde.
507 Armazenamento insuficiente para carregar a função.

Se Code Engine puder executar o código de funções, ele responderá à chamada com um dos seguintes códigos de status.

Códigos de status
Código Descrição
200 Chamada de função aceita, a função será executada atrasada.
202 Chamada de função aceita, a função será executada assincronamente.
299 A função excedeu o limite de tempo de execução especificado ou máximo e foi interrompida.

Como desenvolvedor de uma função, você pode gerar qualquer código de status HTTP arbitrário, mesmo os listados anteriormente. Portanto, um cabeçalho de resposta indica que o código de status foi gerado pelo código de função.

As funções Code Engine incluem os cabeçalhos de resposta a seguir na resposta de chamada de função.

Códigos de status
Código Descrição
x-faas-actionstatus O código de status HTTP definido pela lógica do programa de funções.
x-faas-activation-id O ID exclusivo para identificar a chamada de função.
x-faas-result Uma mensagem success ou uma mensagem de erro curta que é retornada pelo contêiner de Tempo de Execução.
x-faas-errormessage Uma mensagem de erro longa com detalhes adicionais..
x-faas-prewarmed Uma mensagem que indica se a chamada foi fria ou se a função foi executada em um contêiner pré-aquecido existente. Os valores possíveis são false ou true

Características de entrada / saída de dados de função

Para executar sua função no Code Engine, seu código deve implementar um contrato de tempo de execução com as características a seguir.

  • Deve ser chamável a partir de um endpoint de aplicativo da Web público, para que possa ser incorporado a páginas da Web e, em seguida, invocado a partir de qualquer fonte de eventos Code Engine, um navegador da Web ou qualquer outro cliente compatível com HTTPS.
  • Deve implementar um procedimento main como ponto de entrada. O procedimento main pode receber parâmetros de entrada no formato de uma estrutura de dados formatada JSON e pode retornar parâmetros de saída, também no formato de uma estrutura de dados formatada JSON.
  • Pode receber um subcaminho opcional para que a função possa implementar diferentes tipos, com base no caminho especificado. O procedimento main da função recebe o caminho como um parâmetro de entrada __ce_path
  • Pode receber parâmetros de consulta opcionais, que podem ser usados para configurar a função no tempo de execução O procedimento main da função recebe os parâmetros como pares de valores de chave dentro da estrutura de dados de entrada formatada JSON
  • Pode receber cabeçalhos de solicitação para que o código do cliente possa especificar codificações aceitas.
  • É possível receber um cabeçalho de solicitação de tipo de conteúdo opcional
  • É possível receber uma carga útil de solicitação opcional (corpo), que a função processa no tempo de execução Dependendo do tipo de conteúdo de solicitação selecionado, a carga útil de dados é transmitida para o ponto de entrada principal da função, seja no formato codificado de base 64 ou "desdobrado" como parte da estrutura de dados de entrada JSON. Caracteres especiais em pares de valores de chaves de entrada application/x-www-form-urlencoded são valores percent-encoded.
  • Pode definir um código de status HTTP arbitrário (opcional) que é então retornado ao cliente que o invoca.
  • É possível configurar cabeçalhos de resposta arbitrários, como um local de redirecionamento, uma codificação de resposta ou valores de cookie
  • Pode retornar um corpo de resposta arbitrária com uma codificação binária ou não binária selecionada; por exemplo, application/octet-stream, application/json, text/*, image/* ou audio/* Se nenhum cabeçalho de resposta content-type for configurado, ele será padronizado para text/plain..
  • Suporta os seguintes tipos de conteúdo de solicitação: application/x-www-form-urlencoded (padrão), text/plain, application/json, application/octet-stream, image/*, audio/*
  • Não suporta o cabeçalho da Solicitação multipart/form-data

Opções de visibilidade para uma função Code Engine

Com o site Code Engine, você pode determinar o nível certo de visibilidade para a sua função, definindo os pontos de extremidade ou mapeamentos de domínio do sistema que estão disponíveis para receber solicitações.

Cada função tem um mapeamento interno do domínio do sistema que é visível para todos os componentes dentro do mesmo projeto Code Engine, mas não fora do projeto. Além do mapeamento de domínio do sistema interno, você escolhe tornar a função visível para a internet pública ou para a rede IBM Cloud privada.

Para visibilidade pública ou privada, a função é exposta em um ponto de extremidade HTTPS. Para obter detalhes sobre o certificado TLS que é usado, consulte Certificados TLS para projetos Code Engine.

É possível implementar sua função com os níveis de visibilidade a seguir:

Visibilidade para funções
Configuração Descrição
interno(projeto) Uma função com essa configuração pode receber solicitações de componentes no mesmo projeto do Code Engine. A definição de um ponto de extremidade interno (do projeto) significa que sua função não pode ser acessada pela Internet pública e que o acesso à rede só é possível a partir de outros componentes do Code Engine que estejam sendo executados no mesmo projeto do Code Engine. Esse terminal é sempre ativado Importante: Uma função não pode invocar outro trabalho ou aplicativo usando rotas internas.
público Uma função com essa configuração é exposta à Internet e ao seu projeto Code Engine. Definir um endpoint público significa que sua função pode receber solicitações da Internet pública ou de componentes do seu projeto Code Engine. Essa configuração é a padrão.
privado Uma função com essa configuração é exposta à rede privada IBM Cloud e ao seu projeto Code Engine. A definição de um endpoint privado significa que sua função não pode ser acessada pela Internet pública e que o acesso à rede só é possível a partir de outros serviços do site IBM Cloud usando Virtual Private Endpoints (VPE) ou componentes do site Code Engine que estejam sendo executados no mesmo projeto.

É possível definir as configurações de endpoint para a visibilidade de uma função no console ou com a CLI ao criar e implantar ou atualizar a função.

Implementando sua função com um terminal interno

É possível configurar a visibilidade do terminal para a sua função para implementar com um terminal interno (projeto) Quando você configura um terminal interno (projeto), sua função não é acessível por meio da internet pública e o acesso à rede é possível apenas por meio de outros componentes do Code Engine que estão em execução no mesmo Code Engine projeto. Esse terminal é sempre ativado As funções ainda são acessíveis por meio de componentes compartilhados e, portanto, precisam ser protegidas.

Por exemplo, se a sua solução consistir em várias funções dentro de um projeto, você poderá configurá-la de modo que apenas uma dessas funções seja visível na Internet, para que ela lide com o tráfego de entrada. Essa função voltada para o público pode delegar trabalho a outras funções em sua solução, de modo que elas não precisem estar visíveis na Internet.

Com a CLI, configure a visibilidade do terminal para sua função para que ela seja implementada com um terminal do projeto usando a opção --visibility=project no comando function create ou function update. É possível obter as URLs disponíveis para sua função que refletem sua definição de terminal usando o comando function get.

No console, configure a visibilidade de terminais para sua função usando a configuração Terminais ao criar sua função. Após a sua função ser implementada, é possível visualizar e modificar essas configurações de mapeamento de domínio do sistema na guia Mapeamentos de domínio em sua página Funções

Uma função com essa configuração pode receber solicitações de componentes no mesmo projeto do Code Engine. Entretanto, uma função não pode invocar outro trabalho ou aplicativo usando rotas internas.

Implementação de sua função com um endpoint público

Ao implementar uma função, por padrão, a função pode receber solicitações da Internet pública ou de componentes dentro do mesmo projeto do Code Engine. Nesse caso, a função é implantada com um endpoint público.

Implementação de sua função com um endpoint privado

É possível configurar a visibilidade do terminal para sua função para implementar com um terminal privado. Quando você define um endpoint privado para sua função, ele não pode ser acessado pela Internet pública e o acesso à rede só é possível a partir de outros serviços IBM Cloud de endpoints privados virtuais (VPE) ou componentes Code Engine que estejam sendo executados no mesmo projeto (cluster-local).

Por exemplo, se a sua solução consistir em um componente executado em um cluster IBM Cloud Kubernetes Service Kubernetes dentro do seu próprio endpoint virtual privado e você quiser acessar a função Code Engine a partir da rede privada IBM Cloud, poderá definir a visibilidade da função como privada. Quando a visibilidade da função é definida como privada, a função não pode ser acessada pela Internet pública. A função ainda pode ser acessada de outras funções do projeto.

É possível criar sua função com um terminal privado para que a função seja exposta apenas por meio da rede privada IBM Cloud e não exposta à Internet externa. A função ainda pode ser acessada por meio de componentes compartilhados de dentro da rede interna e o ponto de extremidade da função precisa ser protegido.

Com a CLI, configure a visibilidade do terminal para sua função para que ela seja implementada com um terminal privado usando a opção --visibility=private no comando function create ou function update. É possível obter as URLs disponíveis para sua função que refletem sua definição de terminal usando o comando function get.

No console, configure a visibilidade de terminais para sua função usando a configuração Terminais ao criar sua função. Após a sua função ser implementada, é possível visualizar e modificar essas configurações de mapeamento de domínio do sistema na guia Mapeamentos de domínio em sua página Funções

Para obter mais informações sobre a conexão em redes privadas, consulte Usando terminais privados virtuais com o Code Engine.

Opções para criar funções

Saiba mais sobre as opções que você pode especificar ao criar sua função. Observe que as opções podem variar entre o console e a CLI.

Memória e CPU

Ao implementar sua função, você pode especificar a quantidade de memória e CPU que ela pode consumir. Essas quantidades podem variar, dependendo do fato de sua função ser de computação intensiva, de memória intensiva ou equilibrada.

Por padrão, sua função recebe 4 G de memória e 1.0 vCPU. Para obter mais informações sobre outras combinações de memória e CPU suportadas, consulte Combinações de memória e CPU suportadas para funções.

Criar e executar sua função com variáveis de ambiente

Você pode definir e configurar variáveis de ambiente como pares de valores-chave que podem ser usados pela sua função em tempo de execução.

Você pode definir variáveis de ambiente ao criar a função ou ao atualizar uma função existente com a CLI.

Para obter mais informações sobre a definição de variáveis de ambiente, consulte Trabalhando com variáveis de ambiente.

Code Engine injeta automaticamente determinadas variáveis de ambiente na função. Para obter mais informações sobre variáveis de ambiente injetadas automaticamente, consulte Variáveis de ambiente injetadas automaticamente.

Criar e executar sua função ao usar segredos e configmaps

Em Code Engine, os segredos e os configmaps podem ser consumidos por sua função usando variáveis de ambiente.

Os segredos e configmaps são pares chave-valor. Quando mapeados para variáveis de ambiente, os relacionamentos NAME=VALUE são configurados de tal forma que o nome da variável de ambiente corresponde à "key" de cada entrada nesses mapas, e o valor da variável de ambiente é o "value" dessa chave.

Sua função pode usar variáveis de ambiente para fazer referência completa a um configmap (ou segredo) ou fazer referência a chaves individuais em um configmap (ou segredo).

Para obter mais informações, consulte Referenciando segredos usando variáveis de ambiente e Referenciando configmaps usando variáveis de ambiente.

Considerações para Cotas de Funções

Ao trabalhar com aplicativos, funções e tarefas em lote, esses recursos são executados no contexto de um projeto do Code Engine. As cotas de recursos são definidas por projeto e os limites se aplicam a aplicativos, funções e tarefas em lote.

Para obter mais informações sobre limites do Code Engine, consulte Limites e cotas para o Code Engine.

Próximas etapas

Agora que você está familiarizado com os conceitos-chave de trabalho com as funções Code Engine, está pronto para criar e trabalhar com as funções? Consulte os tópicos a seguir.

Para obter mais informações sobre como trabalhar com funções, consulte os tópicos a seguir.