Generator Skrip Kompresi Lambda@Edge
Hasilkan fungsi Lambda@Edge siap produksi yang menambahkan kompresi Brotli dan GZIP ke respons CloudFront - untuk asal yang tidak mendukung kompresi secara asli. Konfigurasikan jenis peristiwa (Respon Asal atau Respons Penampil), algoritma kompresi, dan header opsional. Generator skrip kompresi lambda@edge menghasilkan kode fungsi, kebijakan kepercayaan IAM, kebijakan eksekusi IAM, dan perintah penerapan AWS CLI langkah demi langkah. Semua generasi terjadi di browser Anda tanpa perlu mendaftar.
Lambda@Edge Compression Script Generator
Node.js 20.x is recommended. Lambda@Edge supports Node.js 18.x and 20.x.
Response Headers
Skip Conditions
/**
* Lambda@Edge Compression Script
* Event type: origin-response
* Runtime: nodejs20.x
* Generated by AbackTools - https://abacktools.com
*/
'use strict';
// Content types that benefit from compression
const COMPRESSIBLE_TYPES = [
'text/html', 'text/css', 'text/plain', 'text/xml', 'text/javascript',
'application/javascript', 'application/x-javascript', 'application/json',
'application/ld+json', 'application/xml', 'application/rss+xml',
'application/atom+xml', 'image/svg+xml', 'font/ttf', 'font/otf',
];
// Already-compressed formats - skip to avoid overhead
const SKIP_TYPES = [
'image/jpeg', 'image/png', 'image/webp', 'image/avif', 'image/gif',
'image/bmp', 'video/mp4', 'video/webm', 'audio/mpeg', 'audio/ogg',
'application/zip', 'application/gzip', 'application/x-brotli',
'font/woff2',
];
exports.handler = async (event) => {
const { request, response } = event.Records[0].cf;
// Get the Accept-Encoding header from the viewer request
const acceptEncoding =
(request.headers['accept-encoding'] || [{ value: '' }])[0].value.toLowerCase();
// Get the Content-Type of the response
const contentType =
(response.headers['content-type'] || [{ value: '' }])[0].value.split(';')[0].trim().toLowerCase();
// Skip if already compressed
const alreadyEncoded = response.headers['content-encoding'];
if (alreadyEncoded && alreadyEncoded[0]?.value) {
return response;
}
// Skip already-compressed content types
if (SKIP_TYPES.some(t => contentType.startsWith(t))) {
return response;
}
// Only compress compressible content types
const isCompressible = COMPRESSIBLE_TYPES.some(t => contentType.startsWith(t));
if (!isCompressible) {
return response;
}
// Skip small responses (compression overhead not worth it)
const bodyLength = response.body ? Buffer.byteLength(response.body, 'utf8') : 0;
if (bodyLength < 1024) {
return response;
}
// Determine the best encoding to use
let encoding = null;
if (acceptEncoding.includes('br')) {
encoding = 'br';
} else if (acceptEncoding.includes('gzip')) {
encoding = 'gzip';
}
if (!encoding) {
return response;
}
// Compress the response body
try {
const zlib = require('zlib');
const body = Buffer.from(
response.body,
response.bodyEncoding === 'base64' ? 'base64' : 'utf8'
);
let compressed;
if (encoding === 'br') {
compressed = zlib.brotliCompressSync(body, {
params: { [zlib.constants.BROTLI_PARAM_QUALITY]: 6 },
});
} else {
compressed = zlib.gzipSync(body, { level: 6 });
}
// Only use compressed version if it's actually smaller
if (compressed.length < body.length) {
response.body = compressed.toString('base64');
response.bodyEncoding = 'base64';
response.headers['content-encoding'] = [{ key: 'Content-Encoding', value: encoding }];
response.headers['content-length'] = [{ key: 'Content-Length', value: String(compressed.length) }];
}
} catch (err) {
console.error('Compression failed:', err);
// Return uncompressed response on error
}
// Add Vary: Accept-Encoding so CloudFront caches separate variants
const existingVary = (response.headers['vary'] || [{ value: '' }])[0].value;
if (!existingVary.toLowerCase().includes('accept-encoding')) {
response.headers['vary'] = [{
key: 'Vary',
value: existingVary ? `${existingVary}, Accept-Encoding` : 'Accept-Encoding',
}];
}
// Set Cache-Control for compressed assets
if (!response.headers['cache-control']) {
response.headers['cache-control'] = [{
key: 'Cache-Control',
value: 'public, max-age=31536000, stale-while-revalidate=86400',
}];
}
return response;
};Lambda@Edge requirement: Functions must be deployed in us-east-1(N. Virginia) regardless of your CloudFront distribution's origin region. Lambda@Edge does not support environment variables or VPC access.
Mengapa Menggunakan Generator Skrip Kompresi Lambda@Edge Kami?
- Skrip Kompresi Lambda@Edge Instan: Hasilkan fungsi kompresi Lambda@Edge yang siap produksi secara instan - tanpa penyelaman dokumentasi AWS, tanpa penelitian API zlib Node.js. Generator skrip kompresi lambda@edge kami menghasilkan kode fungsi yang diformat dengan benar, kebijakan IAM, dan langkah penerapan dalam hitungan detik.
- Amankan Generator Skrip Kompresi Lambda@Edge Online: Pilihan konfigurasi Anda tidak akan pernah lepas dari perangkat Anda saat Anda menggunakan generator skrip kompresi lambda@edge ini. Semua pembuatan skrip berjalan sepenuhnya di browser Anda - tidak ada permintaan server, tidak ada penyimpanan data, 100% pribadi. Aman untuk mengonfigurasi distribusi CloudFront produksi.
- Generator Skrip Kompresi Lambda@Edge - Tanpa Instalasi: Buat skrip kompresi Lambda@Edge langsung di browser modern apa pun tanpa instalasi AWS CLI, tanpa pengaturan Node.js, dan tanpa memerlukan akun. Generator skrip kompresi lambda@edge berfungsi di Windows, macOS, Linux, dan seluler.
- Paket Lengkap: Skrip, Kebijakan IAM, dan Langkah-Langkah Penerapan: Generator skrip kompresi lambda@edge menghasilkan semua yang Anda perlukan - kode fungsi, kebijakan kepercayaan IAM, kebijakan eksekusi IAM, dan perintah penerapan AWS CLI langkah demi langkah. Menyertakan peringatan real-time untuk kesalahan konfigurasi umum seperti hilangnya header Vary.
Kasus Penggunaan Umum untuk Generator Skrip Kompresi Lambda@Edge
- Kompresi Distribusi CloudFront: Tambahkan kompresi Brotli dan GZIP ke distribusi CloudFront yang menyajikan konten dari bucket S3 atau asal kustom yang tidak mendukung kompresi. Generator skrip kompresi lambda@edge menghasilkan fungsi Respons Asal yang mengompresi respons sebelum CloudFront menyimpannya dalam cache - sehingga kompresi berjalan satu kali per cache yang hilang, bukan pada setiap permintaan.
- API Gateway + Kompresi CloudFront: Kompres respons API Gateway yang disajikan melalui CloudFront. API Gateway mendukung GZIP tetapi tidak mendukung Brotli - generator skrip kompresi lambda@edge menambahkan dukungan Brotli untuk browser modern dan kembali menggunakan GZIP untuk klien lama, sehingga meningkatkan ukuran transfer respons API sebesar 15-25% dibandingkan GZIP saja.
- Kompresi Situs Statis S3: Tambahkan kompresi dinamis ke situs statis yang dihosting di S3 dan disajikan melalui CloudFront. S3 tidak mengompresi respons - generator skrip kompresi lambda@edge menambahkan fungsi Respons Asal yang mengompresi HTML, CSS, JavaScript, dan JSON sebelum CloudFront menyimpan versi terkompresi dalam cache.
- Pengoptimalan CDN Multi-Wilayah: Mengurangi biaya bandwidth di seluruh lokasi edge CloudFront dengan mengompresi respons di lokasi asal. Generator skrip kompresi lambda@edge menghasilkan fungsi yang berjalan di us-east-1 namun dijalankan di lokasi edge CloudFront di seluruh dunia - mengurangi ukuran transfer sebesar 60-80% untuk konten berbasis teks.
- Peningkatan Kompresi Asal Lama: Tambahkan kompresi Brotli ke server asal lama yang hanya mendukung GZIP atau tanpa kompresi. Generator skrip kompresi lambda@edge mencegat peristiwa Respons Asal dan menerapkan kompresi Brotli untuk browser modern - tidak diperlukan perubahan pada server asal.
- Header Keamanan + Paket Kompresi: Gabungkan kompresi dengan header keamanan dalam satu fungsi Lambda@Edge. Generator skrip kompresi lambda@edge secara opsional menambahkan header X-Content-Type-Options, X-Frame-Options, dan X-XSS-Protection bersama kompresi - mengurangi jumlah fungsi Lambda@Edge yang diperlukan per perilaku CloudFront.
Apa itu Kompresi Lambda@Edge?
Lambda@Edge adalah layanan AWS yang menjalankan fungsi Node.js di lokasi edge CloudFront di seluruh dunia. Fungsi kompresi Lambda@Edge mencegat respons CloudFront dan menerapkan kompresi GZIP atau Brotli sebelum respons di-cache atau dikirimkan ke penampil. Ini berguna ketika server asal Anda (S3, API Gateway, EC2, atau server khusus) tidak mendukung kompresi - fungsi Lambda@Edge menambahkan kompresi secara transparan pada lapisan CDN. Generator skrip kompresi lambda@edge kami menghasilkan fungsi Node.js lengkap menggunakan modul zlib bawaan (tanpa dependensi eksternal) yang menangani negosiasi Accept-Encoding, pemfilteran tipe konten, manajemen header Vary, dan header Kontrol Cache.
Cara Kerja Generator Skrip Kompresi Lambda@Edge Kami
- 1 Konfigurasikan pilihan Anda: Pilih jenis peristiwa CloudFront (Respon Asal atau Respons Penampil), waktu proses Node.js, algoritma kompresi (lebih disukai Brotli, hanya GZIP, atau hanya Brotli), dan fitur opsional seperti header Vary, Kontrol Cache, dan header keamanan. Generator skrip kompresi lambda@edge memperbarui output secara real-time.
- 2 Salin skrip, kebijakan IAM, dan langkah-langkah penerapan: Generator menghasilkan empat output - kode fungsi (index.js), kebijakan kepercayaan IAM, kebijakan eksekusi IAM, dan perintah penerapan AWS CLI. Semua generasi berjalan di browser Anda - tidak ada data yang dikirim ke mana pun.
- 3 Terapkan ke AWS dan kaitkan dengan CloudFront: Buat fungsi Lambda di us-east-1, terbitkan versi, dan kaitkan dengan perilaku distribusi CloudFront Anda. Tab langkah penerapan menyediakan perintah AWS CLI yang tepat dengan placeholder untuk ID akun dan ID distribusi Anda.
Respons Asal vs Respons Pemirsa
- Respons Asal (disarankan): Berjalan setelah CloudFront menerima respons dari asal Anda, sebelum di-cache. Respons terkompresi disimpan dalam cache CloudFront - permintaan berikutnya untuk objek yang sama disajikan dari cache tanpa memanggil fungsi Lambda. Ini adalah pendekatan yang paling hemat biaya: kompresi dijalankan satu kali per cache yang hilang.
- Respons Penampil: Berjalan sebelum CloudFront mengirimkan respons ke penampil, setelah pencarian cache. Ini berarti fungsi Lambda berjalan pada setiap permintaan - termasuk cache yang ditemukan. Gunakan Respons Penampil hanya ketika Anda perlu mengubah respons yang sudah di-cache, atau ketika Anda perlu menambahkan header per-viewer yang tidak dapat di-cache.
- Batas Lambda@Edge: Fungsi harus diterapkan di us-east-1. Waktu eksekusi maksimum: 5 detik (Viewer) atau 30 detik (Origin). Ukuran isi respons maksimum: 1 MB (Penampil) atau 1 MB (Asal). Tidak ada variabel lingkungan atau akses VPC. Tidak ada paket npm eksternal - hanya gunakan Node.js bawaan.
- Kompresi CloudFront vs Lambda@Edge: CloudFront memiliki fitur kompresi bawaan (diaktifkan dalam pengaturan distribusi) yang mendukung GZIP dan Brotli. Gunakan kompresi bawaan CloudFront jika memungkinkan - kompresi ini gratis dan tidak dikenakan biaya pemanggilan Lambda. Gunakan kompresi Lambda@Edge hanya ketika Anda memerlukan logika kustom (pemfilteran tipe konten, header keamanan, atau kompresi untuk asal yang mengirimkan header Tipe Konten yang salah).
Batasan Penting Lambda@Edge
Fungsi Lambda@Edge memiliki batasan yang ketat: fungsi tersebut harus diterapkan di us-east-1 (Virginia Utara) terlepas dari wilayah asal Anda. Mereka tidak dapat menggunakan variabel lingkungan, koneksi VPC, atau paket npm eksternal - skrip yang dihasilkan hanya menggunakan modul zlib bawaan Node.js. Ukuran isi respons maksimum adalah 1 MB - respons yang lebih besar dari 1 MB tidak dapat diubah oleh Lambda@Edge. Untuk respons berukuran besar, pertimbangkan untuk menggunakan Fungsi CloudFront (untuk manipulasi header saja) atau aktifkan kompresi bawaan CloudFront. Lambda@Edge juga memiliki latensi cold start sebesar 100-500 md pada pemanggilan pertama di setiap lokasi edge.
Pertanyaan yang Sering Diajukan
Generator skrip kompresi lambda@edge menghasilkan fungsi Node.js yang siap diterapkan untuk AWS Lambda@Edge yang menambahkan kompresi Brotli dan GZIP ke respons CloudFront. Generator skrip kompresi lambda@edge gratis kami secara online menghasilkan kode fungsi, kebijakan kepercayaan IAM, kebijakan eksekusi IAM, dan langkah-langkah penerapan AWS CLI.
Gunakan kompresi Lambda@Edge ketika asal Anda mengirimkan header Tipe Konten yang salah, ketika Anda memerlukan pemfilteran tipe konten khusus, ketika Anda ingin menggabungkan kompresi dengan header keamanan, atau ketika Anda memerlukan kompresi untuk asal yang tidak didukung oleh kompresi bawaan CloudFront.
Gunakan Respons Asal - ini berjalan satu kali per cache hilang dan menyimpan respons terkompresi dalam cache CloudFront. Respons Penampil berjalan pada setiap permintaan termasuk cache hits, yang secara signifikan lebih mahal dan menambah latensi pada setiap respons.
Ya. Semua pembuatan skrip berjalan sepenuhnya di browser Anda menggunakan JavaScript. Tidak ada data konfigurasi yang dikirim ke server mana pun, disimpan dari jarak jauh, atau dikirim melalui jaringan.
Ya - 100% gratis, selamanya. Tanpa pendaftaran, tanpa akun, tanpa tingkat premium, dan tanpa iklan. Hasilkan skrip kompresi Lambda@Edge tanpa batas, sepenuhnya gratis.
AWS mengharuskan semua fungsi Lambda@Edge dibuat di wilayah us-east-1 (Virginia Utara). AWS secara otomatis mereplikasi fungsi tersebut ke semua lokasi edge CloudFront di seluruh dunia saat Anda mengaitkannya dengan distribusi.
Skrip yang dihasilkan hanya menggunakan modul zlib bawaan Node.js - tidak diperlukan paket eksternal. Ini menjaga paket penerapan tetap di bawah 1 KB. Lambda@Edge mendukung paket npm jika Anda menerapkan ZIP dengan node_modules, namun modul bawaan lebih disukai karena kesederhanaannya.
Lambda@Edge hanya dapat mengubah isi respons hingga berukuran 1 MB. Respons yang lebih besar dari 1 MB dikembalikan tanpa diubah. Untuk respons berukuran besar, gunakan kompresi bawaan CloudFront atau kompres di server asal.
Uji dengan curl: "curl -H "Terima-Encoding: br, gzip" -I https://your-cloudfront-domain.com/". Cari Content-Encoding: br atau Content-Encoding: gzip di header respons. Periksa CloudWatch Logs di us-east-1 untuk log eksekusi Lambda@Edge.