Utilizzo delle funzioni

Una funzione è uno snippet di codice stateless che esegue compiti quando viene invocato dalle richieste di HTTP. Con le funzioni di IBM Code Engine è possibile eseguire la logica aziendale in modo scalabile e senza server. IBM Code Engine le funzioni di questo tipo forniscono un ambiente di runtime ottimizzato per supportare scenari a bassa latenza e di scale-out rapido. Il codice delle funzioni può essere scritto in un runtime gestito che include versioni specifiche di Node.js o Python.

Un bundle di codici è una raccolta di file che rappresenta il codice della funzione. Questo bundle di codice viene inserito nel contenitore di runtime. Il tuo bundle di codice è creato da Code Engine ed è memorizzato nel registro del contenitore o in linea con la funzione. Un bundle di codice non è un'immagine contenitore standard OCI (Open Container Initiative).

Prima di iniziare

Non sei sicuro di quale tipo di carico di lavoro Code Engine creare? Vedi Planning for Code Engine.

Limitazioni della funzione

  • Nessun supporto per la sottoscrizione ai produttori eventi.
  • Nessun supporto per Terraform.

Come posso eseguire il codice come un componente della funzione Code Engine ?

Se il codice esiste come origine in un file locale o in un repository Git o se il tuo codice è un bundle di codice esistente che si trova in un registro pubblico o privato, Code Engine fornisce un modo semplificato per eseguire il codice come una funzione.

  • Se stai iniziando con il codice sorgente che si trova in un repository Git, puoi scegliere di puntare all'ubicazione della tua origine e Code Engine si occupa della creazione del bundle del codice dalla tua origine e della creazione della funzione con una singola operazione. In questo scenario, Code Engine carica il codice in IBM Cloud® Container Registry. Per ulteriori informazioni, consultare Creazione di una funzione dal codice sorgente del repository.

  • Se stai iniziando con il codice sorgente su una workstation locale, puoi scegliere di puntare all'ubicazione della tua origine e Code Engine si occupa di creare l'immagine dalla tua origine e creare la funzione con un singolo comando della CLI. In questo scenario, Code Engine carica il codice in IBM Cloud® Container Registry. Per ulteriori informazioni, vedi Creazione della tua funzione dal codice di origine locale con la CLI.

  • Se si sta iniziando con il codice sorgente, è anche possibile eseguire il codice sorgente in linea. In questo scenario, incolla il codice sorgente quando crei la tua funzione. Per ulteriori informazioni, consultare Creazione della funzione con codice in linea.

Dopo aver creato ed eseguito la funzione, è anche possibile aggiornare la funzione utilizzando uno qualsiasi dei modi precedenti, indipendentemente dal modo in cui è stata creata o precedentemente aggiornata la funzione.

Cosa succede quando richiamo la funzione?

Quando una funzione viene richiamata (avviata), l'istanza della funzione corrispondente viene inizializzata con il contenitore di runtime configurato e i parametri Resource. Il processo della prima inizializzazione viene definito avvio a freddo.

Per ridurre la latenza di avvio a freddo, Code Engine ottimizza il richiamo pre - riscaldando determinati runtime con specifiche configurazioni di CPU e memoria. Le combinazioni preriscaldate per le funzioni includono i runtime Node.js e Python e la combinazione predefinita di CPU e memoria per le funzioni, ovvero 0.25 vCPU x 1 GB di memoria. Inoltre, il sistema è progettato per migliorare il riutilizzo delle istanze della funzione già inizializzate. Pertanto, un'istanza della funzione viene mantenuta attiva una volta terminata la chiamata per consentire le chiamate successive riutilizzando la stessa istanza e riutilizzando lo stato dell'istanza al completamento dell'ultima chiamata. Il riutilizzo di un'istanza di funzione non è garantito.

Posso mantenere la mia istanza di funzione più a lungo?

Con Code Engine, la funzione si adatta automaticamente, in base al carico di lavoro. Quando crei la tua funzione con la combinazione di CPU e memoria predefinita, la tua funzione viene inserita in un contenitore "preriscaldato", ottimizzato per l'utilizzo. Quando si crea una funzione con una combinazione di CPU e memoria diversa da quella predefinita, la funzione viene inserita in un nuovo contenitore. Per impostazione predefinita, questo contenitore viene mantenuto attivo solo per un breve periodo di tempo dopo il completamento della funzione. Per ulteriori informazioni, vedi Supported CPU and memory combination for functions.

Puoi modificare la quantità di tempo per cui il tuo contenitore viene mantenuto attivo con l'opzione --scale-down-delay nella CLI o l'opzione Ritardo di ridimensionamento inferiore nella console. Tieni presente che mentre mantenere attivo il tuo contenitore riduce i tempi di avvio a freddo per qualsiasi esecuzione successiva della tua funzione, ti viene anche addebitato il periodo di tempo in cui il contenitore della funzione personalizzata esiste.

Richieste e risposte

Le funzioni vengono invocate con il protocollo HTTP. Quando si richiama la funzione, si possono specificare i parametri della richiesta personalizzata, il corpo e le intestazioni della richiesta personalizzata, nonché il metodo HTTP. I parametri della richiesta sono resi disponibili al codice funzione come parametri di input. Il codice funzione può impostare il corpo della risposta, le intestazioni della risposta e il codice della risposta, che vengono restituiti al chiamante dall'endpoint delle funzioni.

Esempio 1: creazione di una risposta HTML da una funzione

Il seguente esempio illustra come generare una risposta HTML da una funzione.

  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;

Esempio 2: impostazione di un codice di risposta e dell'intestazione della risposta

La funzione può impostare un codice di risposta specifico e indicatori di intestazione. L'esempio seguente illustra come impostare un codice di risposta e un'intestazione di risposta per aggiungere un reindirizzamento a un altro URL.

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

Esempio 3: generazione di una risposta di testo semplice da una funzione

Il seguente esempio illustra come generare una risposta di testo semplice da una funzione.

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}`
    }
}

Gestione degli errori e debug

I richiami della funzione possono restituire errori di sistema o dell'applicazione. Ad esempio, gli errori di sistema indicano che il codice funzione non è stato eseguito correttamente, mentre gli errori dell'applicazione indicano un problema nel codice funzione stesso.

Quando si verifica un errore di sistema, viene restituito un codice di risposta HTTP simile ai codici seguenti.

Codici di risposta HTTP
Codice Descrizione
409 Le risorse richieste dalla funzione non sono state soddisfatte.
413 Il payload della richiesta supera il massimo definito.
414 L'URI di richiamo è troppo lungo.
416 La funzione ha generato una risposta che supera il valore massimo definito.
422 Il codice funzione non è valido e non può essere elaborato. Per i dettagli, consultare i log della piattaforma.
424 Non è stato possibile eseguire il codice funzione. Riprova più tardi.
429 È stata superata la quota di risorse, impossibile pianificare la funzione.
431 Le intestazioni della richiesta superano il massimo definito.
500 Errore server interno.
502 Gateway errato.
503 Funzione attualmente non disponibile, riprovare più tardi.
507 Memoria insufficiente per caricare la funzione.

Se Code Engine può eseguire il codice delle funzioni, risponde al richiamo con uno dei seguenti codici di stato.

Codici di stato
Codice Descrizione
200 Richiamo della funzione accettato, la funzione verrà eseguita in ritardo.
202 Richiamo funzione accettato, la funzione verrà eseguita in modo asincrono.
299 La funzione ha superato il limite di runtime specificato o massimo ed è stata interrotta.

Come sviluppatore di una funzione, è possibile generare qualsiasi codice di stato HTTP arbitrario, anche quelli elencati in precedenza. Pertanto, un'intestazione di risposta indica che il codice di stato è stato generato dal codice funzione.

Le funzioni Code Engine aggiungono le seguenti intestazioni di risposta alla risposta di richiamo della funzione.

Codici di stato
Codice Descrizione
x-faas-actionstatus Codice di stato HTTP impostato dalla logica del programma funzionale.
x-faas-activation-id L'ID univoco per identificare il richiamo della funzione.
x-faas-result Un messaggio success o un messaggio di errore breve restituito dal contenitore Runtime.
x-faas-errormessage Un lungo messaggio di errore con ulteriori dettagli.
x-faas-prewarmed Un messaggio che indica se il richiamo è stato eseguito a freddo o se la funzione è stata eseguita in un contenitore esistente (pre - riscaldato). I possibili valori sono false o true.

Caratteristiche di immissione / emissione dei dati della funzione

Per eseguire la funzione in Code Engine, il tuo codice deve implementare un contratto di runtime con le seguenti caratteristiche.

  • Deve essere richiamabile da un endpoint pubblico di un'applicazione web, in modo da poter essere incorporato nelle pagine web e quindi invocato da qualsiasi sorgente di Code Engine Eventing, da un browser web o da qualsiasi altro client compatibile con HTTPS.
  • È necessario implementare una procedura main come punto di ingresso. La procedura main può ricevere parametri di input sotto forma di una struttura dati formattata JSON e può restituire parametri di output, anche sotto forma di struttura dati formattata JSON.
  • Può ricevere un percorso secondario facoltativo, in modo che la funzione possa implementare diverse caratteristiche, in base al percorso specificato. La procedura main della funzione riceve il percorso come parametro di input __ce_path.
  • Può ricevere parametri di query facoltativi, che possono essere utilizzati per configurare la funzione al runtime. La procedura main della funzione riceve i parametri come coppie chiave - valore all'interno della struttura dati di input formattata JSON.
  • Può ricevere le intestazioni della richiesta, in modo che il codice client possa specificare le codifiche accettate.
  • Può ricevere un'intestazione di richiesta di tipo contenuto facoltativa.
  • Può ricevere un payload di richiesta facoltativo (corpo), che la funzione elabora al runtime. A seconda del tipo di contenuto della richiesta selezionato, il payload dei dati viene passato al punto di ingresso principale della funzione, in formato codificato in base 64 o "sviluppato in piano" come parte della struttura dei dati di input JSON. I caratteri speciali nelle coppie di valori chiave di application/x-www-form-urlencoded input sono valori percent-encoded.
  • Può definire un codice di stato arbitrario HTTP (opzionale), che viene restituito al client che lo invoca.
  • Può impostare intestazioni di risposta arbitrarie, come un'ubicazione di reindirizzamento, una codifica di risposta o valori cookie.
  • Può restituire un corpo di risposta arbitrario con una codifica binaria o non binaria selezionata; ad esempio, application/octet-stream, application/json, text/*, image/* o audio/*. Se non è impostata alcuna intestazione di risposta content-type, il valore predefinito è text/plain.
  • Supporta i seguenti tipi di contenuto della richiesta: application/x-www-form-urlencoded (predefinito), text/plain, application/json, application/octet-stream, image/*, audio/*
  • Non supporta l'intestazione della richiesta multipart/form-data.

Opzioni per la visibilità per la funzione Code Engine

Con Code Engine, puoi stabilire il giusto livello di visibilità per la tua funzione definendo gli endpoint o le associazioni del dominio di sistema disponibili per ricevere le richieste.

Ogni funzione ha una mappatura interna del dominio del sistema che è visibile a tutti i componenti dello stesso progetto Code Engine, ma non all'esterno del progetto. In aggiunta all'associazione del dominio di sistema interno, scegli di rendere la funzione visibile a internet pubblico o alla rete privata IBM Cloud.

Per la visibilità pubblica o privata, la funzione viene esposta su un endpoint HTTPS. Per informazioni sul certificato TLS utilizzato, vedere Certificati TLS per i progetti Code Engine.

È possibile distribuire la propria funzione con i seguenti livelli di visibilità:

Visibilità delle funzioni
Impostazione Descrizione
interno(progetto) Una funzione con questa impostazione può ricevere le richieste dai componenti nello stesso progetto Code Engine. L'impostazione di un endpoint interno (al progetto) significa che la funzione non è accessibile da Internet e che l'accesso alla rete è possibile solo da parte di altri componenti di Code Engine in esecuzione all'interno dello stesso progetto Code Engine. Questo endpoint è sempre abilitato. Importante: Una funzione non può richiamare un altro lavoro o un'applicazione utilizzando i percorsi interni.
pubblico Una funzione con questa impostazione viene esposta a internet e al tuo progetto Code Engine. L'impostazione di un endpoint pubblico significa che la tua funzione può ricevere richieste da internet pubblico o dai componenti del tuo progetto Code Engine. Questa è l'impostazione predefinita.
privato Una funzione con questa impostazione è esposta alla rete privata IBM Cloud e al progetto Code Engine. L'impostazione di un endpoint privato significa che la tua funzione non è accessibile da Internet pubblico e l'accesso alla rete è possibile solo da altri componenti IBM Cloud utilizzando VPE (Virtual Private Endpoints) o Code Engine in esecuzione nello stesso progetto.

Puoi configurare le impostazioni dell'endpoint per la visibilità di una funzione dalla console o con la CLI quando crei e distribuisci o aggiorni la tua funzione.

Distribuzione della funzione con un endpoint interno

È possibile impostare la visibilità dell'endpoint per la funzione da distribuire con un endpoint interno (progetto). Quando imposti un endpoint interno (progetto), la tua funzione non è accessibile da internet pubblico e l'accesso alla rete è possibile solo da altri componenti Code Engine in esecuzione nello stesso progetto Code Engine. Questo endpoint è sempre abilitato. Le funzioni sono ancora accessibili tramite componenti condivisi e quindi devono essere protette.

Ad esempio, se la soluzione è composta da diverse funzioni all'interno di un progetto, è possibile configurare la propria soluzione in modo che solo una di tali funzioni sia visibile da Internet in modo che gestisca il traffico in entrata. Questa funzione rivolta al pubblico può delegare il lavoro ad altre funzioni nella soluzione in modo che non debbano essere visibili da Internet.

Con la CLI, imposta la visibilità dell'endpoint per la tua funzione in modo che venga distribuita con un endpoint del progetto utilizzando l'opzione --visibility=project sul comando function create o function update. È possibile ottenere gli URL disponibili per la funzione che riflettono la definizione di endpoint utilizzando il comando function get.

Dalla console, imposta la visibilità degli endpoint per la tua funzione utilizzando l'impostazione Endpoint quando crei la tua funzione. Una volta distribuita la funzione, è possibile visualizzare e modificare queste impostazioni di mappatura del dominio di sistema nella scheda Mappature dominio della pagina Funzioni.

Una funzione con questa impostazione può ricevere le richieste dai componenti nello stesso progetto Code Engine. Tuttavia, una funzione non può richiamare un altro lavoro o un'applicazione utilizzando i percorsi interni.

Distribuzione della tua funzione con un endpoint pubblico

Quando distribuisci una funzione, per impostazione predefinita, la funzione può ricevere richieste da internet pubblico o da componenti all'interno dello stesso progetto Code Engine. In questo caso, la funzione viene distribuita con un endpoint pubblico.

Distribuzione della tua funzione con un endpoint privato

È possibile impostare la visibilità dell'endpoint per la propria funzione da distribuire con un endpoint privato. Quando imposti un endpoint privato per la tua funzione, non è accessibile da internet pubblico e l'accesso alla rete è possibile solo da altri componenti IBM Cloud che sono in esecuzione nello stesso progetto (cluster-local).

Ad esempio, se la tua soluzione è composta da un componente in esecuzione su un cluster IBM Cloud Kubernetes Service Kubernetes all'interno del tuo endpoint privato virtuale e vuoi accedere alla funzione Code Engine dalla rete privata IBM Cloud, puoi impostare la visibilità della funzione su privata. Quando la visibilità della funzione è impostata su privata, la funzione non è accessibile tramite Internet pubblico. La funzione è ancora accessibile da altre funzioni all'interno del progetto.

Puoi creare la tua funzione con un endpoint privato in modo che la funzione sia esposta solo attraverso la rete privata IBM Cloud e non esposta a Internet esterno. La funzione è ancora raggiungibile tramite componenti condivisi dall'interno della rete interna e l'endpoint della funzione deve essere protetto.

Con la CLI, imposta la visibilità dell'endpoint per la tua funzione in modo che venga distribuita con un endpoint privato utilizzando l'opzione --visibility=private sul comando function create o function update. È possibile ottenere gli URL disponibili per la funzione che riflettono la definizione di endpoint utilizzando il comando function get.

Dalla console, imposta la visibilità degli endpoint per la tua funzione utilizzando l'impostazione Endpoint quando crei la tua funzione. Una volta distribuita la funzione, è possibile visualizzare e modificare queste impostazioni di mappatura del dominio di sistema nella scheda Mappature dominio della pagina Funzioni.

Per ulteriori informazioni sulla connessione su reti private, vedi Using Virtual Private Endpoints with Code Engine.

Opzioni per la creazione di funzioni

Informazioni sulle opzioni che è possibile specificare quando si crea la funzione. Tieni presente che le opzioni possono variare tra console e CLI.

Memoria e CPU

Quando si distribuisce la funzione, è possibile specificare la quantità di memoria e CPU che la funzione può utilizzare. Queste quantità possono variare, a seconda che la tua funzione sia ad alta intensità di elaborazione, ad alta intensità di memoria o bilanciata.

Per impostazione predefinita, alla funzione vengono assegnati 4 G di memoria e 1.0 vCPU. Per ulteriori informazioni su altre combinazioni di memoria e CPU supportate, vedi Supported memory and CPU binfor functions.

Creazione ed esecuzione della funzione con le variabili di ambiente

È possibile definire e impostare le variabili di ambiente come coppie chiave - valore che possono essere utilizzate dalla funzione al runtime.

Puoi definire le variabili di ambiente quando crei la tua funzione o quando aggiorni una funzione esistente con la CLI.

Per ulteriori informazioni sulla definizione delle variabili di ambiente, consultare Gestione delle variabili di ambiente.

Code Engine inserisce automaticamente alcune variabili di ambiente nella funzione. Per ulteriori informazioni sulle variabili di ambiente inserite automaticamente, consultare Variabili di ambiente inserite automaticamente.

Creazione ed esecuzione della funzione quando si utilizzano i segreti e le mappe di configurazione

In Code Engine, i segreti e le mappe di configurazione possono essere utilizzati dalla funzione utilizzando le variabili di ambiente.

Sia i segreti che le mappe di configurazione sono coppie chiave - valore. Quando associate alle variabili di ambiente, le relazioni NAME=VALUE vengono impostate in modo che il nome della variabile di ambiente corrisponda alla "chiave" di ciascuna voce in tali mappe e il valore della variabile di ambiente sia il "valore" di tale chiave.

La funzione può utilizzare le variabili di ambiente per fare riferimento completamente a una configmap (o a un segreto) o fare riferimento a singole chiavi in una configmap (o a un segreto).

Per ulteriori informazioni, vedi Riferimento ai segreti utilizzando le variabili di ambiente e Riferimento alle mappe di configurazione utilizzando le variabili di ambiente.

Considerazioni per le quote di funzioni

Quando lavori con applicazioni, funzioni e lavori batch, tali risorse vengono eseguite nel contesto di un progetto Code Engine. Le quote di risorse vengono definite in base al progetto e vengono applicati limiti per applicazioni, funzioni e lavori batch.

Per ulteriori informazioni sui limiti di Code Engine, vedi Limiti e quote per Code Engine.

Passi successivi

Ora che hai familiarità con i concetti chiave di utilizzo delle funzioni Code Engine, sei pronto a creare e gestire le funzioni? Vedi i seguenti argomenti.

Per ulteriori informazioni sull'utilizzo delle funzioni, vedere i seguenti argomenti.