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
Il client richiede la CloudFront distribuzione per ottenere un particolare file URL del sito Web nel bucket S3.
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.
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.
CloudFront inoltra la richiesta all'URLApplication Load Balancer specificato.
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.
La funzione Lambda si connette al bucket S3, esegue un'
GetObject
operazione 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à | Descrizione | Competenze 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.
| 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.
| Architetto del cloud |
Risorse correlate
AWSdocumentazione
Ottimizzazione della memorizzazione nella cache e della disponibilità (documentazione) CloudFront
Lambda funge da obiettivi (documentazione Elastic Load Balancing)
Quote Lambda (documentazione Lambda)
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'GetObject
operazione 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); } ); };