Distribuisci contenuti statici in un bucket Amazon S3 tramite un VPC CloudFront - Prontuario AWS

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

Distribuisci contenuti statici in un bucket Amazon S3 tramite un VPC CloudFront

Creato da Angel Emmanuel Hernandez Cebrian

Ambiente: PoC o pilota

Tecnologie: distribuzione di contenuti; rete; sicurezza, identità, conformità; senza server; app Web e mobili

AWSservizi: Amazon CloudFront; Elastic Load Balancing (ELB); Lambda AWS

Riepilogo

Quando offri contenuti statici ospitati su Amazon Web Services (AWS), l'approccio consigliato consiste nell'utilizzare un bucket Amazon Simple Storage Service (S3) come origine e utilizzare Amazon CloudFront per distribuire il contenuto. Questa soluzione offre due vantaggi principali: la comodità di memorizzare nella cache i contenuti statici nelle postazioni periferiche e la possibilità di definire liste di controllo degli accessi Web (webACLs) per la CloudFront distribuzione, che aiutano a proteggere le richieste ai contenuti con una configurazione e un sovraccarico amministrativo minimi.

Tuttavia, esiste una limitazione architetturale comune all'approccio standard consigliato. In alcuni ambienti, si desidera che le appliance firewall virtuali siano distribuite in un cloud privato virtuale (VPC) per ispezionare tutti i contenuti, inclusi i contenuti statici. L'approccio standard non indirizza il traffico attraverso l'area VPC di ispezione. Questo modello fornisce una soluzione architettonica alternativa. Continui a utilizzare una CloudFront distribuzione per fornire contenuti statici in un bucket S3, ma il traffico viene instradato VPC tramite un Application Load Balancer. Una funzione AWS Lambda recupera quindi e restituisce il contenuto dal bucket S3.

Prerequisiti e limitazioni

Prerequisiti

  • Un account AWS attivo.

  • Contenuto statico del sito Web ospitato in un bucket S3.

Limitazioni

  • Le risorse in questo modello devono trovarsi in un'unica AWS regione, ma possono essere fornite in account diversi. AWS

  • I limiti si applicano alla dimensione massima di richiesta e risposta che la funzione Lambda può ricevere e inviare, rispettivamente. Per ulteriori informazioni, consulta Limiti nelle funzioni Lambda come destinazioni (documentazione Elastic Load Balancing).

  • È importante trovare un buon equilibrio tra prestazioni, scalabilità, sicurezza ed economicità quando si utilizza questo approccio. Nonostante l'elevata scalabilità di Lambda, se il numero di chiamate Lambda simultanee supera la quota massima, alcune richieste vengono limitate. Per ulteriori informazioni, consulta Quote Lambda (documentazione Lambda). È inoltre necessario considerare i prezzi quando si utilizza Lambda. Per ridurre al minimo le chiamate Lambda, assicurati di definire correttamente la cache per la distribuzione. CloudFront Per ulteriori informazioni, consulta Ottimizzazione della memorizzazione nella cache e della disponibilità (documentazione). CloudFront

Architettura

Stack tecnologico Target

  • CloudFront

  • Amazon Cloud Privato Virtuale (AmazonVPC)

  • Application Load Balancer

  • Lambda

  • Amazon S3

Architettura Target

L'immagine seguente mostra l'architettura consigliata quando è necessario utilizzare CloudFront per servire contenuti statici da un bucket S3 tramite un. VPC

Flusso di traffico attraverso Application Load Balancer nella funzione VPC Lambda.
  1. Il client richiede la CloudFront distribuzione per ottenere un particolare file URL del sito Web nel bucket S3.

  2. CloudFront invia la richiesta a. AWS WAF AWSWAFfiltra la richiesta utilizzando il web ACLs applicato alla CloudFront distribuzione. Se la richiesta viene ritenuta valida, il flusso continua. Se la richiesta viene ritenuta non valida, il client riceve un errore 403.

  3. CloudFront controlla la sua cache interna. Se esiste una chiave valida corrispondente alla richiesta in entrata, il valore associato viene rispedito al client come risposta. In caso contrario, il flusso continua.

  4. CloudFront inoltra la richiesta all'URLApplication Load Balancer specificato.

  5. L'Application Load Balancer ha un listener associato a un gruppo target basato su una funzione Lambda. L'Application Load Balancer richiama la funzione Lambda.

  6. La funzione Lambda si connette al bucket S3, esegue un'GetObjectoperazione su di esso e restituisce il contenuto come risposta.

Automazione e scalabilità

Per automatizzare la distribuzione di contenuti statici utilizzando questo approccio, crea pipeline CI/CD per aggiornare i bucket Amazon S3 che ospitano i siti Web.

La funzione Lambda si ridimensiona automaticamente per gestire le richieste concorrenti, entro le quote e le limitazioni del servizio. Per ulteriori informazioni, consulta Scalabilità delle funzioni Lambda e quote Lambda (documentazione Lambda). Per gli altri AWS servizi e funzionalità, come CloudFront l'Application Load Balancer, li AWS ridimensiona automaticamente.

Strumenti

  • Amazon CloudFront accelera la distribuzione dei tuoi contenuti web distribuendoli attraverso una rete mondiale di data center, che riduce la latenza e migliora le prestazioni.

  • Elastic Load Balancing (ELB) distribuisce il traffico di applicazioni o di rete in entrata su più destinazioni. In questo modello, si utilizza un Application Load Balancer fornito tramite Elastic Load Balancing per indirizzare il traffico verso la funzione Lambda.

  • AWSLambda è un servizio di elaborazione che ti aiuta a eseguire il codice senza dover effettuare il provisioning o gestire i server. Esegue il codice solo quando necessario e si ridimensiona automaticamente, quindi paghi solo per il tempo di elaborazione che utilizzi.

  • Amazon Simple Storage Service (Amazon S3) è un servizio di archiviazione degli oggetti basato sul cloud che consente di archiviare, proteggere e recuperare qualsiasi quantità di dati.

  • Amazon Virtual Private Cloud (AmazonVPC) ti aiuta a lanciare AWS risorse in una rete virtuale che hai definito. Questa rete virtuale è simile a una rete tradizionale che gestiresti nel tuo data center, con i vantaggi dell'utilizzo dell'infrastruttura scalabile di. AWS

Epiche

AttivitàDescrizioneCompetenze richieste

Crea unVPC.

Crea un file VPC per ospitare le risorse distribuite in questo modello, come l'Application Load Balancer e la funzione Lambda.  Per istruzioni, consulta Create a VPC (VPCdocumentazione Amazon).

Architetto del cloud

Crea un AWS WAF sito webACL.

Crea un AWS WAF sito webACL. Più avanti in questo schema, applicherete questo web ACL alla CloudFront distribuzione. Per istruzioni, consultate Creazione di un Web ACL (AWSWAFdocumentazione).

Architetto del cloud

Creazione della funzione Lambda

Crea la funzione Lambda che serve il contenuto statico ospitato nel bucket S3 come sito Web. Utilizza il codice fornito nella sezione Informazioni aggiuntive di questo modello. Personalizza il codice per identificare il bucket S3 di destinazione.

Generale AWS

Carica la funzione Lambda.

Immettete il seguente comando per caricare il codice della funzione Lambda in un archivio di file.zip in Lambda.

aws lambda update-function-code \ --function-name \ --zip-file fileb://lambda-alb-s3-website.zip
Generale AWS

Crea un Application Load Balancer.

Crea un Application Load Balancer con accesso a Internet che punti alla funzione Lambda. Per istruzioni, consulta Creare un gruppo target per la funzione Lambda (documentazione Elastic Load Balancing). Per una configurazione ad alta disponibilità, crea l'Application Load Balancer e collegalo a sottoreti private in diverse zone di disponibilità.

Architetto del cloud

Crea una CloudFront distribuzione.

Crea una CloudFront distribuzione che punti all'Application Load Balancer che hai creato.

  1. Accedi alla console di AWS gestione e apri la CloudFront console su https://console.aws.amazon.com/cloudfront/v3/home.

  2. Scegliere Create Distribution (Crea distribuzione).

  3. Nella prima pagina della procedura guidata Create Distribution (Crea distribuzione), nella sezione Web, scegli Get Started (Inizia).

  4. Specificate le impostazioni per la vostra distribuzione. Per ulteriori informazioni, consulta Valori da specificare durante la creazione o l'aggiornamento di una distribuzione. Tieni presente quanto segue:

    1. Imposta Application Load Balancer come origine.

    2. Nelle impostazioni di distribuzione, scegli il Web esistente tramite ACLs AWS WAF il quale desideri candidarti. Per ulteriori informazioni, consulta AWSWAFweb ACL.

  5. Salvare le modifiche.

  6. Dopo aver CloudFront creato la distribuzione, il valore della colonna Status relativa InProgressalla distribuzione cambia da Deployed. Se scegli di abilitare la distribuzione, sarà pronta per elaborare le richieste dopo viene attivato lo stato Deployed (Distribuito).

Architetto del cloud

Risorse correlate

AWSdocumentazione

AWSsiti web di servizio

Informazioni aggiuntive

Codice

Il seguente esempio di funzione Lambda è scritto in Node.js. Questa funzione Lambda funge da server Web che esegue un'GetObjectoperazione su un bucket S3 che contiene le risorse del sito Web.

/** * This is an AWS Lambda function created for demonstration purposes. * It retrieves static assets from a defined Amazon S3 bucket. * To make the content available through a URL, use an Application Load Balancer with a Lambda integration. * * Set the S3_BUCKET environment variable in the Lambda function definition. */ var AWS = require('aws-sdk'); exports.handler = function(event, context, callback) { var bucket = process.env.S3_BUCKET; var key = event.path.replace('/', ''); if (key == '') { key = 'index.html'; } // Fetch from S3 var s3 = new AWS.S3(); return s3.getObject({Bucket: bucket, Key: key}, function(err, data) { if (err) { return err; } var isBase64Encoded = false; var encoding = 'utf8'; if (data.ContentType.indexOf('image/') > -1) { isBase64Encoded = true; encoding = 'base64' } var resp = { statusCode: 200, headers: { 'Content-Type': data.ContentType, }, body: new Buffer(data.Body).toString(encoding), isBase64Encoded: isBase64Encoded }; callback(null, resp); } ); };