Funzioni Edge
Panoramica
Le funzioni Edge sono potenti strumenti di sviluppo per aggiungere logica personalizzata all'edge con CloudFront. Le funzioni Edge consentono agli sviluppatori di arricchire le applicazioni web riducendo al contempo la latenza e di creare applicazioni completamente distribuite. Le funzioni Edge possono essere utilizzate per:
- Implementazione della logica HTTP avanzata. CloudFront fornisce regole native come il reindirizzamento da HTTP a HTTPs, l'instradamento verso origini diverse in base al percorso della richiesta, ecc... Le funzioni Edge consentono di andare oltre la versione nativa di CloudFront per implementare logiche HTTP avanzate, come la normalizzazione delle chiavi della cache, la riscrittura degli URL, le operazioni HTTP CRUD, ecc...
- Riduzione della latenza delle applicazioni. Alcune logiche dell'applicazione possono essere scaricate dall'origine all'edge per trarre vantaggio dalla memorizzazione nella cache (ad esempio test A/B) o per essere eseguita più vicino agli utenti (ad esempio reindirizzamenti HTTP, abbreviazione degli URL, rendering HTML). Nelle architetture di microservizi o microfront, è possibile utilizzare le funzioni edge per implementare una logica comune (ad esempio Autorizzazione e Autenticazione) un’unica volta nel punto di ingresso dell'applicazione anziché implementarla separatamente in ciascun componente.
- Protezione del perimetro dell'applicazione. Le funzioni Edge possono essere utilizzate per applicare controlli di sicurezza come il controllo degli accessi e il blocco geografico avanzato all'edge. Ciò consente di ridurre la superficie di attacco dell'origine e di eliminare i costi di scalabilità non necessari.
- Richiesta di instradamento. È possibile utilizzare funzioni edge per instradare ogni richiesta HTTP verso un'origine specifica in base alla logica dell'applicazione. Ciò può essere utile per scenari quali failover avanzato, bilanciamento del carico di origine, architetture multiregionali, migrazioni, instradamento delle applicazioni, ecc...
Tipi di funzioni edge con CloudFront
CloudFront offre due versioni di funzioni edge: Funzioni CloudFront e Lambda@Edge. Funzioni CloudFront offre tempi di avvio inferiori al millisecondo e dimensionamento immediato per gestire milioni di richieste al secondo, il che lo rende ideale per la logica leggera (normalizzazione della cache, riscrittura degli URL, manipolazione delle richieste, autorizzazione, ecc.). Lambda@Edge è un'estensione di AWS Lambda, eseguita in modo distribuito sulle cache edge regionali. Lambda@Edge offre maggiore potenza di calcolo e funzionalità avanzate, come le chiamate di rete esterne, anche se a costi e latenza più elevati. Questa documentazione fornisce dettagli approfonditi sulle differenze tra i due runtime.
Le funzioni edge possono essere utilizzate per manipolare le richieste e le risposte HTTP in volo o semplicemente per terminare le richieste e generare risposte invece di fluire a monte su CloudFront. Le funzioni edge possono essere configurate per essere eseguite in occasione di diversi eventi durante il ciclo di vita di una richiesta su CloudFront:
- Eventi del visualizzatore: eseguiti per ogni richiesta, prima di controllare la cache di CloudFront. È ideale per la normalizzazione della cache, l'autorizzazione o l'inserimento di cookie unici. Le Funzioni di CloudFront sono consentite solo sugli eventi del visualizzatore.
- Eventi di origine: vengono eseguiti in caso di errori nella cache, prima di risalire all'origine per recuperare i file. È ideale per generare contenuti o manipolare le risposte prima di memorizzarle nella cache e per instradare le richieste in modo dinamico verso origini diverse.
Prendi in considerazione le seguenti best practice:
- Associa una funzione Edge al comportamento più specifico della cache, per evitare costi di esecuzione non necessari delle funzioni.
- Scegli le Funzioni CloudFront per i casi d'uso eseguiti in occasione di eventi del visualizzatore e Lambda@Edge per i casi d'uso eseguiti agli eventi di origine.
- Torna a Lambda@Edge per gli eventi del visualizzatore solo quando le Funzioni CloudFront non sono in grado di soddisfare i requisiti della tua logica.
- Sugli eventi del visualizzatore, puoi utilizzare Lambda@Edge o le Funzioni CloudFront, ma non entrambi (ad esempio Lambda@Edge sull'evento di richiesta del visualizzatore e Funzioni CloudFront sull'evento di risposta del visualizzatore).
- Scopri le restrizioni sulle funzioni edge quando progetti la tua applicazione.
Funzioni CloudFront
Le Funzioni CloudFront sono scritte in JavaScript, possono essere create e testate interamente nella console e nelle API di CloudFront e possono accedere ai log di CloudWatch nella Regione us-east-1. In qualità di sviluppatore, dovrai scrivere funzioni con un utilizzo di calcolo inferiore all'80%. Le esecuzioni che superano le quote di utilizzo di calcolo verranno limitate da CloudFront, il quale può essere monitorato utilizzando i parametri di CloudWatch.
Questa guida ai modelli di programmazione ti aiuta a scrivere le Funzioni CloudFront. Di seguito è riportato un esempio di funzione per reindirizzare gli utenti provenienti dalla Germania a contenuti localizzati in tedesco:
function handler(event) {
var request = event.request;
var headers = request.headers;
var host = request.headers.host.value;
var country = 'DE';
var newurl = `https://${host}/de/index.html`;
if (headers['cloudfront-viewer-country']) {
var countryCode = headers['cloudfront-viewer-country'].value;
if (countryCode === country) {
var response = {
statusCode: 302,
statusDescription: 'Found',
headers: { location: { value: newurl } },
};
return response;
}
}
return request;
}
Le Funzioni CloudFront offrono inoltre la possibilità di disaccoppiare e archiviare i dati persistenti in modo separato dal codice tramite CloudFront KeyValueStore. Il KeyValueStore è particolarmente adatto in situazioni in cui i dati incorporati, come le mappature di reindirizzamento in blocco, superano il limite delle dimensioni della funzione. Ha anche il vantaggio di consentire l'aggiornamento dei dati persistenti senza apportare modifiche alla funzione.
Lambda@Edge
Le funzioni Lambda@Edge possono essere scritte in NodeJS o Python. Consentono di sfruttare la potenza di un container Lambda con memoria configurabile (fino a 10 GB). Poiché è basata su AWS Lambda, una funzione Lambda@Edge è creata nella console Lambda ed esclusivamente in us-east-1. Una volta completata la creazione e l’implementazione nella distribuzione CloudFront, CloudFront esegue la replica a livello globale nelle sue cache edge regionali. Per associare una funzione Lambda@Edge a un comportamento della cache di CloudFront, è necessario prima pubblicarne una nuova versione e quindi distribuirla nel comportamento della cache di destinazione. Ogni aggiornamento della funzione Lambda@Edge attiva una nuova implementazione di CloudFront (a differenza delle funzioni CloudFront, in cui solo l'associazione iniziale attiva un’implementazione CloudFront). Quando sviluppi le funzioni Lambda@Edge, considera quanto segue:
- Scopri le best practice per l'utilizzo di Lambda@Edge, in particolare per quanto riguarda la gestione della concorrenza di esecuzione. La concorrenza misura il numero di container Lambda in esecuzione contemporaneamente per Regione di Cache Edge Regionale. In ogni Regione, la concorrenza di Lambda@Edge ha delle quote in termini di velocità di bursting e limite assoluto.
- Scopri le best practice per il recupero di dati esterni dalla tua funzione Lambda@Edge.
- I log Lambda@Edge vengono spediti ai log di CloudWatch nella Regione in cui sono stati eseguiti con un nome di gruppo di log preceduto da us-east-1. Se devi centralizzare i log Lambda@Edge in un'unica Regione, prendi in considerazione la seguente soluzione di aggregazione di log Lambda@Edge. Nota che ogni esecuzione di funzione genera log su CloudWatch Logs (a differenza delle funzioni CloudFront, in cui i log vengono generati solo se scritti esplicitamente nel codice della funzione). Puoi disabilitare i log di Lambda@Edge rimuovendo le autorizzazioni per inviare i log a CloudWatch dal ruolo IAM associato.
Questa guida ai modelli di programmazione ti aiuta a scrivere le funzioni Lambda@Edge. Di seguito è riportato un esempio di funzione che indirizza le richieste provenienti da utenti tedeschi a un server con sede in Germania per scopi normativi:
'use strict';
exports.handler = (event, context, callback) => {
const request = event.Records[0].cf.request;
if (request.headers['cloudfront-viewer-country']) {
const countryCode = request.headers['cloudfront-viewer-country'][0].value;
if (countryCode === 'DE') {
const domainName = 'origin.example.de';
request.origin.custom.domainName = domainName;
request.headers['host'] = [{ key: 'host', value: domainName }];
}
}
return request;
};