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 memorizzarli nella cache.

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.
  • Utilizza il runtime della funzione edge più ottimale per il caso. Ad esempio, nel caso in cui la logica sia implementabile utilizzando le Funzioni CloudFront o Lambda@Edge sugli eventi del visualizzatore, scegli le Funzioni CloudFront. Quando la logica è implementabile con le Funzioni CloudFront sugli eventi dei visualizzatori, oppure con Lambda@Edge sugli eventi di origine, utilizza le Funzioni CloudFront, a meno che la percentuale di riscontri nella cache non sia molto elevata.
  • Scopri le restrizioni sulle funzioni edge nella progettazione dell'applicazione. Per quanto riguarda gli eventi del visualizzatore, è possibile utilizzare Lambda@Edge o le Funzioni CloudFront, ma non entrambi (ad esempio Lambda@Edge sull'evento di richiesta del visualizzatore e Funzioni CloudFront sul relativo evento di risposta).
Applicazioni pratiche dell'edge computing su Amazon CloudFront

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 dimensione 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 consente di scrivere al meglio le funzioni Lambda@Edge. Di seguito è riportato un esempio di funzione che reindirizza le richieste in base a reindirizzamenti archiviati in un bucket S3:

const aws = require('aws-sdk');
const s3 = new aws.S3({ region: 'us-east-1' });
const s3Params = {
  Bucket: 'redirections-configuration',
  Key: 'redirects.json',
};
const TTL = 5000; // TTL of 5 seconds
 
async function fetchRedirectionsFromS3() {
  const response = await s3.getObject(s3Params).promise();
  return JSON.parse(response.Body.toString('utf-8')).map(
    ({ source, destination }) => ({
      source: new RegExp(source),
      destination,
    })
  );
}
 
let redirections;
function fetchRedirections() {
  if (!redirections) {
    redirections = fetchRedirectionsFromS3();
 
    setTimeout(() => {
      redirections = undefined;
    }, TTL);
  }
 
  return redirections;
}
 
exports.handler = async event => {
  const request = event.Records[0].cf.request;
 
  try {
    const redirects = await fetchRedirections();
 
    for (const { source, destination } of redirects) {
      if (source.test(request.uri)) {
        return {
          status: '302',
          statusDescription: 'Found',
          headers: {
            location: [{ value: destination }],
          },
        };
      }
    }
    
    return request;
    
  } catch (_error) {
    return request;
  }
};
Come impostare una funzione Lambda@Edge

Risorse

Questa pagina è stata utile?