Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Sajikan konten statis dalam bucket Amazon S3 melalui VPC dengan menggunakan Amazon CloudFront
Malaikat Emmanuel Hernandez Cebrian, Amazon Web Services
Ringkasan
Saat Anda menayangkan konten statis yang di-host di Amazon Web Services (AWS), pendekatan yang disarankan adalah menggunakan bucket Amazon Simple Storage Service (S3) Amazon Simple Storage Service (S3) sebagai asal dan menggunakan Amazon CloudFront untuk mendistribusikan konten. Solusi ini memiliki dua manfaat utama: kenyamanan caching konten statis di lokasi tepi, dan kemampuan untuk menentukan daftar kontrol akses web (web ACLs) untuk CloudFront distribusi, yang membantu Anda mengamankan permintaan ke konten dengan konfigurasi minimal dan overhead administratif.
Namun, ada batasan arsitektur umum untuk standar, pendekatan yang direkomendasikan. Di beberapa lingkungan, Anda ingin peralatan firewall virtual digunakan di cloud pribadi virtual (VPC) untuk memeriksa semua konten, termasuk konten statis. Pendekatan standar tidak merutekan lalu lintas melalui VPC untuk diperiksa. Pola ini memberikan solusi arsitektur alternatif. Anda masih menggunakan CloudFront distribusi untuk menyajikan konten statis dalam bucket S3, tetapi lalu lintas dirutekan melalui VPC dengan menggunakan Application Load Balancer. Fungsi AWS Lambda kemudian mengambil dan mengembalikan konten dari bucket S3.
Prasyarat dan batasan
Prasyarat
Akun AWS aktif.
Konten situs web statis yang dihosting di bucket S3.
Batasan
Sumber daya dalam pola ini harus dalam satu Wilayah AWS, tetapi dapat disediakan di akun AWS yang berbeda.
Batas berlaku untuk ukuran permintaan dan respons maksimum yang dapat diterima dan dikirim oleh fungsi Lambda. Untuk informasi selengkapnya, lihat Batas dalam fungsi Lambda sebagai target (dokumentasi Elastic Load Balancing).
Penting untuk menemukan keseimbangan yang baik antara kinerja, skalabilitas, keamanan, dan efektivitas biaya saat menggunakan pendekatan ini. Meskipun skalabilitas Lambda tinggi, jika jumlah pemanggilan Lambda bersamaan melebihi kuota maksimum, beberapa permintaan dibatasi. Untuk informasi selengkapnya, lihat Kuota Lambda (dokumentasi Lambda). Anda juga perlu mempertimbangkan harga saat menggunakan Lambda. Untuk meminimalkan pemanggilan Lambda, pastikan Anda menentukan cache untuk distribusi dengan benar. CloudFront Untuk informasi selengkapnya, lihat Mengoptimalkan caching dan ketersediaan (CloudFront dokumentasi).
Arsitektur
Tumpukan teknologi target
CloudFront
Amazon Virtual Private Cloud (Amazon VPC)
Penyeimbang Beban Aplikasi
Lambda
Amazon S3
Arsitektur target
Gambar berikut menunjukkan arsitektur yang disarankan saat Anda perlu menggunakan CloudFront untuk menyajikan konten statis dari bucket S3 melalui VPC.

Klien meminta URL CloudFront distribusi untuk mendapatkan file situs web tertentu di bucket S3.
CloudFront mengirimkan permintaan ke AWS WAF. AWS WAF memfilter permintaan dengan menggunakan web yang ACLs diterapkan pada distribusi. CloudFront Jika permintaan ditentukan valid, aliran berlanjut. Jika permintaan ditentukan tidak valid, klien menerima kesalahan 403.
CloudFront memeriksa cache internalnya. Jika ada kunci yang valid yang cocok dengan permintaan yang masuk, nilai terkait dikirim kembali ke klien sebagai respons. Jika tidak, aliran terus berlanjut.
CloudFront meneruskan permintaan ke URL Application Load Balancer yang ditentukan.
Application Load Balancer memiliki pendengar yang terkait dengan grup target berdasarkan fungsi Lambda. Application Load Balancer memanggil fungsi Lambda.
Fungsi Lambda terhubung ke bucket S3, melakukan
GetObject
operasi di atasnya, dan mengembalikan konten sebagai respons.
Otomatisasi dan skala
Untuk mengotomatiskan penyebaran konten statis menggunakan pendekatan ini, buat CI/CD pipeline untuk memperbarui bucket Amazon S3 yang meng-host situs web.
Fungsi Lambda menskalakan secara otomatis untuk menangani permintaan bersamaan, dalam kuota dan batasan layanan. Untuk informasi selengkapnya, lihat Penskalaan fungsi Lambda dan kuota Lambda (dokumentasi Lambda). Untuk layanan dan fitur AWS lainnya, seperti CloudFront dan Application Load Balancer, AWS menskalakan ini secara otomatis.
Alat
Amazon CloudFront mempercepat distribusi konten web Anda dengan mengirimkannya melalui jaringan pusat data di seluruh dunia, yang menurunkan latensi dan meningkatkan kinerja.
Elastic Load Balancing (ELB) mendistribusikan lalu lintas aplikasi atau jaringan yang masuk ke beberapa target. Dalam pola ini, Anda menggunakan Application Load Balancer yang disediakan melalui Elastic Load Balancing untuk mengarahkan lalu lintas ke fungsi Lambda.
AWS Lambda adalah layanan komputasi yang membantu Anda menjalankan kode tanpa perlu menyediakan atau mengelola server. Ini menjalankan kode Anda hanya bila diperlukan dan skala secara otomatis, jadi Anda hanya membayar untuk waktu komputasi yang Anda gunakan.
Amazon Simple Storage Service (Amazon S3) adalah layanan penyimpanan objek berbasis cloud yang membantu Anda menyimpan, melindungi, dan mengambil sejumlah data.
Amazon Virtual Private Cloud (Amazon VPC) membantu Anda meluncurkan sumber daya AWS ke jaringan virtual yang telah Anda tentukan. Jaringan virtual ini menyerupai jaringan tradisional yang akan Anda operasikan di pusat data Anda sendiri, dengan manfaat menggunakan infrastruktur AWS yang dapat diskalakan.
Epik
Tugas | Deskripsi | Keterampilan yang dibutuhkan |
---|---|---|
Buat sebuah VPC. | Buat VPC untuk hosting sumber daya yang digunakan dalam pola ini, seperti Application Load Balancer dan fungsi Lambda. Untuk petunjuk, lihat Membuat VPC (dokumentasi Amazon VPC). | Arsitek awan |
Buat AWS WAF web ACL. | Buat AWS WAF web ACL. Kemudian dalam pola ini, Anda menerapkan ACL web ini ke CloudFront distribusi. Untuk petunjuk, lihat Membuat ACL web (dokumentasi AWS WAF). | Arsitek awan |
Buat fungsi Lambda. | Buat fungsi Lambda yang menyajikan konten statis yang dihosting di bucket S3 sebagai situs web. Gunakan kode yang disediakan di bagian Informasi tambahan dari pola ini. Sesuaikan kode untuk mengidentifikasi bucket S3 target Anda. | AWS Umum |
Unggah fungsi Lambda. | Masukkan perintah berikut untuk mengunggah kode fungsi Lambda ke arsip file.zip di Lambda.
| AWS Umum |
Buat Application Load Balancer. | Buat Application Load Balancer yang menghadap ke internet yang menunjuk ke fungsi Lambda. Untuk petunjuk, lihat Membuat grup target untuk fungsi Lambda (dokumentasi Elastic Load Balancing). Untuk konfigurasi ketersediaan tinggi, buat Application Load Balancer dan pasang ke subnet pribadi di Availability Zone yang berbeda. | Arsitek awan |
Buat CloudFront distribusi. | Buat CloudFront distribusi yang menunjuk ke Application Load Balancer yang Anda buat.
| Arsitek awan |
Sumber daya terkait
Dokumentasi AWS
Mengoptimalkan caching dan ketersediaan (dokumentasi) CloudFront
Lambda berfungsi sebagai target (dokumentasi Elastic Load Balancing)
Kuota Lambda (dokumentasi Lambda)
Situs web layanan AWS
Informasi tambahan
Kode
Berikut contoh fungsi Lambda ditulis dalam Node.js. Fungsi Lambda ini bertindak sebagai server web yang melakukan GetObject
operasi ke bucket S3 yang berisi sumber daya situs 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); } ); };