Immagina un piccolo programma che vuoi far girare solo quando qualcuno lo chiama: ricevere l'avviso che un cliente ha pagato, elaborare un modulo di contatto, convertire un'immagine. Non vuoi un server acceso 24 ore su 24 per questo. Per questo esiste Lambda: dai il tuo codice ad Amazon, e Amazon lo esegue solo quando serve e ti fa pagare solo quel tempo. Niente macchine da mantenere.
La domanda è: come lo chiami? La cosa più universale è dargli un indirizzo web, un URL come https://algo.on.aws/, in modo che qualsiasi browser o programma possa "aprirlo" e il tuo codice risponda. Questa guida fa esattamente questo con l'opzione che Lambda include di serie, chiamata URL di funzione. Non c'è da installare né sottoscrivere nient'altro.
Prima di iniziare: cosa significa ogni cosa
- Funzione Lambda
- Un pezzo di codice tuo (in Python, Node.js, ecc.) salvato in Amazon, che viene eseguito quando qualcosa lo chiama e si spegne quando finisce. Paghi per ogni esecuzione, non per tenere qualcosa acceso.
- URL
- Un indirizzo web, quello che si scrive nella barra del browser. Qui, l'indirizzo con cui si può chiamare la tua funzione.
- Richiesta e risposta
- Quando un browser o un programma apre un URL, invia una "richiesta" (cosa vuole) e riceve una "risposta" (quello che gli viene restituito). La tua funzione riceve la richiesta e costruisce la risposta.
- Webhook
- Un avviso automatico che un servizio (per esempio, il tuo gateway di pagamento) invia a un tuo URL quando succede qualcosa. Per riceverlo ti serve un URL che risponda: questa guida te lo dà.
- API Gateway
- Un altro servizio di Amazon, più completo e più complesso, che serve anch'esso a mettere un indirizzo web davanti a una funzione. Per anni è stata l'unica opzione. Oggi, per la maggior parte dei casi semplici, non serve, e questa guida non lo usa.
- CORS
- Una regola di sicurezza dei browser: una pagina web può chiamare indirizzi di altri siti solo se quei siti lo permettono espressamente. Se la tua funzione sarà chiamata da una tua pagina web, bisogna dire a Lambda quali pagine possono farlo.
- Registri (log)
- Il diario di quello che fa la tua funzione a ogni esecuzione: quanto ha impiegato, se ha fallito e perché. Si salvano in un altro servizio chiamato CloudWatch.
Passo dopo passo
Verifica che la tua funzione sappia rispondere a una richiesta web
Quando la funzione viene chiamata dal suo indirizzo web, Lambda le consegna un pacchetto di dati con la richiesta (cosa chiedeva, con quali dati) e si aspetta che il tuo codice restituisca una risposta con due cose: un codice di stato (200 vuol dire "tutto bene") e un corpo (il testo o i dati che restituisci). Se la tua funzione è stata fatta per un altro uso, va adattata. Un esempio minimo, in Node.js, che risponde "ciao, mondo":
export const handler = async (event) => ({ statusCode: 200, headers: { "Content-Type": "application/json" }, body: JSON.stringify({ hola: "mundo" }) });Se non programmi tu, passa questo paragrafo a chi lo fa: saprà cosa significa.
Decidi chi potrà chiamare la funzione
È l'unica decisione importante della guida, e conviene capirla bene. Ci sono due opzioni:
- Solo con credenziali AWS (l'opzione si chiama
AWS_IAM): potrà chiamarla solo un tuo programma che abbia permessi nel tuo account Amazon. È la più sicura, ma un browser normale o un servizio esterno non potranno usarla. - Aperta (l'opzione si chiama
NONE): chiunque conosca l'indirizzo potrà chiamarla. È quello che ti serve se la chiamerà un servizio esterno (un webhook) o una pagina web. In cambio, la sicurezza deve metterla il tuo codice: controllare una password o una firma a ogni chiamata. Lo vediamo nell'ultimo passo.
Regola semplice: se non sai quale scegliere, scegli la prima. Se la funzione deve ricevere chiamate da fuori del tuo account, scegli la seconda e non saltare l'ultimo passo.
- Solo con credenziali AWS (l'opzione si chiama
Attiva l'indirizzo web
Nella console AWS entra in Lambda, apri la tua funzione e clicca sulla scheda Configuration. Nel menu a sinistra scegli Function URL e clicca su Create function URL. Scegli il tipo di accesso del passo precedente.
Se la chiamerà una tua pagina web da un altro dominio, espandi CORS e scrivi l'indirizzo di quella pagina in "Allow origin" (per esempio
https://miweb.com). Se metti un asterisco, qualsiasi sito al mondo potrà chiamarla dal browser; evitalo a meno che sia quello che vuoi. Salva. In alto compare il nuovo indirizzo, con questo aspetto:https://xxxxxxxx.lambda-url.eu-west-1.on.aws/. Quello è il tuo URL.Provalo
Se hai scelto l'opzione aperta, copia l'indirizzo e incollalo nel browser: dovresti vedere la risposta della tua funzione (nell'esempio, il testo "ciao, mondo"). Funziona già.
Se preferisci provarlo da un terminale, in CloudShell (l'icona del terminale nella barra superiore della console AWS) scrivi:
curl -i https://xxxxxxxx.lambda-url.eu-west-1.on.aws/Se hai scelto l'opzione con credenziali, il browser dirà "Forbidden": è quello che ci si aspetta, perché non porta credenziali. La prova dovrà farla il tuo programma che la chiamerà, usando le librerie AWS, che sanno già firmare le richieste.
Guarda il diario delle esecuzioni
Scheda Monitor, pulsante View CloudWatch logs. Ogni chiamata lascia un'annotazione con quanto ha impiegato e quello che il tuo codice ha scritto. Se una chiamata restituisce un errore, qui vedrai il motivo. Un consiglio che fa risparmiare: in quel gruppo di log, imposta una conservazione di, per esempio, 30 giorni; altrimenti i log si conservano per sempre e si pagano.
Se l'hai lasciata aperta, proteggila
Aperta vuol dire che chiunque può chiamarla, quindi il tuo codice deve controllare qualcosa a ogni chiamata. Di solito: il servizio che ti invia il webhook include una firma o una chiave segreta in ogni avviso, e la tua funzione verifica che sia corretta prima di fare qualsiasi cosa. Quella chiave salvala nelle variabili d'ambiente della funzione (scheda Configuration), non scritta nel codice.
E metti un tetto a quante volte può essere eseguita contemporaneamente (concorrenza riservata, in Configuration): se qualcuno bombarda l'indirizzo, il tetto evita che la fattura schizzi.
Cosa può andare storto
La pagina web dice qualcosa su "CORS" e non riceve risposta
È il browser che protegge l'utente: la tua funzione non ha detto che quella pagina può chiamarla. Modifica l'URL di funzione, sezione CORS, e aggiungi l'indirizzo esatto della tua pagina e il tipo di richiesta che usa (GET, POST). Se anche il tuo codice restituisce intestazioni CORS per conto suo, toglile da uno dei due posti: duplicate falliscono lo stesso.
Restituisce "Forbidden" anche se l'ho lasciata aperta
Alla funzione manca il permesso che lascia chiamarla a chiunque. Creando l'URL dalla console si aggiunge da solo; se l'ha creato un programma o uno script, chiedi a chi l'ha fatto di aggiungere il permesso lambda:InvokeFunctionUrl per il pubblico (principal *).
La prima chiamata impiega vari secondi e poi va veloce
Si chiama "avvio a freddo": se la funzione non viene usata da un po', Amazon deve caricarla di nuovo. Per un webhook non importa. Per un sito con utenti in attesa, si può ridurre rendendo la funzione più piccola o pagando per tenerla sempre pronta (concorrenza con provisioning).
Mi serve che l'indirizzo sia del mio dominio, o controllare chi chiama e quanto
Per questo serve già API Gateway, il servizio più completo che citavamo all'inizio, oppure mettere CloudFront davanti. L'URL di funzione è la via breve e per la maggior parte basta; quando non basterà più, te ne accorgerai.
In Simplio
In Simplio le tue funzioni Lambda compaiono con il loro stato e i loro log in un elenco; se sono in Python, Node.js o Ruby puoi modificare il codice, salvare con il secondo fattore e provarle al momento vedendo la risposta. E dar loro un indirizzo web è un clic, con il tipo di accesso spiegato in chiaro. Ogni persona del tuo team vede solo le funzioni che le assegni.
La stessa cosa, in AWS e in Simplio
| Nella console di AWS | In Simplio | |
|---|---|---|
| Dare l'indirizzo web alla funzione | Lambda, Configuration, Function URL, tipo di accesso, CORS: 5 passi | Pulsante "URL pubblico" nella funzione, con il tipo di accesso spiegato: 1 clic |
| Provarla e vedere cosa ha restituito | Browser o curl, e CloudWatch per i log | Provare da Simplio vedendo risposta e log nella stessa schermata |
| Cambiare il codice | Editor di Lambda, senza controllo su chi l'ha toccato | Editor con secondo fattore al salvataggio, e registro attività |