

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

# Sesuaikan di tepi dengan Lambda @Edge
<a name="lambda-at-the-edge"></a>

Lambda @Edge adalah perpanjangan dari. AWS Lambda Lambda @Edge adalah layanan komputasi yang memungkinkan Anda menjalankan fungsi yang menyesuaikan konten yang diberikan Amazon. CloudFront Anda dapat membuat fungsi Node.js atau Python di konsol Lambda dalam satu Wilayah AWS, US East (Virginia N.).

Setelah membuat fungsi, Anda dapat menambahkan pemicu menggunakan konsol CloudFront atau konsol Lambda sehingga fungsi berjalan AWS di lokasi yang lebih dekat dengan penampil, tanpa menyediakan atau mengelola server. Secara opsional, Anda dapat menggunakan operasi Lambda CloudFront dan API untuk mengatur fungsi dan pemicu Anda secara terprogram.

Lambda@Edge menskalakan secara otomatis, dari beberapa permintaan per hari menjadi ribuan per detik. Memproses permintaan di AWS lokasi yang lebih dekat dengan penampil alih-alih di server asal secara signifikan mengurangi latensi dan meningkatkan pengalaman pengguna.

**catatan**  
Lambda @Edge tidak didukung dengan permintaan gRPC. Untuk informasi lebih lanjut. lihat. [Menggunakan gRPC dengan distribusi CloudFront](distribution-using-grpc.md)

**Topics**
+ [Bagaimana Lambda @Edge bekerja dengan permintaan dan tanggapan](lambda-edge-event-request-response.md)
+ [Cara menggunakan Lambda @Edge](lambda-edge-ways-to-use.md)
+ [Memulai dengan fungsi Lambda @Edge (konsol)](lambda-edge-how-it-works.md)
+ [Siapkan izin dan peran IAM untuk Lambda @Edge](lambda-edge-permissions.md)
+ [Tulis dan buat fungsi Lambda @Edge](lambda-edge-create-function.md)
+ [Tambahkan pemicu untuk fungsi Lambda @Edge](lambda-edge-add-triggers.md)
+ [Uji dan debug fungsi Lambda @Edge](lambda-edge-testing-debugging.md)
+ [Hapus fungsi dan replika Lambda @Edge](lambda-edge-delete-replicas.md)
+ [Struktur acara Lambda @Edge](lambda-event-structure.md)
+ [Bekerja dengan permintaan dan tanggapan](lambda-generating-http-responses.md)
+ [Lambda @Edge contoh fungsi](lambda-examples.md)

# Bagaimana Lambda @Edge bekerja dengan permintaan dan tanggapan
<a name="lambda-edge-event-request-response"></a>

Saat Anda mengaitkan CloudFront distribusi dengan fungsi Lambda @Edge, CloudFront mencegat permintaan dan respons di lokasi tepi. CloudFront Anda dapat menjalankan fungsi Lambda ketika CloudFront peristiwa berikut terjadi:
+ Saat CloudFront menerima permintaan dari penampil (permintaan penampil)
+ Sebelum CloudFront meneruskan permintaan ke asal (permintaan asal)
+ Ketika CloudFront menerima respons dari asal (respons asal)
+ Sebelum CloudFront mengembalikan respons ke penampil (respons penampil)

Jika Anda menggunakan AWS WAF, permintaan penampil Lambda @Edge dijalankan setelah AWS WAF aturan apa pun diterapkan.

Untuk informasi selengkapnya, lihat [Bekerja dengan permintaan dan tanggapan](lambda-generating-http-responses.md) dan [Struktur acara Lambda @Edge](lambda-event-structure.md).

# Cara menggunakan Lambda @Edge
<a name="lambda-edge-ways-to-use"></a>

Ada banyak kegunaan untuk pemrosesan Lambda @Edge dengan CloudFront distribusi Amazon Anda, seperti contoh berikut:
+ Fungsi Lambda dapat memeriksa cookie dan menulis ulang URLs sehingga pengguna melihat versi situs yang berbeda untuk pengujian. A/B 
+ CloudFront dapat mengembalikan objek yang berbeda ke pemirsa berdasarkan perangkat yang mereka gunakan dengan memeriksa `User-Agent` header, yang mencakup informasi tentang perangkat. Misalnya, CloudFront dapat mengembalikan gambar yang berbeda berdasarkan ukuran layar perangkat mereka. Demikian pula, fungsi tersebut dapat mempertimbangkan nilai `Referer` header dan menyebabkan CloudFront mengembalikan gambar ke bot yang memiliki resolusi terendah yang tersedia. 
+ Atau Anda dapat memeriksa cookie untuk kriteria lainnya. Misalnya, di situs web ritel yang menjual pakaian, jika Anda menggunakan cookie untuk menunjukkan warna mana yang dipilih pengguna untuk jaket, fungsi Lambda dapat mengubah permintaan sehingga CloudFront mengembalikan gambar jaket dalam warna yang dipilih.
+ Fungsi Lambda dapat menghasilkan respons HTTP saat permintaan CloudFront penampil atau peristiwa permintaan asal terjadi.
+ Fungsi dapat memeriksa header atau token otorisasi, dan menyisipkan header untuk mengontrol akses ke konten Anda sebelum CloudFront meneruskan permintaan ke asal Anda.
+ Fungsi Lambda juga dapat melakukan panggilan jaringan ke sumber daya eksternal untuk mengonfirmasi kredensial pengguna, atau mengambil konten tambahan untuk menyesuaikan respons.

Untuk informasi selengkapnya, termasuk kode contoh, lihat[Lambda @Edge contoh fungsi](lambda-examples.md).

Untuk informasi selengkapnya tentang pengaturan Lambda @Edge di konsol, lihat. [Tutorial: Buat fungsi Lambda @Edge dasar (konsol)](lambda-edge-how-it-works-tutorial.md)

# Memulai dengan fungsi Lambda @Edge (konsol)
<a name="lambda-edge-how-it-works"></a>

Dengan Lambda @Edge, Anda dapat menggunakan CloudFront pemicu untuk menjalankan fungsi Lambda. Saat Anda mengaitkan CloudFront distribusi dengan fungsi Lambda, CloudFront [mencegat permintaan dan respons di lokasi CloudFront tepi dan](https://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html) menjalankan fungsi tersebut. Fungsi Lambda dapat meningkatkan keamanan atau menyesuaikan informasi yang dekat dengan pemirsa Anda untuk meningkatkan kinerja.

Daftar berikut memberikan ikhtisar dasar tentang cara membuat dan menggunakan fungsi Lambda dengan. CloudFront

**Ikhtisar: Membuat dan menggunakan fungsi Lambda dengan CloudFront**

1. Buat fungsi Lambda di Wilayah AS Timur (Virginia N.).

1. Simpan dan publikasikan versi bernomor dari fungsi tersebut.

   Jika ingin mengubah fungsi, Anda harus mengedit versi \$1LATEST dari fungsi di Wilayah Timur AS (N. Virginia). Kemudian, sebelum Anda mengaturnya agar berfungsi CloudFront, Anda menerbitkan versi bernomor baru.

1. Kaitkan fungsi dengan perilaku CloudFront distribusi dan cache. Kemudian tentukan satu atau lebih CloudFront peristiwa (*pemicu*) yang menyebabkan fungsi dijalankan. Misalnya, Anda dapat membuat pemicu untuk fungsi yang akan dijalankan saat CloudFront menerima permintaan dari penampil.

1. Saat Anda membuat pemicu, Lambda membuat replika fungsi di AWS lokasi di seluruh dunia.

**Tip**  
Untuk informasi selengkapnya, lihat [membuat dan memperbarui fungsi](lambda-edge-create-function.md), [struktur acara](lambda-event-structure.md), dan [menambahkan CloudFront pemicu.](lambda-edge-add-triggers.md) Anda juga dapat menemukan lebih banyak ide dan mendapatkan sampel kode di [Lambda @Edge contoh fungsi](lambda-examples.md).

Untuk step-by-step tutorial, lihat topik berikut:

**Topics**
+ [Tutorial: Buat fungsi Lambda @Edge dasar (konsol)](lambda-edge-how-it-works-tutorial.md)

# Tutorial: Buat fungsi Lambda @Edge dasar (konsol)
<a name="lambda-edge-how-it-works-tutorial"></a>

Tutorial ini menunjukkan kepada Anda bagaimana memulai dengan Lambda @Edge dengan membuat dan mengonfigurasi contoh fungsi Node.js yang berjalan di. CloudFront Contoh ini menambahkan header keamanan HTTP ke respons saat CloudFront mengambil file. (Ini dapat meningkatkan keamanan dan privasi untuk situs web.)

Anda tidak memerlukan situs web Anda sendiri untuk tutorial ini. Namun, ketika Anda memilih untuk membuat solusi Lambda @Edge Anda sendiri, Anda mengikuti langkah-langkah serupa dan memilih dari opsi yang sama.

**Topics**
+ [Langkah 1: Mendaftar untuk Akun AWS](#lambda-edge-how-it-works-tutorial-AWS)
+ [Langkah 2: Buat CloudFront distribusi](#lambda-edge-how-it-works-tutorial-cloudfront)
+ [Langkah 3: Buat fungsi Anda](#lambda-edge-how-it-works-tutorial-create-function)
+ [Langkah 4: Tambahkan CloudFront pemicu untuk menjalankan fungsi](#lambda-edge-how-it-works-tutorial-add-trigger)
+ [Langkah 5: Verifikasi bahwa fungsi berjalan](#lambda-edge-how-it-works-tutorial-verify)
+ [Langkah 6: Memecahkan masalah](#lambda-edge-how-it-works-tutorial-troubleshoot)
+ [Langkah 7: Bersihkan sumber daya contoh Anda](#lambda-edge-how-it-works-tutorial-cleanup-resources)
+ [Informasi Terkait](#lambda-edge-how-it-works-tutorial-resources)

## Langkah 1: Mendaftar untuk Akun AWS
<a name="lambda-edge-how-it-works-tutorial-AWS"></a>

Jika Anda belum melakukannya, daftar untuk Akun AWS. Untuk informasi selengkapnya, lihat [Mendaftar untuk Akun AWS](setting-up-cloudfront.md#sign-up-for-aws).

## Langkah 2: Buat CloudFront distribusi
<a name="lambda-edge-how-it-works-tutorial-cloudfront"></a>

Sebelum membuat contoh fungsi Lambda@Edge, Anda harus memiliki CloudFront yang dapat dikerjakan, yang mencakup asal muasal untuk menyajikan konten.

Untuk contoh ini, Anda membuat CloudFront distribusi yang menggunakan bucket Amazon S3 sebagai asal distribusi. Jika Anda sudah memiliki lingkungan untuk digunakan, Anda dapat melewati langkah ini.<a name="lambda-edge-how-it-works-tutorial-cf-proc"></a>

**Untuk membuat CloudFront distribusi dengan asal Amazon S3**

1. Buat bucket Amazon S3 dengan satu atau dua file, seperti file citra, untuk konten sampel. Untuk bantuan, ikuti langkah dalam [Unggah konten Anda ke Amazon S3](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/GettingStarted.html#GettingStartedUploadContent). Pastikan Anda mengatur izin untuk memberikan akses baca publik ke objek dalam keranjang Anda.

1. Buat CloudFront distribusi dan tambahkan bucket S3 Anda sebagai asal, dengan mengikuti langkah-langkah di [Buat distribusi CloudFront web](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/GettingStarted.html#GettingStartedCreateDistribution). Jika Anda sudah memiliki distribusi, Anda dapat menambahkan bucket sebagai asal distribusi tersebut.
**Tip**  
Catat ID distribusi Anda. Kemudian dalam tutorial ini ketika Anda menambahkan CloudFront pemicu untuk fungsi Anda, Anda harus memilih ID untuk distribusi Anda dalam daftar dropdown—misalnya,. `E653W22221KDDL`

## Langkah 3: Buat fungsi Anda
<a name="lambda-edge-how-it-works-tutorial-create-function"></a>

Pada langkah ini, Anda membuat fungsi Lambda dari templat cetak biru di konsol Lambda. Fungsi menambahkan kode untuk memperbarui header keamanan di CloudFront distribusi. <a name="lambda-edge-how-it-works-tutorial-create-function-blueprint-proc"></a>

**Untuk membuat fungsi Lambda**

1. Masuk ke Konsol Manajemen AWS dan buka AWS Lambda konsol di[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).
**penting**  
**Pastikan Anda berada di AS-Timur-1 (Virginia **N.) ( Wilayah AWS us-east-1).**** Anda harus berada di Wilayah ini untuk membuat fungsi Lambda@Edge.

1. Pilih **Buat fungsi**.

1. Pada halaman **fungsi Buat**, pilih **Gunakan cetak biru**, lalu filter untuk CloudFront cetak biru dengan memasukkan di bidang pencarian. **cloudfront**
**catatan**  
CloudFront **cetak biru hanya tersedia di Wilayah AS-Timur-1 (**Virginia N.) (us-east-1).****

1. Pilih cetak biru **header Modify HTTP response** sebagai template untuk fungsi Anda.

1. Masukkan informasi tentang fungsi Anda berikut ini:
   + **Nama fungsi** — Masukkan nama untuk fungsi Anda.
   + **Peran eksekusi** - Pilih cara mengatur izin untuk fungsi Anda. Untuk menggunakan templat kebijakan izin Lambda @Edge dasar yang direkomendasikan, pilih **Buat peran baru dari AWS ** templat kebijakan.
   + **Nama peran** — Masukkan nama untuk peran yang dibuat oleh templat kebijakan.
   + **Templat kebijakan** — Lambda secara otomatis menambahkan templat kebijakan **Izin Lambda @Edge** Dasar karena Anda memilih CloudFront cetak biru sebagai dasar fungsi Anda. Templat kebijakan ini menambahkan izin peran eksekusi yang memungkinkan CloudFront untuk menjalankan fungsi Lambda untuk Anda CloudFront di lokasi di seluruh dunia. Untuk informasi selengkapnya, lihat [Siapkan izin dan peran IAM untuk Lambda @Edge](lambda-edge-permissions.md).

1. Pilih **Buat fungsi** di bagian bawah halaman.

1. **Di panel **Deploy to Lambda** @Edge yang muncul, pilih Batal.** (Untuk tutorial ini, Anda harus memodifikasi kode fungsi sebelum menerapkan fungsi ke Lambda @Edge.)

1. Gulir ke bawah ke bagian **Sumber kode** halaman.

1. Ganti kode templat dengan fungsi yang memodifikasi header keamanan yang dikembalikan oleh Anda. Misalnya, Anda dapat menggunakan kode yang serupa dengan yang berikut ini:

   ```
   'use strict';
   export const handler = (event, context, callback) => {
   
       //Get contents of response
       const response = event.Records[0].cf.response;
       const headers = response.headers;
   
       //Set new headers
       headers['strict-transport-security'] = [{key: 'Strict-Transport-Security', value: 'max-age= 63072000; includeSubdomains; preload'}];
       headers['content-security-policy'] = [{key: 'Content-Security-Policy', value: "default-src 'none'; img-src 'self'; script-src 'self'; style-src 'self'; object-src 'none'"}];
       headers['x-content-type-options'] = [{key: 'X-Content-Type-Options', value: 'nosniff'}];
       headers['x-frame-options'] = [{key: 'X-Frame-Options', value: 'DENY'}];
       headers['x-xss-protection'] = [{key: 'X-XSS-Protection', value: '1; mode=block'}];
       headers['referrer-policy'] = [{key: 'Referrer-Policy', value: 'same-origin'}];
   
       //Return modified response
       callback(null, response);
   };
   ```

1. Pilih **File**, **Simpan** untuk menyimpan kode yang diperbarui.

1. Pilih **Deploy**.

Lanjutkan ke bagian berikutnya untuk menambahkan CloudFront pemicu untuk menjalankan fungsi.

## Langkah 4: Tambahkan CloudFront pemicu untuk menjalankan fungsi
<a name="lambda-edge-how-it-works-tutorial-add-trigger"></a>

Sekarang Anda memiliki fungsi Lambda untuk memperbarui header keamanan, konfigurasikan CloudFront memicu untuk menjalankan fungsi Anda untuk menambahkan header dalam respons apa pun yang CloudFront dari tempat awal distribusi Anda.<a name="lambda-edge-how-it-works-tutorial-add-trigger-proc"></a>

**Untuk mengkonfigurasi CloudFront pemicu untuk fungsi Anda**

1. Di konsol Lambda, pada halaman **Ikhtisar fungsi** untuk fungsi Anda, pilih **Tambah** pemicu.

1. Untuk **konfigurasi Trigger**, pilih **CloudFront**.

1. Pilih **Terapkan ke Lambda @Edge**.

1. Di panel **Deploy to Lambda** @Edge, **di bawah pemicu CloudFront Konfigurasi**, masukkan informasi berikut:
   + **Distribusi** — ID CloudFront distribusi untuk dikaitkan dengan fungsi Anda. Dalam daftar dropdown, pilih ID distribusi.
   + **Perilaku cache** — Perilaku cache yang digunakan dengan pemicu. Untuk contoh ini, biarkan nilai disetel ke **\$1**, yang berarti perilaku cache default distribusi Anda. Untuk informasi selengkapnya, lihat [Pengaturan perilaku cache](DownloadDistValuesCacheBehavior.md) dalam topik [Semua referensi pengaturan distribusi](distribution-web-values-specify.md).
   + **CloudFront event** - Pemicu yang menentukan kapan fungsi Anda berjalan. Kami ingin fungsi header keamanan berjalan setiap kali CloudFront mengembalikan respons dari asal. Dalam daftar dropdown, pilih Respons **asal**. Untuk informasi selengkapnya, lihat [Tambahkan pemicu untuk fungsi Lambda @Edge](lambda-edge-add-triggers.md).

1. Pilih kotak **centang Konfirmasi penerapan ke Lambda** @Edge.

1. Pilih **Deploy** untuk menambahkan pemicu dan mereplikasi fungsi ke AWS lokasi di seluruh dunia.

1. Tunggu fungsi mereplikasi. Ini biasanya memerlukan waktu beberapa menit.

    Anda dapat memeriksa untuk melihat apakah replikasi selesai oleh [menuju ke CloudFront konsol](https://console.aws.amazon.com/cloudfront/v4/home) dan melihat distribusi Anda. Tunggu status distribusi berubah dari **Deploying** ke tanggal dan waktu, yang berarti bahwa fungsi Anda telah direplikasi. Untuk memverifikasi bahwa fungsi bekerja, ikuti langkah-langkah di bagian berikutnya.

## Langkah 5: Verifikasi bahwa fungsi berjalan
<a name="lambda-edge-how-it-works-tutorial-verify"></a>

Sekarang setelah Anda membuat fungsi Lambda dan mengonfigurasi pemicu untuk menjalankannya untuk CloudFront distribusi, periksa untuk memastikan bahwa fungsi tersebut memenuhi apa yang Anda harapkan. Dalam contoh ini, kami memeriksa header HTTP yang CloudFront kembali, untuk memastikan bahwa judul keamanan ditambahkan.<a name="lambda-edge-how-it-works-tutorial-verify-proc"></a>

**Untuk memverifikasi bahwa fungsi Lambda@Edge Anda menambahkan header keamanan**

1. Dalam peramban, masukkan URL untuk file dalam buket S3. Misalnya, Anda mungkin menggunakan URL yang serupa dengan `https://d111111abcdef8.cloudfront.net/image.jpg`.

   Untuk informasi selengkapnya tentang nama CloudFront domain yang akan digunakan dalam URL file, lihat[Sesuaikan format URL untuk file di CloudFront](LinkFormat.md).

1. Buka bilah alat Pengembang Web browser Anda. Misalnya, di jendela browser Anda di Chrome, buka menu konteks (klik kanan), lalu pilih **Periksa**.

1. Pilih **Jaringan** tab.

1. Muat ulang halaman untuk menampilkan citra Anda, lalu pilih permintaan HTTP di panel kiri. Anda melihat header HTTP yang ditampilkan dalam panel terpisah.

1. Lihat daftar header HTTP untuk memverifikasi bahwa header keamanan yang diharapkan disertakan dalam daftar. Misalnya, Anda mungkin melihat header yang mirip dengan yang ditampilkan di screenshot berikut.  
![\[Daftar header HTTP dengan header keamanan yang diharapkan disorot.\]](http://docs.aws.amazon.com/id_id/AmazonCloudFront/latest/DeveloperGuide/images/lambda-at-edge-security-headers-list.png)

Jika header keamanan disertakan dalam daftar header Anda, bagus\$1 Anda telah berhasil membuat fungsi Lambda@Edge pertama Anda. Jika CloudFront mengembalikan kesalahan atau ada masalah lain, lanjutkan ke langkah berikutnya untuk memecahkan masalah.

## Langkah 6: Memecahkan masalah
<a name="lambda-edge-how-it-works-tutorial-troubleshoot"></a>

Jika CloudFront mengembalikan kesalahan atau tidak menambahkan header keamanan seperti yang diharapkan, Anda dapat menyelidiki eksekusi fungsi Anda dengan melihat CloudWatch Log. Pastikan untuk menggunakan log yang disimpan di AWS lokasi yang paling dekat dengan lokasi di mana fungsi dijalankan.

Misalnya, jika Anda melihat file dari London, coba ubah Wilayah dalam CloudWatch konsol ke Eropa (London).<a name="lambda-edge-how-it-works-tutorial-cloudwatch-proc"></a>

**Untuk memeriksa CloudWatch log untuk fungsi Lambda @Edge Anda**

1. Masuk ke Konsol Manajemen AWS dan buka CloudWatch konsol di [https://console.aws.amazon.com/cloudwatch/](https://console.aws.amazon.com/cloudwatch/).

1. Perubahan **Wilayah** ke lokasi yang ditampilkan saat Anda melihat file di browser Anda. Di sinilah fungsi beroperasi.

1. Di panel kiri, pilih **Log** untuk melihat log untuk distribusi Anda. 

Untuk informasi selengkapnya, lihat [Pantau CloudFront metrik dengan Amazon CloudWatch](monitoring-using-cloudwatch.md).

## Langkah 7: Bersihkan sumber daya contoh Anda
<a name="lambda-edge-how-it-works-tutorial-cleanup-resources"></a>

Jika Anda membuat bucket dan CloudFront distribusi Amazon S3 hanya untuk tutorial ini, hapus AWS sumber daya yang Anda alokasikan sehingga Anda tidak lagi dikenakan biaya. Setelah Anda menghapus AWS sumber daya, konten apa pun yang Anda tambahkan tidak lagi tersedia.

**Tugas**
+ [Hapus ember S3](#lambda-edge-how-it-works-tutorial-delete-bucket) 
+ [Hapus fungsi Lambda](#lambda-edge-how-it-works-tutorial-delete-function)
+ [Hapus CloudFront distribusi](#lambda-edge-how-it-works-tutorial-delete-distribution)

### Hapus ember S3
<a name="lambda-edge-how-it-works-tutorial-delete-bucket"></a>

Sebelum Anda menghapus buket Amazon S3, pastikan pembuatan log dinonaktifkan untuk buket. Jika tidak, AWS terus menulis log ke bucket Anda saat Anda menghapusnya.<a name="lambda-edge-how-it-works-tutorial-delete-bucket-proc"></a>

**Untuk menonaktifkan pembuatan log untuk bucket**

1. Buka konsol Amazon S3 di. [https://console.aws.amazon.com/s3/](https://console.aws.amazon.com/s3/)

1. Pilih keranjang Anda, lalu pilih **Properti**.

1. Dari **Properti**, pilih **Pencatatan**.

1. Hapus kotak centang **Diaktifkan**.

1. Pilih **Simpan**.

Sekarang, Anda dapat menghapus bucket Anda. Untuk informasi selengkapnya, lihat [Menghapus bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html) di *Panduan Pengguna Konsol Layanan Penyimpanan Sederhana Amazon*.

### Hapus fungsi Lambda
<a name="lambda-edge-how-it-works-tutorial-delete-function"></a>

Untuk instruksi untuk menghapus asosiasi fungsi Lambda dan opsional fungsi itu sendiri, lihat. [Hapus fungsi dan replika Lambda @Edge](lambda-edge-delete-replicas.md)

### Hapus CloudFront distribusi
<a name="lambda-edge-how-it-works-tutorial-delete-distribution"></a>

Sebelum Anda menghapus CloudFront distribusi, Anda harus menonaktifkannya. Distribusi yang dinonaktifkan tidak lagi berfungsi, dan tidak dikenakan biaya. Anda dapat mengaktifkan distribusi yang dinonaktifkan kapan saja. Setelah Anda menghapus distribusi yang dinonaktifkan, maka tidak lagi tersedia.<a name="lambda-edge-how-it-works-tutorial-delete-distribution-proc"></a>

**Untuk menonaktifkan dan menghapus CloudFront distribusi**

1. Buka CloudFront konsol di[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Pilih distribusi yang ingin Anda nonaktifkan, lalu pilih **Nonaktifkan**.

1. Saat diminta untuk mengonfirmasi, pilih **Ya, Nonaktifkan**.

1. Pilih distribusi yang dinonaktifkan, lalu pilih **Hapus**.

1. Saat diminta konfirmasi, pilih **Ya, Hapus**.

## Informasi Terkait
<a name="lambda-edge-how-it-works-tutorial-resources"></a>

Sekarang, setelah Anda memiliki gagasan dasar tentang cara kerja fungsi Lambda@Edge, pelajari lebih lanjut dengan membaca hal berikut:
+ [Lambda @Edge contoh fungsi](lambda-examples.md)
+ [Praktik Terbaik Desain Lambda @Edge](https://aws.amazon.com/blogs/networking-and-content-delivery/lambdaedge-design-best-practices/)
+ [Mengurangi Latensi dan Menggeser Komputasi ke Edge dengan Lambda @Edge](https://aws.amazon.com/blogs/networking-and-content-delivery/reducing-latency-and-shifting-compute-to-the-edge-with-lambdaedge/)

# Siapkan izin dan peran IAM untuk Lambda @Edge
<a name="lambda-edge-permissions"></a>

Untuk mengonfigurasi Lambda @Edge, Anda harus memiliki izin dan peran IAM berikut untuk: AWS Lambda
+ [Izin IAM](#lambda-edge-permissions-required) — Izin ini memungkinkan Anda membuat fungsi Lambda dan mengaitkannya dengan distribusi Anda. CloudFront 
+ [Peran eksekusi fungsi Lambda (peran](#lambda-edge-permissions-function-execution) IAM) — Prinsipal layanan Lambda mengasumsikan peran ini untuk menjalankan fungsi Anda.
+ [Peran terkait layanan untuk Lambda @Edge](#using-service-linked-roles-lambda-edge) — Peran terkait layanan memungkinkan spesifik untuk Layanan AWS mereplikasi fungsi Lambda ke dan mengaktifkan penggunaan file log. Wilayah AWS CloudWatch CloudFront 

## Izin IAM diperlukan untuk mengaitkan fungsi Lambda @Edge dengan distribusi CloudFront
<a name="lambda-edge-permissions-required"></a>

Selain izin IAM yang Anda perlukan untuk Lambda, Anda memerlukan izin berikut untuk mengaitkan fungsi Lambda dengan distribusi: CloudFront 
+ `lambda:GetFunction`— Memberikan izin untuk mendapatkan informasi konfigurasi untuk fungsi Lambda Anda dan URL yang telah ditentukan sebelumnya untuk mengunduh file `.zip` yang berisi fungsi tersebut.
+ `lambda:EnableReplication*`— Memberikan izin ke kebijakan sumber daya sehingga layanan replikasi Lambda bisa mendapatkan kode fungsi dan konfigurasi.
+ `lambda:DisableReplication*`— Memberikan izin ke kebijakan sumber daya sehingga layanan replikasi Lambda dapat menghapus fungsi.
**penting**  
Anda harus menambahkan tanda bintang (`*`) di akhir `lambda:EnableReplication*` dan `lambda:DisableReplication*` tindakan.
+ Untuk sumber daya, tentukan ARN dari versi fungsi yang ingin Anda jalankan ketika suatu CloudFront peristiwa terjadi, seperti contoh berikut:

  `arn:aws:lambda:us-east-1:123456789012:function:TestFunction:2`
+ `iam:CreateServiceLinkedRole`— Memberikan izin untuk membuat peran terkait layanan yang digunakan Lambda @Edge untuk mereplikasi fungsi Lambda. CloudFront Setelah Anda mengonfigurasi Lambda @Edge untuk pertama kalinya, peran terkait layanan akan dibuat secara otomatis untuk Anda. Anda tidak perlu menambahkan izin ini ke distribusi lain yang menggunakan Lambda @Edge.

  
+ `cloudfront:UpdateDistribution`atau `cloudfront:CreateDistribution` — Memberikan izin untuk memperbarui atau membuat distribusi.

Untuk informasi selengkapnya, lihat topik berikut:
+ [Identity and Access Management untuk Amazon CloudFront](security-iam.md)
+ *Izin [akses sumber daya Lambda di Panduan Pengembang](https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html#lambda-intro-execution-role)AWS Lambda *

## Peran eksekusi fungsi untuk prinsipal layanan
<a name="lambda-edge-permissions-function-execution"></a>

Anda harus membuat peran IAM yang dapat diasumsikan oleh kepala sekolah `lambda.amazonaws.com` dan `edgelambda.amazonaws.com` layanan ketika mereka menjalankan fungsi Anda. 

**Tip**  
Saat membuat fungsi di konsol Lambda, Anda dapat memilih untuk membuat peran eksekusi baru dengan menggunakan templat AWS kebijakan. Langkah ini *secara otomatis* menambahkan izin Lambda @Edge yang diperlukan untuk menjalankan fungsi Anda. Lihat [Langkah 5 dalam Tutorial: Membuat fungsi Lambda @Edge sederhana](lambda-edge-how-it-works-tutorial.md#lambda-edge-how-it-works-tutorial-create-function).

Untuk informasi selengkapnya tentang membuat peran IAM secara manual, lihat [Membuat peran dan melampirkan kebijakan (konsol)](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions_create-policies.html) di Panduan Pengguna *IAM*.

**Example Contoh: Kebijakan kepercayaan peran**  
Anda dapat menambahkan peran ini di bawah tab **Trust Relationship** di konsol IAM. Jangan tambahkan kebijakan ini di bawah tab **Izin**.    
****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": {
            "Service": [
               "lambda.amazonaws.com",
               "edgelambda.amazonaws.com"
            ]
         },
         "Action": "sts:AssumeRole"
      }
   ]
}
```

*Untuk informasi selengkapnya tentang izin yang perlu Anda berikan ke peran eksekusi, lihat Izin [akses sumber daya Lambda](https://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html#lambda-intro-execution-role) di AWS Lambda Panduan Pengembang.*

**Catatan**  
Secara default, setiap kali CloudFront peristiwa memicu fungsi Lambda, data ditulis CloudWatch ke Log. Jika Anda ingin menggunakan log ini, peran eksekusi memerlukan izin untuk menulis data ke CloudWatch Log. Anda dapat menggunakan standar AWSLambdaBasicExecutionRole untuk memberikan izin ke peran eksekusi.  
Untuk informasi selengkapnya tentang CloudWatch Log, lihat[Log fungsi tepi](edge-functions-logs.md).
Jika kode fungsi Lambda Anda mengakses AWS sumber daya lain, seperti membaca objek dari bucket S3, peran eksekusi memerlukan izin untuk melakukan tindakan tersebut. 

## Peran terkait layanan untuk Lambda @Edge
<a name="using-service-linked-roles-lambda-edge"></a>

[Lambda @Edge menggunakan peran terkait layanan IAM.](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_terms-and-concepts.html#iam-term-service-linked-role) Peran yang terhubung dengan layanan adalah jenis peran IAM unik yang terhubung langsung ke layanan. Peran yang ditautkan dengan layanan ditentukan sebelumnya oleh layanan dan mencakup semua izin yang diperlukan layanan untuk menghubungi layanan AWS lainnya atas nama Anda.

Lambda @Edge menggunakan peran terkait layanan IAM berikut:
+ **AWSServiceRoleForLambdaReplicator**— Lambda @Edge menggunakan peran ini untuk memungkinkan Lambda @Edge mereplikasi fungsi ke. Wilayah AWS

  Saat Anda pertama kali menambahkan pemicu Lambda @Edge CloudFront, peran bernama dibuat AWSServiceRoleForLambdaReplicator secara otomatis untuk memungkinkan Lambda @Edge mereplikasi fungsi. Wilayah AWS Peran ini diperlukan untuk menggunakan fungsi Lambda @Edge. ARN untuk AWSServiceRoleForLambdaReplicator peran tersebut terlihat seperti contoh berikut:

  `arn:aws:iam::123456789012:role/aws-service-role/replicator.lambda.amazonaws.com/AWSServiceRoleForLambdaReplicator`
+ **AWSServiceRoleForCloudFrontLogger**— CloudFront menggunakan peran ini untuk mendorong file log ke dalam CloudWatch. Anda dapat menggunakan file log untuk men-debug kesalahan validasi Lambda @Edge.

  AWSServiceRoleForCloudFrontLoggerPeran dibuat secara otomatis saat Anda menambahkan asosiasi fungsi Lambda @Edge CloudFront untuk memungkinkan mendorong file log kesalahan Lambda @Edge ke. CloudWatch ARN untuk AWSServiceRoleForCloudFrontLogger peran yang terlihat seperti ini:

  `arn:aws:iam::account_number:role/aws-service-role/logger.cloudfront.amazonaws.com/AWSServiceRoleForCloudFrontLogger`

Peran yang terhubung dengan layanan memudahkan pengaturan dan penggunaan Lambda@Edge karena Anda tidak perlu menambahkan izin yang diperlukan secara manual. Lambda@Edge mendefinisikan izin peran yang terhubung ke layanan, dan hanya Lambda@Edge yang dapat memegang peran tersebut. Izin yang ditentukan mencakup kebijakan kepercayaan dan kebijakan izin. Kebijakan izin tidak dapat dilampirkan ke entitas IAM lainnya.

Anda harus menghapus sumber daya terkait CloudFront atau Lambda @Edge sebelum dapat menghapus peran terkait layanan. Ini membantu melindungi sumber daya Lambda @Edge Anda sehingga Anda tidak menghapus peran terkait layanan yang masih diperlukan untuk mengakses sumber daya aktif.

Untuk mengetahui informasi selengkapnya tentang peran terkait layanan, lihat [Peran terkait layanan untuk CloudFront](security_iam_service-with-iam.md#security_iam_service-with-iam-roles-service-linked). 

### Izin peran terkait layanan untuk Lambda @Edge
<a name="slr-permissions-lambda-edge"></a>

Lambda @Edge menggunakan dua peran terkait layanan, bernama dan. **AWSServiceRoleForLambdaReplicator**AWSServiceRoleForCloudFrontLogger**** Bagian berikut menjelaskan izin untuk masing-masing peran ini.

**Contents**
+ [Izin peran terkait layanan untuk replikator Lambda](#slr-permissions-lambda-replicator)
+ [Izin peran terkait layanan untuk logger CloudFront](#slr-permissions-cloudfront-logger)

#### Izin peran terkait layanan untuk replikator Lambda
<a name="slr-permissions-lambda-replicator"></a>

Peran terkait layanan ini memungkinkan Lambda mereplikasi fungsi Lambda @Edge. Wilayah AWS

Peran terkait layanan AWSServiceRoleForLambdaReplicator memercayai layanan `replicator.lambda.amazonaws.com` untuk menjalankan peran.

Kebijakan izin peran memungkinkan Lambda@Edge menyelesaikan tindakan berikut pada sumber daya yang ditentukan:
+ `lambda:CreateFunction` pada `arn:aws:lambda:*:*:function:*`
+ `lambda:DeleteFunction` pada `arn:aws:lambda:*:*:function:*`
+ `lambda:DisableReplication` pada `arn:aws:lambda:*:*:function:*`
+ `iam:PassRole` pada `all AWS resources`
+  `cloudfront:ListDistributionsByLambdaFunction` pada `all AWS resources`

#### Izin peran terkait layanan untuk logger CloudFront
<a name="slr-permissions-cloudfront-logger"></a>

Peran terkait layanan ini memungkinkan CloudFront untuk mendorong file log ke dalam CloudWatch sehingga Anda dapat men-debug kesalahan validasi Lambda @Edge.

Peran terkait layanan AWSServiceRoleForCloudFrontLogger memercayai layanan `logger.cloudfront.amazonaws.com` untuk menjalankan peran.

Kebijakan izin peran memungkinkan Lambda @Edge menyelesaikan tindakan berikut pada sumber daya yang ditentukan: `arn:aws:logs:*:*:log-group:/aws/cloudfront/*`
+ `logs:CreateLogGroup` ``
+ `logs:CreateLogStream`
+ `logs:PutLogEvents`

Anda harus mengonfigurasi izin untuk mengizinkan entitas IAM (seperti pengguna, grup, atau peran) untuk menghapus peran yang ditautkan oleh layanan Lambda@Edge. Untuk informasi selengkapnya, lihat [Izin peran terkait layanan](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html#service-linked-role-permissions) dalam *Panduan Pengguna IAM*.

### Membuat peran terkait layanan untuk Lambda @Edge
<a name="create-slr-lambda-edge"></a>

Anda biasanya tidak membuat peran terkait layanan secara manual untuk Lambda@Edge. Layanan ini membuat peran untuk Anda secara otomatis dalam skenario berikut:
+ Saat pertama kali membuat pemicu, layanan akan membuat AWSServiceRoleForLambdaReplicator peran (jika belum ada). Peran ini memungkinkan Lambda untuk mereplikasi fungsi Lambda @Edge ke. Wilayah AWS

  Jika Anda menghapus peran layanan yang ditautkan, peran tersebut akan dibuat lagi saat Anda menambahkan pemicu baru untuk Lambda@Edge dalam distribusi.
+ Saat Anda memperbarui atau membuat CloudFront distribusi yang memiliki asosiasi Lambda @Edge, layanan akan membuat AWSServiceRoleForCloudFrontLogger peran (jika peran tersebut belum ada). Peran ini memungkinkan CloudFront untuk mendorong file log Anda ke CloudWatch.

  Jika Anda menghapus peran terkait layanan, peran akan dibuat lagi saat Anda memperbarui atau membuat CloudFront distribusi yang memiliki asosiasi Lambda @Edge.

Untuk membuat peran terkait layanan ini secara manual, Anda dapat menjalankan perintah AWS Command Line Interface (AWS CLI) berikut:

**Untuk membuat AWSServiceRoleForLambdaReplicator peran**
+ Jalankan perintah berikut.

  ```
  aws iam create-service-linked-role --aws-service-name replicator.lambda.amazonaws.com
  ```

**Untuk membuat AWSServiceRoleForCloudFrontLogger peran**
+ Jalankan perintah berikut.

  ```
  aws iam create-service-linked-role --aws-service-name logger.cloudfront.amazonaws.com
  ```

### Mengedit peran terkait layanan Lambda @Edge
<a name="edit-slr-lambda-edge"></a>

Lambda @Edge tidak mengizinkan Anda mengedit AWSServiceRoleForLambdaReplicator atau peran yang ditautkan AWSServiceRoleForCloudFrontLogger layanan. Setelah layanan membuat peran terkait layanan, Anda tidak dapat mengubah nama peran karena berbagai entitas mungkin mereferensikan peran tersebut. Namun, Anda dapat menggunakan IAM untuk mengedit deskripsi peran. Untuk informasi selengkapnya, lihat [Mengedit peran terkait layanan](https://docs.aws.amazon.com/IAM/latest/UserGuide/using-service-linked-roles.html#edit-service-linked-role) dalam *Panduan Pengguna IAM*.

### Didukung Wilayah AWS untuk peran terkait layanan Lambda @Edge
<a name="slr-regions-lambda-edge"></a>

CloudFront mendukung penggunaan peran terkait layanan untuk Lambda @Edge sebagai berikut: Wilayah AWS
+ AS Timur (Virginia Utara)–`us-east-1`
+ AS Timur (Ohio)–`us-east-2`
+ AS Barat (California Utara)–`us-west-1`
+ AS Barat (Oregon)–`us-west-2`
+ Asia Pasifik (Mumbai)–`ap-south-1`
+ Asia Pasifik (Seoul)–`ap-northeast-2`
+ Asia Pasifik (Singapura)–`ap-southeast-1`
+ Asia Pasifik (Sydney)–`ap-southeast-2`
+ Asia Pasifik (Tokyo) – `ap-northeast-1`
+ Eropa (Frankfurt) – `eu-central-1`
+ Eropa (Irlandia)–`eu-west-1`
+ Eropa (London) – `eu-west-2`
+ Amerika Selatan (São Paulo) – `sa-east-1`

# Tulis dan buat fungsi Lambda @Edge
<a name="lambda-edge-create-function"></a>

Untuk menggunakan Lambda @Edge, Anda *menulis* kode untuk fungsi Anda AWS Lambda . Untuk membantu Anda menulis fungsi Lambda @Edge, lihat sumber daya berikut:
+  [Struktur acara Lambda @Edge](lambda-event-structure.md)— Memahami struktur acara yang akan digunakan dengan Lambda @Edge.
+ [Lambda @Edge contoh fungsi](lambda-examples.md)— Contoh fungsi, seperti A/B pengujian dan menghasilkan pengalihan HTTP.

Model pemrograman untuk menggunakan Node.js atau Python dengan Lambda @Edge sama dengan menggunakan Lambda dalam file. Wilayah AWS*Untuk informasi selengkapnya, lihat [Membangun fungsi Lambda dengan Node.js](https://docs.aws.amazon.com/lambda/latest/dg/lambda-nodejs.html) atau Membangun [fungsi Lambda dengan Python](https://docs.aws.amazon.com/lambda/latest/dg/lambda-python.html) di Panduan Pengembang.AWS Lambda *

Dalam fungsi Lambda @Edge Anda, sertakan `callback` parameter dan kembalikan objek yang berlaku untuk peristiwa permintaan atau respons:
+ **Minta acara** – Sertakan `cf.request` keberatan dalam respons.

  Jika Anda menghasilkan respons, sertakan `cf.response` keberatan dalam respons. Untuk informasi selengkapnya, lihat [Hasilkan respons HTTP dalam pemicu permintaan](lambda-generating-http-responses.md#lambda-generating-http-responses-in-requests). 
+ **Peristiwa tanggapan** – Sertakan `cf.response` keberatan dalam respons.

Setelah Anda menulis kode Anda sendiri atau menggunakan salah satu contoh, Anda kemudian membuat fungsi di Lambda. Untuk membuat fungsi atau mengedit yang sudah ada, lihat topik berikut:

**Topics**
+ [Buat fungsi Lambda @Edge](lambda-edge-create-in-lambda-console.md)
+ [Edit fungsi Lambda](lambda-edge-edit-function.md)

 *Setelah Anda membuat fungsi di Lambda, Anda mengatur Lambda untuk menjalankan fungsi berdasarkan CloudFront peristiwa tertentu, yang disebut pemicu.* Untuk informasi selengkapnya, lihat [Tambahkan pemicu untuk fungsi Lambda @Edge](lambda-edge-add-triggers.md).

# Buat fungsi Lambda @Edge
<a name="lambda-edge-create-in-lambda-console"></a>

 AWS Lambda Untuk mengatur menjalankan fungsi Lambda yang didasarkan pada CloudFront peristiwa, ikuti prosedur ini.<a name="lambda-edge-create-function-procedure"></a>

**Untuk membuat fungsi Lambda@Edge**

1. Masuk ke Konsol Manajemen AWS dan buka AWS Lambda konsol di [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1. Jika Anda sudah memiliki satu atau beberapa fungsi Lambda, pilih **Buat fungsi**.

   Jika Anda tidak memiliki fungsi apa pun, pilih **Mulai Sekarang**.

1. Pada daftar Wilayah di bagian atas halaman, pilih **AS Timur (N. Virginia)**.

1. Buat fungsi menggunakan kode Anda sendiri atau buat fungsi dimulai dengan CloudFront cetak biru.
   + Untuk membuat fungsi menggunakan kode Anda sendiri, pilih **Penulis dari awal**. 
   + **Untuk menampilkan daftar cetak biru CloudFront, masukkan **cloudfront** di bidang filter, lalu pilih Enter.**

     Jika Anda menemukan cetak biru yang ingin digunakan, pilih nama cetak biru tersebut.

1. Di **Informasi dasar** , tentukan nilai-nilai berikut:

   1. **Nama** — Masukkan nama untuk fungsi Anda.

   1. **Peran** — Untuk memulai dengan cepat, pilih **Buat peran baru dari templat**. Anda juga dapat **memilih Pilih peran yang ada** atau **Buat peran khusus**, lalu ikuti petunjuk untuk melengkapi informasi untuk bagian ini.

   1. **Nama peran** — Masukkan nama untuk peran tersebut.

   1. **Templat kebijakan** — Pilih izin **Lambda Edge Dasar**.

1. Jika Anda memilih **Penulis dari awal** dalam langkah 4, lompat ke langkah 7.

   Jika Anda memilih cetak biru di langkah 4, bagian **cloudfront** memungkinkan Anda membuat satu pemicu, yang mengaitkan fungsi ini dengan cache dalam distribusi dan peristiwa. CloudFront CloudFront Kami sarankan Anda memilih **Hapus** pada titik ini, jadi tidak ada pemicu untuk fungsi saat dibuat. Kemudian Anda dapat menambahkan pemicu nanti. 
**Tip**  
Kami menyarankan Anda menguji dan men-debug fungsi sebelum menambahkan pemicu. Jika Anda menambahkan pemicu sekarang, fungsi akan berjalan segera setelah Anda membuat fungsi dan selesai mereplikasi ke AWS lokasi di seluruh dunia, dan distribusi yang sesuai diterapkan.

1. Pilih **Buat fungsi**.

   Lambda membuat dua versi fungsi Anda: \$1LATEST dan Versi 1. Anda dapat mengedit versi \$1LATEST saja, tetapi konsol awalnya menampilkan Versi 1.

1. Untuk mengedit fungsi, pilih **Versi 1** di dekat bagian atas halaman, di bawah ARN untuk fungsi . Lalu, pada **Versi** pilih, pilih **\$1LATEST**. (Jika Anda meninggalkan fungsi dan kemudian kembali, label tombol adalah **Pengukur**.)

1. Di **Konfigurasi** pilih tab yang sesuai **Jenis entri kode**. Kemudian ikuti perintah untuk mengedit atau mengunggah kode Anda.

1. Untuk **Waktu pengoperasian**, pilih nilai berdasarkan kode fungsi Anda.

1. Di **Tanda** , tambahkan tag yang berlaku.

1. Pilih **Tindakan**, lalu pilih **Terbitkan versi baru**.

1. Masukkan deskripsi untuk versi baru fungsi.

1. Pilih **Terbitkan**.

1. Uji dan jalankan debug fungsinya. *Untuk informasi selengkapnya tentang pengujian di konsol Lambda, lihat [Memanggil fungsi Lambda menggunakan konsol di Panduan Pengembang](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#get-started-invoke-manually).AWS Lambda *

1. Saat Anda siap menjalankan fungsi untuk CloudFront acara, publikasikan versi lain dan edit fungsi untuk menambahkan pemicu. Untuk informasi selengkapnya, lihat [Tambahkan pemicu untuk fungsi Lambda @Edge](lambda-edge-add-triggers.md).

# Edit fungsi Lambda
<a name="lambda-edge-edit-function"></a>

Setelah Anda membuat fungsi Lambda @Edge, Anda dapat menggunakan konsol Lambda untuk mengeditnya.

**Catatan**  
Versi asli diberi label \$1LATEST.
Anda dapat mengedit versi \$1LATEST saja.
Setiap kali Anda mengedit versi \$1LATEST, Anda harus menerbitkan versi bernomor baru.
Anda tidak dapat membuat pemicu untuk \$1LATEST.
Saat Anda menerbitkan versi baru suatu fungsi, Lambda tidak otomatis menyalin pemicu dari versi sebelumnya ke versi baru. Anda harus mereproduksi pemicu untuk versi baru. 
Saat Anda menambahkan pemicu untuk suatu CloudFront peristiwa ke suatu fungsi, jika sudah ada pemicu untuk distribusi, perilaku cache, dan peristiwa yang sama untuk versi sebelumnya dari fungsi yang sama, Lambda menghapus pemicu dari versi sebelumnya.
Setelah Anda membuat pembaruan pada CloudFront distribusi, seperti menambahkan pemicu, Anda harus menunggu perubahan menyebar ke lokasi tepi sebelum fungsi yang Anda tentukan dalam pemicu akan berfungsi.<a name="lambda-edge-edit-function-procedure"></a>

**Untuk mengedit fungsi Lambda**

1. Masuk ke Konsol Manajemen AWS dan buka AWS Lambda konsol di [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1. Pada daftar Wilayah di bagian atas halaman, pilih **AS Timur (N. Virginia)**.

1. Dalam daftar fungsi, pilih nama fungsi.

   Secara default, konsol menampilkan versi \$1LATEST. Anda dapat melihat versi sebelumnya (pilih **Pengukur**), tetapi Anda hanya dapat mengedit \$1LATEST.

1. Di **Kode** , untuk **Jenis entri kode**, pilih untuk mengedit kode di browser, mengunggah file .zip, atau mengunggah file dari Amazon S3.

1. Pilih salah satu **Simpan** atau **Simpan dan uji**.

1. Pilih **Tindakan**, dan pilih **Terbitkan versi baru**. 

1. Di **Terbitkan versi baru dari \$1LATEST** kotak dialog, masukkan deskripsi versi baru. Uraian ini muncul dalam daftar versi, bersama dengan nomor versi yang dibuat secara otomatis. 

1. Pilih **Terbitkan**.

   Versi baru secara otomatis menjadi versi terbaru. Nomor versi muncul pada **Versi** di sudut kiri atas halaman.
**catatan**  
Jika Anda belum menambahkan pemicu untuk fungsi Anda, lihat[Tambahkan pemicu untuk fungsi Lambda @Edge](lambda-edge-add-triggers.md). 

1. Pilih **Pemicu** tab.

1. Pilih **Tambahkan pemicu**.

1. Di **Tambahkan pemicu** kotak dialog, pilih kotak titik-titik, lalu pilih **CloudFront**.
**catatan**  
Jika Anda telah membuat satu atau beberapa pemicu untuk suatu fungsi, CloudFront adalah layanan default.

1. Tentukan nilai berikut untuk menunjukkan kapan Anda ingin fungsi Lambda menjalankan.

   1. **ID Distribusi** — Pilih ID distribusi yang ingin Anda tambahkan pemicu.

   1. **Perilaku cache** - Pilih perilaku cache yang menentukan objek yang ingin Anda jalankan fungsinya.

   1. **CloudFront event** — Pilih CloudFront acara yang menyebabkan fungsi dijalankan.

   1. **Aktifkan pemicu dan replikasi** - Pilih kotak centang ini sehingga Lambda mereplikasi fungsi secara global. Wilayah AWS 

1. Pilih **Kirim**.

1. Untuk menambahkan lebih banyak pemicu untuk fungsi ini, ulangi langkah 10 hingga 13.

*Untuk informasi selengkapnya tentang menguji dan men-debug fungsi di konsol Lambda, [lihat Memanggil fungsi Lambda menggunakan](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#get-started-invoke-manually) konsol di Panduan Pengembang.AWS Lambda *

Saat Anda siap menjalankan fungsi untuk CloudFront acara, publikasikan versi lain dan edit fungsi untuk menambahkan pemicu. Untuk informasi selengkapnya, lihat [Tambahkan pemicu untuk fungsi Lambda @Edge](lambda-edge-add-triggers.md).

# Tambahkan pemicu untuk fungsi Lambda @Edge
<a name="lambda-edge-add-triggers"></a>

Pemicu Lambda @Edge adalah salah satu kombinasi dari CloudFront distribusi, perilaku cache, dan peristiwa yang menyebabkan fungsi dijalankan. Misalnya, Anda dapat membuat pemicu yang menyebabkan fungsi dijalankan saat CloudFront menerima permintaan dari penampil untuk perilaku cache tertentu yang Anda siapkan untuk distribusi Anda. Anda dapat menentukan satu atau lebih CloudFront pemicu. 

**Tip**  
Saat membuat CloudFront distribusi, Anda menentukan setelan yang memberi tahu CloudFront cara merespons saat menerima permintaan yang berbeda. Pengaturan default disebut *perilaku cache default* untuk distribusi. Anda dapat mengatur perilaku cache tambahan yang menentukan cara CloudFront merespons dalam keadaan tertentu, misalnya, saat menerima permintaan untuk jenis file tertentu. Untuk informasi selengkapnya, lihat [Pengaturan perilaku cache](DownloadDistValuesCacheBehavior.md).

Saat pertama kali membuat fungsi Lambda, Anda hanya dapat menentukan *satu* pemicu. Anda dapat menambahkan lebih banyak pemicu ke fungsi yang sama nanti dengan menggunakan konsol Lambda atau dengan mengedit distribusi di CloudFront konsol.
+ Konsol Lambda berfungsi dengan baik jika Anda ingin menambahkan lebih banyak pemicu ke fungsi untuk distribusi yang sama. CloudFront 
+  CloudFront Konsol bisa lebih baik jika Anda ingin menambahkan pemicu untuk beberapa distribusi karena lebih mudah untuk menemukan distribusi yang ingin Anda perbarui. Anda juga dapat memperbarui CloudFront pengaturan lain secara bersamaan.

**Topics**
+ [CloudFront peristiwa yang dapat memicu fungsi Lambda @Edge](lambda-cloudfront-trigger-events.md)
+ [Pilih acara untuk memicu fungsi](lambda-how-to-choose-event.md)
+ [Tambahkan pemicu ke fungsi Lambda @Edge](lambda-edge-add-triggers-console.md)

# CloudFront peristiwa yang dapat memicu fungsi Lambda @Edge
<a name="lambda-cloudfront-trigger-events"></a>

Untuk setiap perilaku cache dalam CloudFront distribusi Amazon, Anda dapat menambahkan hingga empat pemicu (asosiasi) yang menyebabkan fungsi Lambda dijalankan saat peristiwa CloudFront tertentu terjadi. CloudFront pemicu dapat didasarkan pada salah satu dari empat CloudFront peristiwa, seperti yang ditunjukkan pada diagram berikut.

![\[Grafik konseptual yang menunjukkan bagaimana peristiwa CloudFront pemicu untuk fungsi Lambda terintegrasi dengan. CloudFront\]](http://docs.aws.amazon.com/id_id/AmazonCloudFront/latest/DeveloperGuide/images/cloudfront-events-that-trigger-lambda-functions.png)


 CloudFront Peristiwa yang dapat digunakan untuk memicu fungsi Lambda @Edge adalah sebagai berikut:

**Permintaan penampil**  
Fungsi dijalankan ketika CloudFront menerima permintaan dari penampil, sebelum memeriksa untuk melihat apakah objek yang diminta ada dalam CloudFront cache.  
Fungsi tidak dijalankan dalam kasus berikut:  
+ Saat mengambil halaman kesalahan kustom.
+ Ketika CloudFront secara otomatis mengalihkan permintaan HTTP ke HTTPS (ketika nilai [Kebijakan protokol penampil](DownloadDistValuesCacheBehavior.md#DownloadDistValuesViewerProtocolPolicy) adalah **Redirect HTTP ke** HTTPS).

**Permintaan asal**  
Fungsi dijalankan *hanya* ketika CloudFront meneruskan permintaan ke asal Anda. Ketika objek yang diminta ada di CloudFront cache, fungsi tidak dijalankan.

**Respons asal**  
Fungsi mengeksekusi setelah CloudFront menerima respon dari asal dan sebelum cache objek dalam respon. Perhatikan bahwa fungsi menjalankan bahkan jika kesalahan dikembalikan dari asal.  
Fungsi tidak dijalankan dalam kasus berikut:  
+ Ketika file yang diminta dalam CloudFront cache dan tidak kedaluwarsa.
+ Saat respons dihasilkan dari fungsi yang dipicu oleh peristiwa permintaan asal.

**Respons penampil**  
Fungsi menjalankan sebelum mengembalikan file yang diminta ke penampil. Perhatikan bahwa fungsi dijalankan terlepas dari apakah file sudah dalam CloudFront cache.  
Fungsi tidak dijalankan dalam kasus berikut:  
+ Saat asal mengembalikan kode status HTTP sebesar 400 atau lebih.
+ Saat halaman kesalahan kustom dikembalikan.
+ Saat respons dihasilkan dari fungsi yang dipicu oleh peristiwa permintaan penampil.
+ Ketika CloudFront secara otomatis mengalihkan permintaan HTTP ke HTTPS (ketika nilai [Kebijakan protokol penampil](DownloadDistValuesCacheBehavior.md#DownloadDistValuesViewerProtocolPolicy) adalah **Redirect HTTP ke** HTTPS).

Saat Anda menambahkan beberapa pemicu ke perilaku cache yang sama, Anda dapat menggunakannya untuk menjalankan fungsi yang sama atau menjalankan fungsi yang berbeda untuk setiap pemicu. Anda juga dapat mengaitkan fungsi yang sama dengan lebih dari satu distribusi.

**catatan**  
Ketika sebuah CloudFront peristiwa memicu eksekusi fungsi Lambda, fungsi harus *selesai* CloudFront sebelum dapat melanjutkan.   
Misalnya, jika fungsi Lambda dipicu oleh peristiwa permintaan CloudFront penampil, tidak CloudFront akan mengembalikan respons ke penampil atau meneruskan permintaan ke asal hingga fungsi Lambda selesai berjalan.   
Ini berarti bahwa setiap permintaan yang memicu fungsi Lambda meningkatkan latensi untuk permintaan, jadi Anda ingin fungsi tersebut dijalankan secepat mungkin.

# Pilih acara untuk memicu fungsi
<a name="lambda-how-to-choose-event"></a>

Saat Anda memutuskan CloudFront acara mana yang ingin Anda gunakan untuk memicu fungsi Lambda, pertimbangkan hal berikut:

**Saya CloudFront ingin menyimpan objek yang diubah oleh fungsi Lambda**  
Untuk cache objek yang telah dimodifikasi oleh fungsi Lambda sehingga CloudFront dapat melayani objek dari lokasi tepi saat diminta berikutnya, gunakan *permintaan asal* atau peristiwa *respons asal*.   
Ini mengurangi beban dari awal, mengurangi latensi untuk permintaan berikutnya, dan mengurangi biaya dari invoking Lambda@Edge pada permintaan berikutnya.  
Misalnya, jika Anda ingin menambahkan, menghapus, atau mengubah header untuk objek yang dikembalikan oleh asal dan Anda CloudFront ingin menyimpan hasil cache, gunakan peristiwa respons asal.

**Saya ingin fungsi dijalankan untuk setiap permintaan**  
Untuk menjalankan fungsi untuk setiap permintaan yang CloudFront diterima untuk distribusi, gunakan *permintaan penampil* atau peristiwa *respons penampil*.   
Permintaan asal dan kejadian respons asal hanya terjadi ketika objek yang diminta tidak di-cache di lokasi tepi dan CloudFront meneruskan permintaan ke asal.

**Saya ingin fungsinya mengubah kunci cache**  
Untuk mengubah nilai yang Anda gunakan sebagai dasar untuk caching, gunakan acara *permintaan penampil*.   
Misalnya, jika fungsi mengubah URL untuk menyertakan singkatan bahasa pada jalur (misalnya, karena pengguna memilih bahasa dari daftar tarik turun), gunakan acara permintaan penampil:  
+ **URL dalam permintaan penampil** - https://example.com/en/ index.html
+ **URL ketika permintaan berasal dari alamat IP di Jerman** https://example.com/de/ - index.html
Anda juga menggunakan acara permintaan pemirsa jika Anda menyimpan cache berdasarkan cookie atau header permintaan.  
Jika fungsi mengubah cookie atau header, konfigurasikan CloudFront untuk meneruskan bagian permintaan yang berlaku ke asal. Untuk informasi selengkapnya, lihat topik berikut:  
+ [Konten cache berdasarkan cookie](Cookies.md)
+ [Konten cache berdasarkan header permintaan](header-caching.md)

**Fungsi mempengaruhi respon dari asal**  
Untuk mengubah permintaan dengan cara yang memengaruhi respons dari asal, gunakan peristiwa *permintaan asal*.   
Biasanya, sebagian besar peristiwa permintaan pemirsa tidak diteruskan ke asal. CloudFront menanggapi permintaan dengan objek yang sudah ada di cache tepi. Jika fungsi mengubah permintaan berdasarkan peristiwa permintaan asal, CloudFront cache respons ke permintaan asal yang diubah.

# Tambahkan pemicu ke fungsi Lambda @Edge
<a name="lambda-edge-add-triggers-console"></a>

Anda dapat menggunakan AWS Lambda konsol atau CloudFront konsol Amazon untuk menambahkan pemicu ke fungsi Lambda @Edge Anda.

**penting**  
Anda dapat membuat pemicu hanya untuk versi bernomor dari fungsi Anda (bukan **\$1LATEST**).

------
#### [ Lambda console ]<a name="lambda-edge-add-triggers-procedure"></a>

**Untuk menambahkan pemicu CloudFront acara ke fungsi Lambda @Edge**

1. Masuk ke Konsol Manajemen AWS dan buka AWS Lambda konsol di [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

1. Pada daftar Wilayah di bagian atas halaman, pilih **AS Timur (N. Virginia)**.

1. Di **Fungsi** , pilih nama fungsi yang ingin Anda tambahkan pemicunya.

1. Pada halaman **Ikhtisar fungsi**, pilih tab **Versi**.

1. Pilih versi yang ingin Anda tambahkan pemicu.

   Setelah memilih versi, nama tombol berubah menjadi **Versi: \$1LATEST** atau **Versi:** *nomor versi*.

1. Pilih **Pemicu** tab.

1. Pilih **Tambahkan pemicu**.

1. Untuk **konfigurasi Trigger**, **pilih Pilih sumber****cloudfront**, masukkan, lalu pilih **CloudFront**.
**catatan**  
Jika Anda sudah membuat satu atau lebih pemicu, CloudFront adalah layanan default.

1. Tentukan nilai berikut untuk menunjukkan kapan Anda ingin fungsi Lambda menjalankan.

   1. **Distribusi** - Pilih distribusi yang ingin Anda tambahkan pemicu.

   1. **Perilaku cache** - Pilih perilaku cache yang menentukan objek yang ingin Anda jalankan fungsinya.
**catatan**  
Jika Anda menentukan `*` untuk perilaku cache, fungsi Lambda menerapkan perilaku cache default.

   1. **CloudFront event** — Pilih CloudFront acara yang menyebabkan fungsi dijalankan.

   1. **Sertakan isi** - Pilih kotak centang ini jika Anda ingin mengakses badan permintaan dalam fungsi Anda. 

   1. **Konfirmasikan penerapan ke Lambda** @Edge — Pilih kotak centang ini AWS Lambda sehingga mereplikasi fungsi ke global. Wilayah AWS 

1. Pilih **Tambahkan**.

   Fungsi mulai memproses permintaan untuk CloudFront peristiwa yang ditentukan saat CloudFront distribusi yang diperbarui diterapkan. Untuk menentukan apakah distribusi diterapkan, pilih **Distribusi** dalam panel navigasi. Ketika distribusi diterapkan, nilai kolom **Status** untuk distribusi berubah dari **Deploying ke tanggal dan waktu penerapan**.

------
#### [ CloudFront console ]<a name="lambda-create-functions-add-triggers-cloudfront-console-procedure"></a>

**Untuk menambahkan pemicu CloudFront acara ke fungsi Lambda @Edge**

1. Dapatkan ARN dari fungsi Lambda yang ingin Anda tambahkan pemicu untuk:

   1. Masuk ke Konsol Manajemen AWS dan buka AWS Lambda konsol di [https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/).

   1. Pada daftar Wilayah di bagian atas halaman, pilih **AS Timur (N. Virginia)**.

   1. Dalam daftar fungsi, pilih nama fungsi yang ingin Anda tambahkan pemicunya.

   1. Pada halaman **Ikhtisar fungsi**, pilih tab **Versi**, dan pilih versi bernomor yang ingin Anda tambahkan pemicu.

   1. Pilih **Salin ARN** tombol untuk menyalin ARN ke clipboard Anda. ARN untuk fungsi Lambda terlihat seperti ini:

      `arn:aws:lambda:us-east-1:123456789012:function:TestFunction:2`

      Nomor di bagian akhir (**2** dalam contoh ini) adalah nomor versi fungsi.

1. Buka CloudFront konsol di[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Dalam daftar distribusi, pilih ID distribusi yang ingin Anda tambahkan pemicunya.

1. Pilih **Perilaku** tab.

1. Pilih perilaku cache yang ingin Anda tambahkan pemicu, lalu pilih **Edit**.

1. Untuk **asosiasi Fungsi**, dalam daftar **Jenis fungsi**, pilih **Lambda @Edge** untuk saat Anda ingin menjalankan fungsi: untuk permintaan penampil, respons penampil, permintaan asal, atau respons asal. 

   Untuk informasi selengkapnya, lihat [Pilih acara untuk memicu fungsi](lambda-how-to-choose-event.md).

1. Di kotak teks **Fungsi ARN/Nama**, tempel ARN dari fungsi Lambda yang ingin Anda jalankan saat acara yang dipilih terjadi. Ini adalah nilai yang Anda salin dari konsol Lambda.

1. Pilih **Sertakan** isi jika Anda ingin mengakses badan permintaan dalam fungsi Anda.

   Jika Anda hanya ingin mengganti badan permintaan, Anda tidak perlu memilih opsi ini.

1. Untuk menjalankan fungsi yang sama untuk lebih banyak jenis acara, ulangi langkah 6 dan 7.

1. Pilih **Simpan perubahan**.

1. Untuk menambahkan pemicu ke lebih banyak perilaku cache untuk distribusi ini, ulangi langkah 5 hingga 10.

   Fungsi mulai memproses permintaan untuk CloudFront peristiwa yang ditentukan saat CloudFront distribusi yang diperbarui diterapkan. Untuk menentukan apakah distribusi diterapkan, pilih **Distribusi** dalam panel navigasi. Saat distribusi diterapkan, nilai kolom **Status** untuk distribusi berubah dari **Deploying ke waktu dan tanggal penerapan**.

------

# Uji dan debug fungsi Lambda @Edge
<a name="lambda-edge-testing-debugging"></a>

Penting untuk menguji kode fungsi Lambda @Edge Anda secara mandiri, untuk memastikan bahwa itu menyelesaikan tugas yang dimaksudkan, dan untuk melakukan pengujian integrasi, untuk memastikan bahwa fungsi berfungsi dengan benar. CloudFront 

Selama pengujian integrasi atau setelah fungsi Anda di-deploy, Anda mungkin perlu men-debug CloudFront kesalahan, seperti kesalahan HTTP 5xx. Kesalahan dapat menjadi respons tidak valid yang dikembalikan dari fungsi Lambda, kesalahan eksekusi saat fungsi dipicu, atau kesalahan akibat perotasian eksekusi oleh layanan Lambda. Bagian-bagian dalam topik ini membagikan strategi untuk menentukan jenis kegagalan mana yang menjadi masalahnya, kemudian langkah-langkah yang dapat Anda ambil untuk memperbaiki masalah.

**catatan**  
Saat Anda meninjau file CloudWatch log atau metrik saat Anda memecahkan masalah kesalahan, ketahuilah bahwa kesalahan tersebut ditampilkan atau disimpan di lokasi Wilayah AWS terdekat dengan lokasi di mana fungsi dijalankan. Jadi, jika Anda memiliki situs web atau aplikasi web dengan pengguna di Britania Raya, dan Anda memiliki fungsi Lambda yang terkait dengan distribusi Anda, misalnya, Anda harus mengubah Wilayah untuk CloudWatch melihat metrik atau file log untuk London. Wilayah AWS Untuk informasi selengkapnya, lihat [Tentukan Wilayah Lambda @Edge](#lambda-edge-testing-debugging-determine-region).

**Topics**
+ [Uji fungsi Lambda @Edge Anda](#lambda-edge-testing-debugging-test-function)
+ [Identifikasi kesalahan fungsi Lambda @Edge di CloudFront](#lambda-edge-identifying-function-errors)
+ [Memecahkan masalah respons fungsi Lambda @Edge yang tidak valid (kesalahan validasi)](#lambda-edge-testing-debugging-troubleshooting-invalid-responses)
+ [Memecahkan masalah kesalahan eksekusi fungsi Lambda @Edge](#lambda-edge-testing-debugging-execution-errors)
+ [Tentukan Wilayah Lambda @Edge](#lambda-edge-testing-debugging-determine-region)
+ [Tentukan apakah akun Anda mendorong log ke CloudWatch](#lambda-edge-testing-debugging-cloudwatch-logs-enabled)

## Uji fungsi Lambda @Edge Anda
<a name="lambda-edge-testing-debugging-test-function"></a>

Terdapat dua langkah untuk menguji fungsi Lambda Anda: pengujian mandiri dan pengujian integrasi.

**Uji fungsionalitas mandiri**  
Sebelum Anda menambahkan fungsi Lambda CloudFront, pastikan untuk menguji fungsionalitas terlebih dahulu dengan menggunakan kemampuan pengujian di konsol Lambda atau dengan menggunakan metode lain. *Untuk informasi selengkapnya tentang pengujian di konsol Lambda, lihat [Memanggil fungsi Lambda menggunakan konsol di Panduan Pengembang](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html#get-started-invoke-manually).AWS Lambda *

**Uji operasi fungsi Anda di CloudFront**  
Penting untuk menyelesaikan pengujian integrasi, di mana fungsi Anda dikaitkan dengan distribusi dan berjalan berdasarkan CloudFront peristiwa. Pastikan bahwa fungsi dipicu untuk acara yang tepat, dan mengembalikan respons yang valid dan benar untuk CloudFront. Misalnya, pastikan bahwa struktur acara sudah benar, bahwa hanya header yang valid yang disertakan, dan sebagainya.  
Saat Anda mengulangi pengujian integrasi dengan fungsi Anda di konsol Lambda, lihat langkah-langkah dalam tutorial Lambda @Edge saat Anda memodifikasi kode atau mengubah CloudFront pemicu yang memanggil fungsi Anda. Misalnya, pastikan bahwa Anda bekerja dalam versi bernomor dari fungsi Anda, seperti yang dijelaskan dalam langkah tutorial ini: [Langkah 4: Tambahkan CloudFront pemicu untuk menjalankan fungsi](lambda-edge-how-it-works-tutorial.md#lambda-edge-how-it-works-tutorial-add-trigger).   
Saat Anda membuat perubahan dan menerapkannya, ketahuilah bahwa fungsi dan CloudFront pemicu Anda yang diperbarui akan memakan waktu beberapa menit untuk mereplikasi di semua Wilayah. Ini biasanya memerlukan waktu beberapa menit, tetapi dapat memakan waktu hingga 15 menit.  
Anda dapat memeriksa untuk melihat apakah replikasi selesai dengan pergi ke CloudFront konsol dan melihat distribusi Anda.  

**Untuk memeriksa apakah replikasi Anda telah selesai digunakan**

1. Buka CloudFront konsol di[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Pilih nama distribusi.

1. Periksa status distribusi yang akan diubah dari **Sedang Berlangsung** kembali ke **Diterapkan**, yang berarti fungsi Anda telah direplikasi. Kemudian ikuti langkah-langkah di bagian berikutnya untuk memverifikasi bahwa fungsi berfungsi.
Ketahuilah bahwa pengujian di konsol hanya memvalidasi logika fungsi Anda, dan tidak menerapkan kuota layanan apa pun (sebelumnya dikenal sebagai batas) yang khusus untuk Lambda @Edge.

## Identifikasi kesalahan fungsi Lambda @Edge di CloudFront
<a name="lambda-edge-identifying-function-errors"></a>

Setelah Anda memverifikasi bahwa logika fungsi Anda berfungsi dengan benar, Anda mungkin masih melihat kesalahan HTTP 5xx saat fungsi Anda berjalan. CloudFront Kesalahan HTTP 5xx dapat dikembalikan karena berbagai alasan, yang dapat mencakup kesalahan fungsi Lambda atau masalah lain di dalamnya. CloudFront
+ Jika Anda menggunakan fungsi Lambda @Edge, Anda dapat menggunakan grafik di CloudFront konsol untuk membantu melacak penyebab kesalahan, lalu bekerja untuk memperbaikinya. Misalnya, Anda dapat melihat apakah kesalahan HTTP 5xx disebabkan oleh CloudFront atau oleh fungsi Lambda, dan kemudian, untuk fungsi tertentu, Anda dapat melihat file log terkait untuk menyelidiki masalah tersebut.
+ Untuk memecahkan masalah kesalahan HTTP secara umum di CloudFront, lihat langkah-langkah pemecahan masalah dalam topik berikut:. [Memecahkan masalah kode status respons kesalahan di CloudFront](troubleshooting-response-errors.md)

### Apa yang menyebabkan kesalahan fungsi Lambda @Edge di CloudFront
<a name="lambda-edge-testing-debugging-function-errors"></a>

Ada beberapa alasan mengapa fungsi Lambda dapat menyebabkan kesalahan HTTP 5xx, dan langkah-langkah pemecahan masalah yang harus Anda ambil bergantung pada jenis kesalahan. Kesalahan dapat dikategorikan sebagai berikut:

**Kesalahan eksekusi fungsi Lambda**  
Kesalahan eksekusi terjadi ketika CloudFront tidak mendapatkan respons dari Lambda karena ada pengecualian yang tidak tertangani dalam fungsi atau ada kesalahan dalam kode. Misalnya, jika kode menyertakan callback(Kesalahan).

**Respons fungsi Lambda yang tidak valid dikembalikan ke CloudFront**  
Setelah fungsi berjalan, CloudFront menerima respons dari Lambda. Kesalahan dikembalikan jika struktur objek tanggapan tidak sesuai dengan [Struktur acara Lambda @Edge](lambda-event-structure.md), atau respons berisi header yang tidak valid atau kolom tidak valid lainnya.

**Eksekusi di CloudFront dibatasi karena kuota layanan Lambda (sebelumnya dikenal sebagai batas)**  
Eksekusi throttle layanan Lambda di setiap Wilayah, dan menghasilkan kesalahan jika Anda melebihi kuota. Untuk informasi selengkapnya, lihat [Kuotas di Lambda@Edge](cloudfront-limits.md#limits-lambda-at-edge).

### Cara menentukan jenis kegagalan
<a name="lambda-edge-testing-debugging-failure-type"></a>

Untuk membantu Anda memutuskan di mana harus fokus saat Anda men-debug dan bekerja untuk menyelesaikan kesalahan yang dikembalikan oleh CloudFront, akan sangat membantu untuk mengidentifikasi CloudFront mengapa mengembalikan kesalahan HTTP. Untuk memulai, Anda dapat menggunakan grafik yang disediakan di bagian **Pemantauan** CloudFront konsol di Konsol Manajemen AWS. Untuk informasi selengkapnya tentang melihat grafik di bagian **Pemantauan** CloudFront konsol, lihat[Pantau CloudFront metrik dengan Amazon CloudWatch](monitoring-using-cloudwatch.md).

Grafik berikut akan sangat membantu ketika Anda ingin melacak apakah kesalahan dikembalikan oleh asal atau fungsi Lambda, dan untuk mempersempit jenis masalah ketika itu adalah kesalahan dari fungsi Lambda.

**Grafik harga kesalahan**  
Salah satu grafik yang dapat Anda lihat pada **Ikhtisar** untuk setiap distribusi Anda adalah **Tingkat kesalahan** grafik. Grafik ini menampilkan tingkat kesalahan sebagai persentase dari total permintaan yang datang ke distribusi Anda. Grafik menunjukkan tingkat kesalahan total, total 4xx kesalahan, total 5xx kesalahan, dan total 5xx kesalahan dari fungsi Lambda. Berdasarkan jenis dan volume kesalahan, Anda dapat mengambil langkah untuk menyelidiki dan memecahkan masalah penyebab.  

![\[Grafik tingkat kesalahan untuk CloudFront distribusi\]](http://docs.aws.amazon.com/id_id/AmazonCloudFront/latest/DeveloperGuide/images/Distribution-error-rate-pct-full.png)

+ Jika Anda melihat kesalahan Lambda, Anda dapat menyelidiki lebih lanjut dengan melihat jenis kesalahan tertentu yang dikembalikan oleh fungsi tersebut. **Kesalahan Lambda@Edge** tab menyertakan grafik yang mengategorikan kesalahan fungsi berdasarkan jenis untuk membantu Anda menemukan masalah dari fungsi tertentu.
+ Jika Anda melihat CloudFront kesalahan, Anda dapat memecahkan masalah dan bekerja untuk memperbaiki kesalahan asal atau mengubah konfigurasi Anda CloudFront . Untuk informasi selengkapnya, lihat [Memecahkan masalah kode status respons kesalahan di CloudFront](troubleshooting-response-errors.md).

**Grafik kesalahan pelaksanaan dan respons fungsi tidak valid**  
**Kesalahan Lambda@Edge** tab mencakup grafik yang mengkategorikan kesalahan Lambda@Edge untuk distribusi tertentu, berdasarkan jenis. Misalnya, satu grafik menunjukkan semua kesalahan eksekusi oleh Wilayah AWS.  
Untuk mempermudah pemecahan masalah, Anda dapat mencari masalah tertentu dengan membuka dan memeriksa file log untuk fungsi tertentu berdasarkan Wilayah.   

**Untuk melihat file log untuk fungsi tertentu menurut Wilayah**

1. **Pada tab **kesalahan Lambda @Edge**, di bawah **fungsi Lambda @Edge** Terkait, pilih nama fungsi, lalu pilih Lihat metrik.** 

1. Selanjutnya, pada halaman dengan nama fungsi Anda, di sudut kanan atas, pilih **Lihat log fungsi**, lalu pilih Wilayah. 

   Misalnya, jika Anda melihat masalah dalam grafik **Kesalahan** untuk Wilayah AS Barat (Oregon), pilih Wilayah itu dari daftar tarik-turun. Ini membuka CloudWatch konsol Amazon.

1. Di CloudWatch konsol untuk Wilayah itu, di bawah **Aliran log**, pilih aliran log untuk melihat peristiwa fungsi tersebut.
Selain itu, baca bagian berikut dalam bab ini untuk rekomendasi lebih lanjut tentang pemecahan masalah dan memperbaiki kesalahan.

**Grafik trotel**  
**Kesalahan Lambda@Edge** juga mencakup **Trotel** grafik. Terkadang, layanan Lambda merombak invokasi fungsi Anda dengan basis per Wilayah, jika Anda mencapai kuota konkurensi regional (sebelumnya disebut batas). Jika Anda melihat kesalahan yang melebihi, fungsi Anda telah mencapai kuota yang dikenakan layanan Lambda pada eksekusi di Wilayah. Untuk informasi lebih lanjut, termasuk cara meminta peningkatan kuota, lihat [Kuotas di Lambda@Edge](cloudfront-limits.md#limits-lambda-at-edge).  

![\[Grafik throttle untuk eksekusi fungsi Lambda @Edge.\]](http://docs.aws.amazon.com/id_id/AmazonCloudFront/latest/DeveloperGuide/images/Lambda-throttles-page.png)


Sebagai contoh tentang cara menggunakan informasi ini dalam mengatasi masalah kesalahan HTTP, lihat [Empat langkah untuk melakukan debug pengiriman konten Anda di AWS](https://aws.amazon.com/blogs/networking-and-content-delivery/four-steps-for-debugging-your-content-delivery-on-aws/).

## Memecahkan masalah respons fungsi Lambda @Edge yang tidak valid (kesalahan validasi)
<a name="lambda-edge-testing-debugging-troubleshooting-invalid-responses"></a>

Jika Anda mengidentifikasi bahwa masalah Anda adalah kesalahan validasi Lambda, itu berarti fungsi Lambda Anda mengembalikan respons yang tidak valid. CloudFront Ikuti panduan di bagian ini untuk mengambil langkah-langkah untuk meninjau fungsi Anda dan memastikan bahwa respons Anda sesuai dengan CloudFront persyaratan. 

CloudFront memvalidasi respons dari fungsi Lambda dengan dua cara:
+ **Respon Lambda harus sesuai dengan struktur objek yang diperlukan.** Contoh struktur objek yang buruk mencakup hal berikut: JSON yang tidak dapat dipisahkan, kolom wajib yang hilang, dan objek tidak valid dalam respons. Untuk informasi lebih lanjut, lihat [Struktur acara Lambda @Edge](lambda-event-structure.md).
+ **Respons harus menyertakan hanya nilai objek yang valid.** Kesalahan akan terjadi jika respons mencakup objek valid tetapi memiliki nilai yang tidak didukung. Contohnya meliputi yang berikut ini: menambahkan atau memperbarui header yang masuk daftar tidak diizinkan atau hanya baca (lihat [Pembatasan pada fungsi edge](edge-functions-restrictions.md)), melebihi ukuran izi maksimum (lihat dalam *Pembatasan Ukuran Respons yang Dihasilkan* dalam topic [Kesalahan](lambda-generating-http-responses.md#lambda-generating-http-responses-errors) Lambda@Edge) dan karakter atau nilai tidak valid (lihat [Struktur acara Lambda @Edge](lambda-event-structure.md)).

Ketika Lambda mengembalikan respons yang tidak valid CloudFront, pesan kesalahan ditulis ke file log yang CloudFront mendorong ke CloudWatch Wilayah tempat fungsi Lambda dijalankan. Ini adalah perilaku default untuk mengirim file log CloudWatch ketika ada respons yang tidak valid. Namun, jika Anda mengaitkan fungsi Lambda CloudFront sebelum fungsionalitas dirilis, fungsi tersebut mungkin tidak diaktifkan untuk fungsi Anda. Untuk informasi lebih lanjut, lihat *Tentukan apakah Akun Anda Mendorong Log ke CloudWatch* nanti dalam topik.

CloudFront mendorong file log ke Wilayah yang sesuai dengan tempat fungsi Anda dijalankan, di grup log yang terkait dengan distribusi Anda. Grup log memiliki format berikut:`/aws/cloudfront/LambdaEdge/DistributionId`, di *DistributionId* mana ID distribusi Anda. Untuk menentukan Wilayah tempat Anda dapat menemukan file CloudWatch log, lihat *Menentukan Wilayah Lambda @Edge* nanti dalam topik ini.

Jika kesalahan dapat direproduksi, Anda dapat membuat permintaan baru yang menghasilkan kesalahan dan kemudian menemukan id permintaan dalam CloudFront respons gagal (`X-Amz-Cf-Id`header) untuk menemukan satu kegagalan dalam file log. Entri file log mencakup informasi yang dapat membantu Anda mengidentifikasi mengapa kesalahan dikembalikan, dan juga mencantumkan id permintaan Lambda yang sesuai sehingga Anda dapat menganalisis akar masalah dalam konteks permintaan tunggal.

Jika kesalahan terputus-putus, Anda dapat menggunakan log CloudFront akses untuk menemukan id permintaan untuk permintaan yang gagal, dan kemudian mencari CloudWatch log untuk pesan kesalahan yang sesuai. Untuk informasi lebih lanjut, lihat bagian sebelumnya, *Menentukan Jenis Kegagalan*.

## Memecahkan masalah kesalahan eksekusi fungsi Lambda @Edge
<a name="lambda-edge-testing-debugging-execution-errors"></a>

Jika masalahnya adalah kesalahan eksekusi Lambda, akan sangat membantu untuk membuat pernyataan logging untuk fungsi Lambda, untuk menulis pesan ke file CloudWatch log yang memantau eksekusi fungsi Anda CloudFront dan menentukan apakah berfungsi seperti yang diharapkan. Kemudian Anda dapat mencari pernyataan tersebut di file CloudWatch log untuk memverifikasi bahwa fungsi Anda berfungsi.

**catatan**  
Bahkan jika Anda belum mengubah fungsi Lambda@Edge Anda, pembaruan pada lingkungan pelaksanaan fungsi Lambda dapat memengaruhinya dan dapat mengembalikan kesalahan pelaksanaan. Untuk informasi tentang pengujian dan migrasi ke versi yang lebih baru, lihat [Pembaruan mendatang untuk lingkungan eksekusi AWS Lambda dan AWS Lambda @Edge](https://aws.amazon.com/blogs/compute/upcoming-updates-to-the-aws-lambda-execution-environment/).

## Tentukan Wilayah Lambda @Edge
<a name="lambda-edge-testing-debugging-determine-region"></a>

Untuk melihat Wilayah tempat fungsi Lambda @Edge Anda menerima lalu lintas, lihat metrik untuk fungsi di CloudFront konsol di. Konsol Manajemen AWS Metrik ditampilkan untuk setiap AWS Wilayah. Di halaman yang sama, Anda dapat memilih Wilayah dan melihat file log untuk Wilayah tersebut sehingga Anda dapat menyelidiki masalah. Anda harus meninjau file CloudWatch log di AWS Wilayah yang benar untuk melihat file log yang dibuat saat CloudFront menjalankan fungsi Lambda Anda.

Untuk informasi selengkapnya tentang melihat grafik di bagian **Pemantauan** CloudFront konsol, lihat[Pantau CloudFront metrik dengan Amazon CloudWatch](monitoring-using-cloudwatch.md).

## Tentukan apakah akun Anda mendorong log ke CloudWatch
<a name="lambda-edge-testing-debugging-cloudwatch-logs-enabled"></a>

Secara default, CloudFront memungkinkan pencatatan respons fungsi Lambda yang tidak valid, dan mendorong file log ke CloudWatch dengan menggunakan salah satu file. [Peran terkait layanan untuk Lambda @Edge](lambda-edge-permissions.md#using-service-linked-roles-lambda-edge) Jika Anda memiliki fungsi Lambda @Edge yang Anda tambahkan CloudFront sebelum fitur log respons fungsi Lambda yang tidak valid dirilis, logging diaktifkan saat Anda memperbarui konfigurasi Lambda @Edge Anda, misalnya, dengan menambahkan pemicu. CloudFront 

Anda dapat memverifikasi bahwa mendorong file log ke CloudWatch diaktifkan untuk akun Anda dengan melakukan hal berikut:
+ **Periksa untuk melihat apakah log muncul CloudWatch** — Pastikan Anda melihat di Wilayah tempat fungsi Lambda @Edge dijalankan. Untuk informasi selengkapnya, lihat [Tentukan Wilayah Lambda @Edge](#lambda-edge-testing-debugging-determine-region).
+ **Tentukan apakah peran terkait layanan terkait ada di akun Anda di IAM —** Anda harus memiliki peran `AWSServiceRoleForCloudFrontLogger` IAM di akun Anda. Untuk informasi selengkapnya tentang peran ini, silakan lihat [Peran terkait layanan untuk Lambda @Edge](lambda-edge-permissions.md#using-service-linked-roles-lambda-edge).

# Hapus fungsi dan replika Lambda @Edge
<a name="lambda-edge-delete-replicas"></a>

Anda dapat menghapus fungsi Lambda @Edge hanya ketika replika fungsi telah dihapus oleh. CloudFront Replika fungsi Lambda secara otomatis dihapus dalam situasi berikut:
+ Setelah Anda menghapus kaitan terakhir untuk fungsi dari semua CloudFront distribusi. Jika lebih dari satu distribusi menggunakan fungsi, replika akan dihapus hanya setelah Anda menghapus asosiasi fungsi dari distribusi terakhir.
+ Setelah Anda menghapus distribusi terakhir yang terkait dengan fungsi tersebut.

Replika biasanya dihapus dalam beberapa jam. Anda tidak dapat menghapus replika fungsi Lambda@Edge secara manual. Ini membantu mencegah situasi di mana replika dihapus yang masih digunakan, yang akan mengakibatkan kesalahan.

**Awas**  
Jangan membuat aplikasi yang menggunakan replika fungsi Lambda @Edge di luar. CloudFront Replika ini dihapus saat asosiasi mereka dengan distribusi dihapus, atau saat distribusi itu sendiri dihapus. Replika yang aplikasi luarnya mungkin akan dihapus tanpa peringatan, sehingga menyebabkannya gagal.

**Untuk menghapus asosiasi fungsi Lambda @Edge dari distribusi CloudFront**

1. Masuk ke Konsol Manajemen AWS dan buka CloudFront konsol di[https://console.aws.amazon.com/cloudfront/v4/home](https://console.aws.amazon.com/cloudfront/v4/home).

1. Pilih ID distribusi dengan asosiasi fungsi Lambda @Edge yang ingin Anda hapus.

1. Pilih **Perilaku** tab.

1. **Pilih perilaku cache yang memiliki asosiasi fungsi Lambda @Edge yang ingin Anda hapus, lalu pilih Edit.**

1. Di bawah **Asosiasi fungsi**, **Jenis fungsi**, pilih **Tidak ada asosiasi** untuk menghapus asosiasi fungsi Lambda @Edge.

1. Pilih **Simpan perubahan**.

Setelah menghapus asosiasi fungsi Lambda @Edge dari CloudFront distribusi, Anda dapat menghapus fungsi Lambda atau versi fungsi dari. AWS Lambda Tunggu beberapa jam setelah menghapus asosiasi fungsi sehingga replika fungsi Lambda @Edge dapat dibersihkan. Setelah itu, Anda dapat menghapus fungsi dengan menggunakan konsol Lambda,, AWS CLI Lambda API, atau SDK. AWS 

Anda juga dapat menghapus *versi* tertentu dari fungsi Lambda jika versi tersebut tidak memiliki CloudFront distribusi yang terkait dengannya. Setelah menghapus semua asosiasi untuk versi fungsi Lambda, tunggu beberapa jam. Kemudian Anda dapat menghapus versi fungsi.

# Struktur acara Lambda @Edge
<a name="lambda-event-structure"></a>

Topik berikut menjelaskan objek peristiwa permintaan dan respons yang CloudFront diteruskan ke fungsi Lambda @Edge saat dipicu.

**Topics**
+ [Pemilihan asal dinamis](#lambda-event-content-based-routing)
+ [Permintaan acara](#lambda-event-structure-request)
+ [Peristiwa respon](#lambda-event-structure-response)

## Pemilihan asal dinamis
<a name="lambda-event-content-based-routing"></a>

Anda dapat menggunakan [pola jalur dalam perilaku cache](DownloadDistValuesCacheBehavior.md#DownloadDistValuesPathPattern) untuk merutekan permintaan ke asal berdasarkan jalur dan nama objek yang diminta, seperti `images/*.jpg`. Menggunakan Lambda@Edge, Anda juga dapat merutekan permintaan ke asal berdasarkan karakteristik lain, seperti nilai-nilai dalam header permintaan. 

Ada sejumlah cara agar pemilihan asal dinamis ini dapat berguna. Misalnya, Anda dapat mendistribusikan permintaan lintas asal-usul di area geografis yang berbeda untuk membantu menyeimbangkan beban global. Atau Anda dapat secara selektif merutekan permintaan ke asal-usul berbeda yang masing-masing melayani fungsi tertentu: penanganan bot, optimalisasi SEO, autentikasi, dan sebagainya. Untuk contoh kode yang mendemonstrasikan cara menggunakan fitur ini, lihat [Pemilihan asal dinamis berbasis konten - contoh](lambda-examples.md#lambda-examples-content-based-routing-examples).

Dalam peristiwa permintaan CloudFront asal, `origin` objek dalam struktur peristiwa berisi informasi tentang asal yang akan diarahkan ke permintaan, berdasarkan pola jalur. Anda dapat memperbarui nilai di `origin` mengajukan keberatan untuk mengirimkan permintaan ke negara asal yang berbeda. Saat Anda memperbarui `origin` objek, Anda tidak perlu menentukan asal dalam distribusi. Anda juga dapat mengganti objek asal Amazon S3 dengan objek asal kustom, dan sebaliknya. Namun, Anda hanya dapat menentukan asal tunggal per permintaan; asal kustom atau asal Amazon S3, tetapi tidak keduanya.

## Permintaan acara
<a name="lambda-event-structure-request"></a>

Topik berikut menunjukkan struktur objek yang CloudFront diteruskan ke fungsi Lambda untuk acara [permintaan penampil dan asal](lambda-cloudfront-trigger-events.md). Contoh-contoh ini menunjukkan `GET` tanpa isi. Berikut ini contoh adalah daftar semua bidang yang mungkin muncul dalam peristiwa permintaan penampil dan asal.

**Topics**
+ [Contoh permintaan penampil](#example-viewer-request)
+ [Contoh permintaan asal](#example-origin-request)
+ [Permintaan bidang acara](#request-event-fields)

### Contoh permintaan penampil
<a name="example-viewer-request"></a>

Contoh berikut menunjukkan objek acara permintaan penampil.

```
{
  "Records": [
    {
      "cf": {
        "config": {
          "distributionDomainName": "d111111abcdef8.cloudfront.net",
          "distributionId": "EDFDVBD6EXAMPLE",
          "eventType": "viewer-request",
          "requestId": "4TyzHTaYWb1GX1qTfsHhEqV6HUDd_BzoBZnwfnvQc_1oF26ClkoUSEQ=="
        },
        "request": {
          "clientIp": "203.0.113.178",
          "headers": {
            "host": [
              {
                "key": "Host",
                "value": "d111111abcdef8.cloudfront.net"
              }
            ],
            "user-agent": [
              {
                "key": "User-Agent",
                "value": "curl/7.66.0"
              }
            ],
            "accept": [
              {
                "key": "accept",
                "value": "*/*"
              }
            ]
          },
          "method": "GET",
          "querystring": "",
          "uri": "/"
        }
      }
    }
  ]
}
```

### Contoh permintaan asal
<a name="example-origin-request"></a>

Contoh berikut menunjukkan objek peristiwa permintaan asal usul.

```
{
  "Records": [
    {
      "cf": {
        "config": {
          "distributionDomainName": "d111111abcdef8.cloudfront.net",
          "distributionId": "EDFDVBD6EXAMPLE",
          "eventType": "origin-request",
          "requestId": "4TyzHTaYWb1GX1qTfsHhEqV6HUDd_BzoBZnwfnvQc_1oF26ClkoUSEQ=="
        },
        "request": {
          "clientIp": "203.0.113.178",
          "headers": {
            "x-forwarded-for": [
              {
                "key": "X-Forwarded-For",
                "value": "203.0.113.178"
              }
            ],
            "user-agent": [
              {
                "key": "User-Agent",
                "value": "Amazon CloudFront"
              }
            ],
            "via": [
              {
                "key": "Via",
                "value": "2.0 2afae0d44e2540f472c0635ab62c232b.cloudfront.net (CloudFront)"
              }
            ],
            "host": [
              {
                "key": "Host",
                "value": "example.org"
              }
            ],
            "cache-control": [
              {
                "key": "Cache-Control",
                "value": "no-cache"
              }
            ]
          },
          "method": "GET",
          "origin": {
            "custom": {
              "customHeaders": {},
              "domainName": "example.org",
              "keepaliveTimeout": 5,
              "path": "",
              "port": 443,
              "protocol": "https",
              "readTimeout": 30,
              "responseCompletionTimeout": 30,
              "sslProtocols": [
                "TLSv1",
                "TLSv1.1",
                "TLSv1.2"
              ]
            }
          },
          "querystring": "",
          "uri": "/"
        }
      }
    }
  ]
}
```

### Permintaan bidang acara
<a name="request-event-fields"></a>

Meminta data objek peristiwa dimuat dalam dua subobjek: `config` (`Records.cf.config`) and `request` (`Records.cf.request`). Daftar berikut menjelaskan setiap bidang subobject.

#### Bidang di objek konfigurasi
<a name="request-event-fields-config"></a>

Daftar berikut menjelaskan bidang dalam `config` objek (`Records.cf.config`).

**`distributionDomainName` (hanya baca)**  
Nama domain distribusi yang terkait dengan permintaan.

**`distributionID` (hanya baca)**  
ID distribusi yang terkait dengan permintaan.

**`eventType` (hanya baca)**  
Jenis pemicu yang terkait dengan permintaan: `viewer-request` atau`origin-request`.

**`requestId` (hanya baca)**  
String terenkripsi yang secara unik mengidentifikasi permintaan. viewer-to-CloudFront `requestId`Nilai juga muncul di log CloudFront akses sebagai`x-edge-request-id`. Untuk informasi selengkapnya, lihat [Akses log (log standar)](AccessLogs.md) dan [Bidang file log](standard-logs-reference.md#BasicDistributionFileFormat).

#### Bidang di objek permintaan
<a name="request-event-fields-request"></a>

Daftar berikut menjelaskan bidang dalam `request` objek (`Records.cf.request`).

**`clientIp` (hanya baca)**  
Alamat IP penampil yang membuat permintaan. Jika penampil menggunakan proksi HTTP atau penyeimbang beban untuk mengirim permintaan, nilainya adalah alamat IP proksi atau pengimbang beban.

**header (baca/tulis)**  
Header pada permintaan. Perhatikan hal-hal berikut:  
+ Kunci dalam `headers` objek adalah versi huruf kecil nama header HTTP standar. Menggunakan tombol huruf kecil memberi Anda akses huruf kecil ke nilai header.
+ Setiap objek header (misalnya, `headers["accept"]` atau `headers["host"]`) adalah serangkaian pasangan utama-nilai. Untuk header tertentu, larik berisi satu pasangan nilai kunci untuk setiap nilai dalam permintaan.
+ `key`berisi nama case-sensitive dari header seperti yang muncul dalam permintaan HTTP; misalnya,,, `Host``User-Agent`, `X-Forwarded-For``Cookie`, dan sebagainya.
+ `value` berisi nilai header sebagaimana muncul dalam permintaan HTTP.
+ Ketika fungsi Lambda Anda menambahkan atau memodifikasi header permintaan dan Anda tidak menyertakan bidang header`key`, Lambda @Edge secara otomatis menyisipkan header `key` menggunakan nama header yang Anda berikan. Terlepas dari bagaimana Anda telah memformat nama header, kunci header yang dimasukkan secara otomatis diformat dengan kapitalisasi awal untuk setiap bagian, dipisahkan oleh tanda hubung (-).

  Misalnya, Anda dapat menambahkan header seperti berikut, tanpa header `key`:

  ```
  "user-agent": [
    {
      "value": "ExampleCustomUserAgent/1.X.0"
    }
  ]
  ```

  Dalam contoh ini, Lambda@Edge secara otomatis memasukkan `"key": "User-Agent"`.
Untuk informasi tentang pembatasan penggunaan header, lihat [Pembatasan pada fungsi edge](edge-functions-restrictions.md).

**`method` (hanya baca)**  
Metode HTTP permintaan.

**`querystring` (baca/tulis)**  
String kueri, jika ada, dalam permintaan. Jika permintaan tidak menyertakan string kueri, objek acara masih menyertakan `querystring` dengan nilai kosong. Untuk informasi selengkapnya tentang string kueri, lihat [Konten cache berdasarkan parameter string kueri](QueryStringParameters.md).

**`uri` (baca/tulis)**  
Jalur relatif objek yang diminta. Jika fungsi Lambda Anda memodifikasi `uri` perhatikan hal-hal berikut:  
+ `uri` nilai harus dimulai dengan garis miring ke depan (/).
+ Saat fungsi mengubah `uri` yang mengubah objek yang diminta oleh penampil.
+ Ketika fungsi mengubah `uri` nilai, *itu tidak* mengubah perilaku cache untuk permintaan atau asal permintaan yang dikirim.

**`body` (baca/tulis)**  
Isi permintaan HTTP. `body` struktur dapat memuat kolom berikut:    
**`inputTruncated` (hanya baca)**  
Bendera Boolean yang menunjukkan apakah tubuh dijejali Lambda@Edge. Untuk informasi selengkapnya, lihat [Pembatasan pada isi permintaan dengan opsi sertakan isi](lambda-at-edge-function-restrictions.md#lambda-at-edge-restrictions-request-body).  
**`action` (baca/tulis)**  
Tindakan yang ingin Anda lakukan dengan tubuh. Opsi untuk `action` adalah sebagai berikut:  
+ `read-only:` Ini adalah pengaturan default. Saat mengembalikan respons dari fungsi Lambda, jika `action` adalah hanya baca, Lambda@Edge mengabaikan setiap perubahan pada `encoding` atau `data`.
+ `replace:` Tentukan ini saat Anda ingin mengganti tubuh yang dikirim ke asal.  
**`encoding` (baca/tulis)**  
Pengodean untuk tubuh. Saat Lambda@Edge mengekspos tubuh ke fungsi Lambda, pertama-tama tubuh berubah menjadi base64-encoding. Jika Anda memilih `replace` untuk `action` untuk mengganti tubuh, Anda dapat memilih untuk menggunakan pengodean `base64` (default) atau `text`. Jika Anda menentukan `encoding` sebagai `base64` tetapi tubuh tidak validbase64, CloudFront mengembalikan kesalahan.  
**`data` (baca/tulis)**  
Isi konten permintaan. 

**`origin` (baca/tulis) (hanya peristiwa awal)**  
Asal pengiriman permintaan ke. `origin`Struktur harus berisi *tepat satu asal*, yang dapat berupa asal khusus atau asal Amazon S3.  
Bergantung pada jenis asal yang Anda tentukan (asal kustom atau Amazon S3), Anda harus menentukan bidang berikut dalam permintaan Anda:    
**`customHeaders` (baca/tulis) (kustom dan berasal dari Amazon S3)**  
(Opsional) Anda dapat menyertakan header khusus dengan permintaan dengan menentukan nama header dan pasangan nilai untuk setiap header kustom. Anda tidak dapat menambahkan header yang tidak diizinkan, dan header dengan nama yang sama tidak dapat hadir. `Records.cf.request.headers` [Catatan tentang header permintaan](#request-event-fields-request-headers) juga berlaku untuk header kustom. Untuk informasi lebih lanjut, lihat [Header khusus yang tidak CloudFront dapat ditambahkan ke permintaan asal](add-origin-custom-headers.md#add-origin-custom-headers-denylist) dan [Pembatasan pada fungsi edge](edge-functions-restrictions.md).  
**`domainName` (baca/tulis) (kustom dan berasal dari Amazon S3)**  
Nama domain asal. Nama domain tidak bisa kosong.  
+ **Untuk asal kustom** – Tentukan nama domain DNS, seperti `www.example.com`. Nama domain tidak dapat menyertakan titik dua (:), dan tidak bisa menjadi alamat IP. Nama domain dapat terdiri dari hingga 253 karakter.
+ **Untuk asal Amazon S3** – Tentukan nama domain DNS bucket Amazon S3, seperti `amzn-s3-demo-bucket.s3.eu-west-1.amazonaws.com`. Nama bisa sampai 128 karakter dan harus berupa huruf kecil.  
**`path` (baca/tulis) (kustom dan berasal dari Amazon S3)**  
Jalur direktori di tempat asal permintaan harus menemukan konten. Jalur harus dimulai dengan garis miring (/) tetapi tidak boleh diakhiri dengan satu (misalnya, seharusnya tidak diakhiri dengan`example-path/`). Hanya untuk asal kustom, alur harus dienkode URL dan memiliki panjang maksimum 255 karakter.  
**`keepaliveTimeout` (baca/tulis) (hanya asal sesuai undang-undang)**  
Berapa lama, dalam hitungan detik, yang CloudFront harus mencoba mempertahankan koneksi ke asal setelah menerima paket terakhir dari respons. Nilainya harus berupa angka dari 1-120, inklusif.  
**`port` (baca/tulis) (hanya asal sesuai undang-undang)**  
Port yang CloudFront harus terhubung ke asal kustom Anda. Port harus 80, 443, atau nomor dalam kisaran 1024–65535, termasuk.  
**`protocol` (baca/tulis) (hanya asal sesuai undang-undang)**  
Protokol koneksi yang CloudFront harus digunakan saat menghubungkan ke asal Anda. Nilai dapat berupa `http` atau `https`.  
**`readTimeout` (baca/tulis) (kustom dan berasal dari Amazon S3)**  
Berapa lama, dalam hitungan detik, CloudFront harus menunggu tanggapan setelah mengirim permintaan ke asal Anda. Ini juga menentukan berapa lama CloudFront harus menunggu setelah menerima paket tanggapan sebelum menerima paket berikutnya. Nilainya harus berupa angka dari 1-120, inklusif.  
Jika Anda membutuhkan kuota yang lebih tinggi, lihat [Batas waktu respons per asal](cloudfront-limits.md#limits-web-distributions).  
**`responseCompletionTimeout` (baca/tulis) (kustom dan berasal dari Amazon S3)**  
Waktu (dalam detik) permintaan dari CloudFront ke asal dapat tetap terbuka dan menunggu tanggapan. Jika respons lengkap tidak diterima dari asal saat ini, CloudFront akhiri koneksi.  
Nilai untuk `responseCompletionTimeout` harus sama dengan atau lebih besar dari nilai untuk`readTimeout`. Jika Anda menetapkan nilai ini ke 0, itu akan menghapus nilai sebelumnya yang Anda tetapkan dan kembali ke default. Anda juga dapat melakukannya dengan menghapus `responseCompletionTimeout` bidang dari permintaan acara.   
**`sslProtocols` (baca/tulis) (hanya asal sesuai undang-undang)**  
 SSL/TLS Protokol minimum yang CloudFront dapat digunakan saat membuat koneksi HTTPS dengan asal Anda. Nilai dapat berupa: `TLSv1.2`, `TLSv1.1`, `TLSv1`, atau `SSLv3`.  
**`authMethod` (baca/tulis) (hanya asal-usul Amazon S3)**  
Jika Anda menggunakan [identitas akses asal (OAI)](private-content-restricting-access-to-s3.md#private-content-restricting-access-to-s3-oai), setel bidang ini ke`origin-access-identity`. Jika Anda tidak menggunakan OAI, atur ke`none`. Jika Anda mengatur `authMethod` untuk `origin-access-identity`, ada beberapa persyaratan:   
+ Anda harus menentukan `region` (lihat bidang berikut).
+ Anda harus menggunakan OAI yang sama ketika Anda mengubah permintaan dari satu asal Amazon S3 ke yang lain.
+ Anda tidak dapat menggunakan OAI saat mengubah permintaan dari asal kustom ke asal Amazon S3.
Bidang ini tidak mendukung [kontrol akses asal (OAC)](private-content-restricting-access-to-s3.md).  
**`region` (baca/tulis) (hanya asal-usul Amazon S3)**  
 AWS Wilayah ember Amazon S3 Anda. Ini hanya diperlukan ketika Anda mengatur `authMethod` untuk `origin-access-identity`.

## Peristiwa respon
<a name="lambda-event-structure-response"></a>

Topik berikut menunjukkan struktur objek yang CloudFront diteruskan ke fungsi Lambda untuk [penampil dan peristiwa respons asal](lambda-cloudfront-trigger-events.md). Berikut ini contoh adalah daftar semua bidang yang mungkin muncul di penampil dan kejadian respons asal.

**Topics**
+ [Contoh respon asal](#lambda-event-structure-response-origin)
+ [Contoh respons penampil](#lambda-event-structure-response-viewer)
+ [Bidang acara respons](#response-event-fields)

### Contoh respon asal
<a name="lambda-event-structure-response-origin"></a>

Contoh berikut menunjukkan objek peristiwa respons asal usul.

```
{
  "Records": [
    {
      "cf": {
        "config": {
          "distributionDomainName": "d111111abcdef8.cloudfront.net",
          "distributionId": "EDFDVBD6EXAMPLE",
          "eventType": "origin-response",
          "requestId": "4TyzHTaYWb1GX1qTfsHhEqV6HUDd_BzoBZnwfnvQc_1oF26ClkoUSEQ=="
        },
        "request": {
          "clientIp": "203.0.113.178",
          "headers": {
            "x-forwarded-for": [
              {
                "key": "X-Forwarded-For",
                "value": "203.0.113.178"
              }
            ],
            "user-agent": [
              {
                "key": "User-Agent",
                "value": "Amazon CloudFront"
              }
            ],
            "via": [
              {
                "key": "Via",
                "value": "2.0 8f22423015641505b8c857a37450d6c0.cloudfront.net (CloudFront)"
              }
            ],
            "host": [
              {
                "key": "Host",
                "value": "example.org"
              }
            ],
            "cache-control": [
              {
                "key": "Cache-Control",
                "value": "no-cache"
              }
            ]
          },
          "method": "GET",
          "origin": {
            "custom": {
              "customHeaders": {},
              "domainName": "example.org",
              "keepaliveTimeout": 5,
              "path": "",
              "port": 443,
              "protocol": "https",
              "readTimeout": 30,
              "responseCompletionTimeout": 30,
              "sslProtocols": [
                "TLSv1",
                "TLSv1.1",
                "TLSv1.2"
              ]
            }
          },
          "querystring": "",
          "uri": "/"
        },
        "response": {
          "headers": {
            "access-control-allow-credentials": [
              {
                "key": "Access-Control-Allow-Credentials",
                "value": "true"
              }
            ],
            "access-control-allow-origin": [
              {
                "key": "Access-Control-Allow-Origin",
                "value": "*"
              }
            ],
            "date": [
              {
                "key": "Date",
                "value": "Mon, 13 Jan 2020 20:12:38 GMT"
              }
            ],
            "referrer-policy": [
              {
                "key": "Referrer-Policy",
                "value": "no-referrer-when-downgrade"
              }
            ],
            "server": [
              {
                "key": "Server",
                "value": "ExampleCustomOriginServer"
              }
            ],
            "x-content-type-options": [
              {
                "key": "X-Content-Type-Options",
                "value": "nosniff"
              }
            ],
            "x-frame-options": [
              {
                "key": "X-Frame-Options",
                "value": "DENY"
              }
            ],
            "x-xss-protection": [
              {
                "key": "X-XSS-Protection",
                "value": "1; mode=block"
              }
            ],
            "content-type": [
              {
                "key": "Content-Type",
                "value": "text/html; charset=utf-8"
              }
            ],
            "content-length": [
              {
                "key": "Content-Length",
                "value": "9593"
              }
            ]
          },
          "status": "200",
          "statusDescription": "OK"
        }
      }
    }
  ]
}
```

### Contoh respons penampil
<a name="lambda-event-structure-response-viewer"></a>

Contoh berikut menunjukkan objek acara respons penampil.

```
{
  "Records": [
    {
      "cf": {
        "config": {
          "distributionDomainName": "d111111abcdef8.cloudfront.net",
          "distributionId": "EDFDVBD6EXAMPLE",
          "eventType": "viewer-response",
          "requestId": "4TyzHTaYWb1GX1qTfsHhEqV6HUDd_BzoBZnwfnvQc_1oF26ClkoUSEQ=="
        },
        "request": {
          "clientIp": "203.0.113.178",
          "headers": {
            "host": [
              {
                "key": "Host",
                "value": "d111111abcdef8.cloudfront.net"
              }
            ],
            "user-agent": [
              {
                "key": "User-Agent",
                "value": "curl/7.66.0"
              }
            ],
            "accept": [
              {
                "key": "accept",
                "value": "*/*"
              }
            ]
          },
          "method": "GET",
          "querystring": "",
          "uri": "/"
        },
        "response": {
          "headers": {
            "access-control-allow-credentials": [
              {
                "key": "Access-Control-Allow-Credentials",
                "value": "true"
              }
            ],
            "access-control-allow-origin": [
              {
                "key": "Access-Control-Allow-Origin",
                "value": "*"
              }
            ],
            "date": [
              {
                "key": "Date",
                "value": "Mon, 13 Jan 2020 20:14:56 GMT"
              }
            ],
            "referrer-policy": [
              {
                "key": "Referrer-Policy",
                "value": "no-referrer-when-downgrade"
              }
            ],
            "server": [
              {
                "key": "Server",
                "value": "ExampleCustomOriginServer"
              }
            ],
            "x-content-type-options": [
              {
                "key": "X-Content-Type-Options",
                "value": "nosniff"
              }
            ],
            "x-frame-options": [
              {
                "key": "X-Frame-Options",
                "value": "DENY"
              }
            ],
            "x-xss-protection": [
              {
                "key": "X-XSS-Protection",
                "value": "1; mode=block"
              }
            ],
            "age": [
              {
                "key": "Age",
                "value": "2402"
              }
            ],
            "content-type": [
              {
                "key": "Content-Type",
                "value": "text/html; charset=utf-8"
              }
            ],
            "content-length": [
              {
                "key": "Content-Length",
                "value": "9593"
              }
            ]
          },
          "status": "200",
          "statusDescription": "OK"
        }
      }
    }
  ]
}
```

### Bidang acara respons
<a name="response-event-fields"></a>

Data objek peristiwa respons dimuat dalam tiga subobjek: `config` (`Records.cf.config`), `request` (`Records.cf.request`), dan `response` (`Records.cf.response`). Untuk informasi lebih lanjut tentang bidang di objek permintaan, lihat [Bidang di objek permintaan](#request-event-fields-request). Daftar berikut menjelaskan bidang dalam `config` dan `response` subobjects.

#### Bidang di objek konfigurasi
<a name="response-event-fields-config"></a>

Daftar berikut menjelaskan bidang dalam `config` objek (`Records.cf.config`).

**`distributionDomainName` (hanya baca)**  
Nama domain distribusi yang terkait dengan respons.

**`distributionID` (hanya baca)**  
ID distribusi yang terkait dengan respons.

**`eventType` (hanya baca)**  
Jenis pemicu yang terkait dengan respons: `origin-response` atau`viewer-response`.

**`requestId` (hanya baca)**  
String terenkripsi yang secara unik mengidentifikasi viewer-to-CloudFront permintaan yang terkait dengan respons ini. `requestId`Nilai juga muncul di log CloudFront akses sebagai`x-edge-request-id`. Untuk informasi selengkapnya, lihat [Akses log (log standar)](AccessLogs.md) dan [Bidang file log](standard-logs-reference.md#BasicDistributionFileFormat).

#### Bidang di objek respons
<a name="response-event-fields-response"></a>

Daftar berikut menjelaskan bidang dalam `response` objek (`Records.cf.response`). Untuk informasi tentang penggunaan fungsi Lambda@Edge untuk membuat respons HTTP, lihat [Hasilkan respons HTTP dalam pemicu permintaan](lambda-generating-http-responses.md#lambda-generating-http-responses-in-requests).

**`headers` (baca/tulis)**  
Header dalam respons. Perhatikan hal-hal berikut:  
+ Kunci dalam `headers` objek adalah versi huruf kecil nama header HTTP standar. Menggunakan tombol huruf kecil memberi Anda akses huruf kecil ke nilai header.
+ Setiap objek header (misalnya, `headers["content-type"]` atau `headers["content-length"]`) adalah serangkaian pasangan utama-nilai. Untuk header tertentu, larik berisi satu pasangan nilai kunci untuk setiap nilai dalam respons.
+ `key`berisi nama case-sensitive header seperti yang muncul dalam respons HTTP; misalnya,,, `Content-Type` `Content-Length``Cookie`, dan sebagainya.
+ `value` berisi nilai header sebagaimana muncul dalam respons HTTP.
+ Ketika fungsi Lambda Anda menambahkan atau memodifikasi header respons dan Anda tidak menyertakan bidang header`key`, Lambda @Edge secara otomatis menyisipkan header `key` menggunakan nama header yang Anda berikan. Terlepas dari bagaimana Anda telah memformat nama header, kunci header yang dimasukkan secara otomatis diformat dengan kapitalisasi awal untuk setiap bagian, dipisahkan oleh tanda hubung (-).

  Misalnya, Anda dapat menambahkan header seperti berikut, tanpa header `key`:

  ```
  "content-type": [
    {
      "value": "text/html;charset=UTF-8"
    }
  ]
  ```

  Dalam contoh ini, Lambda@Edge secara otomatis memasukkan `"key": "Content-Type"`.
Untuk informasi tentang pembatasan penggunaan header, lihat [Pembatasan pada fungsi edge](edge-functions-restrictions.md).

**`status`**  
Kode status HTTP dari respons.

**`statusDescription`**  
Deskripsi status HTTP untuk respons.

# Bekerja dengan permintaan dan tanggapan
<a name="lambda-generating-http-responses"></a>

Untuk menggunakan permintaan dan tanggapan Lambda @Edge, lihat topik berikut:

**Topics**
+ [Gunakan fungsi Lambda @Edge dengan failover asal](#lambda-and-origin-failover)
+ [Hasilkan respons HTTP dalam pemicu permintaan](#lambda-generating-http-responses-in-requests)
+ [Perbarui tanggapan HTTP di pemicu respons asal](#lambda-updating-http-responses)
+ [Akses badan permintaan dengan memilih opsi include body](#lambda-include-body-access)

## Gunakan fungsi Lambda @Edge dengan failover asal
<a name="lambda-and-origin-failover"></a>

Anda dapat menggunakan fungsi Lambda @Edge dengan CloudFront distribusi yang telah Anda atur dengan grup asal, misalnya, untuk failover asal yang Anda konfigurasikan untuk membantu memastikan ketersediaan tinggi. Untuk menggunakan fungsi Lambda dengan kelompok asal, tentukan fungsi dalam permintaan asal atau pemicu respons asal untuk kelompok asal saat Anda membuat perilaku cache.

Untuk informasi selengkapnya, lihat berikut ini:
+ **Buat grup asal:** [Buat grup asal](high_availability_origin_failover.md#concept_origin_groups.creating)
+ **Bagaimana asal failover bekerja dengan Lambda@Edge:** [Gunakan failover asal dengan fungsi Lambda@Edge](high_availability_origin_failover.md#concept_origin_groups.lambda)

## Hasilkan respons HTTP dalam pemicu permintaan
<a name="lambda-generating-http-responses-in-requests"></a>

Saat CloudFront menerima permintaan, Anda dapat menggunakan fungsi Lambda untuk menghasilkan respons HTTP yang CloudFront kembali langsung ke penampil tanpa meneruskan respons ke asal. Membuat respons HTTP mengurangi beban pada asal mula, dan biasanya juga mengurangi latensi bagi penampil.

Beberapa skenario umum untuk menghasilkan tanggapan HTTP mencakup hal berikut:
+ Mengembalikan halaman web kecil ke penampil
+ Mengembalikan kode status HTTP 301 atau 302 untuk mengarahkan pengguna ke halaman web lain
+ Mengembalikan kode status HTTP 401 ke penampil saat pengguna belum mengautentikasi

Fungsi Lambda@Edge dapat menghasilkan respons HTTP saat CloudFront peristiwa yang terjadi:

**Peristiwa permintaan penampil**  
Saat fungsi dipicu oleh peristiwa permintaan penampil, CloudFront mengembalikan respons ke penampil dan tidak menyimpannya di cache.

**Acara permintaan asal**  
Saat fungsi dipicu oleh peristiwa permintaan asal, CloudFront periksa cache tepi untuk respons yang sebelumnya dihasilkan oleh fungsi tersebut.   
+ Jika respons ada di cache, fungsi tidak dijalankan dan CloudFront mengembalikan respons cache ke penampil.
+ Jika respons tidak ada dalam cache, fungsi akan dijalankan, CloudFront mengembalikan respons ke penampil, dan juga menyimpan datanya.

Untuk melihat beberapa kode sampel untuk menghasilkan respons HTTP, lihat [Lambda @Edge contoh fungsi](lambda-examples.md). Anda juga dapat mengganti respons HTTP dalam pemicu respons. Untuk informasi selengkapnya, lihat [Perbarui tanggapan HTTP di pemicu respons asal](#lambda-updating-http-responses).

### Model pemrograman
<a name="lambda-generating-http-responses-programming-model"></a>

Bagian ini menjelaskan model pemrograman untuk menggunakan Lambda@Edge untuk menghasilkan respons HTTP.

**Topics**
+ [Objek respons](#lambda-generating-http-responses-object)
+ [Kesalahan](#lambda-generating-http-responses-errors)
+ [Bidang yang diperlukan](#lambda-generating-http-responses-required-fields)

#### Objek respons
<a name="lambda-generating-http-responses-object"></a>

Tanggapan yang Anda kembalikan sebagai `result` parameter dari `callback` harus memiliki struktur berikut (perhatikan bahwa hanya `status` bidang wajib diisi).

```
const response = {
    body: 'content',
    bodyEncoding: 'text' | 'base64',
    headers: {
        'header name in lowercase': [{
            key: 'header name in standard case',
            value: 'header value'
         }],
         ...
    },
    status: 'HTTP status code (string)',
    statusDescription: 'status description'
};
```

Objek respons dapat mencakup nilai-nilai berikut:

**`body`**  
Tubuh, jika ada, yang CloudFront ingin Anda kembalikan dalam respons yang dihasilkan.

**`bodyEncoding`**  
Pengodean untuk nilai yang Anda tentukan dalam `body`. Satu-satunya pengodean yang valid adalah `text` dan `base64`. Jika Anda memasukkan `body` dalam `response` objek tetapi dihilangkan`bodyEncoding`, CloudFront perlakukan tubuh sebagai teks.  
Jika Anda menentukan `bodyEncoding` sebagai `base64` tetapi bagian tubuh tidak valid dasar64, CloudFront mengembalikan kesalahan.

**`headers`**  
Header yang CloudFront ingin Anda kembalikan dalam respons yang dihasilkan. Perhatikan hal-hal berikut:  
+ Kunci dalam `headers` objek adalah versi huruf kecil nama header HTTP standar. Menggunakan tombol huruf kecil memberi Anda akses huruf kecil ke nilai header.
+ Setiap header (misalnya, `headers["accept"]` atau `headers["host"]`) adalah serangkaian pasangan kunci. Untuk header tertentu, larik berisi satu pasangan nilai kunci untuk setiap nilai dalam respons yang dihasilkan.
+ `key` (opsional) adalah nama judul yang peka terhadap kasus sebagaimana muncul dalam permintaan HTTP; misalnya, `accept` atau `host`.
+ Tentukan `value` sebagai nilai header.
+ Jika Anda tidak menyertakan bagian kunci header dari pasangan nilai kunci, Lambda@Edge secara otomatis memasukkan kunci header menggunakan nama header yang Anda berikan. Terlepas dari bagaimana Anda telah memformat nama header, kunci header yang disisipkan secara otomatis diformat dengan kapitalisasi awal untuk setiap bagian, dipisahkan oleh tanda hubung (-).

  Misalnya, Anda dapat menambahkan header seperti berikut, tanpa tombol header: `'content-type': [{ value: 'text/html;charset=UTF-8' }]`

  Dalam contoh ini, Lambda@Edge membuat tombol header berikut: `Content-Type`.
Untuk informasi tentang pembatasan penggunaan header, lihat [Pembatasan pada fungsi edge](edge-functions-restrictions.md).

**`status`**  
Kode status HTTP. Berikan kode status sebagai string. CloudFront menggunakan kode status yang disediakan untuk hal-hal berikut:  
+ Kembalikan dalam respons
+ Cache di cache CloudFront tepi, ketika respons dihasilkan oleh fungsi yang dipicu oleh peristiwa permintaan asal
+ Masuk CloudFront [Akses log (log standar)](AccessLogs.md)
Jika `status` nilainya tidak antara 200 dan 599, CloudFront mengembalikan kesalahan ke penampil.

**`statusDescription`**  
Deskripsi yang CloudFront ingin Anda kembalikan dalam respons, untuk menyertai kode status HTTP. Anda tidak perlu menggunakan deskripsi standar, seperti `OK` untuk kode status HTTP sebesar 200.

#### Kesalahan
<a name="lambda-generating-http-responses-errors"></a>

Berikut ini adalah kemungkinan kesalahan untuk respons HTTP yang dihasilkan.

**Respon Berisi Tubuh dan Menentukan 204 (Tidak Ada Konten) untuk Status**  
Ketika fungsi dipicu oleh permintaan penampil, CloudFront mengembalikan kode status HTTP 502 (Bad Gateway) ke penampil ketika kedua hal berikut ini benar:  
+ Nilai dari `status` adalah 204 (Tidak Ada Konten)
+ Jawaban mencakup nilai untuk `body`
Ini karena Lambda@Edge mengenakan pembatasan opsional yang ditemukan dalam RFC 2616, yang menyatakan bahwa `HTTP 204` respons tidak harus berisi isi pesan.

**Pembatasan Ukuran Respons yang Dihasilkan**  
Ukuran maksimum respons yang dihasilkan oleh fungsi Lambda tergantung pada peristiwa yang memicu fungsi:  
+ **Peristiwa permintaan penampil** – 40 KB
+ **Acara permintaan asal** – 1 MB
Jika respons lebih besar dari ukuran yang diizinkan, CloudFront mengembalikan kode status HTTP 502 (Bad Gateway) ke penampil.

#### Bidang yang diperlukan
<a name="lambda-generating-http-responses-required-fields"></a>

`status` bidang wajib diisi. 

Semua kolom lain bersifat opsional.

## Perbarui tanggapan HTTP di pemicu respons asal
<a name="lambda-updating-http-responses"></a>

Saat CloudFront menerima respons HTTP dari server asal, jika ada pemicu respons asal yang terkait dengan perilaku cache, Anda dapat memodifikasi respons HTTP untuk mengganti apa yang dikembalikan dari asal.

Beberapa skenario umum untuk memperbarui respons HTTP mencakup hal berikut:
+ Mengubah status untuk mengatur kode status HTTP 200 dan membuat konten tubuh statis untuk kembali ke penampil ketika asal mengembalikan kode status kesalahan (4xx atau 5xx). Untuk kode sampel, lihat [Contoh: Gunakan pemicu respons asal untuk memperbarui kode status kesalahan ke 200](lambda-examples.md#lambda-examples-custom-error-static-body).
+ Mengubah status untuk mengatur kode status HTTP 301 atau HTTP 302, untuk mengarahkan pengguna ke situs web lain saat asal mengembalikan kode status kesalahan (4xx atau 5xx). Untuk kode sampel, lihat [Contoh: Gunakan pemicu respons asal untuk memperbarui kode status kesalahan ke 302](lambda-examples.md#lambda-examples-custom-error-new-site).

**catatan**  
Fungsi harus mengembalikan nilai status antara `200` dan `599` (inklusif), jika tidak CloudFront mengembalikan kesalahan ke penampil.

Anda juga dapat mengganti respons HTTP di penampil dan peristiwa permintaan asal. Untuk informasi selengkapnya, lihat [Hasilkan respons HTTP dalam pemicu permintaan](#lambda-generating-http-responses-in-requests).

Saat Anda bekerja dengan respons HTTP, Lambda @Edge tidak mengekspos badan yang dikembalikan oleh server asal ke pemicu respons asal. Anda dapat membuat badan konten statis dengan mengaturnya ke nilai yang diinginkan, atau menghapus tubuh di dalam fungsi dengan mengatur nilai yang akan kosong. Jika Anda tidak memperbarui bidang isi dalam fungsi Anda, badan asli yang dikembalikan oleh server asal dikembalikan ke penampil.

## Akses badan permintaan dengan memilih opsi include body
<a name="lambda-include-body-access"></a>

Anda dapat memilih untuk menggunakan Lambda@Edge mengekspos tubuh dalam permintaan metode HTTP yang dapat ditulis (POST, PUT, DELETE, dan seterusnya), sehingga Anda dapat mengaksesnya dalam fungsi Lambda Anda. Anda dapat memilih akses hanya-baca, atau Anda dapat menentukan bahwa Anda akan mengganti isi.

Untuk mengaktifkan opsi ini, pilih **Sertakan Tubuh** saat membuat CloudFront untuk fungsi Anda yang digunakan untuk permintaan pemirsa atau acara permintaan asal. Untuk informasi lebih lanjut, lihat [Tambahkan pemicu untuk fungsi Lambda @Edge](lambda-edge-add-triggers.md), atau untuk mempelajari penggunaan **Sertakan Tubuh** dengan fungsi Anda, lihat [Struktur acara Lambda @Edge](lambda-event-structure.md).

Skenario saat Anda mungkin ingin menggunakan fitur ini meliputi hal berikut:
+ Memproses formulir web, seperti formulir “hubungi kami”, tanpa mengirim data input pelanggan kembali ke server asal.
+ Mengumpulkan data beacon web yang dikirim oleh browser penampil dan memprosesnya di tepi.

Untuk kode sampel, lihat [Lambda @Edge contoh fungsi](lambda-examples.md).

**catatan**  
Jika badan permintaan berukuran besar, Lambda@Edge akan memotongnya. Untuk informasi terperinci tentang ukuran dan pemotongan maksimum, lihat [Pembatasan pada isi permintaan dengan opsi sertakan isi](lambda-at-edge-function-restrictions.md#lambda-at-edge-restrictions-request-body).

# Lambda @Edge contoh fungsi
<a name="lambda-examples"></a>

Lihat contoh berikut untuk menggunakan fungsi Lambda dengan Amazon. CloudFront

**catatan**  
Jika Anda memilih runtime Node.js 18 atau yang lebih baru untuk fungsi Lambda @Edge Anda, `index.mjs` file dibuat untuk Anda secara otomatis. Untuk menggunakan contoh kode berikut, ganti nama `index.mjs` file menjadi `index.js` sebagai gantinya.

**Topics**
+ [Contoh Umum](#lambda-examples-general-examples)
+ [Hasilkan tanggapan - contoh](#lambda-examples-generated-response-examples)
+ [String kueri - contoh](#lambda-examples-query-string-examples)
+ [Personalisasi konten berdasarkan header negara atau jenis perangkat - contoh](#lambda-examples-redirecting-examples)
+ [Pemilihan asal dinamis berbasis konten - contoh](#lambda-examples-content-based-routing-examples)
+ [Perbarui status kesalahan - contoh](#lambda-examples-update-error-status-examples)
+ [Akses badan permintaan - contoh](#lambda-examples-access-request-body-examples)

## Contoh Umum
<a name="lambda-examples-general-examples"></a>

Contoh berikut menunjukkan cara umum untuk menggunakan Lambda @Edge di. CloudFront

**Topics**
+ [Contoh: A/B pengujian](#lambda-examples-a-b-testing)
+ [Contoh: Ganti header respons](#lambda-examples-overriding-response-header)

### Contoh: A/B pengujian
<a name="lambda-examples-a-b-testing"></a>

Anda dapat menggunakan contoh berikut untuk menguji dua versi citra yang berbeda tanpa membuat pengalihan atau mengubah URL. Contoh ini membaca cookie di permintaan penampil dan memodifikasi URL permintaan dengan sesuai. Jika penampil tidak mengirim cookie dengan salah satu nilai yang diharapkan, contoh secara acak menetapkan penampil ke salah satu. URLs

------
#### [ Node.js ]

```
'use strict';

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;
    const headers = request.headers;

    if (request.uri !== '/experiment-pixel.jpg') {
        // do not process if this is not an A-B test request
        callback(null, request);
        return;
    }

    const cookieExperimentA = 'X-Experiment-Name=A';
    const cookieExperimentB = 'X-Experiment-Name=B';
    const pathExperimentA = '/experiment-group/control-pixel.jpg';
    const pathExperimentB = '/experiment-group/treatment-pixel.jpg';

    /*
     * Lambda at the Edge headers are array objects.
     *
     * Client may send multiple Cookie headers, i.e.:
     * > GET /viewerRes/test HTTP/1.1
     * > User-Agent: curl/7.18.1 (x86_64-unknown-linux-gnu) libcurl/7.18.1 OpenSSL/1.0.1u zlib/1.2.3
     * > Cookie: First=1; Second=2
     * > Cookie: ClientCode=abc
     * > Host: example.com
     *
     * You can access the first Cookie header at headers["cookie"][0].value
     * and the second at headers["cookie"][1].value.
     *
     * Header values are not parsed. In the example above,
     * headers["cookie"][0].value is equal to "First=1; Second=2"
     */
    let experimentUri;
    if (headers.cookie) {
        for (let i = 0; i < headers.cookie.length; i++) {
            if (headers.cookie[i].value.indexOf(cookieExperimentA) >= 0) {
                console.log('Experiment A cookie found');
                experimentUri = pathExperimentA;
                break;
            } else if (headers.cookie[i].value.indexOf(cookieExperimentB) >= 0) {
                console.log('Experiment B cookie found');
                experimentUri = pathExperimentB;
                break;
            }
        }
    }

    if (!experimentUri) {
        console.log('Experiment cookie has not been found. Throwing dice...');
        if (Math.random() < 0.75) {
            experimentUri = pathExperimentA;
        } else {
            experimentUri = pathExperimentB;
        }
    }

    request.uri = experimentUri;
    console.log(`Request uri set to "${request.uri}"`);
    callback(null, request);
};
```

------
#### [ Python ]

```
import json
import random

def lambda_handler(event, context):
    request = event['Records'][0]['cf']['request']
    headers = request['headers']

    if request['uri'] != '/experiment-pixel.jpg':
        # Not an A/B Test
        return request

    cookieExperimentA, cookieExperimentB = 'X-Experiment-Name=A', 'X-Experiment-Name=B'
    pathExperimentA, pathExperimentB = '/experiment-group/control-pixel.jpg', '/experiment-group/treatment-pixel.jpg'

    '''
    Lambda at the Edge headers are array objects.

    Client may send multiple cookie headers. For example:
    > GET /viewerRes/test HTTP/1.1
    > User-Agent: curl/7.18.1 (x86_64-unknown-linux-gnu) libcurl/7.18.1 OpenSSL/1.0.1u zlib/1.2.3
    > Cookie: First=1; Second=2
    > Cookie: ClientCode=abc
    > Host: example.com

    You can access the first Cookie header at headers["cookie"][0].value
    and the second at headers["cookie"][1].value.

    Header values are not parsed. In the example above,
    headers["cookie"][0].value is equal to "First=1; Second=2"
    '''

    experimentUri = ""

    for cookie in headers.get('cookie', []):
        if cookieExperimentA in cookie['value']:
            print("Experiment A cookie found")
            experimentUri = pathExperimentA
            break
        elif cookieExperimentB in cookie['value']:
            print("Experiment B cookie found")
            experimentUri = pathExperimentB
            break

    if not experimentUri:
        print("Experiment cookie has not been found. Throwing dice...")
        if random.random() < 0.75:
            experimentUri = pathExperimentA
        else:
            experimentUri = pathExperimentB

    request['uri'] = experimentUri
    print(f"Request uri set to {experimentUri}")
    return request
```

------

### Contoh: Ganti header respons
<a name="lambda-examples-overriding-response-header"></a>

Contoh berikut menunjukkan cara mengubah nilai header respons berdasarkan nilai header lain.

------
#### [ Node.js ]

```
export const handler = async (event) => {
    const response = event.Records[0].cf.response;
    const headers = response.headers;

    const headerNameSrc = 'X-Amz-Meta-Last-Modified';
    const headerNameDst = 'Last-Modified';

    if (headers[headerNameSrc.toLowerCase()]) {
        headers[headerNameDst.toLowerCase()] = [{
            key: headerNameDst,
            value: headers[headerNameSrc.toLowerCase()][0].value,
        }];
        console.log(`Response header "${headerNameDst}" was set to ` +
                    `"${headers[headerNameDst.toLowerCase()][0].value}"`);
    }

    return response;
};
```

------
#### [ Python ]

```
import json 

def lambda_handler(event, context):
    response = event['Records'][0]['cf']['response']
    headers = response['headers']
    
    header_name_src = 'X-Amz-Meta-Last-Modified'
    header_name_dst = 'Last-Modified'
    
    if headers.get(header_name_src.lower()):
        headers[header_name_dst.lower()] = [{
            'key': header_name_dst,
            'value': headers[header_name_src.lower()][0]['value']
        }]
        print(f'Response header "{header_name_dst}" was set to '
              f'"{headers[header_name_dst.lower()][0]["value"]}"')
    
    return response
```

------

## Hasilkan tanggapan - contoh
<a name="lambda-examples-generated-response-examples"></a>

Contoh berikut menunjukkan bagaimana Anda dapat menggunakan Lambda @Edge untuk menghasilkan tanggapan.

**Topics**
+ [Contoh: Sajikan konten statis (respons yang dihasilkan)](#lambda-examples-static-web-server)
+ [Contoh: Menghasilkan pengalihan HTTP (respons yang dihasilkan)](#lambda-examples-http-redirect)

### Contoh: Sajikan konten statis (respons yang dihasilkan)
<a name="lambda-examples-static-web-server"></a>

Contoh berikut menunjukkan cara menggunakan fungsi Lambda untuk melayani konten situs web statis, yang mengurangi beban pada server asal dan mengurangi latensi keseluruhan. 

**catatan**  
Anda dapat membuat tanggapan HTTP untuk permintaan penampil dan peristiwa permintaan asal. Untuk informasi selengkapnya, lihat [Hasilkan respons HTTP dalam pemicu permintaan](lambda-generating-http-responses.md#lambda-generating-http-responses-in-requests).  
Anda juga dapat mengganti atau menghapus isi respons HTTP dalam peristiwa respons asal. Untuk informasi selengkapnya, lihat [Perbarui tanggapan HTTP di pemicu respons asal](lambda-generating-http-responses.md#lambda-updating-http-responses).

------
#### [ Node.js ]

```
'use strict';

const content = `
<\!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="utf-8">
    <title>Simple Lambda@Edge Static Content Response</title>
  </head>
  <body>
    <p>Hello from Lambda@Edge!</p>
  </body>
</html>
`;

exports.handler = (event, context, callback) => {
    /*
     * Generate HTTP OK response using 200 status code with HTML body.
     */
    const response = {
        status: '200',
        statusDescription: 'OK',
        headers: {
            'cache-control': [{
                key: 'Cache-Control',
                value: 'max-age=100'
            }],
            'content-type': [{
                key: 'Content-Type',
                value: 'text/html'
            }]
        },
        body: content,
    };
    callback(null, response);
};
```

------
#### [ Python ]

```
import json

CONTENT = """
<\!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Simple Lambda@Edge Static Content Response</title>
</head>
<body>
    <p>Hello from Lambda@Edge!</p>
</body>
</html>
"""

def lambda_handler(event, context):
    # Generate HTTP OK response using 200 status code with HTML body.
    response = {
        'status': '200',
        'statusDescription': 'OK',
        'headers': {
            'cache-control': [
                {
                    'key': 'Cache-Control',
                    'value': 'max-age=100'
                }
            ],
            "content-type": [
                {
                    'key': 'Content-Type',
                    'value': 'text/html'
                }
            ]
        },
        'body': CONTENT
    }
    return response
```

------

### Contoh: Menghasilkan pengalihan HTTP (respons yang dihasilkan)
<a name="lambda-examples-http-redirect"></a>

Contoh berikut ini menunjukkan cara membuat pengalihan HTTP.

**catatan**  
Anda dapat membuat tanggapan HTTP untuk permintaan penampil dan peristiwa permintaan asal. Untuk informasi selengkapnya, lihat [Hasilkan respons HTTP dalam pemicu permintaan](lambda-generating-http-responses.md#lambda-generating-http-responses-in-requests).

------
#### [ Node.js ]

```
'use strict';

exports.handler = (event, context, callback) => {
    /*
     * Generate HTTP redirect response with 302 status code and Location header.
     */
    const response = {
        status: '302',
        statusDescription: 'Found',
        headers: {
            location: [{
                key: 'Location',
                value: 'https://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html',
            }],
        },
    };
    callback(null, response);
};
```

------
#### [ Python ]

```
def lambda_handler(event, context):

    # Generate HTTP redirect response with 302 status code and Location header.

    response = {
        'status': '302',
        'statusDescription': 'Found',
        'headers': {
            'location': [{
                'key': 'Location',
                'value': 'https://docs.aws.amazon.com/lambda/latest/dg/lambda-edge.html'
            }]
        }
    }

    return response
```

------

## String kueri - contoh
<a name="lambda-examples-query-string-examples"></a>

Contoh berikut menunjukkan cara Anda dapat menggunakan Lambda @Edge dengan string kueri.

**Topics**
+ [Contoh: Tambahkan header berdasarkan parameter string kueri](#lambda-examples-header-based-on-query-string)
+ [Contoh: Normalisasi parameter string kueri untuk meningkatkan rasio hit cache](#lambda-examples-normalize-query-string-parameters)
+ [Contoh: Mengarahkan pengguna yang tidak diautentikasi ke halaman login](#lambda-examples-redirect-to-signin-page)

### Contoh: Tambahkan header berdasarkan parameter string kueri
<a name="lambda-examples-header-based-on-query-string"></a>

Contoh berikut menunjukkan cara mendapatkan pasangan nilai kunci dari parameter string pencarian, kemudian menambahkan header berdasarkan nilai tersebut.

------
#### [ Node.js ]

```
'use strict';

const querystring = require('querystring');
exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;
    
    /* When a request contains a query string key-value pair but the origin server
     * expects the value in a header, you can use this Lambda function to
     * convert the key-value pair to a header. Here's what the function does:
     * 1. Parses the query string and gets the key-value pair.
     * 2. Adds a header to the request using the key-value pair that the function got in step 1.
     */

    /* Parse request querystring to get javascript object */
    const params = querystring.parse(request.querystring);

    /* Move auth param from querystring to headers */
    const headerName = 'Auth-Header';
    request.headers[headerName.toLowerCase()] = [{ key: headerName, value: params.auth }];
    delete params.auth;

    /* Update request querystring */
    request.querystring = querystring.stringify(params);

    callback(null, request);
};
```

------
#### [ Python ]

```
from urllib.parse import parse_qs, urlencode

def lambda_handler(event, context):
    request = event['Records'][0]['cf']['request']

    '''
    When a request contains a query string key-value pair but the origin server
    expects the value in a header, you can use this Lambda function to
    convert the key-value pair to a header. Here's what the function does:
        1. Parses the query string and gets the key-value pair.
        2. Adds a header to the request using the key-value pair that the function got in step 1.
    '''

    # Parse request querystring to get dictionary/json
    params = {k : v[0] for k, v in parse_qs(request['querystring']).items()}

    # Move auth param from querystring to headers
    headerName = 'Auth-Header'
    request['headers'][headerName.lower()] = [{'key': headerName, 'value': params['auth']}]
    del params['auth']

    # Update request querystring
    request['querystring'] = urlencode(params)

    return request
```

------

### Contoh: Normalisasi parameter string kueri untuk meningkatkan rasio hit cache
<a name="lambda-examples-normalize-query-string-parameters"></a>

Contoh berikut menunjukkan cara meningkatkan rasio hit cache Anda dengan membuat perubahan berikut pada string kueri sebelum CloudFront meneruskan permintaan ke asal Anda:
+ Berikan kombinasi nilai kunci dengan nama parameter.
+ Ubah kasus pasangan yang bernilai kunci menjadi huruf kecil.

Untuk informasi selengkapnya, lihat [Konten cache berdasarkan parameter string kueri](QueryStringParameters.md).

------
#### [ Node.js ]

```
'use strict';

const querystring = require('querystring');

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;
    /* When you configure a distribution to forward query strings to the origin and
     * to cache based on an allowlist of query string parameters, we recommend
     * the following to improve the cache-hit ratio:
     * - Always list parameters in the same order.
     * - Use the same case for parameter names and values.
     *
     * This function normalizes query strings so that parameter names and values
     * are lowercase and parameter names are in alphabetical order.
     *
     * For more information, see:
     * https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/QueryStringParameters.html
     */

    console.log('Query String: ', request.querystring);

    /* Parse request query string to get javascript object */
    const params = querystring.parse(request.querystring.toLowerCase());
    const sortedParams = {};

    /* Sort param keys */
    Object.keys(params).sort().forEach(key => {
        sortedParams[key] = params[key];
    });

    /* Update request querystring with normalized  */
    request.querystring = querystring.stringify(sortedParams);

    callback(null, request);
};
```

------
#### [ Python ]

```
from urllib.parse import parse_qs, urlencode

def lambda_handler(event, context):
    request = event['Records'][0]['cf']['request']
    '''
    When you configure a distribution to forward query strings to the origin and
    to cache based on an allowlist of query string parameters, we recommend
    the following to improve the cache-hit ratio:
    Always list parameters in the same order.
    - Use the same case for parameter names and values.

    This function normalizes query strings so that parameter names and values
    are lowercase and parameter names are in alphabetical order.

    For more information, see:
    https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/QueryStringParameters.html
    '''
    print("Query string: ", request["querystring"])

    # Parse request query string to get js object
    params = {k : v[0] for k, v in parse_qs(request['querystring'].lower()).items()}

    # Sort param keys
    sortedParams = sorted(params.items(), key=lambda x: x[0])

    # Update request querystring with normalized
    request['querystring'] = urlencode(sortedParams)
    
    return request
```

------

### Contoh: Mengarahkan pengguna yang tidak diautentikasi ke halaman login
<a name="lambda-examples-redirect-to-signin-page"></a>

Contoh berikut menunjukkan cara mengalihkan pengguna ke halaman masuk jika mereka belum memasukkan kredensial mereka.

------
#### [ Node.js ]

```
'use strict';

function parseCookies(headers) {
    const parsedCookie = {};
    if (headers.cookie) {
        headers.cookie[0].value.split(';').forEach((cookie) => {
            if (cookie) {
                const parts = cookie.split('=');
                parsedCookie[parts[0].trim()] = parts[1].trim();
            }
        });
    }
    return parsedCookie;
}

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;
    const headers = request.headers;

    /* Check for session-id in request cookie in viewer-request event,
     * if session-id is absent, redirect the user to sign in page with original
     * request sent as redirect_url in query params.
     */

    /* Check for session-id in cookie, if present then proceed with request */
    const parsedCookies = parseCookies(headers);
    if (parsedCookies && parsedCookies['session-id']) {
        callback(null, request);
        return;
    }

    /* URI encode the original request to be sent as redirect_url in query params */
    const encodedRedirectUrl = encodeURIComponent(`https://${headers.host[0].value}${request.uri}?${request.querystring}`);
    const response = {
        status: '302',
        statusDescription: 'Found',
        headers: {
            location: [{
                key: 'Location',
                value: `https://www.example.com/signin?redirect_url=${encodedRedirectUrl}`,
            }],
        },
    };
    callback(null, response);
};
```

------
#### [ Python ]

```
import urllib

def parseCookies(headers):
    parsedCookie = {}
    if headers.get('cookie'):
        for cookie in headers['cookie'][0]['value'].split(';'):
            if cookie:
                parts = cookie.split('=')
                parsedCookie[parts[0].strip()] = parts[1].strip()
    return parsedCookie

def lambda_handler(event, context):
    request = event['Records'][0]['cf']['request']
    headers = request['headers']

    '''
    Check for session-id in request cookie in viewer-request event,
    if session-id is absent, redirect the user to sign in page with original
    request sent as redirect_url in query params.
    '''

    # Check for session-id in cookie, if present, then proceed with request
    parsedCookies = parseCookies(headers)

    if parsedCookies and parsedCookies['session-id']:
        return request

    # URI encode the original request to be sent as redirect_url in query params
    redirectUrl = "https://%s%s?%s" % (headers['host'][0]['value'], request['uri'], request['querystring'])
    encodedRedirectUrl = urllib.parse.quote_plus(redirectUrl.encode('utf-8'))

    response = {
        'status': '302',
        'statusDescription': 'Found',
        'headers': {
            'location': [{
                'key': 'Location',
                'value': 'https://www.example.com/signin?redirect_url=%s' % encodedRedirectUrl
            }]
        }
    }
    return response
```

------

## Personalisasi konten berdasarkan header negara atau jenis perangkat - contoh
<a name="lambda-examples-redirecting-examples"></a>

Contoh berikut menunjukkan bagaimana Anda dapat menggunakan Lambda @Edge untuk menyesuaikan perilaku berdasarkan lokasi atau jenis perangkat yang digunakan oleh penampil.

**Topics**
+ [Contoh: Mengarahkan permintaan penampil ke URL khusus negara](#lambda-examples-redirect-based-on-country)
+ [Contoh: Sajikan berbagai versi objek berdasarkan perangkat](#lambda-examples-vary-on-device-type)

### Contoh: Mengarahkan permintaan penampil ke URL khusus negara
<a name="lambda-examples-redirect-based-on-country"></a>

Contoh berikut menunjukkan cara membuat respons pengalihan HTTP dengan URL khusus negara dan mengembalikan respons ke penampil. Ini berguna saat Anda ingin memberikan tanggapan khusus negara. Sebagai contoh:
+ Jika Anda memiliki subdomain spesifik negara, seperti kami.example.com dan tw.example.com, Anda dapat membuat respons pengalihan saat penampil meminta contoh.com.
+ Jika Anda melakukan streaming video tetapi tidak memiliki hak untuk melakukan streaming konten di negara tertentu, Anda dapat mengarahkan pengguna di negara tersebut ke halaman yang menjelaskan mengapa mereka tidak dapat melihat video tersebut. 

Perhatikan hal-hal berikut:
+ Anda harus mengonfigurasi distribusi Anda ke cache berdasarkan `CloudFront-Viewer-Country` header. Untuk informasi selengkapnya, lihat [Cache berdasarkan header permintaan yang dipilih](DownloadDistValuesCacheBehavior.md#DownloadDistValuesForwardHeaders).
+ CloudFront menambahkan `CloudFront-Viewer-Country` header setelah acara permintaan penampil. Untuk menggunakan contoh ini, Anda harus membuat pemicu untuk kejadian permintaan asal.

------
#### [ Node.js ]

```
'use strict';

/* This is an origin request function */
exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;
    const headers = request.headers;

    /*
     * Based on the value of the CloudFront-Viewer-Country header, generate an
     * HTTP status code 302 (Redirect) response, and return a country-specific
     * URL in the Location header.
     * NOTE: 1. You must configure your distribution to cache based on the
     *          CloudFront-Viewer-Country header. For more information, see
     *          https://docs.aws.amazon.com/console/cloudfront/cache-on-selected-headers
     *       2. CloudFront adds the CloudFront-Viewer-Country header after the viewer
     *          request event. To use this example, you must create a trigger for the
     *          origin request event.
     */

    let url = 'https://example.com/';
    if (headers['cloudfront-viewer-country']) {
        const countryCode = headers['cloudfront-viewer-country'][0].value;
        if (countryCode === 'TW') {
            url = 'https://tw.example.com/';
        } else if (countryCode === 'US') {
            url = 'https://us.example.com/';
        }
    }

    const response = {
        status: '302',
        statusDescription: 'Found',
        headers: {
            location: [{
                key: 'Location',
                value: url,
            }],
        },
    };
    callback(null, response);
};
```

------
#### [ Python ]

```
# This is an origin request function

def lambda_handler(event, context):
    request = event['Records'][0]['cf']['request']
    headers = request['headers']

    '''
    Based on the value of the CloudFront-Viewer-Country header, generate an
    HTTP status code 302 (Redirect) response, and return a country-specific
    URL in the Location header.
    NOTE: 1. You must configure your distribution to cache based on the
            CloudFront-Viewer-Country header. For more information, see
            https://docs.aws.amazon.com/console/cloudfront/cache-on-selected-headers
          2. CloudFront adds the CloudFront-Viewer-Country header after the viewer
            request event. To use this example, you must create a trigger for the
            origin request event.
    '''

    url = 'https://example.com/'
    viewerCountry = headers.get('cloudfront-viewer-country')
    if viewerCountry:
        countryCode = viewerCountry[0]['value']
        if countryCode == 'TW':
            url = 'https://tw.example.com/'
        elif countryCode == 'US':
            url = 'https://us.example.com/'

    response = {
        'status': '302',
        'statusDescription': 'Found',
        'headers': {
            'location': [{
                'key': 'Location',
                'value': url
            }]
        }
    }

    return response
```

------

### Contoh: Sajikan berbagai versi objek berdasarkan perangkat
<a name="lambda-examples-vary-on-device-type"></a>

Contoh berikut ini menunjukkan cara menyajikan versi objek berbeda berdasarkan jenis perangkat yang digunakan pengguna, misalnya, perangkat seluler atau tablet. Perhatikan hal-hal berikut:
+ Anda harus mengonfigurasi distribusi Anda ke cache berdasarkan `CloudFront-Is-*-Viewer` yang berbeda. Untuk informasi selengkapnya, lihat [Cache berdasarkan header permintaan yang dipilih](DownloadDistValuesCacheBehavior.md#DownloadDistValuesForwardHeaders).
+ CloudFront menambahkan `CloudFront-Is-*-Viewer` header setelah acara permintaan penampil. Untuk menggunakan contoh ini, Anda harus membuat pemicu untuk kejadian permintaan asal.

------
#### [ Node.js ]

```
'use strict';

/* This is an origin request function */
exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;
    const headers = request.headers;

    /*
     * Serve different versions of an object based on the device type.
     * NOTE: 1. You must configure your distribution to cache based on the
     *          CloudFront-Is-*-Viewer headers. For more information, see
     *          the following documentation:
     *          https://docs.aws.amazon.com/console/cloudfront/cache-on-selected-headers
     *          https://docs.aws.amazon.com/console/cloudfront/cache-on-device-type
     *       2. CloudFront adds the CloudFront-Is-*-Viewer headers after the viewer
     *          request event. To use this example, you must create a trigger for the
     *          origin request event.
     */

    const desktopPath = '/desktop';
    const mobilePath = '/mobile';
    const tabletPath = '/tablet';
    const smarttvPath = '/smarttv';

    if (headers['cloudfront-is-desktop-viewer']
        && headers['cloudfront-is-desktop-viewer'][0].value === 'true') {
        request.uri = desktopPath + request.uri;
    } else if (headers['cloudfront-is-mobile-viewer']
               && headers['cloudfront-is-mobile-viewer'][0].value === 'true') {
        request.uri = mobilePath + request.uri;
    } else if (headers['cloudfront-is-tablet-viewer']
               && headers['cloudfront-is-tablet-viewer'][0].value === 'true') {
        request.uri = tabletPath + request.uri;
    } else if (headers['cloudfront-is-smarttv-viewer']
               && headers['cloudfront-is-smarttv-viewer'][0].value === 'true') {
        request.uri = smarttvPath + request.uri;
    }
    console.log(`Request uri set to "${request.uri}"`);

    callback(null, request);
};
```

------
#### [ Python ]

```
# This is an origin request function
def lambda_handler(event, context):
    request = event['Records'][0]['cf']['request']
    headers = request['headers']

    '''
    Serve different versions of an object based on the device type.
    NOTE: 1. You must configure your distribution to cache based on the
            CloudFront-Is-*-Viewer headers. For more information, see
            the following documentation:
            https://docs.aws.amazon.com/console/cloudfront/cache-on-selected-headers
            https://docs.aws.amazon.com/console/cloudfront/cache-on-device-type
          2. CloudFront adds the CloudFront-Is-*-Viewer headers after the viewer
            request event. To use this example, you must create a trigger for the
            origin request event.
    '''

    desktopPath = '/desktop';
    mobilePath = '/mobile';
    tabletPath = '/tablet';
    smarttvPath = '/smarttv';

    if 'cloudfront-is-desktop-viewer' in headers and headers['cloudfront-is-desktop-viewer'][0]['value'] == 'true':
        request['uri'] = desktopPath + request['uri']
    elif 'cloudfront-is-mobile-viewer' in headers and headers['cloudfront-is-mobile-viewer'][0]['value'] == 'true':
        request['uri'] = mobilePath + request['uri']
    elif 'cloudfront-is-tablet-viewer' in headers and headers['cloudfront-is-tablet-viewer'][0]['value'] == 'true':
        request['uri'] = tabletPath + request['uri']
    elif 'cloudfront-is-smarttv-viewer' in headers and headers['cloudfront-is-smarttv-viewer'][0]['value'] == 'true':
        request['uri'] = smarttvPath + request['uri']

    print("Request uri set to %s" % request['uri'])

    return request
```

------

## Pemilihan asal dinamis berbasis konten - contoh
<a name="lambda-examples-content-based-routing-examples"></a>

Contoh berikut menunjukkan bagaimana Anda dapat menggunakan Lambda @Edge untuk merutekan ke asal yang berbeda berdasarkan informasi dalam permintaan.

**Topics**
+ [Contoh: Menggunakan pemicu permintaan asal untuk mengubah dari asal kustom ke asal Amazon S3](#lambda-examples-content-based-S3-origin-based-on-query)
+ [Contoh: Gunakan pemicu permintaan asal untuk mengubah Wilayah asal Amazon S3](#lambda-examples-content-based-S3-origin-request-trigger)
+ [Contoh: Menggunakan pemicu permintaan asal untuk mengubah dari asal Amazon S3 ke asal kustom](#lambda-examples-content-based-custom-origin-request-trigger)
+ [Contoh: Gunakan pemicu permintaan asal untuk mentransfer lalu lintas secara bertahap dari satu bucket Amazon S3 ke bucket lainnya](#lambda-examples-content-based-gradual-traffic-transfer)
+ [Contoh: Gunakan pemicu permintaan asal untuk mengubah nama domain asal berdasarkan header negara](#lambda-examples-content-based-geo-header)

### Contoh: Menggunakan pemicu permintaan asal untuk mengubah dari asal kustom ke asal Amazon S3
<a name="lambda-examples-content-based-S3-origin-based-on-query"></a>

Fungsi ini mendemonstrasikan bagaimana pemicu permintaan asal dapat digunakan untuk mengubah dari asal kustom ke asal Amazon S3 dari mana konten diambil, berdasarkan properti permintaan.

------
#### [ Node.js ]

```
'use strict';

 const querystring = require('querystring');
 
 exports.handler = (event, context, callback) => {
     const request = event.Records[0].cf.request;
 
     /**
      * Reads query string to check if S3 origin should be used, and
      * if true, sets S3 origin properties.
      */
 
     const params = querystring.parse(request.querystring);
 
     if (params['useS3Origin']) {
         if (params['useS3Origin'] === 'true') {
             const s3DomainName = 'amzn-s3-demo-bucket.s3.amazonaws.com';
 
             /* Set S3 origin fields */
             request.origin = {
                 s3: {
                     domainName: s3DomainName,
                     region: '',
                     authMethod: 'origin-access-identity',
                     path: '',
                     customHeaders: {}
                 }
             };
             request.headers['host'] = [{ key: 'host', value: s3DomainName}];
         }
     }
     
    callback(null, request);
};
```

------
#### [ Python ]

```
from urllib.parse import parse_qs

def lambda_handler(event, context):
    request = event['Records'][0]['cf']['request']
    '''
    Reads query string to check if S3 origin should be used, and
    if true, sets S3 origin properties
    '''
    params = {k: v[0] for k, v in parse_qs(request['querystring']).items()}
    if params.get('useS3Origin') == 'true':
        s3DomainName = 'amzn-s3-demo-bucket.s3.amazonaws.com'

        # Set S3 origin fields
        request['origin'] = {
            's3': {
                'domainName': s3DomainName,
                'region': '',
                'authMethod': 'origin-access-identity',
                'path': '',
                'customHeaders': {}
            }
        }
        request['headers']['host'] = [{'key': 'host', 'value': s3DomainName}]
    return request
```

------

### Contoh: Gunakan pemicu permintaan asal untuk mengubah Wilayah asal Amazon S3
<a name="lambda-examples-content-based-S3-origin-request-trigger"></a>

Fungsi ini menunjukkan bagaimana pemicu permintaan asal dapat digunakan untuk mengubah asal Amazon S3 dari mana konten diambil, berdasarkan properti permintaan.

Dalam contoh ini, kami menggunakan nilai `CloudFront-Viewer-Country` header untuk memperbarui nama domain bucket S3 ke bucket di Wilayah yang lebih dekat dengan penampil. Ini dapat berguna dalam beberapa cara:
+ Ini mengurangi keterlambatan saat Wilayah yang ditentukan lebih dekat ke negara penampil.
+ Ini menyediakan kedaulatan data dengan memastikan bahwa data dilayani dari asal yang berada di negara yang sama dengan asal permintaan tersebut.

Untuk menggunakan contoh ini, Anda harus melakukan hal berikut:
+ Konfigurasikan distribusi Anda ke cache berdasarkan `CloudFront-Viewer-Country` header. Untuk informasi selengkapnya, lihat [Cache berdasarkan header permintaan yang dipilih](DownloadDistValuesCacheBehavior.md#DownloadDistValuesForwardHeaders). 
+ Buat pemicu untuk fungsi ini di acara permintaan asal. CloudFrontmenambahkan `CloudFront-Viewer-Country` header setelah peristiwa permintaan penampil, jadi untuk menggunakan contoh ini, Anda harus memastikan bahwa fungsi tersebut dijalankan untuk permintaan asal.

**catatan**  
Kode contoh berikut menggunakan identitas akses asal (OAI) yang sama untuk semua bucket S3 yang Anda gunakan untuk asal Anda. Untuk informasi selengkapnya, lihat [Identitas akses asal](private-content-restricting-access-to-s3.md#private-content-restricting-access-to-s3-oai).

------
#### [ Node.js ]

```
'use strict';

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;

    /**
     * This blueprint demonstrates how an origin-request trigger can be used to
     * change the origin from which the content is fetched, based on request properties.
     * In this example, we use the value of the CloudFront-Viewer-Country header
     * to update the S3 bucket domain name to a bucket in a Region that is closer to
     * the viewer.
     * 
     * This can be useful in several ways:
     *      1) Reduces latencies when the Region specified is nearer to the viewer's
     *         country.
     *      2) Provides data sovereignty by making sure that data is served from an
     *         origin that's in the same country that the request came from.
     * 
     * NOTE: 1. You must configure your distribution to cache based on the
     *          CloudFront-Viewer-Country header. For more information, see
     *          https://docs.aws.amazon.com/console/cloudfront/cache-on-selected-headers
     *       2. CloudFront adds the CloudFront-Viewer-Country header after the viewer
     *          request event. To use this example, you must create a trigger for the
     *          origin request event.
     */

    const countryToRegion = {
        'DE': 'eu-central-1',
        'IE': 'eu-west-1',
        'GB': 'eu-west-2',
        'FR': 'eu-west-3',
        'JP': 'ap-northeast-1',
        'IN': 'ap-south-1'
    };

    if (request.headers['cloudfront-viewer-country']) {
        const countryCode = request.headers['cloudfront-viewer-country'][0].value;
        const region = countryToRegion[countryCode];
        
        /**
         * If the viewer's country is not in the list you specify, the request
         * goes to the default S3 bucket you've configured.
         */  
        if (region) {
            /**
             * If you've set up OAI, the bucket policy in the destination bucket
             * should allow the OAI GetObject operation, as configured by default
             * for an S3 origin with OAI. Another requirement with OAI is to provide
             * the Region so it can be used for the SIGV4 signature. Otherwise, the
             * Region is not required.
             */
            request.origin.s3.region = region;
            const domainName = `amzn-s3-demo-bucket-in-${region}.s3.${region}.amazonaws.com`;
            request.origin.s3.domainName = domainName;
            request.headers['host'] = [{ key: 'host', value: domainName }];
        }
    }

    callback(null, request);
};
```

------
#### [ Python ]

```
def lambda_handler(event, context):
    request = event['Records'][0]['cf']['request']

    '''
    This blueprint demonstrates how an origin-request trigger can be used to
    change the origin from which the content is fetched, based on request properties.
    In this example, we use the value of the CloudFront-Viewer-Country header
    to update the S3 bucket domain name to a bucket in a Region that is closer to
    the viewer.
    
    This can be useful in several ways:
        1) Reduces latencies when the Region specified is nearer to the viewer's
            country.
        2) Provides data sovereignty by making sure that data is served from an
            origin that's in the same country that the request came from.
    
    NOTE: 1. You must configure your distribution to cache based on the
            CloudFront-Viewer-Country header. For more information, see
            https://docs.aws.amazon.com/console/cloudfront/cache-on-selected-headers
          2. CloudFront adds the CloudFront-Viewer-Country header after the viewer
            request event. To use this example, you must create a trigger for the
            origin request event.
    '''

    countryToRegion = {
        'DE': 'eu-central-1',
        'IE': 'eu-west-1',
        'GB': 'eu-west-2',
        'FR': 'eu-west-3',
        'JP': 'ap-northeast-1',
        'IN': 'ap-south-1'
    }

    viewerCountry = request['headers'].get('cloudfront-viewer-country')
    if viewerCountry:
        countryCode = viewerCountry[0]['value']
        region = countryToRegion.get(countryCode)

        # If the viewer's country in not in the list you specify, the request
        # goes to the default S3 bucket you've configured
        if region:
            '''
            If you've set up OAI, the bucket policy in the destination bucket
            should allow the OAI GetObject operation, as configured by default
            for an S3 origin with OAI. Another requirement with OAI is to provide
            the Region so it can be used for the SIGV4 signature. Otherwise, the
            Region is not required.
            '''
            request['origin']['s3']['region'] = region
            domainName = 'amzn-s3-demo-bucket-in-{0}.s3.{0}.amazonaws.com'.format(region)
            request['origin']['s3']['domainName'] = domainName
            request['headers']['host'] = [{'key': 'host', 'value': domainName}]

    return request
```

------

### Contoh: Menggunakan pemicu permintaan asal untuk mengubah dari asal Amazon S3 ke asal kustom
<a name="lambda-examples-content-based-custom-origin-request-trigger"></a>

Fungsi ini menunjukkan bagaimana pemicu permintaan asal dapat digunakan untuk mengubah asal kustom dari mana konten diambil, berdasarkan sifat permintaan.

------
#### [ Node.js ]

```
'use strict';

const querystring = require('querystring');
 
 exports.handler = (event, context, callback) => {
     const request = event.Records[0].cf.request;
 
     /**
      * Reads query string to check if custom origin should be used, and
      * if true, sets custom origin properties.
      */
 
     const params = querystring.parse(request.querystring);
 
     if (params['useCustomOrigin']) {
         if (params['useCustomOrigin'] === 'true') {
 
             /* Set custom origin fields*/
             request.origin = {
                 custom: {
                     domainName: 'www.example.com',
                     port: 443,
                     protocol: 'https',
                     path: '',
                     sslProtocols: ['TLSv1', 'TLSv1.1'],
                     readTimeout: 5,
                     keepaliveTimeout: 5,
                     customHeaders: {}
                 }
             };
             request.headers['host'] = [{ key: 'host', value: 'www.example.com'}];
         }
     }
    callback(null, request);
};
```

------
#### [ Python ]

```
from urllib.parse import parse_qs

def lambda_handler(event, context):
    request = event['Records'][0]['cf']['request']

    # Reads query string to check if custom origin should be used, and
    # if true, sets custom origin properties

    params = {k: v[0] for k, v in parse_qs(request['querystring']).items()}

    if params.get('useCustomOrigin') == 'true':
            # Set custom origin fields
            request['origin'] = {
                'custom': {
                    'domainName': 'www.example.com',
                    'port': 443,
                    'protocol': 'https',
                    'path': '',
                    'sslProtocols': ['TLSv1', 'TLSv1.1'],
                    'readTimeout': 5,
                    'keepaliveTimeout': 5,
                    'customHeaders': {}
                }
            }
            request['headers']['host'] = [{'key': 'host', 'value': 'www.example.com'}]

    return request
```

------

### Contoh: Gunakan pemicu permintaan asal untuk mentransfer lalu lintas secara bertahap dari satu bucket Amazon S3 ke bucket lainnya
<a name="lambda-examples-content-based-gradual-traffic-transfer"></a>

Fungsi ini menunjukkan bagaimana Anda dapat secara bertahap mentransfer lalu lintas dari satu bucket Amazon S3 ke bucket lain dengan cara yang terkontrol.

------
#### [ Node.js ]

```
'use strict';

    function getRandomInt(min, max) {
        /* Random number is inclusive of min and max*/
        return Math.floor(Math.random() * (max - min + 1)) + min;
 }

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;
    const BLUE_TRAFFIC_PERCENTAGE = 80;

    /**
      * This Lambda function demonstrates how to gradually transfer traffic from
      * one S3 bucket to another in a controlled way.
      * We define a variable BLUE_TRAFFIC_PERCENTAGE which can take values from
      * 1 to 100. If the generated randomNumber less than or equal to BLUE_TRAFFIC_PERCENTAGE, traffic
      * is re-directed to blue-bucket. If not, the default bucket that we've configured
      * is used.
      */

    const randomNumber = getRandomInt(1, 100);

if (randomNumber <= BLUE_TRAFFIC_PERCENTAGE) {
         const domainName = 'blue-bucket.s3.amazonaws.com';
         request.origin.s3.domainName = domainName;
         request.headers['host'] = [{ key: 'host', value: domainName}];
     }
    callback(null, request);
};
```

------
#### [ Python ]

```
import math
import random

def getRandomInt(min, max):
    # Random number is inclusive of min and max
    return math.floor(random.random() * (max - min + 1)) + min

def lambda_handler(event, context):
    request = event['Records'][0]['cf']['request']
    BLUE_TRAFFIC_PERCENTAGE = 80

    '''
    This Lambda function demonstrates how to gradually transfer traffic from
    one S3 bucket to another in a controlled way.
    We define a variable BLUE_TRAFFIC_PERCENTAGE which can take values from
    1 to 100. If the generated randomNumber less than or equal to BLUE_TRAFFIC_PERCENTAGE, traffic
    is re-directed to blue-bucket. If not, the default bucket that we've configured
    is used.
    '''

    randomNumber = getRandomInt(1, 100)

    if randomNumber <= BLUE_TRAFFIC_PERCENTAGE:
        domainName = 'blue-bucket.s3.amazonaws.com'
        request['origin']['s3']['domainName'] = domainName
        request['headers']['host'] = [{'key': 'host', 'value': domainName}]

    return request
```

------

### Contoh: Gunakan pemicu permintaan asal untuk mengubah nama domain asal berdasarkan header negara
<a name="lambda-examples-content-based-geo-header"></a>

Fungsi ini menunjukkan bagaimana Anda dapat mengubah nama domain asal berdasarkan `CloudFront-Viewer-Country` header, sehingga konten disajikan dari asal yang lebih dekat ke negara pemirsa.

Mengimplementasikan fungsi ini untuk distribusi Anda dapat memiliki keuntungan seperti berikut ini:
+ Mengurangi keterlambatan jika Wilayah yang ditentukan lebih dekat dengan negara penampil
+ Memberikan kedaulatan data dengan memastikan bahwa data tersebut berasal dari negara yang sama dengan negara asal permintaan

Perhatikan bahwa untuk mengaktifkan fungsi ini, Anda harus mengonfigurasi distribusi Anda ke cache berdasarkan `CloudFront-Viewer-Country` header. Untuk informasi selengkapnya, lihat [Cache berdasarkan header permintaan yang dipilih](DownloadDistValuesCacheBehavior.md#DownloadDistValuesForwardHeaders).

------
#### [ Node.js ]

```
'use strict';

exports.handler = (event, context, callback) => {
     const request = event.Records[0].cf.request;
     
  if (request.headers['cloudfront-viewer-country']) {
         const countryCode = request.headers['cloudfront-viewer-country'][0].value;
         if (countryCode === 'GB' || countryCode === 'DE' || countryCode === 'IE' ) {
             const domainName = 'eu.example.com';
             request.origin.custom.domainName = domainName;
             request.headers['host'] = [{key: 'host', value: domainName}];
         } 
     }
     
    callback(null, request);
};
```

------
#### [ Python ]

```
def lambda_handler(event, context):
    request = event['Records'][0]['cf']['request']

    viewerCountry = request['headers'].get('cloudfront-viewer-country')
    if viewerCountry:
        countryCode = viewerCountry[0]['value']
        if countryCode == 'GB' or countryCode == 'DE' or countryCode == 'IE':
            domainName = 'eu.example.com'
            request['origin']['custom']['domainName'] = domainName
            request['headers']['host'] = [{'key': 'host', 'value': domainName}]
    return request
```

------

## Perbarui status kesalahan - contoh
<a name="lambda-examples-update-error-status-examples"></a>

Contoh berikut memberikan panduan bagaimana Anda dapat menggunakan Lambda @Edge untuk mengubah status kesalahan yang dikembalikan ke pengguna.

**Topics**
+ [Contoh: Gunakan pemicu respons asal untuk memperbarui kode status kesalahan ke 200](#lambda-examples-custom-error-static-body)
+ [Contoh: Gunakan pemicu respons asal untuk memperbarui kode status kesalahan ke 302](#lambda-examples-custom-error-new-site)

### Contoh: Gunakan pemicu respons asal untuk memperbarui kode status kesalahan ke 200
<a name="lambda-examples-custom-error-static-body"></a>

Fungsi ini menunjukkan bagaimana Anda dapat memperbarui status respons menjadi 200 dan menghasilkan konten tubuh statis untuk kembali ke penampil dalam skenario berikut:
+ Fungsi dipicu dalam respons asal.
+ Status respons dari server asal adalah kode status kesalahan (4xx atau 5xx).

------
#### [ Node.js ]

```
'use strict';

exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;

    /**
     * This function updates the response status to 200 and generates static
     * body content to return to the viewer in the following scenario:
     * 1. The function is triggered in an origin response
     * 2. The response status from the origin server is an error status code (4xx or 5xx)
     */

    if (response.status >= 400 && response.status <= 599) {
        response.status = 200;
        response.statusDescription = 'OK';
        response.body = 'Body generation example';
    }

    callback(null, response);
};
```

------
#### [ Python ]

```
def lambda_handler(event, context):
    response = event['Records'][0]['cf']['response']

    '''
    This function updates the response status to 200 and generates static
    body content to return to the viewer in the following scenario:
    1. The function is triggered in an origin response
    2. The response status from the origin server is an error status code (4xx or 5xx)
    '''

    if int(response['status']) >= 400 and int(response['status']) <= 599:
        response['status'] = 200
        response['statusDescription'] = 'OK'
        response['body'] = 'Body generation example'
    return response
```

------

### Contoh: Gunakan pemicu respons asal untuk memperbarui kode status kesalahan ke 302
<a name="lambda-examples-custom-error-new-site"></a>

Fungsi ini menunjukkan cara Anda dapat memperbarui kode status HTTP ke 302 untuk mengalihkan ke jalur lain (perilaku kesalahan) yang memiliki asal berbeda yang dikonfigurasi. Perhatikan hal-hal berikut:
+ Fungsi dipicu dalam respons asal.
+ Status respons dari server asal adalah kode status kesalahan (4xx atau 5xx).

------
#### [ Node.js ]

```
'use strict';

exports.handler = (event, context, callback) => {
    const response = event.Records[0].cf.response;
    const request = event.Records[0].cf.request;

    /**
     * This function updates the HTTP status code in the response to 302, to redirect to another
     * path (cache behavior) that has a different origin configured. Note the following:
     * 1. The function is triggered in an origin response
     * 2. The response status from the origin server is an error status code (4xx or 5xx)
     */

    if (response.status >= 400 && response.status <= 599) {
        const redirect_path = `/plan-b/path?${request.querystring}`;

        response.status = 302;
        response.statusDescription = 'Found';

        /* Drop the body, as it is not required for redirects */
        response.body = '';
        response.headers['location'] = [{ key: 'Location', value: redirect_path }];
    }

    callback(null, response);
};
```

------
#### [ Python ]

```
def lambda_handler(event, context):
    response = event['Records'][0]['cf']['response']
    request = event['Records'][0]['cf']['request']

    '''
    This function updates the HTTP status code in the response to 302, to redirect to another
    path (cache behavior) that has a different origin configured. Note the following:
    1. The function is triggered in an origin response
    2. The response status from the origin server is an error status code (4xx or 5xx)
    '''

    if int(response['status']) >= 400 and int(response['status']) <= 599:
        redirect_path = '/plan-b/path?%s' % request['querystring']

        response['status'] = 302
        response['statusDescription'] = 'Found'

        # Drop the body as it is not required for redirects
        response['body'] = ''
        response['headers']['location'] = [{'key': 'Location', 'value': redirect_path}]

    return response
```

------

## Akses badan permintaan - contoh
<a name="lambda-examples-access-request-body-examples"></a>

Contoh berikut menunjukkan bagaimana Anda dapat menggunakan Lambda @Edge untuk bekerja dengan permintaan POST.

**catatan**  
Untuk menggunakan contoh ini, Anda harus mengaktifkan opsi *include body* dalam asosiasi fungsi Lambda distribusi. Ini tidak diaktifkan secara default.  
Untuk mengaktifkan pengaturan ini di CloudFront konsol, pilih kotak centang untuk **Sertakan Tubuh** di Asosiasi **Fungsi Lambda**.
Untuk mengaktifkan setelan ini di CloudFront API atau dengan CloudFormation, setel `IncludeBody` bidang ke `true` in`LambdaFunctionAssociation`.

**Topics**
+ [Contoh: Gunakan pemicu permintaan untuk membaca formulir HTML](#lambda-examples-access-request-body-examples-read)
+ [Contoh: Gunakan pemicu permintaan untuk memodifikasi formulir HTML](#lambda-examples-access-request-body-examples-replace)

### Contoh: Gunakan pemicu permintaan untuk membaca formulir HTML
<a name="lambda-examples-access-request-body-examples-read"></a>

Fungsi ini menunjukkan bagaimana Anda dapat memproses isi permintaan POST yang dibuat oleh formulir HTML (formulir web), seperti formulir “hubungi kami”. Misalnya, Anda mungkin memiliki formulir HTML seperti berikut ini:

```
<html>
  <form action="https://example.com" method="post">
    Param 1: <input type="text" name="name1"><br>
    Param 2: <input type="text" name="name2"><br>
    input type="submit" value="Submit">
  </form>
</html>
```

Untuk fungsi contoh berikut, fungsi harus dipicu dalam CloudFront permintaan penampil atau permintaan asal.

------
#### [ Node.js ]

```
'use strict';

const querystring = require('querystring');

/**
 * This function demonstrates how you can read the body of a POST request 
 * generated by an HTML form (web form). The function is triggered in a
 * CloudFront viewer request or origin request event type.
 */

exports.handler = (event, context, callback) => {
    const request = event.Records[0].cf.request;

    if (request.method === 'POST') {
        /* HTTP body is always passed as base64-encoded string. Decode it. */
        const body = Buffer.from(request.body.data, 'base64').toString();
 
        /* HTML forms send the data in query string format. Parse it. */
        const params = querystring.parse(body);
 
        /* For demonstration purposes, we only log the form fields here.
         * You can put your custom logic here. For example, you can store the 
         * fields in a database, such as Amazon DynamoDB, and generate a response
         * right from your Lambda@Edge function.
         */
        for (let param in params) {
            console.log(`For "${param}" user submitted "${params[param]}".\n`);
        }
    }
    return callback(null, request);
};
```

------
#### [ Python ]

```
import base64
from urllib.parse import parse_qs

'''
Say there is a POST request body generated by an HTML such as:

<html>
<form action="https://example.com" method="post">
    Param 1: <input type="text" name="name1"><br>
    Param 2: <input type="text" name="name2"><br>
    input type="submit" value="Submit">
</form>
</html>

'''

'''
This function demonstrates how you can read the body of a POST request 
generated by an HTML form (web form). The function is triggered in a
CloudFront viewer request or origin request event type.
'''

def lambda_handler(event, context):
    request = event['Records'][0]['cf']['request']

    if request['method'] == 'POST':
        # HTTP body is always passed as base64-encoded string. Decode it
        body = base64.b64decode(request['body']['data'])

        # HTML forms send the data in query string format. Parse it
        params = {k: v[0] for k, v in parse_qs(body).items()}

        '''
        For demonstration purposes, we only log the form fields here.
        You can put your custom logic here. For example, you can store the
        fields in a database, such as Amazon DynamoDB, and generate a response
        right from your Lambda@Edge function.
        '''
        for key, value in params.items():
            print("For %s use submitted %s" % (key, value))
            
    return request
```

------

### Contoh: Gunakan pemicu permintaan untuk memodifikasi formulir HTML
<a name="lambda-examples-access-request-body-examples-replace"></a>

Fungsi ini menunjukkan bagaimana Anda dapat memodifikasi isi permintaan POST yang dibuat oleh formulir HTML (formulir web). Fungsi ini dipicu dalam permintaan CloudFront penampil atau permintaan asal.

------
#### [ Node.js ]

```
'use strict';
				
const querystring = require('querystring');

exports.handler = (event, context, callback) => {
    var request = event.Records[0].cf.request;
    if (request.method === 'POST') {
        /* Request body is being replaced. To do this, update the following
        /* three fields:
         *    1) body.action to 'replace'
         *    2) body.encoding to the encoding of the new data.
         *
         *       Set to one of the following values:
         *
         *           text - denotes that the generated body is in text format.
         *               Lambda@Edge will propagate this as is.
         *           base64 - denotes that the generated body is base64 encoded.
         *               Lambda@Edge will base64 decode the data before sending
         *               it to the origin.
         *    3) body.data to the new body.
         */
        request.body.action = 'replace';
        request.body.encoding = 'text';
        request.body.data = getUpdatedBody(request);
    }
    callback(null, request);
};

function getUpdatedBody(request) {
    /* HTTP body is always passed as base64-encoded string. Decode it. */
    const body = Buffer.from(request.body.data, 'base64').toString();

    /* HTML forms send data in query string format. Parse it. */
    const params = querystring.parse(body);

    /* For demonstration purposes, we're adding one more param.
     *
     * You can put your custom logic here. For example, you can truncate long
     * bodies from malicious requests.
     */
    params['new-param-name'] = 'new-param-value';
    return querystring.stringify(params);
}
```

------
#### [ Python ]

```
import base64
from urllib.parse import parse_qs, urlencode

def lambda_handler(event, context):
    request = event['Records'][0]['cf']['request']
    if request['method'] == 'POST':
        '''
        Request body is being replaced. To do this, update the following
        three fields:
            1) body.action to 'replace'
            2) body.encoding to the encoding of the new data.
        
            Set to one of the following values:
        
                text - denotes that the generated body is in text format.
                    Lambda@Edge will propagate this as is.
                base64 - denotes that the generated body is base64 encoded.
                    Lambda@Edge will base64 decode the data before sending
                    it to the origin.
            3) body.data to the new body.
        '''
        request['body']['action'] = 'replace'
        request['body']['encoding'] = 'text'
        request['body']['data'] = getUpdatedBody(request)
    return request

def getUpdatedBody(request):
    # HTTP body is always passed as base64-encoded string. Decode it
    body = base64.b64decode(request['body']['data'])

    # HTML forms send data in query string format. Parse it
    params = {k: v[0] for k, v in parse_qs(body).items()}

    # For demonstration purposes, we're adding one more param

    # You can put your custom logic here. For example, you can truncate long
    # bodies from malicious requests
    params['new-param-name'] = 'new-param-value'
    return urlencode(params)
```

------