

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

# Memanggil Lambda dengan acara dari layanan lain AWS
<a name="lambda-services"></a>

*Beberapa Layanan AWS dapat langsung memanggil fungsi Lambda menggunakan pemicu.* Layanan ini mendorong peristiwa ke Lambda, dan fungsi segera dipanggil saat peristiwa yang ditentukan terjadi. Pemicu cocok untuk peristiwa diskrit dan pemrosesan waktu nyata. Saat Anda [membuat pemicu menggunakan konsol Lambda, konsol](#lambda-invocation-trigger) berinteraksi dengan AWS layanan terkait untuk mengonfigurasi pemberitahuan peristiwa pada layanan tersebut. Pemicunya sebenarnya disimpan dan dikelola oleh layanan yang menghasilkan peristiwa, bukan oleh Lambda.

Peristiwa adalah data yang terstruktur dalam format JSON. Struktur JSON bervariasi tergantung pada layanan yang menghasilkannya dan jenis acara, tetapi semuanya berisi data yang dibutuhkan fungsi untuk memproses acara.

Suatu fungsi dapat memiliki banyak pemicu. Setiap pemicu bertindak sebagai klien yang menjalankan fungsi Anda secara independen, dan setiap peristiwa yang diteruskan Lambda ke fungsi Anda hanya memiliki data dari satu pemicu. Lambda mengubah dokumen acara menjadi objek dan meneruskannya ke penangan fungsi Anda.

[[Bergantung pada layanannya, pemanggilan yang digerakkan oleh peristiwa dapat sinkron atau asinkron.](invocation-async.md)](invocation-sync.md)
+ Untuk pemanggilan sinkron, layanan yang menghasilkan acara menunggu respons dari fungsi Anda. Layanan itu mendefinisikan data yang diperlukan fungsi untuk dikembalikan dalam respons. Layanan mengontrol strategi kesalahan, seperti apakah akan mencoba lagi kesalahan.
+ Untuk invokasi asinkron, Lambda mengantrekan peristiwa sebelum memberikannya ke fungsi Anda. Ketika Lambda mengantri acara, ia segera mengirimkan respons sukses ke layanan yang menghasilkan acara tersebut. Setelah fungsi memproses peristiwa, Lambda tidak mengembalikan respons ke layanan penghasil peristiwa.

## Membuat pemicu
<a name="lambda-invocation-trigger"></a>

Cara termudah untuk membuat pemicu adalah dengan menggunakan konsol Lambda. [Saat Anda membuat pemicu menggunakan konsol, Lambda secara otomatis menambahkan izin yang diperlukan ke kebijakan berbasis sumber daya fungsi.](access-control-resource-based.md)

**Untuk membuat pemicu menggunakan konsol Lambda**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi yang ingin Anda buat pemicu.

1. Di panel **Ikhtisar fungsi**, pilih **Tambah pemicu**.

1. Pilih AWS layanan yang ingin Anda gunakan untuk menjalankan fungsi Anda.

1. Isi opsi di panel **konfigurasi Pemicu** dan pilih **Tambah**. Bergantung pada pilihan Layanan AWS Anda untuk menjalankan fungsi Anda, opsi konfigurasi pemicu akan berbeda.

## Layanan yang dapat memanggil fungsi Lambda
<a name="listing-of-services-and-links-to-more-information"></a>

Tabel berikut mencantumkan layanan yang dapat memanggil fungsi Lambda.


****  

| Layanan | Metode pemanggilan | 
| --- | --- | 
|  [Amazon Managed Streaming for Apache Kafka](with-msk.md)  |  [Pemetaan sumber acara](invocation-eventsourcemapping.md)  | 
|  [Apache Kafka yang dikelola sendiri](with-kafka.md)  |  [Pemetaan sumber acara](invocation-eventsourcemapping.md)  | 
|  [Amazon API Gateway](services-apigateway.md)  |  Digerakkan oleh peristiwa; doa sinkron  | 
|  [AWS CloudFormation](services-cloudformation.md)  |  Digerakkan oleh peristiwa; pemanggilan asinkron  | 
|  [ CloudWatch Log Amazon](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SubscriptionFilters.html#LambdaFunctionExample)  |  Digerakkan oleh peristiwa; pemanggilan asinkron  | 
|  [AWS CodeCommit](https://docs.aws.amazon.com/codecommit/latest/userguide/how-to-notify-lambda-cc.html)  |  Digerakkan oleh peristiwa; pemanggilan asinkron  | 
|  [AWS CodePipeline](https://docs.aws.amazon.com/codepipeline/latest/userguide/actions-invoke-lambda-function.html)  |  Digerakkan oleh peristiwa; pemanggilan asinkron  | 
|  [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-events.html)  |  Digerakkan oleh peristiwa; doa sinkron  | 
|  [AWS Config](governance-config.md)  |  Digerakkan oleh peristiwa; pemanggilan asinkron  | 
|  [Amazon Connect](https://docs.aws.amazon.com/connect/latest/adminguide/connect-lambda-functions.html)  |  Digerakkan oleh peristiwa; doa sinkron  | 
|  [Amazon DocumentDB](with-documentdb.md)  |  [Pemetaan sumber acara](invocation-eventsourcemapping.md)  | 
|  [Amazon DynamoDB](with-ddb.md)  |  [Pemetaan sumber acara](invocation-eventsourcemapping.md)  | 
|  [Elastic Load Balancing (Application Load Balancer)](services-alb.md)  |  Digerakkan oleh peristiwa; doa sinkron  | 
|  [Amazon EventBridge (CloudWatch Acara)](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html)  |  Digerakkan oleh peristiwa; pemanggilan asinkron (bus acara), pemanggilan sinkron atau asinkron (pipa dan jadwal)  | 
|  [AWS IoT](services-iot.md)  |  Digerakkan oleh peristiwa; pemanggilan asinkron  | 
|  [Amazon Kinesis](with-kinesis.md)  |  [Pemetaan sumber acara](invocation-eventsourcemapping.md)  | 
|  [Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/data-transformation.html)  |  Digerakkan oleh peristiwa; doa sinkron  | 
|  [Amazon Lex](https://docs.aws.amazon.com/lexv2/latest/dg/lambda.html)  |  Digerakkan oleh peristiwa; doa sinkron  | 
|  [Amazon MQ](with-mq.md)  |  [Pemetaan sumber acara](invocation-eventsourcemapping.md)  | 
|  [Layanan Email Amazon Sederhana](https://docs.aws.amazon.com/ses/latest/dg/receiving-email-action-lambda.html)  |  Digerakkan oleh peristiwa; pemanggilan asinkron  | 
|  [Layanan Pemberitahuan Sederhana Amazon](with-sns.md)  |  Digerakkan oleh peristiwa; pemanggilan asinkron  | 
|  [Amazon Simple Queue Service](with-sqs.md)  |  [Pemetaan sumber acara](invocation-eventsourcemapping.md)  | 
|  [Amazon Simple Storage Service](with-s3.md) (Amazon S3)  |  Digerakkan oleh peristiwa; pemanggilan asinkron  | 
|  [Batch Layanan Penyimpanan Sederhana Amazon](services-s3-batch.md)  |  Digerakkan oleh peristiwa; doa sinkron  | 
|  [Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotate-secrets_lambda.html)  |  Rotasi rahasia  | 
|  [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/connect-lambda.html)  |  Digerakkan oleh peristiwa; pemanggilan sinkron atau asinkron  | 
|  [Kisi VPC Amazon](https://docs.aws.amazon.com/vpc-lattice/latest/ug/lambda-functions.html)  |  Digerakkan oleh peristiwa; doa sinkron  | 

# Menggunakan Lambda dengan Apache Kafka
<a name="with-kafka-esm"></a>

Lambda mendukung [Apache Kafka](https://kafka.apache.org/) sebagai [sumber peristiwa](invocation-eventsourcemapping.md). Apache Kafka adalah platform streaming acara open-source yang dirancang untuk menangani saluran data real-time dan aplikasi streaming throughput tinggi. Ada dua cara utama untuk menggunakan Lambda dengan Apache Kafka:
+ [Menggunakan Lambda dengan Amazon MSK](with-msk.md)- Amazon Managed Streaming for Apache Kafka (Amazon MSK) adalah layanan yang dikelola sepenuhnya oleh. AWS Amazon MSK membantu mengotomatiskan pengelolaan infrastruktur Kafka Anda, termasuk penyediaan, penambalan, dan penskalaan.
+ [Menggunakan Lambda dengan Apache Kafka yang dikelola sendiri](with-kafka.md)— Dalam AWS terminologi, cluster yang dikelola sendiri mencakup cluster Kafka yang tidak AWS dihosting. [Misalnya, Anda masih dapat menggunakan Lambda dengan cluster Kafka yang dihosting dengan penyedia AWS non-cloud seperti [Confluent](https://www.confluent.io/confluent-cloud/) Cloud atau Redpanda.](https://www.redpanda.com/)

Saat memutuskan antara Amazon MSK dan Apache Kafka yang dikelola sendiri, pertimbangkan kebutuhan operasional dan persyaratan kontrol Anda. Amazon MSK adalah pilihan yang lebih baik jika Anda AWS ingin dengan cepat membantu Anda mengelola pengaturan Kafka yang dapat diskalakan dan siap produksi dengan overhead operasional minimal. Ini menyederhanakan keamanan, pemantauan, dan ketersediaan tinggi, membantu Anda fokus pada pengembangan aplikasi daripada manajemen infrastruktur. Di sisi lain, Apache Kafka yang dikelola sendiri lebih cocok untuk kasus penggunaan yang berjalan di lingkungan yang tidak AWS dihosting, termasuk cluster lokal.

**Topics**
+ [

# Menggunakan Lambda dengan Amazon MSK
](with-msk.md)
+ [

# Menggunakan Lambda dengan Apache Kafka yang dikelola sendiri
](with-kafka.md)
+ [

# Mode penskalaan poller acara Apache Kafka di Lambda
](kafka-scaling-modes.md)
+ [

# Posisi awal pemungutan suara dan streaming Apache Kafka di Lambda
](kafka-starting-positions.md)
+ [

# ID grup konsumen yang dapat disesuaikan di Lambda
](kafka-consumer-group-id.md)
+ [

# Memfilter acara dari Amazon MSK dan sumber acara Apache Kafka yang dikelola sendiri
](kafka-filtering.md)
+ [

# Menggunakan pendaftar skema dengan sumber acara Kafka di Lambda
](services-consume-kafka-events.md)
+ [

# Pemrosesan latensi rendah untuk sumber acara Kafka
](with-kafka-low-latency.md)
+ [

# Mengonfigurasi kontrol penanganan kesalahan untuk sumber acara Kafka
](kafka-retry-configurations.md)
+ [

# Menangkap batch yang dibuang untuk Amazon MSK dan sumber acara Apache Kafka yang dikelola sendiri
](kafka-on-failure.md)
+ [

# Menggunakan topik Kafka sebagai tujuan kegagalan
](kafka-on-failure-destination.md)
+ [

# Pencatatan pemetaan sumber acara Kafka
](esm-logging.md)
+ [

# Memecahkan masalah kesalahan pemetaan sumber acara Kafka
](with-kafka-troubleshoot.md)

# Menggunakan Lambda dengan Amazon MSK
<a name="with-msk"></a>

[Amazon Managed Streaming for Apache Kafka (Amazon](https://docs.aws.amazon.com/msk/latest/developerguide/what-is-msk.html) MSK) adalah layanan yang dikelola sepenuhnya yang dapat Anda gunakan untuk membangun dan menjalankan aplikasi yang menggunakan Apache Kafka untuk memproses data streaming. Amazon MSK menyederhanakan pengaturan, penskalaan, dan pengelolaan cluster Kafka. Amazon MSK juga memudahkan untuk mengkonfigurasi aplikasi Anda untuk beberapa Availability Zone dan untuk keamanan dengan AWS Identity and Access Management (IAM).

Bab ini menjelaskan cara menggunakan kluster MSK Amazon sebagai sumber peristiwa untuk fungsi Lambda Anda. Proses umum untuk mengintegrasikan Amazon MSK dengan Lambda melibatkan langkah-langkah berikut:

1. **[Pengaturan kluster dan jaringan](with-msk-cluster-network.md)** — Pertama, siapkan [kluster MSK Amazon](https://docs.aws.amazon.com/msk/latest/developerguide/what-is-msk.html) Anda. Ini termasuk konfigurasi jaringan yang benar untuk memungkinkan Lambda mengakses cluster Anda.

1. **[Pengaturan pemetaan sumber peristiwa](with-msk-configure.md)** — Kemudian, buat sumber daya [pemetaan sumber peristiwa](invocation-eventsourcemapping.md) yang dibutuhkan Lambda untuk menghubungkan kluster MSK Amazon Anda dengan aman ke fungsi Anda.

1. **[Pengaturan fungsi dan izin](with-msk-permissions.md)** — Terakhir, pastikan bahwa fungsi Anda diatur dengan benar, dan memiliki izin yang diperlukan dalam peran [pelaksanaannya](lambda-intro-execution-role.md).

**catatan**  
Anda sekarang dapat membuat dan mengelola pemetaan sumber acara MSK Amazon Anda langsung dari konsol Lambda atau Amazon MSK. Kedua konsol menawarkan opsi untuk secara otomatis menangani pengaturan izin peran eksekusi Lambda yang diperlukan untuk proses konfigurasi yang lebih efisien.

Untuk contoh tentang cara menyiapkan integrasi Lambda dengan kluster MSK Amazon, lihat, [Tutorial: Menggunakan pemetaan sumber peristiwa MSK Amazon untuk menjalankan fungsi Lambda](services-msk-tutorial.md) Menggunakan [Amazon MSK sebagai sumber acara](https://aws.amazon.com/blogs/compute/using-amazon-msk-as-an-event-source-for-aws-lambda/) di AWS Blog Komputasi, dan Integrasi [Lambda MSK Amazon AWS Lambda di Labs MSK](https://amazonmsk-labs.workshop.aws/en/msklambda.html) Amazon.

**Topics**
+ [

## Contoh peristiwa
](#msk-sample-event)
+ [

# Mengonfigurasi kluster MSK Amazon dan jaringan VPC Amazon untuk Lambda
](with-msk-cluster-network.md)
+ [

# Mengonfigurasi izin Lambda untuk pemetaan sumber acara MSK Amazon
](with-msk-permissions.md)
+ [

# Mengonfigurasi sumber acara MSK Amazon untuk Lambda
](with-msk-configure.md)
+ [

# Tutorial: Menggunakan pemetaan sumber peristiwa MSK Amazon untuk menjalankan fungsi Lambda
](services-msk-tutorial.md)

## Contoh peristiwa
<a name="msk-sample-event"></a>

Lambda mengirimkan batch pesan dalam parameter peristiwa ketika memanggil fungsi Anda. Muatan peristiwa berisi array pesan. Setiap item array berisi detail dari topik Amazon MSK dan pengidentifikasi partisi, bersama-sama dengan stempel waktu dan pesan berkode base64.

```
{
   "eventSource":"aws:kafka",
   "eventSourceArn":"arn:aws:kafka:us-east-1:123456789012:cluster/vpc-2priv-2pub/751d2973-a626-431c-9d4e-d7975eb44dd7-2",
   "bootstrapServers":"b-2.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092,b-1.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092",
   "records":{
      "mytopic-0":[
         {
            "topic":"mytopic",
            "partition":0,
            "offset":15,
            "timestamp":1545084650987,
            "timestampType":"CREATE_TIME",
            "key":"abcDEFghiJKLmnoPQRstuVWXyz1234==",
            "value":"SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==",
            "headers":[
               {
                  "headerKey":[
                     104,
                     101,
                     97,
                     100,
                     101,
                     114,
                     86,
                     97,
                     108,
                     117,
                     101
                  ]
               }
            ]
         }
      ]
   }
}
```

# Mengonfigurasi kluster MSK Amazon dan jaringan VPC Amazon untuk Lambda
<a name="with-msk-cluster-network"></a>

Untuk menghubungkan AWS Lambda fungsi Anda ke kluster MSK Amazon, Anda perlu mengonfigurasi klaster dengan benar dan [Amazon Virtual Private Cloud (VPC) tempat ia](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html) berada. Halaman ini menjelaskan cara mengkonfigurasi cluster dan VPC Anda. Jika cluster dan VPC Anda sudah dikonfigurasi dengan benar, lihat [Mengonfigurasi sumber acara MSK Amazon untuk Lambda](with-msk-configure.md) untuk mengonfigurasi pemetaan sumber peristiwa.

**Topics**
+ [

## Ikhtisar persyaratan konfigurasi jaringan untuk integrasi Lambda dan MSK
](#msk-network-requirements)
+ [

## Mengkonfigurasi gateway NAT untuk sumber acara MSK
](#msk-nat-gateway)
+ [

## Mengkonfigurasi AWS PrivateLink titik akhir untuk sumber acara MSK
](#msk-vpc-privatelink)

## Ikhtisar persyaratan konfigurasi jaringan untuk integrasi Lambda dan MSK
<a name="msk-network-requirements"></a>

Konfigurasi jaringan yang diperlukan untuk integrasi Lambda dan MSK bergantung pada arsitektur jaringan aplikasi Anda. Ada tiga sumber daya utama yang terlibat dalam integrasi ini: cluster MSK Amazon, fungsi Lambda, dan pemetaan sumber peristiwa Lambda. Masing-masing sumber daya ini berada di VPC yang berbeda:
+ Cluster MSK Amazon Anda biasanya berada di subnet pribadi VPC yang Anda kelola.
+ Fungsi Lambda Anda berada di VPC terkelola yang dimiliki oleh AWS Lambda.
+ Pemetaan sumber peristiwa Lambda Anda berada di AWS VPC terkelola lain yang dimiliki oleh Lambda, terpisah dari VPC yang berisi fungsi Anda.

[Pemetaan sumber peristiwa](invocation-eventsourcemapping.md) adalah sumber daya perantara antara kluster MSK dan fungsi Lambda. Pemetaan sumber acara memiliki dua pekerjaan utama. Pertama, ia polling cluster MSK Anda untuk pesan baru. Kemudian, ia memanggil fungsi Lambda Anda dengan pesan-pesan itu. Karena ketiga sumber daya ini berbeda VPCs, operasi polling dan pemanggilan memerlukan panggilan jaringan lintas-VPC.

Persyaratan konfigurasi jaringan untuk pemetaan sumber peristiwa Anda bergantung pada apakah menggunakan mode yang [disediakan atau mode](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode) sesuai permintaan, seperti yang ditunjukkan pada diagram berikut:

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/MSK-esm-network-overview.png)


Cara pemetaan sumber peristiwa Lambda melakukan polling pada cluster MSK Anda untuk pesan baru adalah sama di kedua mode. Untuk membuat koneksi antara pemetaan sumber peristiwa dan kluster MSK Anda, Lambda membuat [ENI hyperplane](configuration-vpc.md#configuration-vpc-enis) (atau menggunakan kembali yang sudah ada, jika tersedia) di subnet pribadi Anda untuk membuat koneksi yang aman. Seperti yang diilustrasikan dalam diagram, ENI hyperplane ini menggunakan konfigurasi subnet dan grup keamanan klaster MSK Anda, bukan fungsi Lambda Anda.

Setelah polling pesan dari cluster, cara Lambda memanggil fungsi Anda berbeda di setiap mode:
+ Dalam mode yang disediakan, Lambda secara otomatis menangani koneksi antara VPC pemetaan sumber peristiwa dan fungsi VPC. Jadi, Anda tidak memerlukan komponen jaringan tambahan untuk berhasil menjalankan fungsi Anda.
+ Dalam mode sesuai permintaan, pemetaan sumber peristiwa Lambda Anda memanggil fungsi Anda melalui jalur melalui VPC yang dikelola pelanggan. [Karena itu, Anda perlu mengonfigurasi [gateway NAT di](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html) subnet publik VPC Anda, atau [AWS PrivateLink](https://docs.aws.amazon.com/vpc/latest/privatelink/what-is-privatelink.html)titik akhir di subnet pribadi VPC yang menyediakan akses ke Lambda, (STS), dan secara opsional,.AWS Security Token Service[AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html) Mengkonfigurasi salah satu dari opsi ini dengan benar memungkinkan koneksi antara VPC Anda dan VPC runtime yang dikelola Lambda, yang diperlukan untuk menjalankan fungsi Anda.

Gateway NAT memungkinkan sumber daya di subnet pribadi Anda untuk mengakses internet publik. Menggunakan konfigurasi ini berarti lalu lintas Anda melintasi internet sebelum menjalankan fungsi Lambda. AWS PrivateLink endpoint memungkinkan subnet pribadi terhubung dengan aman ke AWS layanan atau sumber VPC pribadi lainnya tanpa melintasi internet publik. Lihat [Mengkonfigurasi gateway NAT untuk sumber acara MSK](#msk-nat-gateway) atau [Mengkonfigurasi AWS PrivateLink titik akhir untuk sumber acara MSK](#msk-vpc-privatelink) untuk detail tentang cara mengonfigurasi sumber daya ini.

Sejauh ini, kami berasumsi bahwa klaster MSK Anda berada di subnet pribadi dalam VPC Anda, yang merupakan kasus yang lebih umum. Namun, bahkan jika klaster MSK Anda berada di subnet publik dalam VPC Anda, Anda harus mengonfigurasi AWS PrivateLink titik akhir untuk mengaktifkan koneksi yang aman. Tabel berikut merangkum persyaratan konfigurasi jaringan berdasarkan cara Anda mengonfigurasi kluster MSK dan pemetaan sumber peristiwa Lambda:


| Lokasi klaster MSK (dalam VPC yang dikelola pelanggan) | Mode penskalaan pemetaan sumber acara Lambda | Konfigurasi jaringan yang diperlukan | 
| --- | --- | --- | 
|  Subnet privat  |  Mode sesuai permintaan  |  Gateway NAT (di subnet publik VPC Anda), atau AWS PrivateLink titik akhir (di subnet pribadi VPC Anda) untuk mengaktifkan akses ke Lambda,, dan secara opsional, Secrets Manager. AWS STS  | 
|  Subnet publik  |  Mode sesuai permintaan  |  AWS PrivateLink endpoint (di subnet publik VPC Anda) untuk mengaktifkan akses ke Lambda,, dan secara opsional AWS STS, Secrets Manager.  | 
|  Subnet privat  |  Mode yang disediakan  |  Tidak ada  | 
|  Subnet publik  |  Mode yang disediakan  |  Tidak ada  | 

Selain itu, grup keamanan yang terkait dengan kluster MSK Anda harus mengizinkan lalu lintas melalui port yang benar. Pastikan Anda memiliki aturan grup keamanan berikut yang dikonfigurasi:
+ **Aturan masuk** - Izinkan semua lalu lintas di port broker default. Port yang digunakan MSK tergantung pada jenis otentikasi pada cluster: `9098` untuk otentikasi IAM, untuk SASL/SCRAM, dan `9096` untuk TLS. `9094` Atau, Anda dapat menggunakan aturan grup keamanan referensi mandiri untuk mengizinkan akses dari instans dalam grup keamanan yang sama.
+ **Aturan keluar** — Izinkan semua lalu lintas di port `443` untuk tujuan eksternal jika fungsi Anda perlu berkomunikasi dengan AWS layanan lain. Atau, Anda dapat menggunakan aturan grup keamanan referensi diri untuk membatasi akses ke broker jika Anda tidak perlu berkomunikasi dengan layanan lain AWS .
+ **Aturan masuk titik akhir Amazon VPC** — Jika Anda menggunakan titik akhir VPC Amazon, grup keamanan yang terkait dengan titik akhir harus mengizinkan lalu lintas masuk pada port dari grup keamanan klaster. `443`

## Mengkonfigurasi gateway NAT untuk sumber acara MSK
<a name="msk-nat-gateway"></a>

Anda dapat mengonfigurasi gateway NAT untuk memungkinkan pemetaan sumber acara Anda ke pesan polling dari cluster Anda, dan menjalankan fungsi melalui jalur melalui VPC Anda. Ini diperlukan hanya jika pemetaan sumber acara Anda menggunakan mode sesuai permintaan, dan klaster Anda berada dalam subnet pribadi VPC Anda. Jika klaster Anda berada di subnet publik VPC Anda, atau pemetaan sumber acara Anda menggunakan mode yang disediakan, Anda tidak perlu mengonfigurasi gateway NAT.

[Gateway NAT](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html) memungkinkan sumber daya dalam subnet pribadi untuk mengakses internet publik. Jika Anda memerlukan konektivitas pribadi ke Lambda, lihat [Mengkonfigurasi AWS PrivateLink titik akhir untuk sumber acara MSK](#msk-vpc-privatelink) saja.

Setelah Anda mengkonfigurasi gateway NAT Anda, Anda harus mengkonfigurasi tabel rute yang sesuai. Ini memungkinkan lalu lintas dari subnet pribadi Anda untuk rute ke internet publik melalui gateway NAT.

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/MSK-NAT-Gateway.png)


Langkah-langkah berikut memandu Anda melalui konfigurasi gateway NAT menggunakan konsol. Ulangi langkah-langkah ini seperlunya untuk setiap Availability Zone (AZ).

**Untuk mengonfigurasi gateway NAT dan perutean yang tepat (konsol)**

1. Ikuti langkah-langkah di [Buat gateway NAT](https://docs.aws.amazon.com/vpc/latest/userguide/nat-gateway-working-with.html), perhatikan hal berikut:
   + Gateway NAT harus selalu berada di subnet publik. [Buat gateway NAT dengan konektivitas publik.](https://docs.aws.amazon.com/vpc/latest/userguide/vpc-nat-gateway.html)
   + Jika kluster MSK Anda direplikasi di beberapa AZs, buat satu gateway NAT per AZ. Misalnya, di setiap AZ, VPC Anda harus memiliki satu subnet pribadi yang berisi cluster Anda, dan satu subnet publik yang berisi gateway NAT Anda. Untuk pengaturan dengan tiga AZs, Anda akan memiliki tiga subnet pribadi, tiga subnet publik, dan tiga gateway NAT.

1. Setelah Anda membuat gateway NAT, buka konsol [VPC Amazon](https://console.aws.amazon.com/vpc/) dan **pilih tabel Route** di menu sebelah kiri.

1. Pilih **Buat tabel rute**.

1. Kaitkan tabel rute ini dengan VPC yang berisi kluster MSK Anda. Secara opsional, masukkan nama untuk tabel rute Anda.

1. Pilih **Buat tabel rute**.

1. Pilih tabel rute yang baru saja Anda buat.

1. Di bawah tab **Asosiasi subnet**, pilih **Edit asosiasi subnet**.
   + Kaitkan tabel rute ini dengan subnet pribadi yang berisi kluster MSK Anda.

1. Pilih **Edit rute**.

1. Pilih **Tambahkan rute**:

   1. Untuk **Tujuan**, pilih `0.0.0.0/0`.

   1. Untuk **Target**, pilih **gateway NAT**.

   1. Di kotak pencarian, pilih gateway NAT yang Anda buat di langkah 1. Ini harus menjadi gateway NAT di AZ yang sama dengan subnet pribadi yang berisi cluster MSK Anda (subnet pribadi yang Anda kaitkan dengan tabel rute ini pada langkah 6).

1. Pilih **Simpan perubahan**.

## Mengkonfigurasi AWS PrivateLink titik akhir untuk sumber acara MSK
<a name="msk-vpc-privatelink"></a>

Anda dapat mengonfigurasi AWS PrivateLink titik akhir untuk melakukan polling pesan dari klaster, dan menjalankan fungsi melalui jalur melalui VPC Anda. Titik akhir ini akan memungkinkan klaster MSK Anda mengakses hal-hal berikut:
+ Layanan Lambda
+ [AWS Security Token Service (STS)](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html)
+ Secara opsional, [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)layanan. Ini diperlukan jika rahasia yang diperlukan untuk otentikasi cluster disimpan di Secrets Manager.

Mengkonfigurasi PrivateLink titik akhir hanya diperlukan jika pemetaan sumber acara Anda menggunakan mode sesuai permintaan. Jika pemetaan sumber acara Anda menggunakan mode yang disediakan, Lambda membuat koneksi yang diperlukan untuk Anda.

PrivateLink titik akhir memungkinkan akses pribadi yang aman ke AWS layanan berakhir AWS PrivateLink. Atau, untuk mengkonfigurasi gateway NAT untuk memberikan akses kluster MSK Anda ke internet publik, lihat. [Mengkonfigurasi gateway NAT untuk sumber acara MSK](#msk-nat-gateway)

Setelah Anda mengonfigurasi titik akhir VPC Anda, kluster MSK Anda harus memiliki akses langsung dan pribadi ke Lambda, STS, dan secara opsional, Secrets Manager.

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/MSK-PrivateLink-Endpoints.png)


Langkah-langkah berikut memandu Anda dalam mengonfigurasi PrivateLink titik akhir menggunakan konsol. Ulangi langkah-langkah ini seperlunya untuk setiap titik akhir (Lambda, STS, Secrets Manager).

**Untuk mengkonfigurasi PrivateLink titik akhir VPC (konsol)**

1. Buka [konsol Amazon VPC](https://console.aws.amazon.com/vpc/) dan pilih **Endpoints** di menu sebelah kiri.

1. Pilih **Buat titik akhir**.

1. Secara opsional, masukkan nama untuk titik akhir Anda.

1. Untuk **Jenis**, pilih **AWS layanan**.

1. Di bawah **Layanan**, mulailah mengetik nama layanan. Misalnya, untuk membuat titik akhir untuk terhubung ke Lambda, `lambda` ketik kotak pencarian.

1. Dalam hasilnya, Anda akan melihat titik akhir layanan di wilayah saat ini. Misalnya, di wilayah AS Timur (Virginia N.), Anda harus melihat`com.amazonaws.us-east-2.lambda`. Pilih layanan ini.

1. Di bawah **Pengaturan jaringan**, pilih VPC yang berisi kluster MSK Anda.

1. Di bawah **Subnet**, pilih klaster MSK Anda. AZs 
   + Untuk setiap AZ, di bawah **Subnet ID**, pilih subnet pribadi yang berisi kluster MSK Anda.

1. Di bawah **Grup keamanan**, pilih grup keamanan yang terkait dengan kluster MSK Anda.

1. Pilih **Buat titik akhir**.

Secara default, titik akhir Amazon VPC memiliki kebijakan IAM terbuka yang memungkinkan akses luas ke sumber daya. Praktik terbaik adalah membatasi kebijakan ini untuk melakukan tindakan yang diperlukan menggunakan titik akhir tersebut. Misalnya, untuk titik akhir Secrets Manager, Anda dapat mengubah kebijakannya sehingga hanya mengizinkan peran eksekusi fungsi Anda untuk mengakses rahasia.

**Example Kebijakan titik akhir VPC — titik akhir Secrets Manager**  

```
{
    "Statement": [
        {
            "Action": "secretsmanager:GetSecretValue",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws::iam::123456789012:role/my-role"
                ]
            },
            "Resource": "arn:aws::secretsmanager:us-west-2:123456789012:secret:my-secret"
        }
    ]
}
```

Untuk titik akhir AWS STS dan Lambda, Anda dapat membatasi prinsipal panggilan ke kepala layanan Lambda. Namun, pastikan Anda menggunakannya `"Resource": "*"` dalam kebijakan ini.

**Example Kebijakan titik akhir VPC - titik akhir AWS STS**  

```
{
    "Statement": [
        {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "lambda.amazonaws.com"
                ]
            },
            "Resource": "*"
        }
    ]
}
```

**Example Kebijakan titik akhir VPC - Titik akhir Lambda**  

```
{
    "Statement": [
        {
            "Action": "lambda:InvokeFunction",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "lambda.amazonaws.com"
                ]
            },
            "Resource": "*"
        }
    ]
}
```

# Mengonfigurasi izin Lambda untuk pemetaan sumber acara MSK Amazon
<a name="with-msk-permissions"></a>

Untuk mengakses kluster MSK Amazon, fungsi dan pemetaan sumber peristiwa Anda memerlukan izin untuk melakukan berbagai tindakan Amazon MSK API. Tambahkan izin ini ke [peran eksekusi](lambda-intro-execution-role.md) fungsi. Jika pengguna Anda memerlukan akses, tambahkan izin yang diperlukan ke kebijakan identitas untuk pengguna atau peran.

Kebijakan yang dikelola [AWSLambdaMSKExecutionPeran](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaMSKExecutionRole.html) berisi izin minimum yang diperlukan untuk pemetaan sumber peristiwa MSK Lambda Amazon. Untuk menyederhanakan proses izin, Anda dapat:
+ Lampirkan kebijakan yang dikelola [AWSLambdaMSKExecutionPeran](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaMSKExecutionRole.html) ke peran eksekusi Anda.
+ Biarkan konsol Lambda menghasilkan izin untuk Anda. Saat Anda [membuat pemetaan sumber peristiwa MSK Amazon di konsol](msk-esm-create.md#msk-console), Lambda mengevaluasi peran eksekusi Anda dan memberi tahu Anda jika ada izin yang hilang. Pilih **Hasilkan izin** untuk memperbarui peran eksekusi Anda secara otomatis. Ini tidak berfungsi jika Anda membuat atau memodifikasi kebijakan peran eksekusi secara manual, atau jika kebijakan dilampirkan ke beberapa peran. Perhatikan bahwa izin tambahan mungkin masih diperlukan dalam peran eksekusi Anda saat menggunakan fitur lanjutan seperti [On-Failure Destination](kafka-on-failure.md) atau [AWS Glue Schema](services-consume-kafka-events.md) Registry.

**Topics**
+ [

## Izin yang diperlukan
](#msk-required-permissions)
+ [

## Izin opsional
](#msk-optional-permissions)

## Izin yang diperlukan
<a name="msk-required-permissions"></a>

Peran eksekusi fungsi Lambda Anda harus memiliki izin yang diperlukan berikut untuk pemetaan sumber peristiwa MSK Amazon. Izin ini disertakan dalam kebijakan yang dikelola [AWSLambdaMSKExecutionPeran](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaMSKExecutionRole.html).

### CloudWatch Izin log
<a name="msk-basic-permissions"></a>

Izin berikut memungkinkan Lambda untuk membuat dan menyimpan log di Amazon CloudWatch Logs.
+ [log: CreateLogGroup](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogGroup.html)
+ [log: CreateLogStream](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogStream.html)
+ [log: PutLogEvents](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html)

### Izin klaster MSK
<a name="msk-cluster-permissions"></a>

Izin berikut memungkinkan Lambda mengakses klaster MSK Amazon Anda atas nama Anda:
+ [kafka: DescribeCluster](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn.html)
+ [kafka: DescribeCluster V2](https://docs.aws.amazon.com/MSK/2.0/APIReference/v2-clusters-clusterarn.html)
+ [kafka: GetBootstrapBrokers](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn-bootstrap-brokers.html)

Kami merekomendasikan menggunakan [kafka: DescribeCluster V2](https://docs.aws.amazon.com/MSK/2.0/APIReference/v2-clusters-clusterarn.html) alih-alih [kafka](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn.html):. DescribeCluster Izin v2 berfungsi dengan kluster MSK Amazon yang disediakan dan tanpa server. Anda hanya memerlukan salah satu izin ini dalam kebijakan Anda.

### Izin VPC
<a name="msk-vpc-permissions"></a>

Izin berikut memungkinkan Lambda membuat dan mengelola antarmuka jaringan saat menghubungkan ke kluster MSK Amazon Anda:
+ [EC2: CreateNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInterface.html)
+ [EC2: DescribeNetworkInterfaces](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html)
+ [EC2: DescribeVpcs](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcs.html)
+ [EC2: DeleteNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkInterface.html)
+ [EC2: DescribeSubnets](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSubnets.html)
+ [EC2: DescribeSecurityGroups](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroups.html)

## Izin opsional
<a name="msk-optional-permissions"></a>

 Fungsi Lambda Anda mungkin juga memerlukan izin untuk: 
+ Akses kluster MSK Amazon lintas akun. Untuk pemetaan sumber peristiwa lintas akun, Anda memerlukan [kafka: DescribeVpcConnection](https://docs.aws.amazon.com/msk/1.0/apireference/vpc-connection-arn.html) dalam peran eksekusi. [Prinsipal IAM yang membuat pemetaan sumber peristiwa lintas akun membutuhkan kafka:. ListVpcConnections](https://docs.aws.amazon.com/msk/1.0/apireference/vpc-connections.html)
+ Akses rahasia SCRAM Anda, jika Anda menggunakan otentikasi [SASL/SCRAM](msk-cluster-auth.md#msk-sasl-scram). Ini memungkinkan fungsi Anda menggunakan nama pengguna dan kata sandi untuk terhubung ke Kafka.
+ Jelaskan rahasia Secrets Manager Anda, jika Anda menggunakan SASL/SCRAM atau [otentikasi mTLS](msk-cluster-auth.md#msk-mtls). Ini memungkinkan fungsi Anda untuk mengambil kredensyal atau sertifikat yang diperlukan untuk koneksi aman.
+ Akses kunci terkelola AWS KMS pelanggan Anda, jika AWS Secrets Manager rahasia Anda dienkripsi dengan kunci yang dikelola AWS KMS pelanggan.
+ Akses rahasia registri skema Anda, jika Anda menggunakan registri skema dengan otentikasi:
  + Untuk Registri AWS Glue Skema: Kebutuhan `glue:GetRegistry` dan `glue:GetSchemaVersion` izin fungsi Anda. Ini memungkinkan fungsi Anda untuk mencari dan menggunakan aturan format pesan yang disimpan AWS Glue.
  + Untuk [Registri Skema Konfluen](https://docs.confluent.io/platform/current/schema-registry/security/index.html) dengan `BASIC_AUTH` atau`CLIENT_CERTIFICATE_TLS_AUTH`: Fungsi Anda memerlukan `secretsmanager:GetSecretValue` izin untuk rahasia yang berisi kredensi otentikasi. Ini memungkinkan fungsi Anda mengambil username/password atau sertifikat yang diperlukan untuk mengakses Registri Skema Konfluen.
  + Untuk sertifikat CA pribadi: Fungsi Anda membutuhkan secretsmanager: GetSecretValue izin untuk rahasia yang berisi sertifikat. Hal ini memungkinkan fungsi Anda untuk memverifikasi identitas pendaftar skema yang menggunakan sertifikat kustom.
+ Akses grup konsumen klaster Kafka dan pesan polling dari topik, jika Anda menggunakan autentikasi IAM untuk pemetaan sumber peristiwa.

 Ini sesuai dengan izin yang diperlukan berikut: 
+ [kafka: ListScramSecrets](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn-scram-secrets.html) - Memungkinkan daftar rahasia SCRAM untuk otentikasi Kafka
+ [secretsmanager: GetSecretValue](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html) - Memungkinkan pengambilan rahasia dari Secrets Manager
+ [KMS: Decrypt - Memungkinkan dekripsi data terenkripsi](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html) menggunakan AWS KMS
+ [lem: GetRegistry](https://docs.aws.amazon.com/glue/latest/webapi/API_GetRegistry.html) - Memungkinkan akses ke AWS Glue Schema Registry
+ [lem: GetSchemaVersion](https://docs.aws.amazon.com/glue/latest/webapi/API_GetSchemaVersion.html) - Memungkinkan pengambilan versi skema tertentu dari Schema Registry AWS Glue 
+ [Kafka-cluster:Connect - Memberikan izin untuk menghubungkan](https://docs.aws.amazon.com/service-authorization/latest/reference/list_apachekafkaapisforamazonmskclusters.html) dan mengautentikasi ke cluster
+ [kafka-cluster: AlterGroup](https://docs.aws.amazon.com/service-authorization/latest/reference/list_apachekafkaapisforamazonmskclusters.html) - Memberikan izin untuk bergabung dengan grup di cluster, setara dengan READ GROUP ACL Apache Kafka
+ [kafka-cluster: DescribeGroup](https://docs.aws.amazon.com/service-authorization/latest/reference/list_apachekafkaapisforamazonmskclusters.html) - Memberikan izin untuk mendeskripsikan grup di cluster, setara dengan APache Kafka's DESCRIPTION GROUP ACL
+ [kafka-cluster: DescribeTopic](https://docs.aws.amazon.com/service-authorization/latest/reference/list_apachekafkaapisforamazonmskclusters.html) - Memberikan izin untuk mendeskripsikan topik di cluster, setara dengan APache Kafka's DESCRIPTE TOPIC ACL
+ [kafka-cluster: ReadData](https://docs.aws.amazon.com/service-authorization/latest/reference/list_apachekafkaapisforamazonmskclusters.html) - Memberikan izin untuk membaca data dari topik di cluster, setara dengan ACL TOPIK BACA Apache Kafka

 Selain itu, jika Anda ingin mengirim catatan pemanggilan yang gagal ke tujuan yang gagal, Anda memerlukan izin berikut tergantung pada jenis tujuan: 
+ Untuk tujuan Amazon SQS: [sqs: SendMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html) - Memungkinkan pengiriman pesan ke antrian Amazon SQS
+ Untuk tujuan Amazon SNS: [SNS: Publikasikan - Izinkan](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html) penerbitan pesan ke topik Amazon SNS
+ Untuk tujuan bucket Amazon S3: s3: PutObject dan [https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) - Mengaktifkan penulisan dan daftar objek dalam bucket Amazon S3

Untuk mengatasi masalah kesalahan autentikasi dan otorisasi, lihat. [Memecahkan masalah kesalahan pemetaan sumber acara Kafka](with-kafka-troubleshoot.md)

# Mengonfigurasi sumber acara MSK Amazon untuk Lambda
<a name="with-msk-configure"></a>

Untuk menggunakan kluster MSK Amazon sebagai sumber peristiwa untuk fungsi Lambda, Anda membuat pemetaan [sumber peristiwa yang menghubungkan dua sumber](invocation-eventsourcemapping.md) daya. Halaman ini menjelaskan cara membuat pemetaan sumber peristiwa untuk Amazon MSK.

Halaman ini mengasumsikan bahwa Anda telah mengonfigurasi klaster MSK dan [Amazon Virtual Private Cloud (](https://docs.aws.amazon.com/vpc/latest/userguide/what-is-amazon-vpc.html)VPC) dengan benar. Jika Anda perlu mengatur cluster atau VPC Anda, lihat. [Mengonfigurasi kluster MSK Amazon dan jaringan VPC Amazon untuk Lambda](with-msk-cluster-network.md) Untuk mengonfigurasi perilaku coba lagi untuk penanganan kesalahan, lihat[Mengonfigurasi kontrol penanganan kesalahan untuk sumber acara Kafka](kafka-retry-configurations.md).

**Topics**
+ [

## Menggunakan kluster MSK Amazon sebagai sumber acara
](#msk-esm-overview)
+ [

# Mengonfigurasi metode otentikasi cluster MSK Amazon di Lambda
](msk-cluster-auth.md)
+ [

# Membuat pemetaan sumber acara Lambda untuk sumber acara MSK Amazon
](msk-esm-create.md)
+ [

# Membuat pemetaan sumber acara lintas akun di Lambda
](msk-cross-account.md)
+ [

# Semua parameter konfigurasi sumber acara MSK Amazon di Lambda
](msk-esm-parameters.md)

## Menggunakan kluster MSK Amazon sebagai sumber acara
<a name="msk-esm-overview"></a>

[Saat Anda menambahkan kluster Apache Kafka atau Amazon MSK sebagai pemicu fungsi Lambda Anda, cluster digunakan sebagai sumber peristiwa.](invocation-eventsourcemapping.md)

Lambda membaca data peristiwa dari topik Kafka yang Anda tentukan seperti `Topics` dalam [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)permintaan, berdasarkan [posisi awal](kafka-starting-positions.md) yang Anda tentukan. Setelah pemrosesan berhasil, topik Kafka Anda dijalankan untuk klaster Kafka Anda.

Lambda membaca pesan secara berurutan untuk setiap partisi topik Kafka. Payload Lambda tunggal dapat berisi pesan dari beberapa partisi. Bila lebih banyak rekaman tersedia, Lambda terus memproses catatan dalam batch, berdasarkan BatchSize nilai yang Anda tentukan dalam [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)permintaan, hingga fungsi Anda mengikuti topik.

Setelah Lambda memproses setiap batch, Lambda melakukan offset pesan dalam batch tersebut. Jika fungsi Anda mengembalikan kesalahan untuk salah satu pesan dalam batch, Lambda mencoba ulang seluruh batch pesan sampai berhasil diproses atau pesan berakhir. Anda dapat mengirim catatan yang gagal dalam semua upaya percobaan ulang ke tujuan yang gagal untuk diproses nanti.

**catatan**  
Sementara fungsi Lambda biasanya memiliki batas waktu tunggu maksimum 15 menit, pemetaan sumber acara untuk Amazon MSK, Apache Kafka yang dikelola sendiri, Amazon DocumentDB, dan Amazon MQ untuk ActiveMQ dan RabbitMQ hanya mendukung fungsi dengan batas waktu tunggu maksimum 14 menit.

# Mengonfigurasi metode otentikasi cluster MSK Amazon di Lambda
<a name="msk-cluster-auth"></a>

Lambda memerlukan izin untuk mengakses kluster MSK Amazon Anda, mengambil catatan, dan melakukan tugas lainnya. Amazon MSK mendukung beberapa cara untuk mengautentikasi dengan kluster MSK Anda.

**Topics**
+ [

## Akses tidak diautentikasi
](#msk-unauthenticated)
+ [

## Otentikasi SASL/SCRAM
](#msk-sasl-scram)
+ [

## Otentikasi TLS timbal balik
](#msk-mtls)
+ [

## Autentikasi IAM
](#msk-iam-auth)
+ [

## Bagaimana Lambda memilih broker bootstrap
](#msk-bootstrap-brokers)

## Akses tidak diautentikasi
<a name="msk-unauthenticated"></a>

Jika tidak ada klien yang mengakses cluster melalui internet, Anda dapat menggunakan akses yang tidak diautentikasi.

## Otentikasi SASL/SCRAM
<a name="msk-sasl-scram"></a>

Lambda mendukung otentikasi [Simple Authentication and Security Layer/Salted Challenge Response Authentication Mechanism (SASL/SCRAM)](https://docs.aws.amazon.com/msk/latest/developerguide/msk-password-tutorial.html), dengan fungsi hash SHA-512 dan enkripsi Transport Layer Security (TLS). Agar Lambda dapat terhubung ke cluster, simpan kredensyal otentikasi (nama pengguna dan kata sandi) dalam rahasia Secrets Manager, dan rujuk rahasia ini saat mengonfigurasi pemetaan sumber peristiwa Anda.

Untuk informasi selengkapnya tentang menggunakan Secrets Manager, lihat [Autentikasi kredensyal masuk dengan Secrets Manager di Panduan Pengembang](https://docs.aws.amazon.com/msk/latest/developerguide/msk-password.html) *Amazon Managed Streaming for Apache Kafka*.

**catatan**  
Amazon MSK tidak mendukung SASL/PLAIN otentikasi.

## Otentikasi TLS timbal balik
<a name="msk-mtls"></a>

Mutual TLS (mTLS) menyediakan otentikasi dua arah antara klien dan server. Klien mengirimkan sertifikat ke server untuk server untuk memverifikasi klien. Server juga mengirimkan sertifikat ke klien untuk klien untuk memverifikasi server.

Untuk integrasi MSK Amazon dengan Lambda, kluster MSK Anda bertindak sebagai server, dan Lambda bertindak sebagai klien.
+ Agar Lambda memverifikasi klaster MSK Anda, Anda mengonfigurasi sertifikat klien sebagai rahasia di Secrets Manager, dan mereferensikan sertifikat ini dalam konfigurasi pemetaan sumber peristiwa Anda. Sertifikat klien harus ditandatangani oleh otoritas sertifikat (CA) di toko kepercayaan server.
+ Cluster MSK juga mengirimkan sertifikat server ke Lambda. Sertifikat server harus ditandatangani oleh otoritas sertifikat (CA) di toko AWS kepercayaan.

Amazon MSK tidak mendukung sertifikat server yang ditandatangani sendiri. Semua broker di Amazon MSK menggunakan [sertifikat publik](https://docs.aws.amazon.com/msk/latest/developerguide/msk-encryption.html) yang ditandatangani oleh [Amazon Trust Services CAs](https://www.amazontrust.com/repository/), yang dipercaya Lambda secara default.

### Mengkonfigurasi rahasia mTLS
<a name="mtls-auth-secret"></a>

Rahasia CLIENT\$1CERTIFICATE\$1TLS\$1AUTH memerlukan bidang sertifikat dan bidang kunci pribadi. Untuk kunci pribadi terenkripsi, rahasianya memerlukan kata sandi kunci pribadi. Baik sertifikat dan kunci pribadi harus dalam format PEM.

**catatan**  
Lambda mendukung [PBES1](https://datatracker.ietf.org/doc/html/rfc2898/#section-6.1)(tetapi tidak PBES2) algoritma enkripsi kunci pribadi.

Bidang sertifikat harus berisi daftar sertifikat, dimulai dengan sertifikat klien, diikuti oleh sertifikat perantara, dan diakhiri dengan sertifikat root. Setiap sertifikat harus dimulai pada baris baru dengan struktur berikut:

```
-----BEGIN CERTIFICATE-----  
        <certificate contents>
-----END CERTIFICATE-----
```

Secrets Manager mendukung rahasia hingga 65.536 byte, yang merupakan ruang yang cukup untuk rantai sertifikat yang panjang.

Kunci pribadi harus dalam format [PKCS \$18](https://datatracker.ietf.org/doc/html/rfc5208), dengan struktur berikut:

```
-----BEGIN PRIVATE KEY-----  
         <private key contents>
-----END PRIVATE KEY-----
```

Untuk kunci pribadi terenkripsi, gunakan struktur berikut:

```
-----BEGIN ENCRYPTED PRIVATE KEY-----  
          <private key contents>
-----END ENCRYPTED PRIVATE KEY-----
```

Contoh berikut menunjukkan isi rahasia untuk otentikasi mTLS menggunakan kunci pribadi terenkripsi. Untuk kunci pribadi terenkripsi, Anda menyertakan kata sandi kunci pribadi dalam rahasia.

```
{
 "privateKeyPassword": "testpassword",
 "certificate": "-----BEGIN CERTIFICATE-----
MIIE5DCCAsygAwIBAgIRAPJdwaFaNRrytHBto0j5BA0wDQYJKoZIhvcNAQELBQAw
...
j0Lh4/+1HfgyE2KlmII36dg4IMzNjAFEBZiCRoPimO40s1cRqtFHXoal0QQbIlxk
cmUuiAii9R0=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFgjCCA2qgAwIBAgIQdjNZd6uFf9hbNC5RdfmHrzANBgkqhkiG9w0BAQsFADBb
...
rQoiowbbk5wXCheYSANQIfTZ6weQTgiCHCCbuuMKNVS95FkXm0vqVD/YpXKwA/no
c8PH3PSoAaRwMMgOSA2ALJvbRz8mpg==
-----END CERTIFICATE-----",
 "privateKey": "-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFKzBVBgkqhkiG9w0BBQ0wSDAnBgkqhkiG9w0BBQwwGgQUiAFcK5hT/X7Kjmgp
...
QrSekqF+kWzmB6nAfSzgO9IaoAaytLvNgGTckWeUkWn/V0Ck+LdGUXzAC4RxZnoQ
zp2mwJn2NYB7AZ7+imp0azDZb+8YG2aUCiyqb6PnnA==
-----END ENCRYPTED PRIVATE KEY-----"
}
```

Untuk informasi selengkapnya tentang mTL untuk Amazon MSK, dan petunjuk tentang cara membuat sertifikat klien, lihat [Autentikasi klien Mutual TLS untuk Amazon MSK di Panduan Pengembang Amazon Managed Streaming for](https://docs.aws.amazon.com/msk/latest/developerguide/msk-authentication.html) *Apache Kafka*.

## Autentikasi IAM
<a name="msk-iam-auth"></a>

Anda dapat menggunakan AWS Identity and Access Management (IAM) untuk mengautentikasi identitas klien yang terhubung ke cluster MSK. Dengan autentikasi IAM, Lambda mengandalkan izin dalam [peran eksekusi](lambda-intro-execution-role.md) fungsi Anda untuk terhubung ke klaster, mengambil catatan, dan melakukan tindakan lain yang diperlukan. Untuk contoh kebijakan yang berisi izin yang diperlukan, lihat [Membuat kebijakan otorisasi untuk peran IAM di Panduan Pengembang](https://docs.aws.amazon.com/msk/latest/developerguide/create-iam-access-control-policies.html) *Amazon Managed Streaming for* Apache Kafka.

Jika auth IAM aktif di kluster MSK Anda, dan Anda tidak memberikan rahasia, Lambda secara otomatis default menggunakan autentikasi IAM.

Untuk informasi selengkapnya tentang autentikasi IAM di Amazon MSK, lihat kontrol akses [IAM](https://docs.aws.amazon.com/msk/latest/developerguide/iam-access-control.html).

## Bagaimana Lambda memilih broker bootstrap
<a name="msk-bootstrap-brokers"></a>

Lambda memilih [broker bootstrap](https://docs.aws.amazon.com/msk/latest/developerguide/msk-get-bootstrap-brokers.html) berdasarkan metode otentikasi yang tersedia di cluster Anda, dan apakah Anda memberikan rahasia untuk otentikasi. Jika Anda memberikan rahasia untuk mTLS atau SASL/SCRAM, Lambda secara otomatis memilih metode autentikasi itu. Jika Anda tidak memberikan rahasia, Lambda memilih metode autentikasi terkuat yang aktif di cluster Anda. Berikut ini adalah urutan prioritas di mana Lambda memilih broker, dari autentikasi terkuat hingga terlemah:
+ mTL (rahasia disediakan untuk mTL)
+ SASL/SCRAM (secret provided for SASL/SCRAM)
+ SASL IAM (tidak ada rahasia yang disediakan, dan autentikasi IAM aktif)
+ TLS yang tidak diautentikasi (tidak ada rahasia yang disediakan, dan autentikasi IAM tidak aktif)
+ Plaintext (tidak ada rahasia yang disediakan, dan autentikasi IAM dan TLS yang tidak diautentikasi tidak aktif)

**catatan**  
Jika Lambda tidak dapat terhubung ke jenis broker yang paling aman, Lambda tidak mencoba untuk terhubung ke jenis broker yang berbeda (lebih lemah). Jika Anda ingin Lambda memilih jenis broker yang lebih lemah, nonaktifkan semua metode autentikasi yang lebih kuat di cluster Anda.

# Membuat pemetaan sumber acara Lambda untuk sumber acara MSK Amazon
<a name="msk-esm-create"></a>

[Untuk membuat pemetaan sumber peristiwa, Anda dapat menggunakan konsol Lambda, [AWS Command Line Interface (CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)), atau SDK.AWS](https://aws.amazon.com/getting-started/tools-sdks/)

**catatan**  
Saat Anda membuat pemetaan sumber peristiwa, Lambda membuat ENI [hyperplane](configuration-vpc.md#configuration-vpc-enis) di subnet pribadi yang berisi kluster MSK Anda, memungkinkan Lambda membuat koneksi aman. ENI hyperplane ini memungkinkan penggunaan subnet dan konfigurasi grup keamanan klaster MSK Anda, bukan fungsi Lambda Anda.

Langkah-langkah konsol berikut menambahkan kluster MSK Amazon sebagai pemicu fungsi Lambda Anda. Di bawah tenda, ini menciptakan sumber daya pemetaan sumber peristiwa.

**Untuk menambahkan pemicu MSK Amazon ke fungsi Lambda Anda (konsol)**

1. Buka [halaman Fungsi konsol](https://console.aws.amazon.com/lambda/home#/functions) Lambda.

1. Pilih nama fungsi Lambda yang ingin Anda tambahkan pemicu MSK Amazon.

1. Di bagian **Gambaran umum fungsi**, pilih **Tambah pemicu**.

1. Di bawah **konfigurasi Trigger**, pilih **MSK**.

1. Untuk menentukan detail cluster Kafka Anda, lakukan hal berikut:

   1. Untuk **Klaster MSK**, pilih klaster Anda.

   1. Untuk **nama Topik**, masukkan nama topik Kafka untuk mengkonsumsi pesan dari.

   1. Untuk **ID grup Konsumen**, masukkan ID grup konsumen Kafka untuk bergabung, jika berlaku. Untuk informasi selengkapnya, lihat [ID grup konsumen yang dapat disesuaikan di Lambda](kafka-consumer-group-id.md).

1. Untuk **otentikasi Cluster**, buat konfigurasi yang diperlukan. Untuk informasi selengkapnya tentang otentikasi klaster, lihat[Mengonfigurasi metode otentikasi cluster MSK Amazon di Lambda](msk-cluster-auth.md).
   + Aktifkan **Gunakan otentikasi** jika Anda ingin Lambda melakukan otentikasi dengan klaster MSK Anda saat membuat koneksi. Otentikasi direkomendasikan.
   + Jika Anda menggunakan otentikasi, untuk metode **otentikasi, pilih metode** otentikasi yang akan digunakan.
   + Jika Anda menggunakan autentikasi, untuk kunci **Secrets Manager, pilih kunci** Secrets Manager yang berisi kredensyal otentikasi yang diperlukan untuk mengakses klaster Anda.

1. Di bawah **konfigurasi Event poller**, buat konfigurasi yang diperlukan.
   + Pilih **Aktifkan pemicu** untuk mengaktifkan pemicu segera setelah pembuatan.
   + Pilih apakah Anda ingin **Mengonfigurasi mode yang disediakan** untuk pemetaan sumber acara Anda. Untuk informasi selengkapnya, lihat [Mode penskalaan poller acara Apache Kafka di Lambda](kafka-scaling-modes.md).
     + Jika Anda mengonfigurasi mode yang disediakan, masukkan nilai untuk poller **peristiwa Minimum, nilai untuk poller** **peristiwa maksimum**, dan nilai opsional PollerGroupName untuk menentukan pengelompokan beberapa ESMs dalam VPC sumber peristiwa yang sama.
   + Untuk **posisi awal**, pilih bagaimana Anda ingin Lambda mulai membaca dari streaming Anda. Untuk informasi selengkapnya, lihat [Posisi awal pemungutan suara dan streaming Apache Kafka di Lambda](kafka-starting-positions.md).

1. Di bawah **Batching**, buat konfigurasi yang diperlukan. Untuk informasi lebih lanjut tentang batching, lihat[Perilaku batching](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching).

   1. Untuk **Ukuran batch**, masukkan jumlah maksimum pesan yang akan diterima dalam satu batch.

   1. Untuk **jendela Batch**, masukkan jumlah detik maksimum yang dihabiskan Lambda untuk mengumpulkan catatan sebelum menjalankan fungsi.

1. Di bawah **Pemfilteran**, buat konfigurasi yang diperlukan. Untuk informasi selengkapnya tentang pemfilteran, lihat [Memfilter acara dari Amazon MSK dan sumber acara Apache Kafka yang dikelola sendiri](kafka-filtering.md).
   + Untuk **kriteria Filter**, tambahkan definisi kriteria filter untuk menentukan apakah akan memproses suatu peristiwa atau tidak.

1. Di bawah **Penanganan kegagalan**, buat konfigurasi yang diperlukan. Untuk informasi selengkapnya tentang penanganan kegagalan, lihat[Menangkap batch yang dibuang untuk Amazon MSK dan sumber acara Apache Kafka yang dikelola sendiri](kafka-on-failure.md).
   + Untuk **tujuan On-failure**, tentukan ARN tujuan kegagalan Anda.

1. Untuk **Tag**, masukkan tag untuk dikaitkan dengan pemetaan sumber peristiwa ini.

1. Untuk membuat pemicu, pilih **Tambahkan**.

Anda juga dapat membuat pemetaan sumber acara menggunakan AWS CLI dengan [ create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html)perintah. Contoh berikut membuat pemetaan sumber peristiwa untuk memetakan `my-msk-function` fungsi Lambda ke `AWSKafkaTopic` topik, mulai dari `LATEST` pesan. Perintah ini juga menggunakan [SourceAccessConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_SourceAccessConfiguration.html)objek untuk menginstruksikan Lambda untuk [menggunakan](msk-cluster-auth.md#msk-sasl-scram) otentikasi SASL/SCRAM saat menghubungkan ke cluster.

```
aws lambda create-event-source-mapping \
  --event-source-arn arn:aws:kafka:us-east-1:111122223333:cluster/my-cluster/fc2f5bdf-fd1b-45ad-85dd-15b4a5a6247e-2 \
  --topics AWSKafkaTopic \
  --starting-position LATEST \
  --function-name my-kafka-function
  --source-access-configurations '[{"Type": "SASL_SCRAM_512_AUTH","URI": "arn:aws:secretsmanager:us-east-1:111122223333:secret:my-secret"}]'
```

Jika cluster menggunakan [otentikasi mTLS](msk-cluster-auth.md#msk-mtls), sertakan [SourceAccessConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_SourceAccessConfiguration.html)objek yang menentukan `CLIENT_CERTIFICATE_TLS_AUTH` dan ARN kunci Secrets Manager. Ini ditunjukkan dalam perintah berikut:

```
aws lambda create-event-source-mapping \
  --event-source-arn arn:aws:kafka:us-east-1:111122223333:cluster/my-cluster/fc2f5bdf-fd1b-45ad-85dd-15b4a5a6247e-2 \
  --topics AWSKafkaTopic \
  --starting-position LATEST \
  --function-name my-kafka-function
  --source-access-configurations '[{"Type": "CLIENT_CERTIFICATE_TLS_AUTH","URI": "arn:aws:secretsmanager:us-east-1:111122223333:secret:my-secret"}]'
```

Saat cluster menggunakan [otentikasi IAM](msk-cluster-auth.md#msk-iam-auth), Anda tidak memerlukan [ SourceAccessConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_SourceAccessConfiguration.html)objek. Ini ditunjukkan dalam perintah berikut:

```
aws lambda create-event-source-mapping \
  --event-source-arn arn:aws:kafka:us-east-1:111122223333:cluster/my-cluster/fc2f5bdf-fd1b-45ad-85dd-15b4a5a6247e-2 \
  --topics AWSKafkaTopic \
  --starting-position LATEST \
  --function-name my-kafka-function
```

# Membuat pemetaan sumber acara lintas akun di Lambda
<a name="msk-cross-account"></a>

Anda dapat menggunakan [konektivitas pribadi multi-VPC](https://docs.aws.amazon.com/msk/latest/developerguide/aws-access-mult-vpc.html) untuk menghubungkan fungsi Lambda ke kluster MSK yang disediakan secara berbeda. Akun AWS Konektivitas multi-VPC menggunakan AWS PrivateLink, yang menjaga semua lalu lintas dalam jaringan. AWS 

**catatan**  
Anda tidak dapat membuat pemetaan sumber peristiwa lintas akun untuk kluster MSK tanpa server.

Untuk membuat pemetaan sumber peristiwa lintas akun, Anda harus terlebih dahulu [mengonfigurasi konektivitas multi-VPC untuk](https://docs.aws.amazon.com/msk/latest/developerguide/aws-access-mult-vpc.html#mvpc-cluster-owner-action-turn-on) kluster MSK. Saat Anda membuat pemetaan sumber peristiwa, gunakan ARN koneksi VPC terkelola alih-alih ARN cluster, seperti yang ditunjukkan pada contoh berikut. [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)Operasi juga berbeda tergantung pada jenis otentikasi yang digunakan cluster MSK.

**Example — Buat pemetaan sumber peristiwa lintas akun untuk cluster yang menggunakan otentikasi IAM**  
Saat cluster menggunakan [autentikasi berbasis peran IAM](msk-cluster-auth.md#msk-iam-auth), Anda tidak memerlukan objek. [SourceAccessConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_SourceAccessConfiguration.html) Contoh:  

```
aws lambda create-event-source-mapping \
  --event-source-arn arn:aws:kafka:us-east-1:111122223333:vpc-connection/444455556666/my-cluster-name/51jn98b4-0a61-46cc-b0a6-61g9a3d797d5-7 \
  --topics AWSKafkaTopic \
  --starting-position LATEST \
  --function-name my-kafka-function
```

**Example — Buat pemetaan sumber peristiwa lintas akun untuk cluster yang menggunakan otentikasi SASL/SCRAM**  
Jika cluster menggunakan [otentikasi SASL/SCRAM](msk-cluster-auth.md#msk-sasl-scram), Anda harus menyertakan [SourceAccessConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_SourceAccessConfiguration.html)objek yang menentukan dan `SASL_SCRAM_512_AUTH` Rahasia Secrets Manager ARN.  
Ada dua cara untuk menggunakan rahasia untuk pemetaan sumber peristiwa Amazon MSK lintas akun dengan otentikasi: SASL/SCRAM   
+ Buat rahasia di akun fungsi Lambda dan sinkronkan dengan rahasia cluster. [Buat rotasi](https://docs.aws.amazon.com/secretsmanager/latest/userguide/rotating-secrets.html) untuk menjaga kedua rahasia tetap sinkron. Opsi ini memungkinkan Anda untuk mengontrol rahasia dari akun fungsi.
+ Gunakan rahasia yang terkait dengan kluster MSK. Rahasia ini harus memungkinkan akses lintas akun ke akun fungsi Lambda. Untuk informasi [selengkapnya, lihat Izin untuk AWS Secrets Manager rahasia bagi pengguna di akun lain](https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access_examples_cross.html).

```
aws lambda create-event-source-mapping \
  --event-source-arn arn:aws:kafka:us-east-1:111122223333:vpc-connection/444455556666/my-cluster-name/51jn98b4-0a61-46cc-b0a6-61g9a3d797d5-7 \
  --topics AWSKafkaTopic \
  --starting-position LATEST \
  --function-name my-kafka-function \
  --source-access-configurations '[{"Type": "SASL_SCRAM_512_AUTH","URI": "arn:aws:secretsmanager:us-east-1:444455556666:secret:my-secret"}]'
```

**Example — Buat pemetaan sumber peristiwa lintas akun untuk cluster yang menggunakan otentikasi mTLS**  
Jika cluster menggunakan [otentikasi mTLS](msk-cluster-auth.md#msk-mtls), Anda harus menyertakan [SourceAccessConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_SourceAccessConfiguration.html)objek yang menentukan `CLIENT_CERTIFICATE_TLS_AUTH` dan ARN rahasia Secrets Manager. Rahasianya dapat disimpan di akun cluster atau akun fungsi Lambda.  

```
aws lambda create-event-source-mapping \
  --event-source-arn arn:aws:kafka:us-east-1:111122223333:vpc-connection/444455556666/my-cluster-name/51jn98b4-0a61-46cc-b0a6-61g9a3d797d5-7 \
  --topics AWSKafkaTopic \
  --starting-position LATEST \
  --function-name my-kafka-function \
  --source-access-configurations '[{"Type": "CLIENT_CERTIFICATE_TLS_AUTH","URI": "arn:aws:secretsmanager:us-east-1:444455556666:secret:my-secret"}]'
```

# Semua parameter konfigurasi sumber acara MSK Amazon di Lambda
<a name="msk-esm-parameters"></a>

Semua jenis sumber peristiwa Lambda berbagi operasi yang sama [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)dan [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)API. Namun, hanya beberapa parameter yang berlaku untuk Amazon MSK, seperti yang ditunjukkan pada tabel berikut.


| Parameter | Diperlukan | Default | Catatan | 
| --- | --- | --- | --- | 
|  AmazonManagedKafkaEventSourceConfig  |  T  |  Berisi ConsumerGroupId bidang, yang default ke nilai unik.  |  Hanya dapat mengatur di Create  | 
|  BatchSize  |  T  |  100  |  Maksimum: 10.000.  | 
|  DestinationConfig  |  T  |  N/A  |  [Menangkap batch yang dibuang untuk Amazon MSK dan sumber acara Apache Kafka yang dikelola sendiri](kafka-on-failure.md)  | 
|  Diaktifkan  |  T  |  True  |    | 
|  BisectBatchOnFunctionError  |  T  |  False  |  [Mengonfigurasi kontrol penanganan kesalahan untuk sumber acara Kafka](kafka-retry-configurations.md)  | 
|  FunctionResponseTypes  |  T  |  N/A  |  [Mengonfigurasi kontrol penanganan kesalahan untuk sumber acara Kafka](kafka-retry-configurations.md)  | 
|  MaximumRecordAgeInSeconds  |  T  |  -1 (tak terbatas)  |  [Mengonfigurasi kontrol penanganan kesalahan untuk sumber acara Kafka](kafka-retry-configurations.md)  | 
|  MaximumRetryAttempts  |  T  |  -1 (tak terbatas)  |  [Mengonfigurasi kontrol penanganan kesalahan untuk sumber acara Kafka](kafka-retry-configurations.md)  | 
|  EventSourceArn  |  Y  | N/A |  Hanya dapat mengatur di Create  | 
|  FilterCriteria  |  T  |  N/A  |  [Kontrol peristiwa mana yang dikirim Lambda ke fungsi Anda](invocation-eventfiltering.md)  | 
|  FunctionName  |  Y  |  N/A  |    | 
|  KMSKeyArn  |  T  |  N/A  |  [Enkripsi kriteria filter](invocation-eventfiltering.md#filter-criteria-encryption)  | 
|  MaximumBatchingWindowInSeconds  |  T  |  500 ms  |  [Perilaku batching](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching)  | 
|  ProvisionedPollersConfig  |  T  |  `MinimumPollers`: nilai default 1 jika tidak ditentukan `MaximumPollers`: nilai default 200 jika tidak ditentukan `PollerGroupName`: N/A  |  [Mode yang disediakan](kafka-scaling-modes.md#kafka-provisioned-mode)  | 
|  SourceAccessConfigurations  |  T  |  Tidak ada kredensial  |  Kredensyal otentikasi SASL/SCRAM atau CLIENT\$1CERTIFICATE\$1TLS\$1AUTH (MutualTLS) untuk sumber acara Anda  | 
|  StartingPosition  |  Y  | N/A |  AT\$1TIMESTAMP, TRIM\$1HORIZON, atau TERBARU Hanya dapat mengatur di Create  | 
|  StartingPositionTimestamp  |  T  |  N/A  |  Diperlukan jika StartingPosition disetel ke AT\$1TIMESTAMP  | 
|  Tag  |  T  |  N/A  |  [Menggunakan tag pada pemetaan sumber acara](tags-esm.md)  | 
|  Topik  |  Y  | N/A |  Nama topik Kafka Hanya dapat mengatur di Create  | 

**catatan**  
Saat Anda menentukan`PollerGroupName`, beberapa ESMs dalam VPC Amazon yang sama dapat berbagi kapasitas Event Poller Unit (EPU). Anda dapat menggunakan opsi ini untuk mengoptimalkan biaya mode Provisioned untuk Anda. ESMs Persyaratan untuk pengelompokan ESM:  
ESMs harus berada dalam VPC Amazon yang sama
Maksimal 100 ESMs per kelompok poller
Agregat poller maksimum ESMs di semua kelompok tidak boleh melebihi 2000
Anda dapat memperbarui `PollerGroupName` untuk memindahkan ESM ke grup lain, atau menghapus ESM dari grup dengan menyetel `PollerGroupName` ke string kosong (“”).

# Tutorial: Menggunakan pemetaan sumber peristiwa MSK Amazon untuk menjalankan fungsi Lambda
<a name="services-msk-tutorial"></a>

Dalam tutorial ini, Anda akan melakukan hal berikut:
+ Buat fungsi Lambda di AWS akun yang sama dengan cluster MSK Amazon yang ada.
+ Konfigurasikan jaringan dan otentikasi untuk Lambda untuk berkomunikasi dengan Amazon MSK.
+ Siapkan pemetaan sumber peristiwa MSK Lambda Amazon, yang menjalankan fungsi Lambda Anda saat peristiwa muncul di topik.

Setelah Anda selesai dengan langkah-langkah ini, ketika acara dikirim ke Amazon MSK, Anda akan dapat mengatur fungsi Lambda untuk memproses peristiwa tersebut secara otomatis dengan kode Lambda kustom Anda sendiri.

 **Apa yang dapat Anda lakukan dengan fitur ini?** 

**Contoh solusi: Gunakan pemetaan sumber acara MSK untuk memberikan skor langsung kepada pelanggan Anda.**

Pertimbangkan skenario berikut: Perusahaan Anda menghosting aplikasi web tempat pelanggan Anda dapat melihat informasi tentang acara langsung, seperti permainan olahraga. Pembaruan informasi dari game disediakan untuk tim Anda melalui topik Kafka di Amazon MSK. Anda ingin merancang solusi yang menggunakan pembaruan dari topik MSK untuk memberikan tampilan terbaru dari acara langsung kepada pelanggan di dalam aplikasi yang Anda kembangkan. Anda telah memutuskan pendekatan desain berikut: Aplikasi klien Anda akan berkomunikasi dengan backend tanpa server yang dihosting. AWS Klien akan terhubung melalui sesi websocket menggunakan Amazon API Gateway WebSocket API.

Dalam solusi ini, Anda memerlukan komponen yang membaca peristiwa MSK, melakukan beberapa logika khusus untuk mempersiapkan peristiwa tersebut untuk lapisan aplikasi dan kemudian meneruskan informasi tersebut ke API Gateway API. Anda dapat mengimplementasikan komponen ini dengan AWS Lambda, dengan menyediakan logika kustom Anda dalam fungsi Lambda, lalu memanggilnya dengan pemetaan sumber peristiwa MSK AWS Lambda Amazon.

Untuk informasi selengkapnya tentang penerapan solusi menggunakan Amazon API Gateway WebSocket API, lihat [tutorial WebSocket API](https://docs.aws.amazon.com/apigateway/latest/developerguide/websocket-api-chat-app.html) di dokumentasi API Gateway.

## Prasyarat
<a name="w2aad101c23c15c35c19"></a>

 AWS Akun dengan sumber daya yang telah dikonfigurasi berikut:

**Untuk memenuhi prasyarat ini, kami sarankan mengikuti [Memulai menggunakan Amazon MSK di dokumentasi MSK Amazon](https://docs.aws.amazon.com//msk/latest/developerguide/getting-started.html).**
+ Cluster MSK Amazon. Lihat [Membuat klaster MSK Amazon](https://docs.aws.amazon.com//msk/latest/developerguide/create-cluster.html) di *Memulai menggunakan Amazon MSK*.
+ Konfigurasi berikut:
  + Pastikan **autentikasi berbasis peran IAM** **Diaktifkan di pengaturan keamanan klaster** Anda. Ini meningkatkan keamanan Anda dengan membatasi fungsi Lambda Anda untuk hanya mengakses sumber daya MSK Amazon yang diperlukan. Ini diaktifkan secara default pada kluster MSK Amazon baru.
  + Pastikan **akses Publik** tidak aktif di pengaturan jaringan cluster Anda. Membatasi akses klaster MSK Amazon Anda ke internet meningkatkan keamanan Anda dengan membatasi berapa banyak perantara yang menangani data Anda. Ini diaktifkan secara default pada kluster MSK Amazon baru.
+ Topik Kafka di cluster MSK Amazon Anda untuk digunakan untuk solusi ini. Lihat [Membuat topik](https://docs.aws.amazon.com//msk/latest/developerguide/create-topic.html) di *Memulai menggunakan Amazon MSK*.
+ Host admin Kafka disiapkan untuk mengambil informasi dari cluster Kafka Anda dan mengirim acara Kafka ke topik Anda untuk pengujian, seperti instans Amazon EC2 dengan CLI admin Kafka dan perpustakaan Amazon MSK IAM diinstal. Lihat [Membuat mesin klien](https://docs.aws.amazon.com//msk/latest/developerguide/create-client-machine.html) di *Memulai menggunakan Amazon MSK*.

Setelah Anda menyiapkan sumber daya ini, kumpulkan informasi berikut dari AWS akun Anda untuk mengonfirmasi bahwa Anda siap untuk melanjutkan.
+ Nama cluster MSK Amazon Anda. Anda dapat menemukan informasi ini di konsol MSK Amazon.
+ Cluster UUID, bagian dari ARN untuk cluster MSK Amazon Anda, yang dapat Anda temukan di konsol MSK Amazon. Ikuti prosedur di [Daftar klaster](https://docs.aws.amazon.com/msk/latest/developerguide/msk-list-clusters.html) di dokumentasi MSK Amazon untuk menemukan informasi ini.
+ Grup keamanan yang terkait dengan kluster MSK Amazon Anda. Anda dapat menemukan informasi ini di konsol MSK Amazon. Dalam langkah-langkah berikut, lihat ini sebagai milik Anda*clusterSecurityGroups*.
+ Id dari VPC Amazon yang berisi kluster MSK Amazon Anda. Anda dapat menemukan informasi ini dengan mengidentifikasi subnet yang terkait dengan cluster MSK Amazon Anda di konsol MSK Amazon, lalu mengidentifikasi VPC Amazon yang terkait dengan subnet di Konsol VPC Amazon.
+ Nama topik Kafka yang digunakan dalam solusi Anda. Anda dapat menemukan informasi ini dengan menghubungi cluster MSK Amazon Anda dengan Kafka `topics` CLI dari host admin Kafka Anda. Untuk informasi selengkapnya tentang topik CLI, lihat [Menambahkan dan menghapus topik dalam dokumentasi](https://kafka.apache.org/documentation/#basic_ops_add_topic) Kafka.
+ Nama grup konsumen untuk topik Kafka Anda, cocok untuk digunakan oleh fungsi Lambda Anda. Grup ini dapat dibuat secara otomatis oleh Lambda, jadi Anda tidak perlu membuatnya dengan Kafka CLI. Jika Anda perlu mengelola grup konsumen Anda, untuk mempelajari lebih lanjut tentang CLI kelompok konsumen, [lihat Mengelola Grup Konsumen](https://kafka.apache.org/documentation/#basic_ops_consumer_group) di dokumentasi Kafka.

Izin berikut di AWS akun Anda:
+ Izin untuk membuat dan mengelola fungsi Lambda.
+ Izin untuk membuat kebijakan IAM dan mengaitkannya dengan fungsi Lambda Anda.
+ Izin untuk membuat titik akhir VPC Amazon dan mengubah konfigurasi jaringan di VPC Amazon yang menghosting kluster MSK Amazon Anda.

### Instal AWS Command Line Interface
<a name="install_aws_cli"></a>

Jika Anda belum menginstal AWS Command Line Interface, ikuti langkah-langkah di [Menginstal atau memperbarui versi terbaru AWS CLI untuk menginstalnya](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

Tutorial ini membutuhkan terminal baris perintah atau shell untuk menjalankan perintah. Di Linux dan macOS, gunakan shell dan manajer paket pilihan Anda.

**catatan**  
Di Windows, beberapa perintah Bash CLI yang biasa Anda gunakan dengan Lambda (`zip`seperti) tidak didukung oleh terminal bawaan sistem operasi. Untuk mendapatkan versi terintegrasi Windows dari Ubuntu dan Bash, [instal Windows Subsystem untuk](https://docs.microsoft.com/en-us/windows/wsl/install-win10) Linux. 

## Konfigurasikan konektivitas jaringan untuk Lambda untuk berkomunikasi dengan Amazon MSK
<a name="w2aad101c23c15c35c21"></a>

 Gunakan AWS PrivateLink untuk menghubungkan Lambda dan Amazon MSK. Anda dapat melakukannya dengan membuat antarmuka titik akhir VPC Amazon di konsol VPC Amazon. Untuk informasi selengkapnya tentang konfigurasi jaringan, lihat[Mengonfigurasi kluster MSK Amazon dan jaringan VPC Amazon untuk Lambda](with-msk-cluster-network.md). 

Ketika pemetaan sumber peristiwa MSK Amazon berjalan atas nama fungsi Lambda, ia mengasumsikan peran eksekusi fungsi Lambda. Peran IAM ini mengizinkan pemetaan untuk mengakses sumber daya yang diamankan oleh IAM, seperti kluster MSK Amazon Anda. Meskipun komponen berbagi peran eksekusi, pemetaan MSK Amazon dan fungsi Lambda Anda memiliki persyaratan konektivitas terpisah untuk tugasnya masing-masing, seperti yang ditunjukkan pada diagram berikut.

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/msk_tut_network.png)


Pemetaan sumber acara Anda milik grup keamanan klaster MSK Amazon Anda. Pada langkah jaringan ini, buat titik akhir VPC Amazon dari VPC cluster MSK Amazon Anda untuk menghubungkan pemetaan sumber peristiwa ke layanan Lambda dan STS. Amankan titik akhir ini untuk menerima lalu lintas dari grup keamanan klaster MSK Amazon Anda. Kemudian, sesuaikan grup keamanan cluster MSK Amazon untuk memungkinkan pemetaan sumber peristiwa berkomunikasi dengan cluster MSK Amazon.

 Anda dapat mengonfigurasi langkah-langkah berikut menggunakan file Konsol Manajemen AWS.

**Untuk mengonfigurasi antarmuka titik akhir Amazon VPC untuk menghubungkan Lambda dan Amazon MSK**

1. Buat grup keamanan untuk antarmuka Anda titik akhir Amazon VPC,*endpointSecurityGroup*, yang memungkinkan lalu lintas TCP masuk pada 443 dari. *clusterSecurityGroups* Ikuti prosedur di [Buat grup keamanan](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/working-with-security-groups.html#creating-security-group) di dokumentasi Amazon EC2 untuk membuat grup keamanan. Kemudian, ikuti prosedur di [Tambahkan aturan ke grup keamanan](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule) di dokumentasi Amazon EC2 untuk menambahkan aturan yang sesuai. 

   **Buat grup keamanan dengan informasi berikut:**

   Saat menambahkan aturan masuk Anda, buat aturan untuk setiap grup keamanan di*clusterSecurityGroups*. Untuk setiap aturan:
   + Untuk **Type**, pilih **HTTPS**.
   + Untuk **Sumber**, pilih salah satu dari*clusterSecurityGroups*.

1.  Buat titik akhir yang menghubungkan layanan Lambda ke VPC Amazon yang berisi kluster MSK Amazon Anda. Ikuti prosedur di [Buat titik akhir antarmuka](https://docs.aws.amazon.com//vpc/latest/privatelink/create-interface-endpoint.html).

   **Buat titik akhir antarmuka dengan informasi berikut:**
   + Untuk **nama Layanan**, pilih`com.amazonaws.regionName.lambda`, di mana *regionName* host fungsi Lambda Anda.
   + Untuk **VPC, pilih VPC** Amazon yang berisi kluster MSK Amazon Anda.
   + Untuk **grup Keamanan**, pilih*endpointSecurityGroup*, yang Anda buat sebelumnya.
   + Untuk **Subnet**, pilih subnet yang meng-host cluster MSK Amazon Anda.
   + Untuk **Kebijakan**, berikan dokumen kebijakan berikut, yang mengamankan titik akhir untuk digunakan oleh kepala layanan Lambda untuk tindakan tersebut. `lambda:InvokeFunction`

     ```
     {
         "Statement": [
             {
                 "Action": "lambda:InvokeFunction",
                 "Effect": "Allow",
                 "Principal": {
                     "Service": [
                         "lambda.amazonaws.com"
                     ]
                 },
                 "Resource": "*"
             }
         ]
     }
     ```
   + Pastikan **Aktifkan nama DNS** tetap disetel.

1.  Buat titik akhir yang menghubungkan AWS STS layanan ke VPC Amazon yang berisi kluster MSK Amazon Anda. Ikuti prosedur di [Buat titik akhir antarmuka](https://docs.aws.amazon.com//vpc/latest/privatelink/create-interface-endpoint.html).

   **Buat titik akhir antarmuka dengan informasi berikut:**
   + Untuk **nama Layanan**, pilih AWS STS.
   + Untuk **VPC, pilih VPC** Amazon yang berisi kluster MSK Amazon Anda.
   + Untuk **grup Keamanan**, pilih*endpointSecurityGroup*.
   + Untuk **Subnet**, pilih subnet yang meng-host cluster MSK Amazon Anda.
   + Untuk **Kebijakan**, berikan dokumen kebijakan berikut, yang mengamankan titik akhir untuk digunakan oleh kepala layanan Lambda untuk tindakan tersebut. `sts:AssumeRole`

     ```
     {
         "Statement": [
             {
                 "Action": "sts:AssumeRole",
                 "Effect": "Allow",
                 "Principal": {
                     "Service": [
                         "lambda.amazonaws.com"
                     ]
                 },
                 "Resource": "*"
             }
         ]
     }
     ```
   + Pastikan **Aktifkan nama DNS** tetap disetel.

1. Untuk setiap grup keamanan yang terkait dengan kluster MSK Amazon Anda, yaitu*clusterSecurityGroups*, izinkan hal berikut:
   + Izinkan semua lalu lintas TCP masuk dan keluar pada 9098 ke semua*clusterSecurityGroups*, termasuk di dalam dirinya sendiri.
   + Izinkan semua lalu lintas TCP keluar pada 443.

   Beberapa lalu lintas ini diizinkan oleh aturan grup keamanan default, jadi jika klaster Anda dilampirkan ke satu grup keamanan, dan grup tersebut memiliki aturan default, aturan tambahan tidak diperlukan. Untuk menyesuaikan aturan grup keamanan, ikuti prosedur di [Tambahkan aturan ke grup keamanan](https://docs.aws.amazon.com//AWSEC2/latest/UserGuide/working-with-security-groups.html#adding-security-group-rule) di dokumentasi Amazon EC2.

   **Tambahkan aturan ke grup keamanan Anda dengan informasi berikut:**
   + Untuk setiap aturan masuk atau aturan keluar untuk port 9098, sediakan
     + Untuk **Jenis**, pilih **TCP Kustom**.
     + Untuk **jangkauan Port**, sediakan 9098.
     + Untuk **Sumber**, berikan salah satu dari*clusterSecurityGroups*.
   + **Untuk setiap aturan masuk untuk port 443, untuk **Type**, pilih HTTPS.**

## Buat peran IAM untuk dibaca Lambda dari topik MSK Amazon Anda
<a name="w2aad101c23c15c35c23"></a>

Identifikasi persyaratan autentikasi untuk dibaca Lambda dari topik MSK Amazon Anda, lalu tentukan dalam kebijakan. Buat peran,*lambdaAuthRole*, yang mengizinkan Lambda untuk menggunakan izin tersebut. Otorisasi tindakan di klaster MSK Amazon Anda menggunakan tindakan `kafka-cluster` IAM. Kemudian, beri wewenang kepada Lambda untuk melakukan tindakan Amazon `kafka` MSK dan Amazon EC2 yang diperlukan untuk menemukan dan terhubung ke kluster MSK Amazon Anda, serta CloudWatch tindakan agar Lambda dapat mencatat apa yang telah dilakukannya.

**Untuk menjelaskan persyaratan autentikasi agar Lambda dapat dibaca dari Amazon MSK**

1. Tulis dokumen kebijakan IAM (dokumen JSON),*clusterAuthPolicy*, yang memungkinkan Lambda membaca dari topik Kafka Anda di kluster MSK Amazon Anda menggunakan grup konsumen Kafka Anda. Lambda membutuhkan kelompok konsumen Kafka untuk diatur saat membaca.

   Ubah template berikut agar selaras dengan prasyarat Anda:

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "kafka-cluster:Connect",
                   "kafka-cluster:DescribeGroup",
                   "kafka-cluster:AlterGroup",
                   "kafka-cluster:DescribeTopic",
                   "kafka-cluster:ReadData",
                   "kafka-cluster:DescribeClusterDynamicConfiguration"
               ],
               "Resource": [
                   "arn:aws:kafka:us-east-1:111122223333:cluster/mskClusterName/cluster-uuid",
                   "arn:aws:kafka:us-east-1:111122223333:topic/mskClusterName/cluster-uuid/mskTopicName",
                   "arn:aws:kafka:us-east-1:111122223333:group/mskClusterName/cluster-uuid/mskGroupName"
               ]
           }
       ]
   }
   ```

------

   Untuk informasi lebih lanjut, konsultasikan[Mengonfigurasi izin Lambda untuk pemetaan sumber acara MSK Amazon](with-msk-permissions.md). Saat menulis kebijakan Anda:
   + Ganti *us-east-1* dan *111122223333* dengan Wilayah AWS dan Akun AWS dari kluster MSK Amazon Anda.
   + Untuk*mskClusterName*, berikan nama cluster MSK Amazon Anda.
   + Untuk*cluster-uuid*, berikan UUID di ARN untuk cluster MSK Amazon Anda.
   + Untuk*mskTopicName*, berikan nama topik Kafka Anda.
   + Untuk*mskGroupName*, berikan nama grup konsumen Kafka Anda.

1. Identifikasi MSK Amazon, Amazon EC2, CloudWatch dan izin yang diperlukan Lambda untuk menemukan dan menghubungkan kluster MSK Amazon Anda, dan mencatat peristiwa tersebut.

   Kebijakan `AWSLambdaMSKExecutionRole` terkelola secara permisif mendefinisikan izin yang diperlukan. Gunakan dalam langkah-langkah berikut.

   Dalam lingkungan produksi, nilai `AWSLambdaMSKExecutionRole` untuk membatasi kebijakan peran eksekusi Anda berdasarkan prinsip hak istimewa terkecil, lalu tulis kebijakan untuk peran Anda yang menggantikan kebijakan terkelola ini.

Untuk detail tentang bahasa kebijakan IAM, lihat dokumentasi [IAM](https://docs.aws.amazon.com//iam/).

Sekarang setelah Anda menulis dokumen kebijakan Anda, buat kebijakan IAM sehingga Anda dapat melampirkannya ke peran Anda. Anda dapat melakukan ini menggunakan konsol dengan prosedur berikut.

**Untuk membuat kebijakan IAM dari dokumen kebijakan Anda**

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

1. Di panel navigasi sebelah kiri, pilih **Kebijakan**. 

1. Pilih **Buat kebijakan**.

1. Di bagian **Editor kebijakan**, pilih opsi **JSON**.

1. Tempel*clusterAuthPolicy*.

1. Setelah selesai menambahkan izin ke kebijakan, pilih **Berikutnya**.

1. Pada halaman **Tinjau dan buat**, ketik **Nama Kebijakan** dan **Deskripsi** (opsional) untuk kebijakan yang Anda buat. Tinjau **Izin yang ditentukan dalam kebijakan ini** untuk melihat izin yang diberikan oleh kebijakan Anda.

1. Pilih **Buat kebijakan** untuk menyimpan kebijakan baru Anda.

Untuk informasi selengkapnya, lihat [Membuat kebijakan IAM](https://docs.aws.amazon.com//IAM/latest/UserGuide/access_policies_create.html) di dokumentasi IAM.

Sekarang setelah Anda memiliki kebijakan IAM yang sesuai, buat peran dan lampirkan padanya. Anda dapat melakukan ini menggunakan konsol dengan prosedur berikut.

**Untuk membuat peran eksekusi di konsol IAM**

1. Buka [Halaman peran](https://console.aws.amazon.com/iam/home#/roles) di konsol IAM.

1. Pilih **Buat peran**.

1. Di bawah **Jenis entitas tepercaya**, pilih **AWS layanan**.

1. Di bawah **Kasus penggunaan**, pilih **Lambda**.

1. Pilih **Berikutnya**.

1. Pilih kebijakan berikut:
   + *clusterAuthPolicy*
   + `AWSLambdaMSKExecutionRole`

1. Pilih **Berikutnya**.

1. Untuk **nama Peran**, *lambdaAuthRole* masukkan lalu pilih **Buat peran**.

Untuk informasi selengkapnya, lihat [Mendefinisikan izin fungsi Lambda dengan peran pelaksanaan](lambda-intro-execution-role.md).

## Buat fungsi Lambda untuk membaca dari topik MSK Amazon Anda
<a name="w2aad101c23c15c35c25"></a>

Buat fungsi Lambda yang dikonfigurasi untuk menggunakan peran IAM Anda. Anda dapat membuat fungsi Lambda menggunakan konsol.

**Untuk membuat fungsi Lambda menggunakan konfigurasi autentikasi Anda**

1.  Buka konsol Lambda dan pilih **Buat fungsi** dari header. 

1. Pilih **Penulis dari awal**.

1. Untuk **nama Fungsi**, berikan nama yang sesuai pilihan Anda.

1. Untuk **Runtime**, pilih versi **terbaru yang didukung** `Node.js` untuk menggunakan kode yang disediakan dalam tutorial ini.

1. Pilih **Ubah peran eksekusi default**.

1. Pilih **Gunakan peran yang ada**.

1. Untuk **peran yang ada**, pilih*lambdaAuthRole*.

Dalam lingkungan produksi, Anda biasanya perlu menambahkan kebijakan lebih lanjut ke peran eksekusi untuk fungsi Lambda Anda untuk memproses peristiwa MSK Amazon Anda secara bermakna. Untuk informasi selengkapnya tentang menambahkan kebijakan ke peran Anda, lihat [Menambahkan atau menghapus izin identitas](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_manage-attach-detach.html#add-policies-console) dalam dokumentasi IAM.

## Buat pemetaan sumber acara ke fungsi Lambda Anda
<a name="w2aad101c23c15c35c27"></a>

Pemetaan sumber peristiwa MSK Amazon Anda memberi layanan Lambda informasi yang diperlukan untuk memanggil Lambda Anda saat peristiwa MSK Amazon yang sesuai terjadi. Anda dapat membuat pemetaan MSK Amazon menggunakan konsol. Buat pemicu Lambda, lalu pemetaan sumber peristiwa diatur secara otomatis.

**Untuk membuat pemicu Lambda (dan pemetaan sumber peristiwa)**

1. Arahkan ke halaman ikhtisar fungsi Lambda Anda.

1. Di bagian ikhtisar fungsi, pilih **Tambahkan pemicu** di kiri bawah.

1. Di menu tarik-turun **Pilih sumber**, pilih **Amazon** MSK.

1. Jangan mengatur **otentikasi.**

1. Untuk **klaster MSK**, pilih nama klaster Anda.

1. Untuk **ukuran Batch**, masukkan 1. Langkah ini membuat fitur ini lebih mudah untuk diuji, dan bukan merupakan nilai ideal dalam produksi.

1. Untuk **nama Topik**, berikan nama topik Kafka Anda.

1. Untuk **ID grup Konsumen**, berikan id grup konsumen Kafka Anda.

## Perbarui fungsi Lambda Anda untuk membaca data streaming Anda
<a name="w2aad101c23c15c35c29"></a>

 Lambda memberikan informasi tentang peristiwa Kafka melalui parameter metode acara. Untuk contoh struktur acara MSK Amazon, lihat[Contoh peristiwa](with-msk.md#msk-sample-event). Setelah Anda memahami cara menafsirkan peristiwa MSK Amazon yang diteruskan Lambda, Anda dapat mengubah kode fungsi Lambda Anda untuk menggunakan informasi yang mereka berikan. 

 Berikan kode berikut ke fungsi Lambda Anda untuk mencatat konten acara MSK Lambda Amazon untuk tujuan pengujian: 

------
#### [ .NET ]

**SDK untuk .NET**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-msk-to-lambda). 
Mengkonsumsi acara MSK Amazon dengan Lambda menggunakan.NET.  

```
using System.Text;
using Amazon.Lambda.Core;
using Amazon.Lambda.KafkaEvents;


// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace MSKLambda;

public class Function
{
    
    
    /// <param name="input">The event for the Lambda function handler to process.</param>
    /// <param name="context">The ILambdaContext that provides methods for logging and describing the Lambda environment.</param>
    /// <returns></returns>
    public void FunctionHandler(KafkaEvent evnt, ILambdaContext context)
    {

        foreach (var record in evnt.Records)
        {
            Console.WriteLine("Key:" + record.Key); 
            foreach (var eventRecord in record.Value)
            {
                var valueBytes = eventRecord.Value.ToArray();    
                var valueText = Encoding.UTF8.GetString(valueBytes);
                
                Console.WriteLine("Message:" + valueText);
            }
        }
    }
    

}
```

------
#### [ Go ]

**SDK untuk Go V2**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-msk-to-lambda). 
Mengkonsumsi acara MSK Amazon dengan Lambda menggunakan Go.  

```
package main

import (
	"encoding/base64"
	"fmt"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(event events.KafkaEvent) {
	for key, records := range event.Records {
		fmt.Println("Key:", key)

		for _, record := range records {
			fmt.Println("Record:", record)

			decodedValue, _ := base64.StdEncoding.DecodeString(record.Value)
			message := string(decodedValue)
			fmt.Println("Message:", message)
		}
	}
}

func main() {
	lambda.Start(handler)
}
```

------
#### [ Java ]

**SDK untuk Java 2.x**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-msk-to-lambda). 
Mengkonsumsi acara MSK Amazon dengan Lambda menggunakan Java.  

```
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.KafkaEvent;
import com.amazonaws.services.lambda.runtime.events.KafkaEvent.KafkaEventRecord;

import java.util.Base64;
import java.util.Map;

public class Example implements RequestHandler<KafkaEvent, Void> {

    @Override
    public Void handleRequest(KafkaEvent event, Context context) {
        for (Map.Entry<String, java.util.List<KafkaEventRecord>> entry : event.getRecords().entrySet()) {
            String key = entry.getKey();
            System.out.println("Key: " + key);

            for (KafkaEventRecord record : entry.getValue()) {
                System.out.println("Record: " + record);

                byte[] value = Base64.getDecoder().decode(record.getValue());
                String message = new String(value);
                System.out.println("Message: " + message);
            }
        }

        return null;
    }
}
```

------
#### [ JavaScript ]

**SDK untuk JavaScript (v3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-msk-to-lambda). 
Mengkonsumsi acara MSK Amazon dengan menggunakan JavaScript Lambda.  

```
exports.handler = async (event) => {
    // Iterate through keys
    for (let key in event.records) {
      console.log('Key: ', key)
      // Iterate through records
      event.records[key].map((record) => {
        console.log('Record: ', record)
        // Decode base64
        const msg = Buffer.from(record.value, 'base64').toString()
        console.log('Message:', msg)
      }) 
    }
}
```
Mengkonsumsi acara MSK Amazon dengan menggunakan TypeScript Lambda.  

```
import { MSKEvent, Context } from "aws-lambda";
import { Buffer } from "buffer";
import { Logger } from "@aws-lambda-powertools/logger";

const logger = new Logger({
  logLevel: "INFO",
  serviceName: "msk-handler-sample",
});

export const handler = async (
  event: MSKEvent,
  context: Context
): Promise<void> => {
  for (const [topic, topicRecords] of Object.entries(event.records)) {
    logger.info(`Processing key: ${topic}`);

    // Process each record in the partition
    for (const record of topicRecords) {
      try {
        // Decode the message value from base64
        const decodedMessage = Buffer.from(record.value, 'base64').toString();

        logger.info({
          message: decodedMessage
        });
      }
      catch (error) {
        logger.error('Error processing event', { error });
        throw error;
      }
    };
  }
}
```

------
#### [ PHP ]

**SDK untuk PHP**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-msk-to-lambda). 
Mengkonsumsi acara MSK Amazon dengan Lambda menggunakan PHP.  

```
<?php
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0

// using bref/bref and bref/logger for simplicity

use Bref\Context\Context;
use Bref\Event\Kafka\KafkaEvent;
use Bref\Event\Handler as StdHandler;
use Bref\Logger\StderrLogger;

require __DIR__ . '/vendor/autoload.php';

class Handler implements StdHandler
{
    private StderrLogger $logger;
    public function __construct(StderrLogger $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @throws JsonException
     * @throws \Bref\Event\InvalidLambdaEvent
     */
    public function handle(mixed $event, Context $context): void
    {
        $kafkaEvent = new KafkaEvent($event);
        $this->logger->info("Processing records");
        $records = $kafkaEvent->getRecords();

        foreach ($records as $record) {
            try {
                $key = $record->getKey();
                $this->logger->info("Key: $key");

                $values = $record->getValue();
                $this->logger->info(json_encode($values));

                foreach ($values as $value) {
                    $this->logger->info("Value: $value");
                }
                
            } catch (Exception $e) {
                $this->logger->error($e->getMessage());
            }
        }
        $totalRecords = count($records);
        $this->logger->info("Successfully processed $totalRecords records");
    }
}

$logger = new StderrLogger();
return new Handler($logger);
```

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

**SDK untuk Python (Boto3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-msk-to-lambda). 
Mengkonsumsi acara MSK Amazon dengan Lambda menggunakan Python.  

```
import base64

def lambda_handler(event, context):
    # Iterate through keys
    for key in event['records']:
        print('Key:', key)
        # Iterate through records
        for record in event['records'][key]:
            print('Record:', record)
            # Decode base64
            msg = base64.b64decode(record['value']).decode('utf-8')
            print('Message:', msg)
```

------
#### [ Ruby ]

**SDK untuk Ruby**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-msk-to-lambda). 
Mengkonsumsi acara MSK Amazon dengan Lambda menggunakan Ruby.  

```
require 'base64'

def lambda_handler(event:, context:)
  # Iterate through keys
  event['records'].each do |key, records|
    puts "Key: #{key}"

    # Iterate through records
    records.each do |record|
      puts "Record: #{record}"

      # Decode base64
      msg = Base64.decode64(record['value'])
      puts "Message: #{msg}"
    end
  end
end
```

------
#### [ Rust ]

**SDK for Rust**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-msk-to-lambda). 
Mengkonsumsi acara MSK Amazon dengan Lambda menggunakan Rust.  

```
use aws_lambda_events::event::kafka::KafkaEvent;
use lambda_runtime::{run, service_fn, tracing, Error, LambdaEvent};
use base64::prelude::*;
use serde_json::{Value};
use tracing::{info};

/// Pre-Requisites:
/// 1. Install Cargo Lambda - see https://www.cargo-lambda.info/guide/getting-started.html
/// 2. Add packages tracing, tracing-subscriber, serde_json, base64
///
/// This is the main body for the function.
/// Write your code inside it.
/// There are some code example in the following URLs:
/// - https://github.com/awslabs/aws-lambda-rust-runtime/tree/main/examples
/// - https://github.com/aws-samples/serverless-rust-demo/

async fn function_handler(event: LambdaEvent<KafkaEvent>) -> Result<Value, Error> {

    let payload = event.payload.records;

    for (_name, records) in payload.iter() {

        for record in records {

         let record_text = record.value.as_ref().ok_or("Value is None")?;
         info!("Record: {}", &record_text);

         // perform Base64 decoding
         let record_bytes = BASE64_STANDARD.decode(record_text)?;
         let message = std::str::from_utf8(&record_bytes)?;
         
         info!("Message: {}", message);
        }

    }

    Ok(().into())
}

#[tokio::main]
async fn main() -> Result<(), Error> {

    // required to enable CloudWatch error logging by the runtime
    tracing::init_default_subscriber();
    info!("Setup CW subscriber!");

    run(service_fn(function_handler)).await
}
```

------

Anda dapat memberikan kode fungsi ke Lambda Anda menggunakan konsol.

**Untuk memperbarui kode fungsi menggunakan editor kode konsol**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) konsol Lambda dan pilih fungsi Anda.

1. Pilih tab **Kode**.

1. Di panel **Sumber kode**, pilih file kode sumber Anda dan edit di editor kode terintegrasi.

1. Di bagian **DEPLOY**, pilih **Deploy** untuk memperbarui kode fungsi Anda:  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

## Uji fungsi Lambda Anda untuk memverifikasi bahwa itu terhubung ke topik MSK Amazon Anda
<a name="w2aad101c23c15c35c31"></a>

Anda sekarang dapat memverifikasi apakah Lambda Anda sedang dipanggil oleh sumber peristiwa dengan memeriksa CloudWatch log peristiwa atau tidak.

**Untuk memverifikasi apakah fungsi Lambda Anda sedang dipanggil**

1. Gunakan host admin Kafka Anda untuk menghasilkan acara Kafka menggunakan CLI`kafka-console-producer`. Untuk informasi lebih lanjut, lihat [Menulis beberapa peristiwa ke dalam topik](https://kafka.apache.org/documentation/#quickstart_send) dalam dokumentasi Kafka. Kirim peristiwa yang cukup untuk mengisi batch yang ditentukan oleh ukuran batch untuk pemetaan sumber peristiwa yang ditentukan pada langkah sebelumnya, atau Lambda akan menunggu informasi lebih lanjut untuk dipanggil.

1. Jika fungsi Anda berjalan, Lambda menulis apa yang terjadi. CloudWatch Di konsol, navigasikan ke halaman detail fungsi Lambda Anda.

1. Pilih tab **Konfigurasi**.

1. Dari sidebar, pilih **Alat pemantauan dan operasi**.

1. Identifikasi **grup CloudWatch log** di bawah **konfigurasi Logging**. Grup log harus dimulai dengan`/aws/lambda`. Pilih tautan ke grup log.

1. Di CloudWatch konsol, periksa peristiwa Log untuk **peristiwa log** yang dikirim Lambda ke aliran log. Identifikasi apakah ada peristiwa log yang berisi pesan dari acara Kafka Anda, seperti pada gambar berikut. Jika ada, Anda telah berhasil menghubungkan fungsi Lambda ke Amazon MSK dengan pemetaan sumber peristiwa Lambda.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/msk_tut_log.png)

# Menggunakan Lambda dengan Apache Kafka yang dikelola sendiri
<a name="with-kafka"></a>

Topik ini menjelaskan cara menggunakan Lambda dengan klaster Kafka yang dikelola sendiri. Dalam AWS terminologi, cluster yang dikelola sendiri mencakup cluster Kafka yang tidak AWS dihosting. [Misalnya, Anda dapat meng-host cluster Kafka Anda dengan penyedia cloud seperti [Confluent Cloud](https://www.confluent.io/confluent-cloud/) atau Redpanda.](https://www.redpanda.com/)

Bab ini menjelaskan cara menggunakan cluster Apache Kafka yang dikelola sendiri sebagai sumber acara untuk fungsi Lambda Anda. Proses umum untuk mengintegrasikan Apache Kafka yang dikelola sendiri dengan Lambda melibatkan langkah-langkah berikut:

1. **[Pengaturan cluster dan jaringan](with-kafka-cluster-network.md)** — Pertama, siapkan cluster Apache Kafka yang dikelola sendiri dengan konfigurasi jaringan yang benar untuk memungkinkan Lambda mengakses cluster Anda.

1. **[Pengaturan pemetaan sumber peristiwa](with-kafka-configure.md)** — Kemudian, buat sumber daya [pemetaan sumber acara](invocation-eventsourcemapping.md) yang dibutuhkan Lambda untuk menghubungkan cluster Apache Kafka Anda dengan aman ke fungsi Anda.

1. **[Pengaturan fungsi dan izin](with-kafka-permissions.md)** — Terakhir, pastikan bahwa fungsi Anda diatur dengan benar, dan memiliki izin yang diperlukan dalam peran [pelaksanaannya](lambda-intro-execution-role.md).

Apache Kafka sebagai sumber peristiwa beroperasi sama dengan menggunakan Amazon Simple Queue Service (Amazon SQS) atau Amazon Kinesis. Lambda melakukan polling secara internal untuk pesan baru dari sumber peristiwa, lalu memanggil fungsi Lambda target secara sinkron. Lambda membaca pesan dalam batch dan menyediakan ini untuk fungsi Anda sebagai muatan acara. Ukuran batch maksimum dapat dikonfigurasi (defaultnya adalah 100 pesan). Untuk informasi selengkapnya, lihat [Perilaku batching](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching).

Untuk mengoptimalkan throughput pemetaan sumber acara Apache Kafka yang dikelola sendiri, konfigurasikan mode yang disediakan. Dalam mode yang disediakan, Anda dapat menentukan jumlah minimum dan maksimum poller peristiwa yang dialokasikan untuk pemetaan sumber acara Anda. Ini dapat meningkatkan kemampuan pemetaan sumber acara Anda untuk menangani lonjakan pesan yang tidak terduga. Untuk informasi selengkapnya, lihat [mode yang disediakan.](kafka-scaling-modes.md#kafka-provisioned-mode)

**Awas**  
Pemetaan sumber peristiwa Lambda memproses setiap peristiwa setidaknya sekali, dan pemrosesan duplikat catatan dapat terjadi. Untuk menghindari potensi masalah yang terkait dengan duplikat peristiwa, kami sangat menyarankan agar Anda membuat kode fungsi Anda idempoten. Untuk mempelajari lebih lanjut, lihat [Bagaimana cara membuat fungsi Lambda saya idempoten](https://repost.aws/knowledge-center/lambda-function-idempotent) di Pusat Pengetahuan. AWS 

Untuk sumber peristiwa berbasis Kafka, Lambda mendukung parameter kontrol pemrosesan, seperti jendela batching dan ukuran batch. Untuk informasi selengkapnya, lihat [Perilaku batching](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching).

Untuk contoh cara menggunakan Kafka yang dikelola sendiri sebagai sumber acara, lihat [Menggunakan Apache Kafka yang dihosting sendiri sebagai sumber acara](https://aws.amazon.com/blogs/compute/using-self-hosted-apache-kafka-as-an-event-source-for-aws-lambda/) di Blog Komputasi. AWS Lambda AWS 

**Topics**
+ [

## Contoh peristiwa
](#smaa-sample-event)
+ [

# Mengkonfigurasi cluster dan jaringan Apache Kafka yang dikelola sendiri untuk Lambda
](with-kafka-cluster-network.md)
+ [

# Mengonfigurasi izin peran eksekusi Lambda
](with-kafka-permissions.md)
+ [

# Mengkonfigurasi sumber acara Apache Kafka yang dikelola sendiri untuk Lambda
](with-kafka-configure.md)

## Contoh peristiwa
<a name="smaa-sample-event"></a>

Lambda mengirimkan batch pesan dalam parameter peristiwa ketika memanggil fungsi Lambda Anda. Muatan peristiwa berisi array pesan. Setiap item array berisi detail dari topik Kafka dan pengidentifikasi Kafka partisi, bersama-sama dengan stempel waktu dan pesan berkode base64.

```
{
   "eventSource": "SelfManagedKafka",
   "bootstrapServers":"b-2.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092,b-1.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092",
   "records":{
      "mytopic-0":[
         {
            "topic":"mytopic",
            "partition":0,
            "offset":15,
            "timestamp":1545084650987,
            "timestampType":"CREATE_TIME",
            "key":"abcDEFghiJKLmnoPQRstuVWXyz1234==",
            "value":"SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==",
            "headers":[
               {
                  "headerKey":[
                     104,
                     101,
                     97,
                     100,
                     101,
                     114,
                     86,
                     97,
                     108,
                     117,
                     101
                  ]
               }
            ]
         }
      ]
   }
}
```

# Mengkonfigurasi cluster dan jaringan Apache Kafka yang dikelola sendiri untuk Lambda
<a name="with-kafka-cluster-network"></a>

Untuk menghubungkan fungsi Lambda Anda ke cluster Apache Kafka yang dikelola sendiri, Anda perlu mengkonfigurasi cluster dan jaringan tempat ia berada dengan benar. Halaman ini menjelaskan cara mengkonfigurasi cluster dan jaringan Anda. Jika kluster dan jaringan Anda sudah dikonfigurasi dengan benar, lihat [Mengkonfigurasi sumber acara Apache Kafka yang dikelola sendiri untuk Lambda](with-kafka-configure.md) untuk mengonfigurasi pemetaan sumber peristiwa.

**Topics**
+ [

## Pengaturan cluster Apache Kafka yang dikelola sendiri
](#kafka-cluster-setup)
+ [

## Konfigurasikan keamanan jaringan
](#services-kafka-vpc-config)

## Pengaturan cluster Apache Kafka yang dikelola sendiri
<a name="kafka-cluster-setup"></a>

Anda dapat meng-host cluster Apache Kafka yang dikelola sendiri dengan penyedia cloud seperti [Confluent Cloud](https://www.confluent.io/confluent-cloud/) atau [Redpanda, atau menjalankannya di infrastruktur Anda](https://www.redpanda.com/) sendiri. Pastikan klaster Anda dikonfigurasi dengan benar dan dapat diakses dari jaringan tempat pemetaan sumber peristiwa Lambda Anda akan terhubung.

## Konfigurasikan keamanan jaringan
<a name="services-kafka-vpc-config"></a>

Untuk memberi Lambda akses penuh ke Apache Kafka yang dikelola sendiri melalui pemetaan sumber acara Anda, kluster Anda harus menggunakan titik akhir publik (alamat IP publik), atau Anda harus memberikan akses ke Amazon VPC tempat Anda membuat klaster.

Saat Anda menggunakan Apache Kafka yang dikelola sendiri dengan Lambda, buat titik akhir [AWS PrivateLink VPC](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html) yang menyediakan akses fungsi Anda ke sumber daya di VPC Amazon Anda.

**catatan**  
AWS PrivateLink Titik akhir VPC diperlukan untuk fungsi dengan pemetaan sumber peristiwa yang menggunakan mode default (sesuai permintaan) untuk poller acara. Jika pemetaan sumber acara menggunakan [mode yang disediakan](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode), Anda tidak perlu mengonfigurasi titik akhir AWS PrivateLink VPC.

Buat titik akhir untuk menyediakan akses ke sumber daya berikut:
+  Lambda — Buat titik akhir untuk kepala layanan Lambda. 
+  AWS STS — Buat titik akhir AWS STS untuk prinsipal layanan untuk mengambil peran atas nama Anda. 
+  Secrets Manager - Jika klaster Anda menggunakan Secrets Manager untuk menyimpan kredensi, buat endpoint untuk Secrets Manager. 

Atau, konfigurasikan gateway NAT di setiap subnet publik di Amazon VPC. Untuk informasi selengkapnya, lihat [Aktifkan akses internet untuk fungsi Lambda yang terhubung dengan VPC](configuration-vpc-internet.md).

Saat Anda membuat pemetaan sumber peristiwa untuk Apache Kafka yang dikelola sendiri, Lambda memeriksa apakah Antarmuka Jaringan Elastis ENIs () sudah ada untuk subnet dan grup keamanan yang dikonfigurasi untuk VPC Amazon Anda. Jika Lambda menemukan yang ada ENIs, ia mencoba untuk menggunakannya kembali. Jika tidak, Lambda membuat yang baru ENIs untuk terhubung ke sumber acara dan memanggil fungsi Anda.

**catatan**  
Fungsi Lambda selalu berjalan di dalam yang VPCs dimiliki oleh layanan Lambda. Konfigurasi VPC fungsi Anda tidak memengaruhi pemetaan sumber peristiwa. Hanya konfigurasi jaringan sumber acara yang menentukan bagaimana Lambda terhubung ke sumber acara Anda.

Konfigurasikan grup keamanan untuk VPC Amazon yang berisi cluster Anda. Secara default, Apache Kafka yang dikelola sendiri menggunakan port berikut:. `9092`
+ Aturan masuk - Izinkan semua lalu lintas di port broker default untuk grup keamanan yang terkait dengan sumber acara Anda. Atau, Anda dapat menggunakan aturan grup keamanan referensi mandiri untuk mengizinkan akses dari instans dalam grup keamanan yang sama.
+ Aturan keluar — Izinkan semua lalu lintas di port `443` untuk tujuan eksternal jika fungsi Anda perlu berkomunikasi dengan AWS layanan. Atau, Anda juga dapat menggunakan aturan grup keamanan referensi diri untuk membatasi akses ke broker jika Anda tidak perlu berkomunikasi dengan layanan lain AWS .
+ Aturan masuk titik akhir VPC Amazon — Jika Anda menggunakan titik akhir VPC Amazon, grup keamanan yang terkait dengan titik akhir VPC Amazon Anda harus mengizinkan lalu lintas masuk pada port dari grup keamanan klaster. `443`

Jika klaster menggunakan autentikasi, Anda juga dapat membatasi kebijakan endpoint untuk titik akhir Secrets Manager. Untuk memanggil Secrets Manager API, Lambda menggunakan peran fungsi Anda, bukan kepala layanan Lambda.

**Example Kebijakan titik akhir VPC — titik akhir Secrets Manager**  

```
{
      "Statement": [
          {
              "Action": "secretsmanager:GetSecretValue",
              "Effect": "Allow",
              "Principal": {
                  "AWS": [
                      "arn:aws::iam::123456789012:role/my-role"
                  ]
              },
              "Resource": "arn:aws::secretsmanager:us-west-2:123456789012:secret:my-secret"
          }
      ]
  }
```

Saat Anda menggunakan titik akhir Amazon VPC, AWS merutekan panggilan API Anda untuk menjalankan fungsi Anda menggunakan Antarmuka Jaringan Elastis (ENI) titik akhir. Kepala layanan Lambda perlu memanggil `lambda:InvokeFunction` peran dan fungsi apa pun yang menggunakannya. ENIs

Secara default, titik akhir Amazon VPC memiliki kebijakan IAM terbuka yang memungkinkan akses luas ke sumber daya. Praktik terbaik adalah membatasi kebijakan ini untuk melakukan tindakan yang diperlukan menggunakan titik akhir tersebut. Untuk memastikan bahwa pemetaan sumber peristiwa Anda dapat menjalankan fungsi Lambda Anda, kebijakan titik akhir VPC harus mengizinkan kepala layanan Lambda untuk memanggil dan. `sts:AssumeRole` `lambda:InvokeFunction` Membatasi kebijakan titik akhir VPC Anda agar hanya mengizinkan panggilan API yang berasal dari organisasi Anda mencegah pemetaan sumber peristiwa berfungsi dengan baik, `"Resource": "*"` sehingga diperlukan dalam kebijakan ini.

Contoh kebijakan titik akhir VPC berikut menunjukkan cara memberikan akses yang diperlukan ke prinsipal layanan Lambda untuk titik akhir dan Lambda. AWS STS 

**Example Kebijakan Titik Akhir VPC — titik akhir AWS STS**  

```
{
      "Statement": [
          {
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "lambda.amazonaws.com"
                  ]
              },
              "Resource": "*"
          }
      ]
    }
```

**Example Kebijakan Titik Akhir VPC - Titik akhir Lambda**  

```
{
      "Statement": [
          {
              "Action": "lambda:InvokeFunction",
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "lambda.amazonaws.com"
                  ]
              },
              "Resource": "*"
          }
      ]
  }
```

# Mengonfigurasi izin peran eksekusi Lambda
<a name="with-kafka-permissions"></a>

Selain [mengakses cluster Kafka yang dikelola sendiri](kafka-cluster-auth.md), fungsi Lambda Anda memerlukan izin untuk melakukan berbagai tindakan API. Anda menambahkan izin ini ke [peran eksekusi](lambda-intro-execution-role.md) fungsi. Jika pengguna Anda memerlukan akses ke tindakan API apa pun, tambahkan izin yang diperlukan ke kebijakan identitas untuk pengguna atau AWS Identity and Access Management peran (IAM).

**Topics**
+ [

## Izin fungsi Lambda diperlukan
](#smaa-api-actions-required)
+ [

## Izin fungsi Lambda opsional
](#smaa-api-actions-optional)
+ [

## Menambahkan izin ke peran eksekusi
](#smaa-permissions-add-policy)
+ [

## Memberikan akses pengguna dengan kebijakan IAM
](#smaa-permissions-add-users)

## Izin fungsi Lambda diperlukan
<a name="smaa-api-actions-required"></a>

Untuk membuat dan menyimpan log dalam grup log di Amazon CloudWatch Logs, fungsi Lambda Anda harus memiliki izin berikut dalam peran pelaksanaannya:
+ [log: CreateLogGroup](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogGroup.html)
+ [log: CreateLogStream](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogStream.html)
+ [log: PutLogEvents](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html)

## Izin fungsi Lambda opsional
<a name="smaa-api-actions-optional"></a>

Fungsi Lambda Anda mungkin juga memerlukan izin untuk:
+ Jelaskan rahasia Secrets Manager Anda.
+ Akses AWS Key Management Service (AWS KMS) kunci terkelola pelanggan Anda.
+ Akses VPC Amazon Anda.
+ Kirim catatan pemanggilan yang gagal ke tujuan.

### Secrets Manager dan AWS KMS izin
<a name="smaa-api-actions-secrets"></a>

Bergantung pada jenis kontrol akses yang Anda konfigurasikan untuk broker Kafka Anda, fungsi Lambda Anda mungkin memerlukan izin untuk mengakses rahasia Secrets Manager Anda atau untuk mendekripsi kunci yang dikelola pelanggan Anda. AWS KMS Untuk mengakses sumber daya ini, peran eksekusi fungsi Anda harus memiliki izin berikut:
+ [manajer rahasia: GetSecretValue](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html)
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)

### Izin VPC
<a name="smaa-api-actions-vpc"></a>

Jika hanya pengguna dalam VPC yang dapat mengakses cluster Apache Kafka yang dikelola sendiri, fungsi Lambda Anda harus memiliki izin untuk mengakses sumber daya VPC Amazon Anda. Sumber daya ini termasuk VPC, subnet, grup keamanan, dan antarmuka jaringan. Untuk mengakses sumber daya ini, peran eksekusi fungsi Anda harus memiliki izin berikut:
+ [EC2: CreateNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInterface.html)
+ [EC2: DescribeNetworkInterfaces](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html)
+ [EC2: DescribeVpcs](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcs.html)
+ [EC2: DeleteNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkInterface.html)
+ [EC2: DescribeSubnets](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSubnets.html)
+ [EC2: DescribeSecurityGroups](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroups.html)

## Menambahkan izin ke peran eksekusi
<a name="smaa-permissions-add-policy"></a>

[Untuk mengakses AWS layanan lain yang digunakan cluster Apache Kafka yang dikelola sendiri, Lambda menggunakan kebijakan izin yang Anda tentukan dalam peran eksekusi fungsi Lambda Anda.](lambda-intro-execution-role.md)

Secara default, Lambda tidak diizinkan untuk melakukan tindakan yang diperlukan atau opsional untuk klaster Apache Kafka yang dikelola sendiri. Anda harus membuat dan mendefinisikan tindakan ini dalam [kebijakan kepercayaan IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_update-role-trust-policy.html) untuk peran eksekusi Anda. Contoh ini menunjukkan cara agar Anda dapat membuat kebijakan yang mengizinkan Lambda mengakses sumber daya Amazon VPC Anda.

------
#### [ JSON ]

****  

```
{
        "Version":"2012-10-17",		 	 	 
        "Statement":[
           {
              "Effect":"Allow",
              "Action":[
                 "ec2:CreateNetworkInterface",
                 "ec2:DescribeNetworkInterfaces",
                 "ec2:DescribeVpcs",
                 "ec2:DeleteNetworkInterface",
                 "ec2:DescribeSubnets",
                 "ec2:DescribeSecurityGroups"
              ],
              "Resource":"*"
           }
        ]
     }
```

------

## Memberikan akses pengguna dengan kebijakan IAM
<a name="smaa-permissions-add-users"></a>

Secara default, pengguna dan peran tidak memiliki izin untuk melakukan [operasi API sumber peristiwa](invocation-eventsourcemapping.md#event-source-mapping-api). Untuk memberikan akses ke pengguna di organisasi atau akun Anda, Anda membuat atau memperbarui kebijakan berbasis identitas. Untuk informasi selengkapnya, lihat [Mengontrol akses ke AWS sumber daya menggunakan kebijakan](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_controlling.html) di *Panduan Pengguna IAM*.

Untuk mengatasi masalah kesalahan autentikasi dan otorisasi, lihat. [Memecahkan masalah kesalahan pemetaan sumber acara Kafka](with-kafka-troubleshoot.md)

# Mengkonfigurasi sumber acara Apache Kafka yang dikelola sendiri untuk Lambda
<a name="with-kafka-configure"></a>

Untuk menggunakan cluster Apache Kafka yang dikelola sendiri sebagai sumber peristiwa untuk fungsi Lambda Anda, Anda membuat [pemetaan sumber peristiwa yang menghubungkan dua sumber daya](invocation-eventsourcemapping.md). Halaman ini menjelaskan cara membuat pemetaan sumber acara untuk Apache Kafka yang dikelola sendiri.

Halaman ini mengasumsikan bahwa Anda telah mengkonfigurasi cluster Kafka dengan benar dan jaringan tempat ia berada. Jika Anda perlu mengatur cluster atau jaringan Anda, lihat[Mengkonfigurasi cluster dan jaringan Apache Kafka yang dikelola sendiri untuk Lambda](with-kafka-cluster-network.md).

**Topics**
+ [

## Menggunakan cluster Apache Kafka yang dikelola sendiri sebagai sumber acara
](#kafka-esm-overview)
+ [

# Mengkonfigurasi metode otentikasi cluster di Lambda
](kafka-cluster-auth.md)
+ [

# Membuat pemetaan sumber acara Lambda untuk sumber acara Apache Kafka yang dikelola sendiri
](kafka-esm-create.md)
+ [

# Semua parameter konfigurasi sumber acara Apache Kafka yang dikelola sendiri di Lambda
](kafka-esm-parameters.md)

## Menggunakan cluster Apache Kafka yang dikelola sendiri sebagai sumber acara
<a name="kafka-esm-overview"></a>

[Saat Anda menambahkan kluster Apache Kafka atau Amazon MSK sebagai pemicu fungsi Lambda Anda, cluster digunakan sebagai sumber peristiwa.](invocation-eventsourcemapping.md)

Lambda membaca data peristiwa dari topik Kafka yang Anda tentukan seperti `Topics` dalam [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)permintaan, berdasarkan [posisi awal](kafka-starting-positions.md) yang Anda tentukan. Setelah pemrosesan berhasil, topik Kafka Anda dijalankan untuk klaster Kafka Anda.

Lambda membaca pesan secara berurutan untuk setiap partisi topik Kafka. Payload Lambda tunggal dapat berisi pesan dari beberapa partisi. Bila lebih banyak rekaman tersedia, Lambda terus memproses catatan dalam batch, berdasarkan BatchSize nilai yang Anda tentukan dalam [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)permintaan, hingga fungsi Anda mengikuti topik.

Setelah Lambda memproses setiap batch, Lambda melakukan offset pesan dalam batch tersebut. Jika fungsi Anda mengembalikan kesalahan untuk salah satu pesan dalam batch, Lambda mencoba ulang seluruh batch pesan sampai berhasil diproses atau pesan berakhir. Anda dapat mengirim catatan yang gagal dalam semua upaya percobaan ulang ke tujuan yang gagal untuk diproses nanti.

**catatan**  
Sementara fungsi Lambda biasanya memiliki batas waktu tunggu maksimum 15 menit, pemetaan sumber acara untuk Amazon MSK, Apache Kafka yang dikelola sendiri, Amazon DocumentDB, dan Amazon MQ untuk ActiveMQ dan RabbitMQ hanya mendukung fungsi dengan batas waktu tunggu maksimum 14 menit.

# Mengkonfigurasi metode otentikasi cluster di Lambda
<a name="kafka-cluster-auth"></a>

Lambda mendukung beberapa metode untuk mengautentikasi dengan klaster Apache Kafka yang dikelola sendiri. Pastikan Anda mengonfigurasi cluster Kafka untuk menggunakan salah satu metode otentikasi yang didukung ini. Untuk informasi lebih lanjut tentang keamanan Kafka, lihat bagian [Keamanan](http://kafka.apache.org/documentation.html#security) dari dokumentasi Kafka.

## Otentikasi SASL/SCRAM
<a name="smaa-auth-sasl"></a>

Lambda mendukung otentikasi Simple Authentication and Security Layer/Salted Challenge Response Authentication Mechanism (SASL/SCRAM) otentikasi dengan enkripsi Transport Layer Security (TLS) (). `SASL_SSL` Lambda mengirimkan kredensial terenkripsi untuk mengautentikasi dengan klaster. Lambda tidak mendukung SASL/SCRAM dengan plaintext (). `SASL_PLAINTEXT` Untuk informasi selengkapnya tentang SASL/SCRAM otentikasi, lihat [RFC](https://tools.ietf.org/html/rfc5802) 5802.

Lambda juga mendukung SASL/PLAIN otentikasi. Karena mekanisme ini menggunakan kredensyal teks yang jelas, koneksi ke server harus menggunakan enkripsi TLS untuk memastikan bahwa kredensialnya dilindungi.

Untuk autentikasi SASL, Anda menyimpan kredensyal masuk sebagai rahasia. AWS Secrets Manager Untuk informasi selengkapnya tentang menggunakan Secrets Manager, lihat [Membuat AWS Secrets Manager rahasia](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html) di *Panduan AWS Secrets Manager Pengguna*.

**penting**  
Untuk menggunakan Secrets Manager untuk otentikasi, rahasia harus disimpan di AWS wilayah yang sama dengan fungsi Lambda Anda.

## Autentikasi TLS bersama
<a name="smaa-auth-mtls"></a>

Mutual TLS (mTLS) menyediakan otentikasi dua arah antara klien dan server. Klien mengirimkan sertifikat ke server untuk server untuk memverifikasi klien, dan server mengirimkan sertifikat ke klien untuk klien untuk memverifikasi server. 

Dalam Apache Kafka yang dikelola sendiri, Lambda bertindak sebagai klien. Anda mengonfigurasi sertifikat klien (sebagai rahasia di Secrets Manager) untuk mengautentikasi Lambda dengan broker Kafka Anda. Sertifikat klien harus ditandatangani oleh CA di toko kepercayaan server.

Cluster Kafka mengirimkan sertifikat server ke Lambda untuk mengautentikasi broker Kafka dengan Lambda. Sertifikat server dapat berupa sertifikat CA publik atau sertifikat CA/self-signed certificate. The public CA certificate must be signed by a certificate authority (CA) that's in the Lambda trust store. For a private CA/self yang ditandatangani pribadi, Anda mengonfigurasi sertifikat CA root server (sebagai rahasia di Secrets Manager). Lambda menggunakan sertifikat root untuk memverifikasi broker Kafka.

Untuk informasi selengkapnya tentang mTL, lihat [Memperkenalkan autentikasi TLS timbal balik untuk Amazon MSK sebagai sumber acara](https://aws.amazon.com/blogs/compute/introducing-mutual-tls-authentication-for-amazon-msk-as-an-event-source).

## Mengkonfigurasi rahasia sertifikat klien
<a name="smaa-auth-secret"></a>

Rahasia CLIENT\$1CERTIFICATE\$1TLS\$1AUTH memerlukan bidang sertifikat dan bidang kunci pribadi. Untuk kunci pribadi terenkripsi, rahasianya memerlukan kata sandi kunci pribadi. Baik sertifikat dan kunci pribadi harus dalam format PEM.

**catatan**  
Lambda mendukung [PBES1](https://datatracker.ietf.org/doc/html/rfc2898/#section-6.1)(tetapi tidak PBES2) algoritma enkripsi kunci pribadi.

Bidang sertifikat harus berisi daftar sertifikat, dimulai dengan sertifikat klien, diikuti oleh sertifikat perantara, dan diakhiri dengan sertifikat root. Setiap sertifikat harus dimulai pada baris baru dengan struktur berikut:

```
-----BEGIN CERTIFICATE-----  
            <certificate contents>
-----END CERTIFICATE-----
```

Secrets Manager mendukung rahasia hingga 65.536 byte, yang merupakan ruang yang cukup untuk rantai sertifikat yang panjang.

Kunci pribadi harus dalam format [PKCS \$18](https://datatracker.ietf.org/doc/html/rfc5208), dengan struktur berikut:

```
-----BEGIN PRIVATE KEY-----  
             <private key contents>
-----END PRIVATE KEY-----
```

Untuk kunci pribadi terenkripsi, gunakan struktur berikut:

```
-----BEGIN ENCRYPTED PRIVATE KEY-----  
              <private key contents>
-----END ENCRYPTED PRIVATE KEY-----
```

Contoh berikut menunjukkan isi rahasia untuk otentikasi mTLS menggunakan kunci pribadi terenkripsi. Untuk kunci pribadi terenkripsi, sertakan kata sandi kunci pribadi dalam rahasia.

```
{"privateKeyPassword":"testpassword",
"certificate":"-----BEGIN CERTIFICATE-----
MIIE5DCCAsygAwIBAgIRAPJdwaFaNRrytHBto0j5BA0wDQYJKoZIhvcNAQELBQAw
...
j0Lh4/+1HfgyE2KlmII36dg4IMzNjAFEBZiCRoPimO40s1cRqtFHXoal0QQbIlxk
cmUuiAii9R0=
-----END CERTIFICATE-----
-----BEGIN CERTIFICATE-----
MIIFgjCCA2qgAwIBAgIQdjNZd6uFf9hbNC5RdfmHrzANBgkqhkiG9w0BAQsFADBb
...
rQoiowbbk5wXCheYSANQIfTZ6weQTgiCHCCbuuMKNVS95FkXm0vqVD/YpXKwA/no
c8PH3PSoAaRwMMgOSA2ALJvbRz8mpg==
-----END CERTIFICATE-----",
"privateKey":"-----BEGIN ENCRYPTED PRIVATE KEY-----
MIIFKzBVBgkqhkiG9w0BBQ0wSDAnBgkqhkiG9w0BBQwwGgQUiAFcK5hT/X7Kjmgp
...
QrSekqF+kWzmB6nAfSzgO9IaoAaytLvNgGTckWeUkWn/V0Ck+LdGUXzAC4RxZnoQ
zp2mwJn2NYB7AZ7+imp0azDZb+8YG2aUCiyqb6PnnA==
-----END ENCRYPTED PRIVATE KEY-----"
}
```

## Mengkonfigurasi rahasia sertifikat CA root server
<a name="smaa-auth-ca-cert"></a>

Anda membuat rahasia ini jika broker Kafka Anda menggunakan enkripsi TLS dengan sertifikat yang ditandatangani oleh CA pribadi. Anda dapat menggunakan enkripsi TLS untuk VPCSASL/SCRAM, SASL/PLAIN,, atau otentikasi mTLS.

Rahasia sertifikat CA root server memerlukan bidang yang berisi sertifikat CA root broker Kafka dalam format PEM. Contoh berikut menunjukkan struktur rahasia.

```
{"certificate":"-----BEGIN CERTIFICATE-----
MIID7zCCAtegAwIBAgIBADANBgkqhkiG9w0BAQsFADCBmDELMAkGA1UEBhMCVVMx
EDAOBgNVBAgTB0FyaXpvbmExEzARBgNVBAcTClNjb3R0c2RhbGUxJTAjBgNVBAoT
HFN0YXJmaWVsZCBUZWNobm9sb2dpZXMsIEluYy4xOzA5BgNVBAMTMlN0YXJmaWVs
ZCBTZXJ2aWNlcyBSb290IENlcnRpZmljYXRlIEF1dG...
-----END CERTIFICATE-----"
}
```

# Membuat pemetaan sumber acara Lambda untuk sumber acara Apache Kafka yang dikelola sendiri
<a name="kafka-esm-create"></a>

[Untuk membuat pemetaan sumber peristiwa, Anda dapat menggunakan konsol Lambda, [AWS Command Line Interface (CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)), atau SDK.AWS](https://aws.amazon.com/getting-started/tools-sdks/)

Langkah-langkah konsol berikut menambahkan cluster Apache Kafka yang dikelola sendiri sebagai pemicu fungsi Lambda Anda. Di bawah tenda, ini menciptakan sumber daya pemetaan sumber peristiwa.

## Prasyarat
<a name="kafka-esm-prereqs"></a>
+ Klaster Apache Kafka yang dikelola sendiri. Lambda mendukung Apache Kafka versi 0.10.1.0 dan yang lebih baru.
+ [Peran eksekusi](lambda-intro-execution-role.md) dengan izin untuk mengakses AWS sumber daya yang digunakan cluster Kafka yang dikelola sendiri oleh Anda.

## Menambahkan klaster Kafka yang dikelola sendiri (konsol)
<a name="kafka-esm-console"></a>

Ikuti langkah-langkah untuk menambahkan klaster Apache Kafka yang dikelola sendiri dan topik Kafka sebagai pemicu untuk fungsi Lambda Anda.

**Untuk menambahkan pemicu Apache Kafka untuk fungsi Lambda Anda (konsol)**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih nama fungsi Lambda Anda.

1. Di bagian **Gambaran umum fungsi**, pilih **Tambah pemicu**.

1. Pada **Konfigurasi pemicu**, lakukan hal berikut:

   1. Pilih jenis pemicu **Apache Kafka**.

   1. Untuk **Server bootstrap**, masukkan alamat pasangan host dan port broker Kafka di klaster Anda, lalu pilih **Tambahkan**. Ulangi untuk setiap broker Kafka di klaster.

   1. Untuk **Nama topik**, masukkan nama topik Kafka yang digunakan untuk menyimpan catatan dalam klaster.

   1. Jika Anda mengonfigurasi mode yang disediakan, masukkan nilai untuk poller **peristiwa Minimum, nilai untuk poller** **peristiwa maksimum**, dan nilai opsional PollerGroupName untuk menentukan pengelompokan beberapa ESMs dalam VPC sumber peristiwa yang sama.

   1. (Opsional) Untuk **Ukuran batch**, masukkan jumlah maksimum catatan yang akan diterima dalam satu batch.

   1. Untuk **jendela Batch**, masukkan jumlah maksimum detik yang dihabiskan Lambda untuk mengumpulkan catatan sebelum menjalankan fungsi.

   1. (Opsional) Untuk **ID grup Konsumen**, masukkan ID grup konsumen Kafka untuk bergabung.

   1. (Opsional) Untuk **posisi Mulai**, pilih **Terbaru** untuk mulai membaca aliran dari catatan terbaru, **Potong cakrawala** untuk memulai pada catatan paling awal yang tersedia, atau **Pada stempel waktu untuk menentukan stempel** waktu untuk mulai membaca.

   1. (Opsional) Untuk **VPC**, pilih Amazon VPC untuk cluster Kafka Anda. **Kemudian, pilih **subnet VPC dan grup keamanan** VPC.**

      Pengaturan ini diperlukan jika hanya pengguna dalam VPC Anda yang mengakses broker Anda.

      

   1. (Opsional) Untuk **Otentikasi**, pilih **Tambah**, lalu lakukan hal berikut:

      1. Pilih protokol akses atau otentikasi broker Kafka di cluster Anda.
         + **Jika broker Kafka Anda menggunakan SASL/PLAIN otentikasi, pilih BASIC\$1AUTH.**
         + Jika broker Anda menggunakan SASL/SCRAM otentikasi, pilih salah satu **SASL\$1SCRAM**protokol.
         + **Jika Anda mengonfigurasi otentikasi mTLS, pilih protokol CLIENT\$1CERTIFICATE\$1TLS\$1AUTH.**

      1. Untuk SASL/SCRAM atau otentikasi mTLS, pilih kunci rahasia Secrets Manager yang berisi kredensyal untuk cluster Kafka Anda.

   1. (Opsional) Untuk **Enkripsi**, pilih rahasia Secrets Manager yang berisi sertifikat CA root yang digunakan broker Kafka Anda untuk enkripsi TLS, jika broker Kafka Anda menggunakan sertifikat yang ditandatangani oleh CA pribadi.

      Pengaturan ini berlaku untuk enkripsi TLS untuk SASL/SCRAM atau SASL/PLAIN, dan untuk otentikasi mTLS.

   1. Untuk membuat pemicu dalam status nonaktif untuk pengujian (disarankan), hapus **Aktifkan pemicu**. Atau, untuk segera mengaktifkan pemicu, pilih **Aktifkan pemicu**.

1. Untuk membuat pemicu, pilih **Tambahkan**.

## Menambahkan klaster Kafka yang dikelola sendiri (AWS CLI)
<a name="kafka-esm-cli"></a>

Gunakan contoh AWS CLI perintah berikut untuk membuat dan melihat pemicu Apache Kafka yang dikelola sendiri untuk fungsi Lambda Anda.

### Menggunakan SASL/SCRAM
<a name="kafka-esm-cli-create"></a>

Jika pengguna Kafka mengakses broker Kafka Anda melalui internet, tentukan rahasia Secrets Manager yang Anda buat untuk SASL/SCRAM otentikasi. Contoh berikut menggunakan [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html) AWS CLI perintah untuk memetakan fungsi Lambda bernama `my-kafka-function` ke topik Kafka bernama. `AWSKafkaTopic`

```
aws lambda create-event-source-mapping \ 
  --topics AWSKafkaTopic \
  --source-access-configuration Type=SASL_SCRAM_512_AUTH,URI=arn:aws:secretsmanager:us-east-1:111122223333:secret:MyBrokerSecretName \
  --function-name arn:aws:lambda:us-east-1:111122223333:function:my-kafka-function \
  --self-managed-event-source '{"Endpoints":{"KAFKA_BOOTSTRAP_SERVERS":["abc3.xyz.com:9092", "abc2.xyz.com:9092"]}}'
```

### Menggunakan VPC
<a name="kafka-esm-cli-create-vpc"></a>

Jika hanya Kafka pengguna dalam VPC Anda yang mengakses broker Kafka Anda, Anda harus menentukan VPC, subnet, dan grup keamanan VPC Anda. Contoh berikut menggunakan [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html) AWS CLI perintah untuk memetakan fungsi Lambda bernama `my-kafka-function` ke topik Kafka bernama. `AWSKafkaTopic`

```
aws lambda create-event-source-mapping \ 
  --topics AWSKafkaTopic \
  --source-access-configuration '[{"Type": "VPC_SUBNET", "URI": "subnet:subnet-0011001100"}, {"Type": "VPC_SUBNET", "URI": "subnet:subnet-0022002200"}, {"Type": "VPC_SECURITY_GROUP", "URI": "security_group:sg-0123456789"}]' \
  --function-name arn:aws:lambda:us-east-1:111122223333:function:my-kafka-function \
  --self-managed-event-source '{"Endpoints":{"KAFKA_BOOTSTRAP_SERVERS":["abc3.xyz.com:9092", "abc2.xyz.com:9092"]}}'
```

### Melihat status menggunakan AWS CLI
<a name="kafka-esm-cli-view"></a>

Contoh berikut menggunakan [get-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/get-event-source-mapping.html) AWS CLI perintah untuk menggambarkan status pemetaan sumber peristiwa yang Anda buat.

```
aws lambda get-event-source-mapping
              --uuid dh38738e-992b-343a-1077-3478934hjkfd7
```

# Semua parameter konfigurasi sumber acara Apache Kafka yang dikelola sendiri di Lambda
<a name="kafka-esm-parameters"></a>

Semua jenis sumber peristiwa Lambda berbagi operasi yang sama [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)dan [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)API. Namun, hanya beberapa parameter yang berlaku untuk Apache Kafka yang dikelola sendiri, seperti yang ditunjukkan pada tabel berikut.


| Parameter | Diperlukan | Default | Catatan | 
| --- | --- | --- | --- | 
|  BatchSize  |  T  |  100  |  Maksimum: 10.000.  | 
|  DestinationConfig  |  T  |  N/A  |  [Menangkap batch yang dibuang untuk Amazon MSK dan sumber acara Apache Kafka yang dikelola sendiri](kafka-on-failure.md)  | 
|  Diaktifkan  |  T  |  True  |  | 
|  FilterCriteria  |  T  |  N/A  |  [Kontrol peristiwa mana yang dikirim Lambda ke fungsi Anda](invocation-eventfiltering.md)  | 
|  FunctionName  |  Y  |  N/A  |    | 
|  KMSKeyArn  |  T  |  N/A  |  [Enkripsi kriteria filter](invocation-eventfiltering.md#filter-criteria-encryption)  | 
|  MaximumBatchingWindowInSeconds  |  T  |  500 ms  |  [Perilaku batching](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching)  | 
|  ProvisionedPollersConfig  |  T  |  `MinimumPollers`: nilai default 1 jika tidak ditentukan `MaximumPollers`: nilai default 200 jika tidak ditentukan `PollerGroupName`: N/A  |  [Mode yang disediakan](kafka-scaling-modes.md#kafka-provisioned-mode)  | 
|  SelfManagedEventSource  |  Y  | N/A |  Daftar Broker Kafka. Hanya dapat mengatur di Create  | 
|  SelfManagedKafkaEventSourceConfig  |  T  |  Berisi ConsumerGroupId bidang yang default ke nilai unik.  |  Hanya dapat mengatur di Create  | 
|  SourceAccessConfigurations  |  T  |  Tidak ada kredenensi  |  Informasi VPC atau kredensial autentikasi untuk klaster   Untuk SASL\$1PLAIN, setel ke BASIC\$1AUTH  | 
|  StartingPosition  |  Y  |  N/A  |  AT\$1TIMESTAMP, TRIM\$1HORIZON, atau TERBARU Hanya dapat mengatur di Create  | 
|  StartingPositionTimestamp  |  T  |  N/A  |  Diperlukan jika StartingPosition disetel ke AT\$1TIMESTAMP  | 
|  Tanda  |  T  |  N/A  |  [Menggunakan tag pada pemetaan sumber acara](tags-esm.md)  | 
|  Topik  |  Y  |  N/A  |  Nama topik Hanya dapat mengatur di Create  | 

**catatan**  
Saat Anda menentukan`PollerGroupName`, beberapa ESMs dalam VPC Amazon yang sama dapat berbagi kapasitas Event Poller Unit (EPU). Anda dapat menggunakan opsi ini untuk mengoptimalkan biaya mode Provisioned untuk Anda. ESMs Persyaratan untuk pengelompokan ESM:  
ESMs harus berada dalam VPC Amazon yang sama
Maksimal 100 ESMs per kelompok poller
Agregat poller maksimum ESMs di semua kelompok tidak boleh melebihi 2000
Anda dapat memperbarui `PollerGroupName` untuk memindahkan ESM ke grup lain, atau menghapus ESM dari grup dengan menyetel `PollerGroupName` ke string kosong (“”).

# Mode penskalaan poller acara Apache Kafka di Lambda
<a name="kafka-scaling-modes"></a>

Anda dapat memilih antara dua mode penskalaan poller acara untuk Amazon MSK dan pemetaan sumber acara Apache Kafka yang dikelola sendiri:
+ [Mode sesuai permintaan (default)](#kafka-default-mode)
+ [Mode yang disediakan](#kafka-provisioned-mode)

## Mode sesuai permintaan (default)
<a name="kafka-default-mode"></a>

Saat Anda awalnya membuat sumber acara Kafka, Lambda mengalokasikan sejumlah poller acara default untuk memproses semua partisi dalam topik Kafka. Lambda secara otomatis menaikkan atau menurunkan jumlah [poller acara](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode) berdasarkan pemuatan pesan.

Dalam interval satu menit, Lambda mengevaluasi lag offset dari semua partisi dalam topik. Jika offset lag terlalu tinggi, partisi menerima pesan lebih cepat daripada Lambda dapat memprosesnya. Jika perlu, Lambda menambahkan atau menghapus poller acara dari topik. Proses penskalaan otomatis untuk menambah atau menghapus poller peristiwa ini terjadi dalam waktu tiga menit setelah evaluasi.

Jika fungsi Lambda target Anda dibatasi, Lambda mengurangi jumlah poller acara. Tindakan ini mengurangi beban kerja pada fungsi dengan mengurangi jumlah pesan yang dapat diambil dan dikirim oleh poller peristiwa ke fungsi.

## Mode yang disediakan
<a name="kafka-provisioned-mode"></a>

Untuk beban kerja di mana Anda perlu menyempurnakan throughput pemetaan sumber peristiwa, Anda dapat menggunakan mode yang disediakan. Dalam mode yang disediakan, Anda menentukan batas minimum dan maksimum untuk jumlah poller acara yang disediakan. Poller acara yang disediakan ini didedikasikan untuk pemetaan sumber acara Anda, dan dapat menangani lonjakan pesan yang tidak terduga melalui penskalaan otomatis responsif. Kami menyarankan Anda menggunakan mode yang disediakan untuk beban kerja Kafka yang memiliki persyaratan kinerja yang ketat.

Di Lambda, poller peristiwa adalah unit komputasi dengan kemampuan throughput yang bervariasi menurut jenis sumber peristiwa. Untuk Amazon MSK dan Apache Kafka yang dikelola sendiri, setiap poller acara dapat menangani hingga 5 throughput atau hingga 5 MB/sec pemanggilan bersamaan. Misalnya, jika sumber acara Anda menghasilkan payload rata-rata 1 MB dan durasi rata-rata fungsi Anda adalah 1 detik, satu poller acara Kafka dapat mendukung 5 MB/sec throughput dan 5 pemanggilan Lambda bersamaan (dengan asumsi tidak ada transformasi payload). Untuk Amazon SQS, setiap poller peristiwa dapat menangani hingga 1 throughput atau hingga MB/sec 10 pemanggilan bersamaan. Menggunakan mode yang disediakan menimbulkan biaya tambahan berdasarkan penggunaan poller acara Anda. Untuk detail harganya, lihat [Harga AWS Lambda](https://aws.amazon.com/lambda/pricing/).

**catatan**  
Saat menggunakan mode yang disediakan, Anda tidak perlu membuat titik akhir AWS PrivateLink VPC atau memberikan izin terkait sebagai bagian dari konfigurasi jaringan Anda.

Dalam mode yang disediakan, kisaran nilai yang diterima untuk jumlah minimum poller acara (`MinimumPollers`) adalah antara 1 dan 200, inklusif. Kisaran nilai yang diterima untuk jumlah maksimum poller acara (`MaximumPollers`) adalah antara 1 dan 2.000, inklusif. `MaximumPollers`harus lebih besar dari atau sama dengan`MinimumPollers`. Selain itu, untuk mempertahankan pemrosesan yang teratur dalam partisi, Lambda membatasi `MaximumPollers` jumlah partisi dalam topik.

Untuk detail selengkapnya tentang memilih nilai yang sesuai untuk poller acara minimum dan maksimum, lihat[Praktik terbaik](#kafka-provisioned-mode-bp).

Anda dapat mengonfigurasi mode yang disediakan untuk pemetaan sumber acara Kafka menggunakan konsol atau API Lambda.

**Untuk mengonfigurasi mode yang disediakan untuk pemetaan sumber peristiwa yang ada (konsol)**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi dengan pemetaan sumber peristiwa yang ingin Anda konfigurasikan untuk mode yang disediakan.

1. Pilih **Konfigurasi**, lalu pilih **Pemicu.**

1. **Pilih pemetaan sumber peristiwa yang ingin Anda konfigurasikan untuk mode yang disediakan, lalu pilih Edit.**

1. **Di bawah **Mode yang disediakan**, pilih Konfigurasi.**
   + Untuk **poller acara Minimum**, masukkan nilai antara 1 dan 200. Jika Anda tidak menentukan nilai, Lambda memilih nilai default 1.
   + Untuk **poller acara Maksimum**, masukkan nilai antara 1 dan 2.000. Nilai ini harus lebih besar dari atau sama dengan nilai Anda untuk **poller acara Minimum**. Jika Anda tidak menentukan nilai, Lambda memilih nilai default 200.

1. Pilih **Simpan**.

Anda dapat mengonfigurasi mode yang disediakan secara terprogram menggunakan objek di. [ProvisionedPollerConfig[ EventSourceMappingConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_EventSourceMappingConfiguration.html)](https://docs.aws.amazon.com/lambda/latest/api/API_ProvisionedPollerConfig.html) Misalnya, perintah [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)CLI berikut mengkonfigurasi `MinimumPollers` nilai 5, dan `MaximumPollers` nilai 100.

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --provisioned-poller-config '{"MinimumPollers": 5, "MaximumPollers": 100}'
```

Setelah mengonfigurasi mode yang disediakan, Anda dapat mengamati penggunaan poller peristiwa untuk beban kerja Anda dengan memantau metrik. `ProvisionedPollers` Untuk informasi selengkapnya, lihat [Metrik pemetaan sumber acara](monitoring-metrics-types.md#event-source-mapping-metrics).

Untuk menonaktifkan mode yang disediakan dan kembali ke mode default (sesuai permintaan), Anda dapat menggunakan perintah CLI [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)berikut:

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --provisioned-poller-config '{}'
```

## Fitur penanganan kesalahan dan kinerja tingkat lanjut
<a name="services-kafka-advanced-features"></a>

Untuk pemetaan sumber peristiwa Kafka dengan mode yang disediakan diaktifkan, Anda dapat mengonfigurasi fitur tambahan untuk meningkatkan penanganan dan kinerja kesalahan:
+ [Konfigurasi coba lagi](kafka-retry-configurations.md) — Kontrol cara Lambda menangani catatan yang gagal dengan upaya coba ulang maksimum, batas usia rekaman, pemisahan batch, dan respons batch sebagian.
+ [Tujuan kegagalan Kafka](kafka-on-failure-destination.md) — Kirim catatan yang gagal ke topik Kafka untuk diproses atau dianalisis nanti.

## Praktik dan pertimbangan terbaik saat menggunakan mode yang disediakan
<a name="kafka-provisioned-mode-bp"></a>

Konfigurasi optimal poller peristiwa minimum dan maksimum untuk pemetaan sumber acara Anda bergantung pada persyaratan kinerja aplikasi Anda. Kami menyarankan Anda memulai dengan poller acara minimum default untuk mendasarkan profil kinerja. Sesuaikan konfigurasi Anda berdasarkan pola pemrosesan pesan yang diamati dan profil kinerja yang Anda inginkan.

Untuk beban kerja dengan lalu lintas runcing dan kebutuhan kinerja yang ketat, tingkatkan poller acara minimum untuk menangani lonjakan pesan yang tiba-tiba. Untuk menentukan poller peristiwa minimum yang diperlukan, pertimbangkan pesan beban kerja Anda per detik dan ukuran muatan rata-rata, dan gunakan kapasitas throughput dari poller peristiwa tunggal (hingga 5 MBps) sebagai referensi.

Untuk mempertahankan pemrosesan yang teratur dalam partisi, Lambda membatasi poller peristiwa maksimum ke jumlah partisi dalam topik. Selain itu, poller peristiwa maksimum yang dapat diskalakan oleh pemetaan sumber acara Anda bergantung pada pengaturan konkurensi fungsi.

Saat mengaktifkan mode yang disediakan, perbarui pengaturan jaringan Anda untuk menghapus titik akhir AWS PrivateLink VPC dan izin terkait.

## Optimalisasi Biaya untuk mode Provisioned
<a name="kafka-cost-optimization"></a>

### Harga mode yang disediakan
<a name="kafka-provisioned-pricing"></a>

Mode yang disediakan dibebankan berdasarkan poller peristiwa minimum yang disediakan, dan poller acara dikonsumsi selama penskalaan otomatis. Biaya dihitung menggunakan unit penagihan yang disebut Event Poller Unit (EPU). Anda membayar untuk jumlah dan durasi yang EPUs digunakan, diukur dalam Event-Poller-Unit-hours. Anda dapat menggunakan mode Provisioned dengan satu ESM untuk aplikasi yang peka terhadap kinerja atau Anda dapat mengelompokkan beberapa dalam VPC yang sama untuk ESMs berbagi kapasitas dan biaya EPU. Kami akan mendalami dua kemampuan yang membantu Anda mengoptimalkan biaya mode Provisioned Anda. Untuk detail harga, lihat harga [AWS Lambda](https://aws.amazon.com/lambda/pricing/).

### Peningkatan Pemanfaatan EPU
<a name="kafka-enhanced-epu-utilization"></a>

Setiap EPU mendukung kapasitas MB/s throughput hingga 20 untuk polling acara dan mendukung default 10 poller acara. Saat Anda membuat mode Provisioned untuk Kafka ESM dengan menyetel poller minimum dan maksimum, mode ini menggunakan nomor poller minimum untuk penyediaan EPUs berdasarkan default 10 poller acara per EPU. Namun, setiap poller acara dapat menskalakan secara independen untuk mendukung hingga 5 MB/s kapasitas throughput, yang mungkin memerlukan kepadatan poller peristiwa yang lebih rendah pada EPU tertentu dan dapat memicu penskalaan. EPUs Jumlah poller acara yang dialokasikan pada EPU tergantung pada kapasitas komputasi yang dikonsumsi oleh masing-masing poller acara. Pendekatan pemanfaatan EPU yang ditingkatkan ini memungkinkan poller acara dengan berbagai persyaratan throughput untuk memanfaatkan kapasitas EPU secara efektif, mengurangi biaya untuk semua. ESMs

### Pengelompokan ESM
<a name="kafka-esm-grouping-cost"></a>

Untuk mengoptimalkan biaya mode Provisioned Anda lebih lanjut, Anda dapat mengelompokkan beberapa Kafka ESMs untuk berbagi kapasitas EPU. Dengan pengelompokan ESM dan Pemanfaatan EPU yang ditingkatkan, Anda dapat mengurangi biaya mode Provisioned hingga 90% untuk beban kerja throughput rendah dibandingkan dengan berjalan dalam mode ESM tunggal. Semua ESMs yang membutuhkan kurang dari 1 kapasitas EPU akan mendapat manfaat dari pengelompokan ESM. Seperti ESMs biasanya membutuhkan beberapa poller acara minimum untuk mendukung kebutuhan throughput mereka. Kemampuan ini akan memungkinkan Anda untuk mengadopsi mode Provisioned untuk semua beban kerja Kafka Anda, dan mendapatkan manfaat dari fitur seperti validasi skema, pemfilteran Avro/Protobuf peristiwa, pemanggilan latensi rendah, dan penanganan kesalahan yang ditingkatkan yang hanya tersedia dalam mode Provisioned.

Saat Anda mengonfigurasi `PollerGroupName` parameter dengan nilai yang sama untuk beberapa ESMs dalam VPC Amazon yang sama, parameter tersebut ESMs berbagi sumber daya EPU alih-alih masing-masing memerlukan kapasitas EPU khusus. Anda dapat mengelompokkan hingga 100 ESMs per grup poller dan agregat poller maksimum ESMs di semua kelompok tidak boleh melebihi 2000.

#### Untuk mengkonfigurasi pengelompokan ESM (konsol)
<a name="kafka-esm-grouping-console-cost"></a>

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi Anda.

1. Pilih **Konfigurasi**, lalu pilih **Pemicu.**

1. Saat membuat pemetaan sumber peristiwa Kafka baru, atau mengedit yang sudah ada, pilih **Konfigurasi di bawah Mode** yang **disediakan**.

1. Untuk **poller acara Minimum**, masukkan nilai antara 1 dan 200.

1. Untuk **poller acara Maksimum**, masukkan nilai antara 1 dan 2.000.

1. Untuk **nama grup Poller**, masukkan pengenal untuk grup. Gunakan nama yang sama untuk orang lain yang ingin ESMs Anda kelompokkan bersama.

1. Pilih **Simpan**.

#### Untuk mengkonfigurasi pengelompokan ESM (CLI AWS )
<a name="kafka-esm-grouping-cli-cost"></a>

Contoh berikut membuat ESM dengan grup poller bernama: `production-app-group`

```
aws lambda create-event-source-mapping \
  --function-name myFunction1 \
  --event-source-arn arn:aws:kafka:us-east-1:123456789012:cluster/MyCluster/abcd1234 \
  --topics topic1 \
  --starting-position LATEST \
  --provisioned-poller-config '{
    "MinimumPollers": 1, 
    "MaximumPollers": 10, 
    "PollerGroupName": "production-app-group"
  }'
```

Untuk menambahkan ESM lain ke grup yang sama (berbagi kapasitas EPU), gunakan yang sama: PollerGroupName

```
aws lambda create-event-source-mapping \
  --function-name myFunction2 \
  --event-source-arn arn:aws:kafka:us-east-1:123456789012:cluster/MyCluster/abcd1234 \
  --topics topic2 \
  --starting-position LATEST \
  --provisioned-poller-config '{
    "MinimumPollers": 1, 
    "MaximumPollers": 10, 
    "PollerGroupName": "production-app-group"
  }'
```

**catatan**  
Anda dapat memperbarui `PollerGroupName` untuk memindahkan ESM ke grup lain, atau menghapus ESM dari grup dengan meneruskan string kosong (“”) untuk: `PollerGroupName`

```
# Move ESM to a different group
aws lambda update-event-source-mapping \
  --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
  --provisioned-poller-config '{
    "MinimumPollers": 1, 
    "MaximumPollers": 10, 
    "PollerGroupName": "new-group-name"
  }'

# Remove ESM from group (use dedicated resources)
aws lambda update-event-source-mapping \
  --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
  --provisioned-poller-config '{
    "MinimumPollers": 1, 
    "MaximumPollers": 10, 
    "PollerGroupName": ""
  }'
```

#### Pertimbangan strategi pengelompokan
<a name="kafka-grouping-strategy-considerations"></a>
+ **Batas aplikasi — Grup** ESMs yang termasuk dalam aplikasi atau layanan yang sama untuk alokasi dan manajemen biaya yang lebih baik. Pertimbangkan untuk menggunakan konvensi penamaan seperti `app-name-environment` (misalnya,`order-processor-prod`).
+ **Pola lalu lintas** — Hindari pengelompokan ESMs dengan throughput tinggi dan pola lalu lintas runcing, karena ini dapat menyebabkan perselisihan sumber daya.
+ **Radius ledakan** — Pertimbangkan dampaknya jika infrastruktur bersama mengalami masalah. Semua ESMs dalam grup yang sama dipengaruhi oleh keterbatasan sumber daya bersama. Untuk beban kerja mission-critical, Anda mungkin ingin menggunakan grup terpisah atau khusus. ESMs

#### Contoh optimasi biaya
<a name="kafka-cost-optimization-example"></a>

Pertimbangkan skenario di mana Anda memiliki 10 ESMs, masing-masing dikonfigurasi dengan 1 poller peristiwa dan throughput di bawah 2 MB/s:

**Tanpa pengelompokan:**
+ Setiap ESM membutuhkan EPU-nya sendiri
+ Total EPUs yang dibutuhkan: 10
+ Biaya per EPU: \$10.185/jam di AS Timur (Virginia N.)
+ Biaya EPU bulanan (720 jam): 10 × 720 × \$10,185 = \$11,332

**Dengan pengelompokan:**
+ Semua 10 ESMs berbagi kapasitas EPU
+ 10 poller acara cocok dalam 1 EPU (dengan 10 poller baru per dukungan EPU)
+ Total EPUs yang dibutuhkan: 1
+ Biaya EPU bulanan (720 jam): 1 × 720 × \$10.185 = \$1133.20
+ **Penghematan biaya: 90%** (penghematan \$11,198.80 per bulan)

# Posisi awal pemungutan suara dan streaming Apache Kafka di Lambda
<a name="kafka-starting-positions"></a>

[ StartingPosition Parameter](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-StartingPosition) memberi tahu Lambda kapan harus mulai membaca pesan dari MSK Amazon Anda atau aliran Apache Kafka yang dikelola sendiri. Ada tiga opsi untuk dipilih:
+ **Terbaru** — Lambda mulai membaca tepat setelah catatan terbaru dalam topik Kafka.
+ **Trim horizon** — Lambda mulai membaca dari catatan terakhir yang belum dipangkas dalam topik Kafka. Ini juga merupakan catatan tertua dalam topik ini.
+ **Pada stempel waktu** — Lambda mulai membaca dari posisi yang ditentukan oleh stempel waktu, dalam detik waktu Unix. Gunakan [ StartingPositionTimestamp parameter](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-StartingPositionTimestamp) untuk menentukan stempel waktu.

Streaming polling selama pembuatan atau pembaruan pemetaan sumber acara pada akhirnya konsisten:
+ Selama pembuatan pemetaan sumber acara, mungkin diperlukan beberapa menit untuk memulai acara polling dari aliran.
+ Selama pembaruan pemetaan sumber acara, mungkin diperlukan waktu hingga 90 detik untuk menghentikan dan memulai kembali acara pemungutan suara dari aliran.

Perilaku ini berarti bahwa jika Anda menentukan `LATEST` sebagai posisi awal untuk aliran, pemetaan sumber peristiwa dapat melewatkan peristiwa selama pembuatan atau pembaruan. Untuk memastikan bahwa tidak ada acara yang terlewatkan, tentukan salah satu `TRIM_HORIZON` atau`AT_TIMESTAMP`.

# ID grup konsumen yang dapat disesuaikan di Lambda
<a name="kafka-consumer-group-id"></a>

[Saat menyiapkan Amazon MSK atau Apache Kafka yang dikelola sendiri sebagai sumber acara, Anda dapat menentukan ID grup konsumen.](https://developer.confluent.io/learn-more/kafka-on-the-go/consumer-groups/) ID grup konsumen ini adalah pengenal yang ada untuk grup konsumen Kafka yang Anda inginkan agar fungsi Lambda Anda bergabung. Anda dapat menggunakan fitur ini untuk memigrasikan pengaturan pemrosesan catatan Kafka yang sedang berlangsung dengan mulus dari konsumen lain ke Lambda.

Kafka mendistribusikan pesan ke semua konsumen dalam kelompok konsumen. Jika Anda menentukan ID grup konsumen yang memiliki konsumen aktif lainnya, Lambda hanya menerima sebagian pesan dari topik Kafka. Jika Anda ingin Lambda menangani semua pesan dalam topik, matikan konsumen lain di grup konsumen tersebut.

Selain itu, jika Anda menentukan ID grup konsumen, dan Kafka menemukan grup konsumen yang sudah ada yang valid dengan ID yang sama, Lambda mengabaikan [StartingPosition](kafka-starting-positions.md)pemetaan sumber acara Anda. Sebaliknya, Lambda mulai memproses catatan sesuai dengan offset yang dilakukan dari kelompok konsumen. Jika Anda menentukan ID grup konsumen, dan Kafka tidak dapat menemukan grup konsumen yang ada, maka Lambda mengonfigurasi sumber acara Anda dengan yang ditentukan. `StartingPosition`

ID grup konsumen yang Anda tentukan harus unik di antara semua sumber acara Kafka Anda. Setelah membuat pemetaan sumber acara Kafka dengan ID grup konsumen yang ditentukan, Anda tidak dapat memperbarui nilai ini.

# Memfilter acara dari Amazon MSK dan sumber acara Apache Kafka yang dikelola sendiri
<a name="kafka-filtering"></a>

Anda dapat menggunakan pemfilteran peristiwa untuk mengontrol rekaman mana dari aliran atau antrian yang dikirim Lambda ke fungsi Anda. Untuk informasi umum tentang cara kerja penyaringan acara, lihat[Kontrol peristiwa mana yang dikirim Lambda ke fungsi Anda](invocation-eventfiltering.md).

**catatan**  
Amazon MSK dan pemetaan sumber acara Apache Kafka yang dikelola sendiri hanya mendukung pemfilteran pada kunci. `value`

**Topics**
+ [

## Dasar-dasar penyaringan acara Kafka
](#filtering-kafka)

## Dasar-dasar penyaringan acara Kafka
<a name="filtering-kafka"></a>

Misalkan produser menulis pesan ke topik di cluster Kafka Anda, baik dalam format JSON yang valid atau sebagai string biasa. Contoh catatan akan terlihat seperti berikut, dengan pesan dikonversi ke string yang dikodekan Base64 di bidang. `value`

```
{
    "mytopic-0":[
        {
            "topic":"mytopic",
            "partition":0,
            "offset":15,
            "timestamp":1545084650987,
            "timestampType":"CREATE_TIME",
            "value":"SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==",
            "headers":[]
        }
    ]
}
```

Misalkan produser Apache Kafka Anda menulis pesan ke topik Anda dalam format JSON berikut.

```
{
    "device_ID": "AB1234",
    "session":{
        "start_time": "yyyy-mm-ddThh:mm:ss",
        "duration": 162
    }
}
```

Anda dapat menggunakan `value` kunci untuk memfilter catatan. Misalkan Anda ingin memfilter hanya catatan-catatan di mana `device_ID` dimulai dengan huruf AB. `FilterCriteria`Objeknya adalah sebagai berikut.

```
{
    "Filters": [
        {
            "Pattern": "{ \"value\" : { \"device_ID\" : [ { \"prefix\": \"AB\" } ] } }"
        }
    ]
}
```

Untuk kejelasan tambahan, berikut adalah nilai filter yang `Pattern` diperluas di JSON biasa.

```
{
    "value": {
        "device_ID": [ { "prefix": "AB" } ]
      }
}
```

Anda dapat menambahkan filter menggunakan konsol, AWS CLI atau AWS SAM templat.

------
#### [ Console ]

Untuk menambahkan filter ini menggunakan konsol, ikuti instruksi [Melampirkan kriteria filter ke pemetaan sumber peristiwa (konsol)](invocation-eventfiltering.md#filtering-console) dan masukkan string berikut untuk **kriteria Filter**.

```
{ "value" : { "device_ID" : [ { "prefix":  "AB" } ] } }
```

------
#### [ AWS CLI ]

Untuk membuat pemetaan sumber peristiwa baru dengan kriteria filter ini menggunakan AWS Command Line Interface (AWS CLI), jalankan perintah berikut.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:kafka:us-east-2:123456789012:cluster/my-cluster/b-8ac7cc01-5898-482d-be2f-a6b596050ea8 \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"value\" : { \"device_ID\" : [ { \"prefix\":  \"AB\" } ] } }"}]}'
```

Untuk menambahkan kriteria filter ini ke pemetaan sumber peristiwa yang ada, jalankan perintah berikut.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"value\" : { \"device_ID\" : [ { \"prefix\":  \"AB\" } ] } }"}]}'
```

------
#### [ AWS SAM ]

Untuk menambahkan filter ini menggunakan AWS SAM, tambahkan cuplikan berikut ke template YAMAL untuk sumber acara Anda.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "value" : { "device_ID" : [ { "prefix":  "AB" } ] } }'
```

------

Dengan Kafka, Anda juga dapat memfilter catatan di mana pesannya adalah string biasa. Misalkan Anda ingin mengabaikan pesan-pesan di mana string adalah “kesalahan”. `FilterCriteria`Objek akan terlihat sebagai berikut.

```
{
    "Filters": [
        {
            "Pattern": "{ \"value\" : [ { \"anything-but\": [ \"error\" ] } ] }"
        }
    ]
}
```

Untuk kejelasan tambahan, berikut adalah nilai filter yang `Pattern` diperluas di JSON biasa.

```
{
    "value": [
        {
        "anything-but": [ "error" ]
        }
    ]
}
```

Anda dapat menambahkan filter menggunakan konsol, AWS CLI atau AWS SAM templat.

------
#### [ Console ]

Untuk menambahkan filter ini menggunakan konsol, ikuti instruksi [Melampirkan kriteria filter ke pemetaan sumber peristiwa (konsol)](invocation-eventfiltering.md#filtering-console) dan masukkan string berikut untuk **kriteria Filter**.

```
{ "value" : [ { "anything-but": [ "error" ] } ] }
```

------
#### [ AWS CLI ]

Untuk membuat pemetaan sumber peristiwa baru dengan kriteria filter ini menggunakan AWS Command Line Interface (AWS CLI), jalankan perintah berikut.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:kafka:us-east-2:123456789012:cluster/my-cluster/b-8ac7cc01-5898-482d-be2f-a6b596050ea8 \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"value\" : [ { \"anything-but\": [ \"error\" ] } ] }"}]}'
```

Untuk menambahkan kriteria filter ini ke pemetaan sumber peristiwa yang ada, jalankan perintah berikut.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"value\" : [ { \"anything-but\": [ \"error\" ] } ] }"}]}'
```

------
#### [ AWS SAM ]

Untuk menambahkan filter ini menggunakan AWS SAM, tambahkan cuplikan berikut ke template YAMAL untuk sumber acara Anda.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "value" : [ { "anything-but": [ "error" ] } ] }'
```

------

Pesan Kafka harus berupa string yang dikodekan UTF-8, baik string biasa atau dalam format JSON. Itu karena Lambda menerjemahkan array byte Kafka ke UTF-8 sebelum menerapkan kriteria filter. Jika pesan Anda menggunakan pengkodean lain, seperti UTF-16 atau ASCII, atau jika format pesan tidak cocok dengan format`FilterCriteria`, Lambda hanya memproses filter metadata. Tabel berikut merangkum perilaku spesifik:


| Format pesan masuk | Format pola filter untuk properti pesan | Tindakan yang dihasilkan | 
| --- | --- | --- | 
|  Tali polos  |  Tali polos  |  Filter Lambda berdasarkan kriteria filter Anda.  | 
|  Tali polos  |  Tidak ada pola filter untuk properti data  |  Filter Lambda (hanya pada properti metadata lainnya) berdasarkan kriteria filter Anda.  | 
|  Tali polos  |  JSON yang valid  |  Filter Lambda (hanya pada properti metadata lainnya) berdasarkan kriteria filter Anda.  | 
|  JSON yang valid  |  Tali polos  |  Filter Lambda (hanya pada properti metadata lainnya) berdasarkan kriteria filter Anda.  | 
|  JSON yang valid  |  Tidak ada pola filter untuk properti data  |  Filter Lambda (hanya pada properti metadata lainnya) berdasarkan kriteria filter Anda.  | 
|  JSON yang valid  |  JSON yang valid  |  Filter Lambda berdasarkan kriteria filter Anda.  | 
|  String yang tidak dikodekan UTF-8  |  JSON, string polos, atau tidak ada pola  |  Filter Lambda (hanya pada properti metadata lainnya) berdasarkan kriteria filter Anda.  | 

# Menggunakan pendaftar skema dengan sumber acara Kafka di Lambda
<a name="services-consume-kafka-events"></a>

 Registries skema membantu Anda menentukan dan mengelola skema aliran data. Sebuah skema mendefinisikan struktur dan format catatan data. Dalam konteks pemetaan sumber acara Kafka, Anda dapat mengonfigurasi registri skema untuk memvalidasi struktur dan format pesan Kafka terhadap skema yang telah ditentukan sebelum mencapai fungsi Lambda Anda. Ini menambahkan lapisan tata kelola data ke aplikasi Anda dan memungkinkan Anda mengelola format data secara efisien, memastikan kepatuhan skema, dan mengoptimalkan biaya melalui penyaringan acara. 

 Fitur ini berfungsi dengan semua bahasa pemrograman, tetapi pertimbangkan poin-poin penting ini: 
+ Powertools untuk Lambda menyediakan dukungan khusus untuk Java, Python, TypeScript dan, menjaga konsistensi dengan pola pengembangan Kafka yang ada dan memungkinkan akses langsung ke objek bisnis tanpa kode deserialisasi khusus
+ Fitur ini hanya tersedia untuk pemetaan sumber peristiwa menggunakan mode yang disediakan. Registri skema tidak mendukung pemetaan sumber peristiwa dalam mode sesuai permintaan. Jika Anda menggunakan mode yang disediakan dan memiliki registri skema yang dikonfigurasi, Anda tidak dapat mengubah ke mode sesuai permintaan kecuali Anda menghapus konfigurasi registri skema terlebih dahulu. Untuk informasi selengkapnya, lihat [Mode yang disediakan](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode)
+ Anda hanya dapat mengonfigurasi satu registri skema per pemetaan sumber peristiwa (ESM). Menggunakan registri skema dengan sumber acara Kafka Anda dapat meningkatkan penggunaan Lambda Event Poller Unit (EPU) Anda, yang merupakan dimensi harga untuk mode Provisioned. 

**Topics**
+ [

## Opsi registri skema
](#services-consume-kafka-events-options)
+ [

## Bagaimana Lambda melakukan validasi skema untuk pesan Kafka
](#services-consume-kafka-events-how)
+ [

## Mengkonfigurasi registri skema Kafka
](#services-consume-kafka-events-config)
+ [

## Pemfilteran untuk Avro dan Protobuf
](#services-consume-kafka-events-filtering)
+ [

## Format payload dan perilaku deserialisasi
](#services-consume-kafka-events-payload)
+ [

## Bekerja dengan data deserialisasi dalam fungsi Lambda
](#services-consume-kafka-events-payload-examples)
+ [

## Metode otentikasi untuk registri skema Anda
](#services-consume-kafka-events-auth)
+ [

## Penanganan kesalahan dan pemecahan masalah untuk masalah registri skema
](#services-consume-kafka-events-troubleshooting)

## Opsi registri skema
<a name="services-consume-kafka-events-options"></a>

 Lambda mendukung opsi registri skema berikut: 
+ [AWS Glue Registri Skema](https://docs.aws.amazon.com/glue/latest/dg/schema-registry.html)
+ [Registri Skema Cloud Confluent](https://docs.confluent.io/platform/current/schema-registry/index.html)
+ [Registri Skema Konfluen yang dikelola sendiri](https://docs.confluent.io/platform/current/schema-registry/index.html)

 Registri skema Anda mendukung memvalidasi pesan dalam format data berikut: 
+ Apache Avro
+ Protokol Buffer (Protobuf)
+ Skema JSON (JSON-SE)

 Untuk menggunakan registri skema, pertama-tama pastikan bahwa pemetaan sumber peristiwa Anda dalam mode yang disediakan. Saat Anda menggunakan registri skema, Lambda menambahkan metadata tentang skema ke payload. Untuk informasi selengkapnya, lihat [Format muatan dan perilaku deserialisasi](#services-consume-kafka-events-payload). 

## Bagaimana Lambda melakukan validasi skema untuk pesan Kafka
<a name="services-consume-kafka-events-how"></a>

 Saat Anda mengonfigurasi registri skema, Lambda melakukan langkah-langkah berikut untuk setiap pesan Kafka: 

1. Lambda melakukan polling catatan Kafka dari cluster Anda.

1. Lambda memvalidasi atribut pesan yang dipilih dalam catatan terhadap skema tertentu di registri skema Anda.
   + Jika skema yang terkait dengan pesan tidak ditemukan di registri, Lambda mengirim pesan ke DLQ dengan kode alasan. `SCHEMA_NOT_FOUND`

1. Lambda deserialisasi pesan sesuai dengan konfigurasi registri skema untuk memvalidasi pesan. Jika pemfilteran peristiwa dikonfigurasi, Lambda kemudian melakukan pemfilteran berdasarkan kriteria filter yang dikonfigurasi.
   + Jika deserialisasi gagal, Lambda mengirim pesan ke DLQ dengan kode alasan. `DESERIALIZATION_ERROR` Jika tidak ada DLQ yang dikonfigurasi, Lambda akan menghapus pesan.

1. Jika pesan divalidasi oleh registri skema, dan tidak disaring berdasarkan kriteria filter, Lambda akan memanggil fungsi Anda dengan pesan tersebut.

 Fitur ini dimaksudkan untuk memvalidasi pesan yang sudah diproduksi menggunakan klien Kafka yang terintegrasi dengan registri skema. Kami merekomendasikan untuk mengonfigurasi produsen Kafka Anda untuk bekerja dengan registri skema Anda untuk membuat pesan yang diformat dengan benar. 

## Mengkonfigurasi registri skema Kafka
<a name="services-consume-kafka-events-config"></a>

 Langkah-langkah konsol berikut menambahkan konfigurasi registri skema Kafka ke pemetaan sumber acara Anda. 

**Untuk menambahkan konfigurasi registri skema Kafka ke pemetaan sumber acara Anda (konsol)**

1. Buka [halaman Fungsi konsol](https://console.aws.amazon.com/lambda/home#/functions) Lambda.

1. Pilih **Konfigurasi**.

1. Pilih **Pemicu.**

1. **Pilih pemetaan sumber peristiwa Kafka yang ingin Anda konfigurasikan registri skema, dan pilih Edit.**

1. Di bawah **konfigurasi poller acara**, pilih **Konfigurasi registri skema**. Pemetaan sumber acara Anda harus dalam mode yang disediakan untuk melihat opsi ini.

1. Untuk **URI registri Skema**, masukkan ARN registri skema AWS Glue Anda, atau URL HTTPS dari registri skema Confluent Cloud atau Self-Managed Confluent Schema Registry.

1. Langkah-langkah konfigurasi berikut memberi tahu Lambda cara mengakses registri skema Anda. Untuk informasi selengkapnya, lihat [Metode otentikasi untuk registri skema Anda](#services-consume-kafka-events-auth).
   + Untuk **tipe konfigurasi Access**, pilih jenis otentikasi yang digunakan Lambda untuk mengakses registri skema Anda.
   + Untuk **URI konfigurasi Access**, masukkan ARN rahasia Secrets Manager untuk mengautentikasi dengan registri skema Anda, jika berlaku. Pastikan [peran eksekusi](with-msk-permissions.md) fungsi Anda berisi izin yang benar.

1. Bidang **Enkripsi** hanya berlaku jika registri skema Anda ditandatangani oleh Otoritas Sertifikat (CA) pribadi atau otoritas sertifikat (CA) yang tidak ada di toko kepercayaan Lambda.. Jika berlaku, berikan kunci rahasia yang berisi sertifikat CA pribadi yang digunakan oleh registri skema Anda untuk enkripsi TLS.

1. Untuk **format rekaman Peristiwa**, pilih bagaimana Anda ingin Lambda mengirimkan catatan fungsi Anda setelah validasi skema. Untuk informasi selengkapnya, lihat [Contoh format payload](#services-consume-kafka-events-payload).
   + Jika Anda memilih **JSON**, Lambda memberikan atribut yang Anda pilih dalam atribut validasi Skema di bawah ini dalam format JSON standar. Untuk atribut yang tidak Anda pilih, Lambda mengirimkannya apa adanya.
   + Jika Anda memilih **SUMBER**, Lambda memberikan atribut yang Anda pilih dalam atribut validasi Skema di bawah ini dalam format sumber aslinya.

1. Untuk atribut **validasi Skema, pilih atribut** pesan yang Anda ingin Lambda untuk memvalidasi dan deserialisasi menggunakan registri skema Anda. Anda harus memilih setidaknya satu dari **KEY** atau **VALUE**. Jika Anda memilih JSON untuk format rekaman peristiwa, Lambda juga melakukan deserialisasi atribut pesan yang dipilih sebelum mengirimnya ke fungsi Anda. Untuk informasi selengkapnya, lihat [Format muatan dan perilaku deserialisasi](#services-consume-kafka-events-payload).

1. Pilih **Simpan**.

 Anda juga dapat menggunakan API Lambda untuk membuat atau memperbarui pemetaan sumber peristiwa Anda dengan konfigurasi registri skema. *Contoh berikut menunjukkan cara mengonfigurasi registri skema AWS Glue atau Confluent menggunakan AWS CLI, yang sesuai dengan operasi [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)API [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)dan API di Referensi API:AWS Lambda * 

**penting**  
Jika Anda memperbarui kolom konfigurasi registri skema apa pun menggunakan AWS CLI atau `update-event-source-mapping` API, Anda harus memperbarui semua bidang konfigurasi registri skema.

------
#### [ Create Event Source Mapping ]

```
aws lambda create-event-source-mapping \
  --function-name my-schema-validator-function \
  --event-source-arn arn:aws:kafka:us-east-1:123456789012:cluster/my-cluster/a1b2c3d4-5678-90ab-cdef-11111EXAMPLE \
  --topics my-kafka-topic \
  --provisioned-poller-config MinimumPollers=1,MaximumPollers=1 \
  --amazon-managed-kafka-event-source-mapping '{
      "SchemaRegistryConfig" : {
          "SchemaRegistryURI": "https://abcd-ef123.us-west-2.aws.confluent.cloud",
          "AccessConfigs": [{
              "Type": "BASIC_AUTH", 
              "URI": "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName"
          }],
          "EventRecordFormat": "JSON",
          "SchemaValidationConfigs": [
          { 
              "Attribute": "KEY" 
          },
          { 
              "Attribute": "VALUE" 
          }]
      }
  }'
```

------
#### [ Update AWS Glue Schema Registry ]

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --amazon-managed-kafka-event-source-mapping '{
        "SchemaRegistryConfig" : {
            "SchemaRegistryURI": "arn:aws:glue:us-east-1:123456789012:registry/registryName",
            "EventRecordFormat": "JSON",
            "SchemaValidationConfigs": [
            { 
                "Attribute": "KEY" 
            },
            { 
                "Attribute": "VALUE" 
            }]
        }
    }'
```

------
#### [ Update Confluent Schema Registry with Authentication ]

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --amazon-managed-kafka-event-source-mapping '{
        "SchemaRegistryConfig" : {
            "SchemaRegistryURI": "https://abcd-ef123.us-west-2.aws.confluent.cloud",
            "AccessConfigs": [{
                "Type": "BASIC_AUTH", 
                "URI": "arn:aws:secretsmanager:us-east-1:123456789012:secret:secretName"
            }],
            "EventRecordFormat": "JSON",
            "SchemaValidationConfigs": [
            { 
                "Attribute": "KEY" 
            },
            { 
                "Attribute": "VALUE" 
            }]
        }
    }'
```

------
#### [ Update Confluent Schema Registry without Authentication ]

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --amazon-managed-kafka-event-source-mapping '{
        "SchemaRegistryConfig" : {
            "SchemaRegistryURI": "https://abcd-ef123.us-west-2.aws.confluent.cloud",
            "EventRecordFormat": "JSON",
            "SchemaValidationConfigs": [
            { 
                "Attribute": "KEY" 
            },
            { 
                "Attribute": "VALUE" 
            }]
        }
    }'
```

------
#### [ Remove Schema Registry Configuration ]

*Untuk menghapus konfigurasi registri skema dari pemetaan sumber peristiwa, Anda dapat menggunakan perintah CLI [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)di Referensi API.AWS Lambda *

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --amazon-managed-kafka-event-source-mapping '{
        "SchemaRegistryConfig" : {}
    }'
```

------

## Pemfilteran untuk Avro dan Protobuf
<a name="services-consume-kafka-events-filtering"></a>

 Saat menggunakan format Avro atau Protobuf dengan registri skema, Anda dapat menerapkan pemfilteran acara ke fungsi Lambda Anda. Pola filter diterapkan pada representasi JSON klasik deserialisasi dari data Anda setelah validasi skema. Misalnya, dengan skema Avro yang menentukan detail produk termasuk harga, Anda dapat memfilter pesan berdasarkan nilai harga: 

**catatan**  
 Saat dideserialisasi, Avro dikonversi ke JSON standar, yang berarti tidak dapat langsung dikonversi kembali ke objek Avro. Jika Anda perlu mengonversi ke objek Avro, gunakan format SOURCE sebagai gantinya.   
 Untuk deserialisasi Protobuf, nama bidang di JSON yang dihasilkan cocok dengan yang ditentukan dalam skema Anda, daripada dikonversi ke kasus unta seperti yang biasanya dilakukan Protobuf. Ingatlah hal ini saat membuat pola penyaringan. 

```
aws lambda create-event-source-mapping \
    --function-name myAvroFunction \
    --topics myAvroTopic \
    --starting-position TRIM_HORIZON \
    --kafka-bootstrap-servers '["broker1:9092", "broker2:9092"]' \
    --schema-registry-config '{
        "SchemaRegistryURI": "arn:aws:glue:us-east-1:123456789012:registry/myAvroRegistry",
        "EventRecordFormat": "JSON",
        "SchemaValidationConfigs": [
            { 
                "Attribute": "VALUE" 
            }
        ]
    }' \
    --filter-criteria '{
        "Filters": [
            {
                "Pattern": "{ \"value\" : { \"field_1\" : [\"value1\"], \"field_2\" : [\"value2\"] } }"
            }
        ]
    }'
```

 Dalam contoh ini, pola filter menganalisis `value` objek, mencocokkan pesan dengan `"value1"` dan `field_1` `field_2` dengan`"value2"`. Kriteria filter dievaluasi terhadap data deserialisasi, setelah Lambda mengonversi pesan dari format Avro ke JSON. 

 Untuk informasi lebih rinci tentang pemfilteran acara, lihat Pemfilteran acara [Lambda](invocation-eventfiltering.md). 

## Format payload dan perilaku deserialisasi
<a name="services-consume-kafka-events-payload"></a>

 Saat menggunakan registri skema, Lambda mengirimkan muatan akhir ke fungsi Anda dalam format yang mirip dengan muatan [acara biasa](with-msk.md#msk-sample-event), dengan beberapa bidang tambahan. Bidang tambahan tergantung pada `SchemaValidationConfigs` parameter. Untuk setiap atribut yang Anda pilih untuk validasi (kunci atau nilai), Lambda menambahkan metadata skema yang sesuai ke payload. 

**catatan**  
Anda harus memperbarui [aws-lambda-java-events](https://github.com/aws/aws-lambda-java-libs/tree/main/aws-lambda-java-events)ke versi 3.16.0 atau lebih tinggi untuk menggunakan bidang metadata skema.

 Misalnya, jika Anda memvalidasi `value` bidang, Lambda menambahkan bidang yang `valueSchemaMetadata` dipanggil ke payload Anda. Demikian pula, untuk `key` bidang, Lambda menambahkan bidang yang disebut. `keySchemaMetadata` Metadata ini berisi informasi tentang format data dan ID skema yang digunakan untuk validasi: 

```
"valueSchemaMetadata": {
    "dataFormat": "AVRO",
    "schemaId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
}
```

 `EventRecordFormat`Parameter dapat diatur ke salah satu `JSON` atau`SOURCE`, yang menentukan cara Lambda menangani data yang divalidasi skema sebelum mengirimkannya ke fungsi Anda. Setiap opsi menyediakan kemampuan pemrosesan yang berbeda: 
+ `JSON`- Lambda deserialisasi atribut yang divalidasi ke dalam format JSON standar, membuat data siap untuk digunakan langsung dalam bahasa dengan dukungan JSON asli. Format ini sangat ideal ketika Anda tidak perlu mempertahankan format biner asli atau bekerja dengan kelas yang dihasilkan.
+ `SOURCE`- Lambda mempertahankan format biner asli data sebagai string yang dikodekan Base64, memungkinkan konversi langsung ke objek Avro atau Protobuf. Format ini sangat penting saat bekerja dengan bahasa yang diketik dengan kuat atau ketika Anda perlu mempertahankan kemampuan penuh skema Avro atau Protobuf.

Berdasarkan karakteristik format dan pertimbangan khusus bahasa ini, kami merekomendasikan format berikut:


**Format yang disarankan berdasarkan bahasa pemrograman**  

| Bahasa | Avro | Protobuf | JSON | 
| --- | --- | --- | --- | 
| Java | SUMBER | SUMBER | SUMBER | 
| Python | JSON | JSON | JSON | 
| NodeJS | JSON | JSON | JSON | 
| .NET | SUMBER | SUMBER | SUMBER | 
| Lainnya | JSON | JSON | JSON | 

Bagian berikut menjelaskan format ini secara rinci dan memberikan contoh muatan untuk setiap format.

### Format JSON
<a name="services-consume-kafka-events-payload-json"></a>

 Jika Anda memilih `JSON` sebagai`EventRecordFormat`, Lambda memvalidasi dan deserialisasi atribut pesan yang telah Anda pilih di `SchemaValidationConfigs` bidang (atribut). `key` and/or `value` Lambda memberikan atribut yang dipilih ini sebagai string yang dikodekan base64 dari representasi JSON standar mereka dalam fungsi Anda. 

**catatan**  
 Saat dideserialisasi, Avro dikonversi ke JSON standar, yang berarti tidak dapat langsung dikonversi kembali ke objek Avro. Jika Anda perlu mengonversi ke objek Avro, gunakan format SOURCE sebagai gantinya.   
 Untuk deserialisasi Protobuf, nama bidang di JSON yang dihasilkan cocok dengan yang ditentukan dalam skema Anda, daripada dikonversi ke kasus unta seperti yang biasanya dilakukan Protobuf. Ingatlah hal ini saat membuat pola penyaringan. 

 Berikut ini menunjukkan contoh payload, dengan asumsi Anda memilih `JSON` sebagai`EventRecordFormat`, dan kedua `value` atribut `key` dan sebagai: `SchemaValidationConfigs` 

```
{
   "eventSource":"aws:kafka",
   "eventSourceArn":"arn:aws:kafka:us-east-1:123456789012:cluster/vpc-2priv-2pub/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111-1",
   "bootstrapServers":"b-2.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092,b-1.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092",
   "records":{
      "mytopic-0":[
         {
            "topic":"mytopic",
            "partition":0,
            "offset":15,
            "timestamp":1545084650987,
            "timestampType":"CREATE_TIME",
            "key":"abcDEFghiJKLmnoPQRstuVWXyz1234==", //Base64 encoded string of JSON
            "keySchemaMetadata": {
                "dataFormat": "AVRO",
                "schemaId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
            },
            "value":"abcDEFghiJKLmnoPQRstuVWXyz1234", //Base64 encoded string of JSON
            "valueSchemaMetadata": {
                "dataFormat": "AVRO",
                "schemaId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
            },
            "headers":[
               {
                  "headerKey":[
                     104,
                     101,
                     97,
                     100,
                     101,
                     114,
                     86,
                     97,
                     108,
                     117,
                     101
                  ]
               }
            ]
         }
      ]
   }
}
```

 Dalam contoh ini: 
+ Keduanya `key` dan `value` merupakan string yang dikodekan base64 dari representasi JSON mereka setelah deserialisasi.
+ Lambda menyertakan metadata skema untuk kedua atribut di dan. `keySchemaMetadata` `valueSchemaMetadata`
+ Fungsi Anda dapat memecahkan kode `key` dan `value` string untuk mengakses data JSON deserialized.

 Format JSON direkomendasikan untuk bahasa yang tidak diketik dengan kuat, seperti Python atau Node.js. Bahasa-bahasa ini memiliki dukungan asli untuk mengubah JSON menjadi objek. 

### Format sumber
<a name="services-consume-kafka-events-payload-source"></a>

 Jika Anda memilih `SOURCE` sebagai`EventRecordFormat`, Lambda masih memvalidasi catatan terhadap registri skema, tetapi mengirimkan data biner asli ke fungsi Anda tanpa deserialisasi. Data biner ini dikirimkan sebagai string yang dikodekan Base64 dari data byte asli, dengan metadata yang ditambahkan produsen dihapus. Akibatnya, Anda dapat langsung mengonversi data biner mentah menjadi objek Avro dan Protobuf dalam kode fungsi Anda. Kami merekomendasikan menggunakan Powertools untuk AWS Lambda, yang akan deserialisasi data biner mentah dan memberi Anda objek Avro dan Protobuf secara langsung. 

 Misalnya, jika Anda mengonfigurasi Lambda untuk memvalidasi `value` atribut `key` dan atribut namun menggunakan `SOURCE` formatnya, fungsi Anda akan menerima payload seperti ini: 

```
{
    "eventSource": "aws:kafka",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/vpc-2priv-2pub/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111-1",
    "bootstrapServers": "b-2.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092,b-1.demo-cluster-1.a1bcde.c1.kafka.us-east-1.amazonaws.com:9092",
    "records": {
        "mytopic-0": [
            {
                "topic": "mytopic",
                "partition": 0,
                "offset": 15,
                "timestamp": 1545084650987,
                "timestampType": "CREATE_TIME",
                "key": "abcDEFghiJKLmnoPQRstuVWXyz1234==", // Base64 encoded string of Original byte data, producer-appended metadata removed
                "keySchemaMetadata": {
                    "dataFormat": "AVRO",
                    "schemaId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
                },
                "value": "abcDEFghiJKLmnoPQRstuVWXyz1234==", // Base64 encoded string of Original byte data, producer-appended metadata removed
                "valueSchemaMetadata": {
                    "dataFormat": "AVRO",
                    "schemaId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111"
                },
                "headers": [
                    {
                        "headerKey": [
                            104,
                            101,
                            97,
                            100,
                            101,
                            114,
                            86,
                            97,
                            108,
                            117,
                            101
                        ]
                    }
                ]
            }
        ]
    }
}
```

 Dalam contoh ini: 
+ Keduanya `key` dan `value` berisi data biner asli sebagai string yang dikodekan Base64.
+ Fungsi Anda perlu menangani deserialisasi menggunakan pustaka yang sesuai.

 Memilih `SOURCE` untuk `EventRecordFormat` disarankan jika Anda menggunakan objek yang dihasilkan Avro atau yang dihasilkan Protobuf, terutama dengan fungsi Java. Ini karena Java diketik dengan kuat, dan membutuhkan deserializer khusus untuk format Avro dan Protobuf. Dalam kode fungsi Anda, Anda dapat menggunakan pustaka Avro atau Protobuf pilihan Anda untuk deserialisasi data. 

## Bekerja dengan data deserialisasi dalam fungsi Lambda
<a name="services-consume-kafka-events-payload-examples"></a>

Powertools untuk AWS Lambda membantu Anda deserialisasi catatan Kafka dalam kode fungsi Anda berdasarkan format yang Anda gunakan. Utilitas ini menyederhanakan bekerja dengan catatan Kafka dengan menangani konversi data dan menyediakan ready-to-use objek.

 Untuk menggunakan Powertools untuk AWS Lambda fungsi Anda, Anda perlu menambahkan Powertools AWS Lambda baik sebagai lapisan atau memasukkannya sebagai dependensi saat membangun fungsi Lambda Anda. Untuk petunjuk penyiapan dan informasi selengkapnya, lihat Powertools untuk AWS Lambda dokumentasi untuk bahasa pilihan Anda: 
+ [Powertools untuk AWS Lambda (Java)](https://docs.powertools.aws.dev/lambda/java/latest/utilities/kafka/)
+ [Powertools untuk AWS Lambda (Python)](https://docs.powertools.aws.dev/lambda/python/latest/utilities/kafka/)
+ [Powertools untuk AWS Lambda () TypeScript](https://docs.powertools.aws.dev/lambda/typescript/latest/features/kafka/)
+ [Powertools untuk AWS Lambda (.NET)](https://docs.powertools.aws.dev/lambda/dotnet/utilities/kafka/)

**catatan**  
Saat bekerja dengan integrasi registri skema, Anda dapat memilih `SOURCE` atau `JSON` memformat. Setiap opsi mendukung format serialisasi yang berbeda seperti yang ditunjukkan di bawah ini:  


| Format | Mendukung | 
| --- | --- | 
|  SUMBER  |  Avro dan Protobuf (menggunakan integrasi Lambda Schema Registry)  | 
|  JSON  |  Data JSON  | 

 Saat menggunakan `JSON` format `SOURCE` or, Anda dapat menggunakan Powertools AWS untuk membantu deserialisasi data dalam kode fungsi Anda. Berikut adalah contoh cara menangani format data yang berbeda: 

------
#### [ AVRO ]

Contoh Java:

```
package org.demo.kafka;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.demo.kafka.avro.AvroProduct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import software.amazon.lambda.powertools.kafka.Deserialization;
import software.amazon.lambda.powertools.kafka.DeserializationType;
import software.amazon.lambda.powertools.logging.Logging;

public class AvroDeserializationFunction implements RequestHandler<ConsumerRecords<String, AvroProduct>, String> {

    private static final Logger LOGGER = LoggerFactory.getLogger(AvroDeserializationFunction.class);

    @Override
    @Logging
    @Deserialization(type = DeserializationType.KAFKA_AVRO)
    public String handleRequest(ConsumerRecords<String, AvroProduct> records, Context context) {
        for (ConsumerRecord<String, AvroProduct> consumerRecord : records) {
            LOGGER.info("ConsumerRecord: {}", consumerRecord);

            AvroProduct product = consumerRecord.value();
            LOGGER.info("AvroProduct: {}", product);

            String key = consumerRecord.key();
            LOGGER.info("Key: {}", key);
        }

        return "OK";
    }

}
```

Contoh Python:

```
from aws_lambda_powertools.utilities.kafka_consumer.kafka_consumer import kafka_consumer
from aws_lambda_powertools.utilities.kafka_consumer.schema_config import SchemaConfig
from aws_lambda_powertools.utilities.kafka_consumer.consumer_records import ConsumerRecords

from aws_lambda_powertools.utilities.typing import LambdaContext
from aws_lambda_powertools import Logger

logger = Logger(service="kafkaConsumerPowertools")

value_schema_str = open("customer_profile.avsc", "r").read()

schema_config = SchemaConfig(
value_schema_type="AVRO",
value_schema=value_schema_str)

@kafka_consumer(schema_config=schema_config)
def lambda_handler(event: ConsumerRecords, context:LambdaContext):

  for record in event.records:
      value = record.value
      logger.info(f"Received value: {value}")
```

TypeScript contoh:

```
import { kafkaConsumer } from '@aws-lambda-powertools/kafka';

import type { ConsumerRecords } from '@aws-lambda-powertools/kafka/types';
import { Logger } from '@aws-lambda-powertools/logger';
import type { Context } from 'aws-lambda';

const logger = new Logger();

type Value = {
    id: number;
    name: string;
    price: number;
};

const schema = '{   
    "type": "record",   
    "name": "Product",   
    "fields": [     
        { "name": "id", "type": "int" },     
        { "name": "name", "type": "string" },     
        { "name": "price", "type": "double" }   
    ] 
}';

export const handler = kafkaConsumer<string, Value>(
    (event: ConsumerRecords<string, Value>, _context: Context) => {
        for (const record of event.records) {
            logger.info(Processing record with key: ${record.key});
            logger.info(Record value: ${JSON.stringify(record.value)});
            // You can add more processing logic here
        }
    },
    {
        value: {
            type: 'avro',
            schema: schema,
        },
    }
);
```

Contoh .NET:

```
using Amazon.Lambda.Core;
using AWS.Lambda.Powertools.Kafka;
using AWS.Lambda.Powertools.Kafka.Avro;
using AWS.Lambda.Powertools.Logging;
using Com.Example;

// Assembly attribute to enable the Lambda function's Kafka event to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(PowertoolsKafkaAvroSerializer))]

namespace ProtoBufClassLibrary;

public class Function
{
    public string FunctionHandler(ConsumerRecords<string, CustomerProfile> records, ILambdaContext context)
    {
        foreach (var record in records)
        {
            Logger.LogInformation("Processing messagem from topic: {topic}", record.Topic);
            Logger.LogInformation("Partition: {partition}, Offset: {offset}", record.Partition, record.Offset);
            Logger.LogInformation("Produced at: {timestamp}", record.Timestamp);
            
            foreach (var header in record.Headers.DecodedValues())
            {
                Logger.LogInformation($"{header.Key}: {header.Value}");
            }
            
            Logger.LogInformation("Processing order for: {fullName}", record.Value.FullName);
        }
    
        return "Processed " + records.Count() + " records";
    }
}
```

------
#### [ PROTOBUF ]

Contoh Java:

```
package org.demo.kafka;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.demo.kafka.protobuf.ProtobufProduct;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import software.amazon.lambda.powertools.kafka.Deserialization;
import software.amazon.lambda.powertools.kafka.DeserializationType;
import software.amazon.lambda.powertools.logging.Logging;

public class ProtobufDeserializationFunction
        implements RequestHandler<ConsumerRecords<String, ProtobufProduct>, String> {

    private static final Logger LOGGER = LoggerFactory.getLogger(ProtobufDeserializationFunction.class);

    @Override
    @Logging
    @Deserialization(type = DeserializationType.KAFKA_PROTOBUF)
    public String handleRequest(ConsumerRecords<String, ProtobufProduct> records, Context context) {
        for (ConsumerRecord<String, ProtobufProduct> consumerRecord : records) {
            LOGGER.info("ConsumerRecord: {}", consumerRecord);

            ProtobufProduct product = consumerRecord.value();
            LOGGER.info("ProtobufProduct: {}", product);

            String key = consumerRecord.key();
            LOGGER.info("Key: {}", key);
        }

        return "OK";
    }

}
```

Contoh Python:

```
from aws_lambda_powertools.utilities.kafka_consumer.kafka_consumer import kafka_consumer

from aws_lambda_powertools.utilities.kafka_consumer.schema_config import SchemaConfig
from aws_lambda_powertools.utilities.kafka_consumer.consumer_records import ConsumerRecords

from aws_lambda_powertools.utilities.typing import LambdaContext
from aws_lambda_powertools import Logger

from user_pb2 import User # protobuf generated class

logger = Logger(service="kafkaConsumerPowertools")

schema_config = SchemaConfig(
value_schema_type="PROTOBUF",
value_schema=User)

@kafka_consumer(schema_config=schema_config)
def lambda_handler(event: ConsumerRecords, context:LambdaContext):

  for record in event.records:
      value = record.value
      logger.info(f"Received value: {value}")
```

TypeScript contoh:

```
import { kafkaConsumer } from '@aws-lambda-powertools/kafka';
import type { ConsumerRecords } from '@aws-lambda-powertools/kafka/types';
import { Logger } from '@aws-lambda-powertools/logger';
import type { Context } from 'aws-lambda';
import { Product } from './product.generated.js';

const logger = new Logger();

type Value = {
    id: number;
    name: string;
    price: number;
};

export const handler = kafkaConsumer<string, Value>(
    (event: ConsumerRecords<string, Value>, _context: Context) => {
        for (const record of event.records) {
            logger.info(Processing record with key: ${record.key});
            logger.info(Record value: ${JSON.stringify(record.value)});
        }
    },
    {
        value: {
            type: 'protobuf',
            schema: Product,
        },
    }
);
```

Contoh .NET:

```
using Amazon.Lambda.Core;
using AWS.Lambda.Powertools.Kafka;
using AWS.Lambda.Powertools.Kafka.Protobuf;
using AWS.Lambda.Powertools.Logging;
using Com.Example;

// Assembly attribute to enable the Lambda function's Kafka event to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(PowertoolsKafkaProtobufSerializer))]

namespace ProtoBufClassLibrary;

public class Function
{
    public string FunctionHandler(ConsumerRecords<string, CustomerProfile> records, ILambdaContext context)
    {
        foreach (var record in records)
        {
            Logger.LogInformation("Processing messagem from topic: {topic}", record.Topic);
            Logger.LogInformation("Partition: {partition}, Offset: {offset}", record.Partition, record.Offset);
            Logger.LogInformation("Produced at: {timestamp}", record.Timestamp);
            
            foreach (var header in record.Headers.DecodedValues())
            {
                Logger.LogInformation($"{header.Key}: {header.Value}");
            }
            
            Logger.LogInformation("Processing order for: {fullName}", record.Value.FullName);
        }
    
        return "Processed " + records.Count() + " records";
    }
}
```

------
#### [ JSON ]

Contoh Java:

```
package org.demo.kafka;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

import software.amazon.lambda.powertools.kafka.Deserialization;
import software.amazon.lambda.powertools.kafka.DeserializationType;
import software.amazon.lambda.powertools.logging.Logging;

public class JsonDeserializationFunction implements RequestHandler<ConsumerRecords<String, Product>, String> {

    private static final Logger LOGGER = LoggerFactory.getLogger(JsonDeserializationFunction.class);

    @Override
    @Logging
    @Deserialization(type = DeserializationType.KAFKA_JSON)
    public String handleRequest(ConsumerRecords<String, Product> consumerRecords, Context context) {
        for (ConsumerRecord<String, Product> consumerRecord : consumerRecords) {
            LOGGER.info("ConsumerRecord: {}", consumerRecord);

            Product product = consumerRecord.value();
            LOGGER.info("Product: {}", product);

            String key = consumerRecord.key();
            LOGGER.info("Key: {}", key);
        }

        return "OK";
    }
}
```

Contoh Python:

```
from aws_lambda_powertools.utilities.kafka_consumer.kafka_consumer import kafka_consumer

from aws_lambda_powertools.utilities.kafka_consumer.schema_config import SchemaConfig
from aws_lambda_powertools.utilities.kafka_consumer.consumer_records import ConsumerRecords

from aws_lambda_powertools.utilities.typing import LambdaContext
from aws_lambda_powertools import Logger

logger = Logger(service="kafkaConsumerPowertools")

schema_config = SchemaConfig(value_schema_type="JSON")

@kafka_consumer(schema_config=schema_config)
def lambda_handler(event: ConsumerRecords, context:LambdaContext):

  for record in event.records:
      value = record.value
      logger.info(f"Received value: {value}")
```

TypeScript contoh:

```
import { kafkaConsumer } from '@aws-lambda-powertools/kafka';
import type { ConsumerRecords } from '@aws-lambda-powertools/kafka/types';
import { Logger } from '@aws-lambda-powertools/logger';
import type { Context } from 'aws-lambda';

const logger = new Logger();

type Value = {
    id: number;
    name: string;
    price: number;
};

export const handler = kafkaConsumer<string, Value>(
    (event: ConsumerRecords<string, Value>, _context: Context) => {
        for (const record of event.records) {
            logger.info(Processing record with key: ${record.key});
            logger.info(Record value: ${JSON.stringify(record.value)});
            // You can add more processing logic here
        }
    },
    {
        value: {
            type: 'json',
        },
    }
);
```

Contoh .NET:

```
using Amazon.Lambda.Core;
using AWS.Lambda.Powertools.Kafka;
using AWS.Lambda.Powertools.Kafka.Json;
using AWS.Lambda.Powertools.Logging;
using Com.Example;

// Assembly attribute to enable the Lambda function's Kafka event to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(PowertoolsKafkaJsonSerializer))]

namespace JsonClassLibrary;

public class Function
{
    public string FunctionHandler(ConsumerRecords<string, CustomerProfile> records, ILambdaContext context)
    {
        foreach (var record in records)
        {
            Logger.LogInformation("Processing messagem from topic: {topic}", record.Topic);
            Logger.LogInformation("Partition: {partition}, Offset: {offset}", record.Partition, record.Offset);
            Logger.LogInformation("Produced at: {timestamp}", record.Timestamp);
            
            foreach (var header in record.Headers.DecodedValues())
            {
                Logger.LogInformation($"{header.Key}: {header.Value}");
            }
            
            Logger.LogInformation("Processing order for: {fullName}", record.Value.FullName);
        }
    
        return "Processed " + records.Count() + " records";
    }
}
```

------

## Metode otentikasi untuk registri skema Anda
<a name="services-consume-kafka-events-auth"></a>

 Untuk menggunakan registri skema, Lambda harus dapat mengaksesnya dengan aman. Jika Anda bekerja dengan registri AWS Glue skema, Lambda bergantung pada otentikasi IAM. Ini berarti bahwa [peran eksekusi](lambda-intro-execution-role.md) fungsi Anda harus memiliki izin berikut untuk mengakses AWS Glue registri: 
+ [GetRegistry](https://docs.aws.amazon.com/glue/latest/webapi/API_GetRegistry.html)di *Referensi API AWS Glue Web*
+ [GetSchemaVersion](https://docs.aws.amazon.com/glue/latest/webapi/API_GetSchemaVersion.html)di *Referensi API AWS Glue Web*

Contoh kebijakan IAM yang diperlukan: 

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "glue:GetRegistry",
                "glue:GetSchemaVersion"
            ],
            "Resource": [
                "*"
            ]
        }
    ]
}
```

------

**catatan**  
 Untuk pendaftar AWS Glue skema, jika Anda menyediakan `AccessConfigs` registri AWS Glue , Lambda akan mengembalikan pengecualian validasi. 

Jika Anda bekerja dengan registri skema Confluent, Anda dapat memilih salah satu dari tiga metode otentikasi yang didukung untuk `Type` parameter objek Anda: [KafkaSchemaRegistryAccessConfig](https://docs.aws.amazon.com/lambda/latest/api/API_KafkaSchemaRegistryAccessConfig)
+ **BASIC\$1AUTH** — Lambda menggunakan nama pengguna dan kata sandi atau otentikasi Kunci API dan Rahasia API untuk mengakses registri Anda. Jika Anda memilih opsi ini, berikan Secrets Manager ARN yang berisi kredensyal Anda di bidang URI.
+ **CLIENT\$1CERTIFICATE\$1TLS\$1AUTH — Lambda menggunakan otentikasi** TLS timbal balik dengan sertifikat klien. Untuk menggunakan opsi ini, Lambda memerlukan akses ke sertifikat dan kunci pribadi. Berikan Secrets Manager ARN yang berisi kredensyal ini di bidang URI.
+ **NO\$1AUTH** - Sertifikat CA publik harus ditandatangani oleh otoritas sertifikat (CA) yang ada di toko kepercayaan Lambda. Untuk sertifikat CA/Self-signed privat, Anda mengonfigurasi sertifikat CA root server. Untuk menggunakan opsi ini, hilangkan `AccessConfigs` parameter.

 Selain itu, jika Lambda memerlukan akses ke sertifikat CA pribadi untuk memverifikasi sertifikat TLS registri skema Anda, pilih `SERVER_ROOT_CA_CERT` sebagai `Type` dan berikan Secrets Manager ARN ke sertifikat di bidang URI. 

**catatan**  
 Untuk mengkonfigurasi `SERVER_ROOT_CA_CERT` opsi di konsol, berikan ARN rahasia yang berisi sertifikat di bidang **Enkripsi**. 

 Konfigurasi otentikasi untuk registri skema Anda terpisah dari otentikasi apa pun yang telah Anda konfigurasi untuk cluster Kafka Anda. Anda harus mengkonfigurasi keduanya secara terpisah, bahkan jika mereka menggunakan metode otentikasi serupa. 

## Penanganan kesalahan dan pemecahan masalah untuk masalah registri skema
<a name="services-consume-kafka-events-troubleshooting"></a>

Saat menggunakan registri skema dengan sumber acara MSK Amazon Anda, Anda mungkin mengalami berbagai kesalahan. Bagian ini memberikan panduan tentang masalah umum dan cara mengatasinya.

### Kesalahan konfigurasi
<a name="consume-kafka-events-troubleshooting-configuration-errors"></a>

Kesalahan ini terjadi saat mengatur konfigurasi registri skema Anda.

Diperlukan mode yang disediakan  
**Pesan kesalahan**: `SchemaRegistryConfig is only available for Provisioned Mode. To configure Schema Registry, please enable Provisioned Mode by specifying MinimumPollers in ProvisionedPollerConfig.`  
**Resolusi:** Aktifkan mode yang disediakan untuk pemetaan sumber acara Anda dengan mengonfigurasi parameter di. `MinimumPollers` `ProvisionedPollerConfig`

URL registri skema tidak valid  
**Pesan kesalahan**: `Malformed SchemaRegistryURI provided. Please provide a valid URI or ARN. For example, https://schema-registry.example.com:8081 or arn:aws:glue:us-east-1:123456789012:registry/ExampleRegistry.`  
**Resolusi:** Berikan URL HTTPS yang valid untuk Confluent Schema Registry atau ARN yang valid untuk Schema Registry. AWS Glue 

Format rekaman acara tidak valid atau hilang  
**Pesan kesalahan**: `EventRecordFormat is a required field for SchemaRegistryConfig. Please provide one of supported format types: SOURCE, JSON.`  
**Resolusi:** Tentukan SOURCE atau JSON sebagai EventRecordFormat konfigurasi registri skema Anda.

Atribut validasi duplikat  
**Pesan kesalahan**: `Duplicate KEY/VALUE Attribute in SchemaValidationConfigs. SchemaValidationConfigs must contain at most one KEY/VALUE Attribute.`  
**Resolusi:** Hapus duplikat KEY atau atribut VALUE dari atribut Anda SchemaValidationConfigs. Setiap jenis atribut hanya dapat muncul sekali.

Konfigurasi validasi tidak ada  
**Pesan kesalahan**: `SchemaValidationConfigs is a required field for SchemaRegistryConfig.`  
**Resolusi:** Tambahkan SchemaValidationConfigs ke konfigurasi Anda, tentukan setidaknya satu atribut validasi (KEY atau VALUE).

### Kesalahan akses dan izin
<a name="consume-kafka-events-troubleshooting-access-errors"></a>

Kesalahan ini terjadi ketika Lambda tidak dapat mengakses registri skema karena masalah izin atau otentikasi.

AWS Glue Akses registri skema ditolak  
**Pesan kesalahan**: `Cannot access Glue Schema with provided role. Please ensure the provided role can perform the GetRegistry and GetSchemaVersion Actions on your schema.`  
**Resolusi:** Tambahkan izin yang diperlukan (`glue:GetRegistry`dan`glue:GetSchemaVersion`) ke peran eksekusi fungsi Anda.

Akses Registri Skema Konfluen ditolak  
**Pesan kesalahan**: `Cannot access Confluent Schema with the provided access configuration.`  
**Resolusi:** Verifikasi bahwa kredensyal otentikasi Anda (disimpan di Secrets Manager) sudah benar dan memiliki izin yang diperlukan untuk mengakses registri skema.

Registri AWS Glue Skema Lintas Akun  
**Pesan kesalahan**: `Cross-account Glue Schema Registry ARN not supported.`  
**Resolusi:** Gunakan Registri AWS Glue Skema yang ada di AWS akun yang sama dengan fungsi Lambda Anda.

Registri AWS Glue Skema Lintas Wilayah  
**Pesan kesalahan**: `Cross-region Glue Schema Registry ARN not supported.`  
**Resolusi:** Gunakan Registri AWS Glue Skema yang berada di wilayah yang sama dengan fungsi Lambda Anda.

Masalah akses rahasia  
**Pesan kesalahan**: `Lambda received InvalidRequestException from Secrets Manager.`  
**Resolusi:** Verifikasi bahwa peran eksekusi fungsi Anda memiliki izin untuk mengakses rahasia dan bahwa rahasia tidak dienkripsi dengan AWS KMS kunci default jika mengakses dari akun yang berbeda.

### Kesalahan koneksi
<a name="consume-kafka-events-troubleshooting-connection-errors"></a>

Kesalahan ini terjadi ketika Lambda tidak dapat membuat koneksi ke registri skema.

Masalah konektivitas VPC  
**Pesan kesalahan**: `Cannot connect to your Schema Registry. Your Kafka cluster's VPC must be able to connect to the schema registry. You can provide access by configuring AWS PrivateLink or a NAT Gateway or VPC Peering between Kafka Cluster VPC and the schema registry VPC.`  
**Resolusi:** Konfigurasikan jaringan VPC Anda untuk memungkinkan koneksi ke registri skema menggunakan AWS PrivateLink, NAT Gateway, atau VPC peering.

Kegagalan jabat tangan TLS  
**Pesan kesalahan**: `Unable to establish TLS handshake with the schema registry. Please provide correct CA-certificate or client certificate using Secrets Manager to access your schema registry.`  
**Resolusi:** Verifikasi bahwa sertifikat CA dan sertifikat klien Anda (untuk mTL) sudah benar dan dikonfigurasi dengan benar di Secrets Manager.

Throttling  
**Pesan kesalahan**: `Receiving throttling errors when accessing the schema registry. Please increase API TPS limits for your schema registry.`  
**Resolusi:** Tingkatkan batas tarif API untuk registri skema Anda atau kurangi laju permintaan dari aplikasi Anda.

Kesalahan registri skema yang dikelola sendiri  
**Pesan kesalahan**: `Lambda received an internal server an unexpected error from the provided self-managed schema registry.`  
**Resolusi:** Periksa kesehatan dan konfigurasi server registri skema yang dikelola sendiri.

# Pemrosesan latensi rendah untuk sumber acara Kafka
<a name="with-kafka-low-latency"></a>

AWS Lambda secara native mendukung pemrosesan peristiwa latensi rendah untuk aplikasi yang membutuhkan end-to-end latensi konsisten kurang dari 100 milidetik. Halaman ini menyediakan detail konfigurasi dan rekomendasi untuk mengaktifkan alur kerja latensi rendah.

## Aktifkan pemrosesan latensi rendah
<a name="enable-low-latency"></a>

Untuk mengaktifkan pemrosesan latensi rendah pada pemetaan sumber peristiwa Kafka, konfigurasi dasar berikut diperlukan: 
+ Aktifkan mode yang disediakan. Untuk informasi selengkapnya, lihat [Mode yang disediakan](kafka-scaling-modes.md#kafka-provisioned-mode).
+ Setel `MaximumBatchingWindowInSeconds` parameter pemetaan sumber peristiwa ke 0. Untuk informasi selengkapnya, lihat [Perilaku batching](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching).

## Menyetel dengan latensi rendah Kafka ESM Anda
<a name="recommendations-low-latency"></a>

Pertimbangkan rekomendasi berikut untuk mengoptimalkan pemetaan sumber acara Kafka Anda untuk latensi rendah:

### Konfigurasi mode yang disediakan
<a name="recommendations-pollers"></a>

**Dalam mode yang disediakan untuk pemetaan sumber peristiwa Kafka, Lambda memungkinkan Anda untuk menyempurnakan throughput pemetaan sumber peristiwa Anda dengan mengonfigurasi jumlah sumber daya minimum dan maksimum yang disebut poller peristiwa.** Poller peristiwa (atau **poller**) mewakili sumber daya komputasi yang mendukung pemetaan sumber peristiwa dalam mode yang disediakan, dan mengalokasikan hingga 5 throughput. MB/s Setiap poller acara mendukung hingga 5 pemanggilan Lambda bersamaan.

Untuk menentukan konfigurasi poller yang optimal untuk aplikasi Anda, pertimbangkan tingkat konsumsi puncak dan persyaratan pemrosesan Anda. Mari kita lihat contoh yang disederhanakan:

Dengan ukuran batch 20 catatan dan durasi fungsi target rata-rata 50ms, setiap poller dapat menangani 2.000 catatan per detik dengan batas 5 MB/s . Ini dihitung sebagai: (20 catatan × 1000ms/50ms) × 5 pemanggilan Lambda bersamaan. Oleh karena itu, jika tingkat konsumsi puncak yang Anda inginkan adalah 20.000 catatan per detik, Anda memerlukan setidaknya 10 poller acara.

**catatan**  
Kami merekomendasikan untuk menyediakan poller acara tambahan sebagai penyangga agar tidak beroperasi secara konsisten pada kapasitas maksimum.

Mode yang disediakan secara otomatis menskalakan poller acara Anda berdasarkan pola lalu lintas dalam **poller peristiwa** minimum dan maksimum yang dikonfigurasi yang dapat memicu penyeimbangan ulang, dan karenanya, memperkenalkan latensi tambahan. **Anda dapat menonaktifkan auto-scaling dengan mengonfigurasi nilai yang sama untuk poller peristiwa minimum dan maksimum.**

### Pertimbangan tambahan
<a name="additional-considerations-low-latency"></a>

Beberapa pertimbangan tambahan meliputi:
+ Dingin dimulai dari pemanggilan fungsi target Lambda Anda berpotensi meningkatkan latensi. end-to-end Untuk mengurangi risiko ini, pertimbangkan untuk mengaktifkan [konkurensi yang disediakan](provisioned-concurrency.md) atau [SnapStart](snapstart.md)pada fungsi target pemetaan sumber peristiwa Anda. Selain itu, optimalkan alokasi memori fungsi Anda untuk memastikan eksekusi yang konsisten dan optimal.
+ Ketika `MaximumBatchingWindowInSeconds` diatur ke 0, Lambda akan segera memproses catatan yang tersedia tanpa menunggu untuk mengisi ukuran batch lengkap. Misalnya, jika ukuran batch Anda disetel ke 1.000 catatan tetapi hanya 100 catatan yang tersedia, Lambda akan segera memproses 100 catatan tersebut daripada menunggu 1.000 catatan penuh terakumulasi.

**penting**  
Konfigurasi optimal untuk pemrosesan latensi rendah bervariasi secara signifikan berdasarkan beban kerja spesifik Anda. Kami sangat menyarankan untuk menguji konfigurasi yang berbeda dengan beban kerja Anda yang sebenarnya untuk menentukan pengaturan terbaik untuk kasus penggunaan Anda. 

# Mengonfigurasi kontrol penanganan kesalahan untuk sumber acara Kafka
<a name="kafka-retry-configurations"></a>

Anda dapat mengonfigurasi cara Lambda menangani kesalahan dan percobaan ulang untuk pemetaan sumber acara Kafka Anda. Konfigurasi ini membantu Anda mengontrol cara Lambda memproses catatan yang gagal dan mengelola perilaku coba lagi.

## Konfigurasi coba lagi yang tersedia
<a name="kafka-retry-options"></a>

Konfigurasi coba lagi berikut tersedia untuk Amazon MSK dan sumber acara Kafka yang dikelola sendiri:
+ **Upaya coba ulang maksimum** - Jumlah maksimum kali Lambda mencoba ulang ketika fungsi Anda mengembalikan kesalahan. Ini tidak menghitung upaya pemanggilan awal. Defaultnya adalah -1 (tak terbatas). Saat Anda mengonfigurasi percobaan ulang tak terbatas dan [tujuan saat gagal](kafka-on-failure-destination.md), Lambda secara otomatis menerapkan maksimal 10 percobaan ulang.
+ **Usia rekaman maksimum** - Usia maksimum rekaman yang dikirim Lambda ke fungsi Anda. Defaultnya adalah -1 (tak terbatas).
+ **Pisahkan batch pada kesalahan** - Ketika fungsi Anda mengembalikan kesalahan, bagi batch menjadi dua batch yang lebih kecil dan coba lagi masing-masing secara terpisah. Ini membantu mengisolasi catatan bermasalah.
+ **Respons batch sebagian** - Izinkan fungsi Anda mengembalikan informasi tentang catatan mana dalam batch yang gagal diproses, sehingga Lambda hanya dapat mencoba kembali catatan yang gagal.

## Mengkonfigurasi kontrol penanganan kesalahan (konsol)
<a name="kafka-retry-console"></a>

Anda dapat mengonfigurasi perilaku coba lagi saat membuat atau memperbarui pemetaan sumber peristiwa Kafka di konsol Lambda.

**Untuk mengonfigurasi perilaku coba lagi untuk sumber acara Kafka (konsol)**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih nama fungsi Anda.

1. Lakukan salah satu tindakan berikut:
   + Untuk menambahkan pemicu Kafka baru, di bawah **Ikhtisar fungsi**, pilih **Tambah pemicu**.
   + Untuk memodifikasi pemicu Kafka yang ada, pilih pemicu dan kemudian pilih **Edit**.

1. Di bawah **konfigurasi poller peristiwa**, pilih mode yang disediakan untuk mengonfigurasi kontrol penanganan kesalahan:

   1. Untuk **mencoba lagi**, masukkan jumlah maksimum percobaan ulang (0-10000, atau -1 untuk tak terbatas).

   1. Untuk **usia rekaman maksimum, masukkan usia** maksimum dalam hitungan detik (60-604800, atau -1 untuk tak terbatas).

   1. Untuk mengaktifkan pemisahan batch saat terjadi kesalahan, pilih **Pisahkan batch pada kesalahan**.

   1. Untuk mengaktifkan respons batch sebagian, pilih **ReportBatchItemFailures**.

1. Pilih **Tambah** atau **Simpan**.

## Mengkonfigurasi perilaku coba lagi ()AWS CLI
<a name="kafka-retry-cli"></a>

Gunakan AWS CLI perintah berikut untuk mengonfigurasi perilaku coba lagi untuk pemetaan sumber acara Kafka Anda.

### Membuat pemetaan sumber peristiwa dengan konfigurasi coba lagi
<a name="kafka-retry-cli-create"></a>

Contoh berikut membuat pemetaan sumber peristiwa Kafka yang dikelola sendiri dengan kontrol penanganan kesalahan:

```
aws lambda create-event-source-mapping \
  --function-name my-kafka-function \
  --topics my-kafka-topic \
  --source-access-configuration Type=SASL_SCRAM_512_AUTH,URI=arn:aws:secretsmanager:us-east-1:111122223333:secret:MyBrokerSecretName \
  --self-managed-event-source '{"Endpoints":{"KAFKA_BOOTSTRAP_SERVERS":["abc.xyz.com:9092"]}}' \
  --starting-position LATEST \
  --provisioned-poller-config MinimumPollers=1,MaximumPollers=1 \
  --maximum-retry-attempts 3 \
  --maximum-record-age-in-seconds 3600 \
  --bisect-batch-on-function-error \
  --function-response-types "ReportBatchItemFailures"
```

Untuk sumber acara MSK Amazon:

```
aws lambda create-event-source-mapping \
  --event-source-arn arn:aws:kafka:us-east-1:111122223333:cluster/my-cluster/fc2f5bdf-fd1b-45ad-85dd-15b4a5a6247e-2 \
  --topics AWSMSKKafkaTopic \
  --starting-position LATEST \
  --function-name my-kafka-function \
  --source-access-configurations '[{"Type": "SASL_SCRAM_512_AUTH","URI": "arn:aws:secretsmanager:us-east-1:111122223333:secret:my-secret"}]' \
  --provisioned-poller-config MinimumPollers=1,MaximumPollers=1 \
  --maximum-retry-attempts 3 \
  --maximum-record-age-in-seconds 3600 \
  --bisect-batch-on-function-error \
  --function-response-types "ReportBatchItemFailures"
```

### Memperbarui konfigurasi coba lagi
<a name="kafka-retry-cli-update"></a>

Gunakan `update-event-source-mapping` perintah untuk memodifikasi konfigurasi coba lagi untuk pemetaan sumber peristiwa yang ada:

```
aws lambda update-event-source-mapping \
  --uuid 12345678-1234-1234-1234-123456789012 \
  --maximum-retry-attempts 5 \
  --maximum-record-age-in-seconds 7200 \
  --bisect-batch-on-function-error \
  --function-response-types "ReportBatchItemFailures"
```

## PartialBatchResponse
<a name="kafka-partial-batch-response"></a>

Respons batch sebagian, juga dikenal sebagai ReportBatchItemFailures, adalah fitur kunci untuk penanganan kesalahan dalam integrasi Lambda dengan sumber Kafka. Tanpa fitur ini, ketika terjadi kesalahan di salah satu item dalam batch, itu menghasilkan pemrosesan ulang semua pesan dalam batch itu. Dengan respons batch sebagian diaktifkan dan diimplementasikan, handler mengembalikan pengenal hanya untuk pesan yang gagal, memungkinkan Lambda untuk mencoba lagi hanya item tertentu tersebut. Ini memberikan kontrol yang lebih besar atas bagaimana batch yang berisi pesan gagal diproses.

Untuk melaporkan kesalahan batch, Anda akan menggunakan skema JSON ini:

```
{
  "batchItemFailures": [
    {
      "itemIdentifier": {
        "partition": "topic-partition_number",
        "offset": 100
      }
    },
    ...
  ]
}
```

**penting**  
Jika Anda mengembalikan JSON atau null yang valid kosong, pemetaan sumber peristiwa akan menganggap batch berhasil diproses. Setiap topik-partition\$1number atau offset yang dikembalikan yang tidak valid yang tidak ada dalam acara yang dipanggil akan diperlakukan sebagai kegagalan dan seluruh batch akan dicoba ulang.

Contoh kode berikut menunjukkan cara mengimplementasikan respons batch sebagian untuk fungsi Lambda yang menerima peristiwa dari sumber Kafka. Fungsi melaporkan kegagalan item batch dalam respons, memberi sinyal ke Lambda untuk mencoba lagi pesan tersebut nanti.

Berikut adalah implementasi handler Lambda Python yang menunjukkan pendekatan ini:

```
import base64
from typing import Any, Dict, List

def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, List[Dict[str, Dict[str, Any]]]]:
    failures: List[Dict[str, Dict[str, Any]]] = []
    records_dict = event.get("records", {})
    
    for topic_partition, records_list in records_dict.items():
        for record in records_list:
            topic = record.get("topic")
            partition = record.get("partition")
            offset = record.get("offset")
            value_b64 = record.get("value")
            
            try:
                data = base64.b64decode(value_b64).decode("utf-8")
                process_message(data)
            except Exception as exc:
                print(f"Failed to process record topic={topic} partition={partition} offset={offset}: {exc}")
                item_identifier: Dict[str, Any] = {
                    "partition": f"{topic}-{partition}",
                    "offset": int(offset) if offset is not None else None,
                }
                failures.append({"itemIdentifier": item_identifier})
    
    return {"batchItemFailures": failures}

def process_message(data: str) -> None:
    # Your business logic for a single message
    pass
```

Berikut adalah versi Node.js:

```
const { Buffer } = require("buffer");

const handler = async (event) => {
  const failures = [];
  
  for (let topicPartition in event.records) {
    const records = event.records[topicPartition];
    
    for (const record of records) {
      const topic = record.topic;
      const partition = record.partition;
      const offset = record.offset;
      const valueBase64 = record.value;
      const data = Buffer.from(valueBase64, "base64").toString("utf8");
      
      try {
        await processMessage(data);
      } catch (error) {
        console.error("Failed to process record", { topic, partition, offset, error });
        const itemIdentifier = {
          "partition": `${topic}-${partition}`,
          "offset": Number(offset),
        };
        failures.push({ itemIdentifier });
      }
    }
  }
  
  return { batchItemFailures: failures };
};

async function processMessage(payload) {
  // Your business logic for a single message
}

module.exports = { handler };
```

# Menangkap batch yang dibuang untuk Amazon MSK dan sumber acara Apache Kafka yang dikelola sendiri
<a name="kafka-on-failure"></a>

Untuk menyimpan catatan pemanggilan pemetaan sumber peristiwa yang gagal, tambahkan tujuan ke pemetaan sumber peristiwa fungsi Anda. Setiap catatan yang dikirim ke tujuan adalah dokumen JSON yang berisi metadata tentang pemanggilan yang gagal. Untuk tujuan Amazon S3, Lambda juga mengirimkan seluruh catatan pemanggilan bersama dengan metadata. Anda dapat mengonfigurasi topik Amazon SNS, antrian Amazon SQS, bucket Amazon S3, atau Kafka sebagai tujuan.

Dengan tujuan Amazon S3, Anda dapat menggunakan fitur Pemberitahuan [Acara Amazon S3](https://docs.aws.amazon.com/) untuk menerima notifikasi saat objek diunggah ke bucket S3 tujuan Anda. Anda juga dapat mengonfigurasi Pemberitahuan Acara S3 untuk menjalankan fungsi Lambda lain untuk melakukan pemrosesan otomatis pada batch yang gagal.

Peran eksekusi Anda harus memiliki izin untuk tujuan:
+ **Untuk tujuan SQS: [sqs](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html):** SendMessage
+ **[Untuk tujuan SNS: SNS: Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)**
+ **Untuk tujuan S3: s3: PutObject** [dan [s3:](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) ListBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/ListObjectsV2.html)
+ **Untuk tujuan Kafka: [kafka-cluster](https://docs.aws.amazon.com/msk/latest/developerguide/kafka-actions.html):** WriteData

Anda dapat mengonfigurasi topik Kafka sebagai tujuan gagal untuk pemetaan sumber acara Kafka Anda. Ketika Lambda tidak dapat memproses catatan setelah percobaan ulang yang melelahkan atau ketika catatan melebihi usia maksimum, Lambda mengirimkan catatan yang gagal ke topik Kafka yang ditentukan untuk diproses nanti. Lihat [Menggunakan topik Kafka sebagai tujuan kegagalan](kafka-on-failure-destination.md).

Anda harus menerapkan titik akhir VPC untuk layanan tujuan yang gagal di dalam VPC cluster Kafka Anda.

Selain itu, jika Anda mengonfigurasi kunci KMS di tujuan Anda, Lambda memerlukan izin berikut tergantung pada jenis tujuan:
+ Jika Anda telah mengaktifkan enkripsi dengan kunci KMS Anda sendiri untuk tujuan S3, [kms: GenerateDataKey diperlukan](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html). Jika kunci KMS dan tujuan bucket S3 berada di akun yang berbeda dari fungsi Lambda dan peran eksekusi, konfigurasikan kunci KMS untuk mempercayai peran eksekusi yang diizinkan. kms: GenerateDataKey
+ [Jika Anda telah mengaktifkan enkripsi dengan kunci KMS Anda sendiri untuk tujuan SQS, [KMS: Decrypt dan kms: diperlukan](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html). GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) [https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)
+ [Jika Anda telah mengaktifkan enkripsi dengan kunci KMS Anda sendiri untuk tujuan SNS, [KMS: Decrypt dan kms: diperlukan](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html). GenerateDataKey](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html) [https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html](https://docs.aws.amazon.com/kms/latest/APIReference/API_DescribeKey.html)

## Mengonfigurasi tujuan yang gagal untuk pemetaan sumber acara Kafka
<a name="kafka-onfailure-destination"></a>

Untuk mengonfigurasi tujuan saat gagal menggunakan konsol, ikuti langkah-langkah berikut:

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi.

1. Di bagian **Gambaran umum fungsi**, pilih **Tambahkan tujuan**.

1. Untuk **Sumber**, pilih **Pemanggilan pemetaan sumber acara**.

1. Untuk **pemetaan sumber peristiwa**, pilih sumber peristiwa yang dikonfigurasi untuk fungsi ini.

1. Untuk **Kondisi**, pilih **On failure**. Untuk pemanggilan pemetaan sumber peristiwa, ini adalah satu-satunya kondisi yang diterima.

1. Untuk **tipe Tujuan**, pilih tipe tujuan yang Lambda kirimkan catatan pemanggilan.

1. Untuk **Tujuan**, pilih sumber daya.

1. Pilih **Simpan**.

Anda juga dapat mengonfigurasi tujuan pada kegagalan menggunakan file. AWS CLI Misalnya, [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html)perintah berikut menambahkan pemetaan sumber peristiwa dengan tujuan kegagalan SQS ke: `MyFunction`

```
aws lambda create-event-source-mapping \
--function-name "MyFunction" \
--event-source-arn arn:aws:kafka:us-east-1:123456789012:cluster/vpc-2priv-2pub/751d2973-a626-431c-9d4e-d7975eb44dd7-2 \
--destination-config '{"OnFailure": {"Destination": "arn:aws:sqs:us-east-1:123456789012:dest-queue"}}'
```

[update-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html)Perintah berikut menambahkan tujuan kegagalan S3 ke sumber acara yang terkait dengan input: `uuid`

```
aws lambda update-event-source-mapping \
--uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \
--destination-config '{"OnFailure": {"Destination": "arn:aws:s3:::dest-bucket"}}'
```

Untuk menghapus tujuan, berikan string kosong sebagai argumen ke `destination-config` parameter:

```
aws lambda update-event-source-mapping \
--uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \
--destination-config '{"OnFailure": {"Destination": ""}}'
```

### Praktik terbaik keamanan untuk tujuan Amazon S3
<a name="kafka-s3-destination-security"></a>

Menghapus bucket S3 yang dikonfigurasi sebagai tujuan tanpa menghapus tujuan dari konfigurasi fungsi Anda dapat menimbulkan risiko keamanan. Jika pengguna lain mengetahui nama bucket tujuan Anda, mereka dapat membuat ulang bucket di bucket tersebut. Akun AWS Catatan pemanggilan yang gagal akan dikirim ke bucket mereka, yang berpotensi mengekspos data dari fungsi Anda.

**Awas**  
Untuk memastikan bahwa catatan pemanggilan dari fungsi Anda tidak dapat dikirim ke bucket S3 di bucket lain Akun AWS, tambahkan kondisi ke peran eksekusi fungsi Anda yang membatasi `s3:PutObject` izin ke bucket di akun Anda. 

Contoh berikut menunjukkan kebijakan IAM yang membatasi `s3:PutObject` izin fungsi Anda ke bucket di akun Anda. Kebijakan ini juga memberi Lambda `s3:ListBucket` izin yang dibutuhkan untuk menggunakan bucket S3 sebagai tujuan.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3BucketResourceAccountWrite",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::*/*",
                "arn:aws:s3:::*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:ResourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

Untuk menambahkan kebijakan izin ke peran eksekusi fungsi Anda menggunakan Konsol Manajemen AWS atau AWS CLI, lihat instruksi dalam prosedur berikut:

------
#### [ Console ]

**Untuk menambahkan kebijakan izin ke peran eksekusi fungsi (konsol)**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi Lambda yang peran eksekusinya ingin Anda modifikasi.

1. Di tab **Konfigurasi**, pilih **Izin**.

1. Di tab **Peran eksekusi**, pilih **nama Peran** fungsi Anda untuk membuka halaman konsol IAM peran.

1. Tambahkan kebijakan izin ke peran dengan melakukan hal berikut:

   1. Di panel **Kebijakan izin**, pilih **Tambahkan izin**, lalu pilih **Buat** kebijakan sebaris.

   1. Di **Editor kebijakan**, pilih **JSON**.

   1. Rekatkan kebijakan yang ingin Anda tambahkan ke editor (ganti JSON yang ada), lalu pilih **Berikutnya**.

   1. Di bawah **Detail kebijakan**, masukkan **nama Kebijakan**.

   1. Pilih **Buat kebijakan**.

------
#### [ AWS CLI ]

**Untuk menambahkan kebijakan izin ke peran eksekusi fungsi (CLI)**

1. Buat dokumen kebijakan JSON dengan izin yang diperlukan dan simpan di direktori lokal.

1. Gunakan perintah IAM `put-role-policy` CLI untuk menambahkan izin ke peran eksekusi fungsi Anda. Jalankan perintah berikut dari direktori tempat Anda menyimpan dokumen kebijakan JSON dan ganti nama peran, nama kebijakan, dan dokumen kebijakan dengan nilai Anda sendiri.

   ```
   aws iam put-role-policy \
   --role-name my_lambda_role \
   --policy-name LambdaS3DestinationPolicy \
   --policy-document file://my_policy.json
   ```

------

### Catatan pemanggilan contoh SNS dan SQS
<a name="kafka-sns-sqs-destinations"></a>

Contoh berikut menunjukkan apa yang Lambda kirim ke topik SNS atau tujuan antrian SQS untuk pemanggilan sumber peristiwa Kafka yang gagal. Setiap kunci di bawah `recordsInfo` berisi topik dan partisi Kafka, dipisahkan oleh tanda hubung. Misalnya, untuk kuncinya`"Topic-0"`, `Topic` adalah topik Kafka, dan `0` merupakan partisi. Untuk setiap topik dan partisi, Anda dapat menggunakan data offset dan stempel waktu untuk menemukan catatan pemanggilan asli.

```
{
    "requestContext": {
        "requestId": "316aa6d0-8154-xmpl-9af7-85d5f4a6bc81",
        "functionArn": "arn:aws:lambda:us-east-1:123456789012:function:myfunction",
        "condition": "RetryAttemptsExhausted" | "MaximumPayloadSizeExceeded",
        "approximateInvokeCount": 1
    },
    "responseContext": { // null if record is MaximumPayloadSizeExceeded
        "statusCode": 200,
        "executedVersion": "$LATEST",
        "functionError": "Unhandled"
    },
    "version": "1.0",
    "timestamp": "2019-11-14T00:38:06.021Z",
    "KafkaBatchInfo": {
        "batchSize": 500,
        "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/vpc-2priv-2pub/751d2973-a626-431c-9d4e-d7975eb44dd7-2",
        "bootstrapServers": "...",
        "payloadSize": 2039086, // In bytes
        "recordsInfo": {
            "Topic-0": {
                "firstRecordOffset": "49601189658422359378836298521827638475320189012309704722",
                "lastRecordOffset": "49601189658422359378836298522902373528957594348623495186",
                "firstRecordTimestamp": "2019-11-14T00:38:04.835Z",
                "lastRecordTimestamp": "2019-11-14T00:38:05.580Z",
            },
            "Topic-1": {
                "firstRecordOffset": "49601189658422359378836298521827638475320189012309704722",
                "lastRecordOffset": "49601189658422359378836298522902373528957594348623495186",
                "firstRecordTimestamp": "2019-11-14T00:38:04.835Z",
                "lastRecordTimestamp": "2019-11-14T00:38:05.580Z",
            }
        }
    }
}
```

### Catatan pemanggilan contoh tujuan S3
<a name="kafka-s3-destinations"></a>

Untuk tujuan S3, Lambda mengirimkan seluruh catatan pemanggilan bersama dengan metadata ke tujuan. Contoh berikut menunjukkan bahwa Lambda mengirim ke tujuan bucket S3 untuk pemanggilan sumber peristiwa Kafka yang gagal. Selain semua bidang dari contoh sebelumnya untuk tujuan SQS dan SNS, `payload` bidang berisi catatan pemanggilan asli sebagai string JSON yang lolos.

```
{
    "requestContext": {
        "requestId": "316aa6d0-8154-xmpl-9af7-85d5f4a6bc81",
        "functionArn": "arn:aws:lambda:us-east-1:123456789012:function:myfunction",
        "condition": "RetryAttemptsExhausted" | "MaximumPayloadSizeExceeded",
        "approximateInvokeCount": 1
    },
    "responseContext": { // null if record is MaximumPayloadSizeExceeded
        "statusCode": 200,
        "executedVersion": "$LATEST",
        "functionError": "Unhandled"
    },
    "version": "1.0",
    "timestamp": "2019-11-14T00:38:06.021Z",
    "KafkaBatchInfo": {
        "batchSize": 500,
        "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/vpc-2priv-2pub/751d2973-a626-431c-9d4e-d7975eb44dd7-2",
        "bootstrapServers": "...",
        "payloadSize": 2039086, // In bytes
        "recordsInfo": {
            "Topic-0": {
                "firstRecordOffset": "49601189658422359378836298521827638475320189012309704722",
                "lastRecordOffset": "49601189658422359378836298522902373528957594348623495186",
                "firstRecordTimestamp": "2019-11-14T00:38:04.835Z",
                "lastRecordTimestamp": "2019-11-14T00:38:05.580Z",
            },
            "Topic-1": {
                "firstRecordOffset": "49601189658422359378836298521827638475320189012309704722",
                "lastRecordOffset": "49601189658422359378836298522902373528957594348623495186",
                "firstRecordTimestamp": "2019-11-14T00:38:04.835Z",
                "lastRecordTimestamp": "2019-11-14T00:38:05.580Z",
            }
        }
    },
    "payload": "<Whole Event>" // Only available in S3
}
```

**Tip**  
Sebaiknya aktifkan versi S3 di bucket tujuan Anda.

# Menggunakan topik Kafka sebagai tujuan kegagalan
<a name="kafka-on-failure-destination"></a>

Anda dapat mengonfigurasi topik Kafka sebagai tujuan gagal untuk pemetaan sumber acara Kafka Anda. Ketika Lambda tidak dapat memproses catatan setelah percobaan ulang yang melelahkan atau ketika catatan melebihi usia maksimum, Lambda mengirimkan catatan yang gagal ke topik Kafka yang ditentukan untuk diproses nanti. Saat Anda mengonfigurasi [percobaan ulang tak terbatas](kafka-retry-configurations.md) dan tujuan saat gagal, Lambda secara otomatis menerapkan maksimal 10 percobaan ulang.

## Cara kerja tujuan on-failure Kafka
<a name="kafka-ofd-overview"></a>

Saat Anda mengonfigurasi topik Kafka sebagai tujuan yang gagal, Lambda bertindak sebagai produser Kafka dan menulis catatan gagal ke topik tujuan. Ini menciptakan pola topik surat mati (DLT) dalam infrastruktur Kafka Anda.
+ **Persyaratan cluster yang sama** - Topik tujuan harus ada di cluster Kafka yang sama dengan topik sumber Anda.
+ **Konten rekaman aktual** — Tujuan Kafka menerima catatan gagal aktual bersama dengan metadata kegagalan.
+ **Pencegahan rekursi** — Lambda mencegah loop tak terbatas dengan memblokir konfigurasi di mana topik sumber dan tujuan sama.

## Mengonfigurasi tujuan pada kegagalan Kafka
<a name="kafka-ofd-configure"></a>

Anda dapat mengonfigurasi topik Kafka sebagai tujuan gagal saat membuat atau memperbarui pemetaan sumber acara Kafka.

### Mengkonfigurasi tujuan Kafka (konsol)
<a name="kafka-ofd-console"></a>

**Untuk mengonfigurasi topik Kafka sebagai tujuan gagal (konsol)**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih nama fungsi Anda.

1. Lakukan salah satu tindakan berikut:
   + Untuk menambahkan pemicu Kafka baru, di bawah **Ikhtisar fungsi**, pilih **Tambah pemicu**.
   + Untuk memodifikasi pemicu Kafka yang ada, pilih pemicu dan kemudian pilih **Edit**.

1. Di bawah **Pengaturan tambahan**, untuk **tujuan On-failure**, pilih topik **Kafka**.

1. Untuk **nama Topik**, masukkan nama topik Kafka tempat Anda ingin mengirim catatan yang gagal.

1. Pilih **Tambah** atau **Simpan**.

### Mengkonfigurasi tujuan Kafka ()AWS CLI
<a name="kafka-ofd-cli"></a>

Gunakan `kafka://` awalan untuk menentukan topik Kafka sebagai tujuan kegagalan.

#### Membuat pemetaan sumber acara dengan tujuan Kafka
<a name="kafka-ofd-cli-create"></a>

Contoh berikut membuat pemetaan sumber peristiwa MSK Amazon dengan topik Kafka sebagai tujuan kegagalan:

```
aws lambda create-event-source-mapping \
  --function-name my-kafka-function \
  --topics AWSKafkaTopic \
  --event-source-arn arn:aws:kafka:us-east-1:123456789012:cluster/my-cluster/abc123 \
  --starting-position LATEST \
  --provisioned-poller-config MinimumPollers=1,MaximumPollers=3 \
  --destination-config '{"OnFailure":{"Destination":"kafka://failed-records-topic"}}'
```

Untuk Kafka yang dikelola sendiri, gunakan sintaks yang sama:

```
aws lambda create-event-source-mapping \
  --function-name my-kafka-function \
  --topics AWSKafkaTopic \
  --self-managed-event-source '{"Endpoints":{"KAFKA_BOOTSTRAP_SERVERS":["abc.xyz.com:9092"]}}' \
  --starting-position LATEST \
  --provisioned-poller-config MinimumPollers=1,MaximumPollers=3 \
  --destination-config '{"OnFailure":{"Destination":"kafka://failed-records-topic"}}'
```

#### Memperbarui tujuan Kafka
<a name="kafka-ofd-cli-update"></a>

Gunakan `update-event-source-mapping` perintah untuk menambah atau memodifikasi tujuan Kafka:

```
aws lambda update-event-source-mapping \
  --uuid 12345678-1234-1234-1234-123456789012 \
  --destination-config '{"OnFailure":{"Destination":"kafka://failed-records-topic"}}'
```

## Format rekaman untuk tujuan Kafka
<a name="kafka-ofd-record-format"></a>

Ketika Lambda mengirim catatan gagal ke topik Kafka, setiap pesan berisi metadata tentang kegagalan dan konten rekaman yang sebenarnya.

### Metadata kegagalan
<a name="kafka-ofd-metadata"></a>

Metadata mencakup informasi tentang mengapa catatan gagal dan detail tentang batch asli:

```
{
  "requestContext": {
    "requestId": "e4b46cbf-b738-xmpl-8880-a18cdf61200e",
    "functionArn": "arn:aws:lambda:us-east-1:123456789012:function:my-function:$LATEST",
    "condition": "RetriesExhausted",
    "approximateInvokeCount": 3
  },
  "responseContext": {
    "statusCode": 200,
    "executedVersion": "$LATEST",
    "functionError": "Unhandled"
  },
  "version": "1.0",
  "timestamp": "2019-11-14T18:16:05.568Z",
  "KafkaBatchInfo": {
    "batchSize": 1,
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/my-cluster/abc123",
    "bootstrapServers": "b-1.mycluster.abc123.kafka.us-east-1.amazonaws.com:9098",
    "payloadSize": 1162,
    "recordInfo": {
      "offset": "49601189658422359378836298521827638475320189012309704722",
      "timestamp": "2019-11-14T18:16:04.835Z"
    }
  },
  "payload": {
    "bootstrapServers": "b-1.mycluster.abc123.kafka.us-east-1.amazonaws.com:9098",
    "eventSource": "aws:kafka",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/my-cluster/abc123",
    "records": {
      "my-topic-0": [
        {
          "headers": [],
          "key": "dGVzdC1rZXk=",
          "offset": 100,
          "partition": 0,
          "timestamp": 1749116692330,
          "timestampType": "CREATE_TIME",
          "topic": "my-topic",
          "value": "dGVzdC12YWx1ZQ=="
        }
      ]
    }
  }
}
```

### Perilaku kunci partisi
<a name="kafka-ofd-partitioning"></a>

Lambda menggunakan kunci partisi yang sama dari catatan asli saat memproduksi ke topik tujuan. Jika rekaman asli tidak memiliki kunci, Lambda menggunakan partisi round-robin default Kafka di semua partisi yang tersedia di topik tujuan.

## Persyaratan dan pembatasan
<a name="kafka-ofd-requirements"></a>
+ **Diperlukan mode yang disediakan** - Tujuan saat kegagalan Kafka hanya tersedia untuk pemetaan sumber peristiwa dengan mode yang disediakan diaktifkan.
+ **Hanya cluster yang sama** - Topik tujuan harus ada di cluster Kafka yang sama dengan topik sumber Anda.
+ **Izin topik** - Pemetaan sumber acara Anda harus memiliki izin menulis ke topik tujuan. Contoh:

  ```
  {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
          {
              "Sid": "ClusterPermissions",
              "Effect": "Allow",
              "Action": [
                  "kafka-cluster:Connect",
                  "kafka-cluster:DescribeCluster",
                  "kafka-cluster:DescribeTopic",
                  "kafka-cluster:WriteData",
                  "kafka-cluster:ReadData"
              ],
              "Resource": [
                  "arn:aws:kafka:*:*:cluster/*"
              ]
          },
          {
              "Sid": "TopicPermissions",
              "Effect": "Allow",
              "Action": [
                  "kafka-cluster:DescribeTopic",
                  "kafka-cluster:WriteData",
                  "kafka-cluster:ReadData"
              ],
              "Resource": [
                  "arn:aws:kafka:*:*:topic/*/*"
              ]
          },
          {
              "Effect": "Allow",
              "Action": [
                  "kafka:DescribeCluster",
                  "kafka:GetBootstrapBrokers",
                  "kafka:Produce"
              ],
              "Resource": "arn:aws:kafka:*:*:cluster/*"
          },
          {
              "Effect": "Allow",
              "Action": [
                  "ec2:CreateNetworkInterface",
                  "ec2:DescribeNetworkInterfaces",
                  "ec2:DeleteNetworkInterface",
                  "ec2:DescribeSubnets",
                  "ec2:DescribeSecurityGroups"
              ],
              "Resource": "*"
          }
      ]
  }
  ```
+ **Tidak ada rekursi** - Nama topik tujuan tidak boleh sama dengan nama topik sumber Anda.

# Pencatatan pemetaan sumber acara Kafka
<a name="esm-logging"></a>

Anda dapat mengonfigurasi pencatatan tingkat sistem untuk pemetaan sumber peristiwa Kafka Anda untuk mengaktifkan dan memfilter log sistem yang dikirim oleh poller acara Lambda. CloudWatch 

[Fitur ini hanya tersedia untuk pemetaan sumber acara Kafka, dan dengan mode Provisioned.](https://docs.aws.amazon.com/lambda/latest/dg/kafka-scaling-modes.html#kafka-provisioned-mode)

**Untuk pemetaan sumber peristiwa dengan konfigurasi logging, Anda juga dapat memeriksa log sistem dari kueri log bawaan di tab **Monitor** dari halaman Konsol **Lambda** > **Sumber daya tambahan> pemetaan sumber** peristiwa sekarang.**

## Cara kerja logging
<a name="esm-logging-overview"></a>

Saat Anda menyetel konfigurasi logging dengan level log dalam pemetaan sumber peristiwa, poller peristiwa Lambda mengirimkan log yang sesuai (log sistem pemetaan sumber peristiwa).

Pemetaan sumber peristiwa menggunakan kembali [tujuan log](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-logs.html#configuring-log-destinations) yang sama dengan fungsi Lambda Anda. Pastikan peran eksekusi fungsi Lambda Anda memiliki izin logging yang diperlukan.

Pemetaan sumber peristiwa akan memiliki aliran lognya sendiri, dengan tanggal dan sumber peristiwa pemetaan UUID sebagai nama aliran log, seperti. `2020/01/01/12345678-1234-1234-1234-12345678901`

Untuk log sistem pemetaan sumber peristiwa, Anda dapat memilih antara tingkat log berikut.


| Tingkat log | Penggunaan | 
| --- | --- | 
| DEBUG (paling detail) | Informasi terperinci untuk kemajuan pemrosesan sumber acara | 
| INFO | Pesan tentang operasi normal pemetaan sumber acara Anda | 
| PERINGATAN (paling sedikit detail) | Pesan tentang peringatan potensial dan kesalahan yang dapat menyebabkan perilaku tak terduga | 

Saat Anda memilih level log, poller acara Lambda mengirimkan log pada tingkat itu dan lebih rendah. Misalnya, jika Anda menyetel tingkat log sistem pemetaan sumber peristiwa ke INFO, poller peristiwa tidak mengirim output log pada tingkat DEBUG.

## Mengonfigurasi pencatatan log
<a name="esm-logging-configure"></a>

Anda dapat mengatur konfigurasi logging saat membuat atau memperbarui pemetaan sumber peristiwa Kafka.

### Mengkonfigurasi logging (konsol)
<a name="esm-logging-console"></a>

**Untuk mengkonfigurasi logging (konsol)**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih nama fungsi Anda.

1. Lakukan salah satu tindakan berikut:
   + Untuk menambahkan pemicu Kafka baru, di bawah **Ikhtisar fungsi**, pilih **Tambah pemicu**.
   + Untuk memodifikasi pemicu Kafka yang ada, pilih pemicu dan kemudian pilih **Edit**.

1. **Di bawah **konfigurasi poller Event**, untuk **mode Provisioned**, aktifkan kotak centang Configure.** Dan pengaturan **level Log** akan muncul.

1.  Klik Daftar tarik-turun **tingkat log** dan pilih level untuk pemetaan sumber acara.

1. Pilih **Tambah** atau **Simpan** di bagian bawah untuk membuat atau memperbarui pemetaan sumber acara.

### Mengkonfigurasi logging ()AWS CLI
<a name="esm-logging-cli"></a>

#### Membuat pemetaan sumber peristiwa dengan logging
<a name="esm-logging-cli-create"></a>

Contoh berikut membuat pemetaan sumber peristiwa MSK Amazon dengan konfigurasi logging:

```
aws lambda create-event-source-mapping \
  --function-name my-kafka-function \
  --topics AWSKafkaTopic \
  --event-source-arn arn:aws:kafka:us-east-1:123456789012:cluster/my-cluster/abc123 \
  --starting-position LATEST \
  --provisioned-poller-config MinimumPollers=1,MaximumPollers=3 \
  --logging-config '{"SystemLogLevel":"DEBUG"}'
```

Untuk Kafka yang dikelola sendiri, gunakan sintaks yang sama:

```
aws lambda create-event-source-mapping \
  --function-name my-kafka-function \
  --topics AWSKafkaTopic \
  --self-managed-event-source '{"Endpoints":{"KAFKA_BOOTSTRAP_SERVERS":["abc.xyz.com:9092"]}}' \
  --starting-position LATEST \
  --provisioned-poller-config MinimumPollers=1,MaximumPollers=3 \
  --logging-config '{"SystemLogLevel":"DEBUG"}'
```

#### Memperbarui konfigurasi logging
<a name="esm-logging-cli-update"></a>

Gunakan `update-event-source-mapping` perintah untuk menambah atau memodifikasi konfigurasi logging:

```
aws lambda update-event-source-mapping \
  --uuid 12345678-1234-1234-1234-123456789012 \
  --logging-config '{"SystemLogLevel":"WARN"}'
```

## Format rekaman untuk log sistem pemetaan sumber peristiwa Kafka
<a name="esm-logging-record-format"></a>

Ketika poller peristiwa Lambda mengirim log, setiap entri log berisi metadata pemetaan sumber peristiwa umum dan juga konten khusus acara.

### PERINGATKAN catatan log
<a name="esm-logging-warn-record"></a>

Catatan PERINGATAN berisi kesalahan atau peringatan dari poller acara, dan itu dipancarkan saat peristiwa terjadi. Contoh:

```
{
    "eventType": "ESM_PROCESSING_EVENT",
    "timestamp": 1546347650000,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:12345678-1234-1234-1234-123456789012",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/tests-cluster/87654321-4321-4321-4321-876543221-s1",
    "eventProcessorId": "12345678-1234-1234-1234-123456789012/0",
    "logLevel": "WARN",
    "error": {
        "errorMessage": "Timeout expired while fetching topic metadata",
        "errorCode": "org.apache.kafka.common.errors.TimeoutException"
    }
}
```

### Catatan log INFO
<a name="esm-logging-info-record"></a>

Catatan INFO berisi konfigurasi klien konsumen Kafka di setiap poller acara, dan itu dipancarkan pada saat konsumen sedang dibangun atau diubah. Contoh:

```
{
    "eventType": "POLLER_STATUS_EVENT",
    "timestamp": 1546347660000,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:12345678-1234-1234-1234-123456789012",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/tests-cluster/87654321-4321-4321-4321-876543221-s1",
    "eventProcessorId": "12345678-1234-1234-1234-123456789012/0",
    "logLevel": "INFO",
    "kafkaEventSourceConnection": {
        "brokerEndpoints": "boot-abcd1234.c2.kafka-serverless.us-east-1.amazonaws.com:9098",
        "consumerId": "12345678-1234-1234-1234-123456789012-0",
        "topics": [
            "test"
        ],
        "consumerGroupId": "12345678-1234-1234-1234-123456789012",
        "securityProtocol": "SASL_SSL",
        "saslMechanism": "AWS_MSK_IAM",
        "totalPartitionCount": 2,
        "assignedPartitionCount": 2,
        "partitionsAssignmentGeneration": 5,
        "assignedPartitions": [
            "test-0",
            "test-1"
        ],
        "networkConfig": {
            "ipAddresses": [
                "10.100.141.1"
            ],
            "subnetCidrBlock": "10.100.128.0/20",
            "securityGroups": [
                "sg-abcdefabcdefabcdef"
            ]
        }
    }
}
```

### Catatan log DEBUG
<a name="esm-logging-debug-record"></a>

Log DEBUG berisi info terkait offset Kafka dalam pemrosesan pemetaan sumber peristiwa, dan info offset dipancarkan per menit. Contoh:

```
{
    "eventType": "KAFKA_STATUS_EVENT",
    "timestamp": 1546347670000,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:12345678-1234-1234-1234-123456789012",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/tests-cluster/87654321-4321-4321-4321-876543221-s1",
    "eventProcessorId": "12345678-1234-1234-1234-123456789012/0",
    "logLevel": "DEBUG",
    "kafkaPartitionOffsets": {
        "partition": "test-1",
        "endOffset": 5004,
        "consumedOffset": 5003,
        "processedOffset": 5003,
        "committedOffset": 5004
    }
}
```

# Memecahkan masalah kesalahan pemetaan sumber acara Kafka
<a name="with-kafka-troubleshoot"></a>

Topik berikut memberikan saran pemecahan masalah untuk kesalahan dan masalah yang mungkin Anda temui saat menggunakan Amazon MSK atau Apache Kafka yang dikelola sendiri dengan Lambda.

Untuk bantuan lebih lanjut tentang pemecahan masalah, kunjungi Pusat [AWS Pengetahuan](https://repost.aws/knowledge-center#AWS_Lambda).

## Kesalahan otentikasi dan otorisasi
<a name="kafka-permissions-errors"></a>

Jika salah satu izin yang diperlukan untuk mengkonsumsi data dari cluster Kafka tidak ada, Lambda menampilkan salah satu pesan kesalahan berikut dalam pemetaan sumber peristiwa di bawah. **LastProcessingResult**

**Topics**
+ [

### Cluster gagal mengotorisasi Lambda
](#kafka-authorize-errors)
+ [

### Otentikasi SASL gagal
](#kafka-sasl-errors)
+ [

### Server gagal mengautentikasi Lambda
](#kafka-mtls-errors-server)
+ [

### Lambda gagal mengautentikasi server
](#kafka-mtls-errors-lambda)
+ [

### Sertifikat atau kunci pribadi yang diberikan tidak valid
](#kafka-key-errors)

### Cluster gagal mengotorisasi Lambda
<a name="kafka-authorize-errors"></a>

Untuk SASL/SCRAM atau mTL, kesalahan ini menunjukkan bahwa pengguna yang disediakan tidak memiliki semua izin daftar kontrol akses (ACL) Kafka yang diperlukan berikut:
+ DescribeConfigs Cluster
+ Jelaskan Grup
+ Baca Grup
+ Jelaskan Topik
+ Baca Topik

Saat Anda membuat Kafka ACLs dengan `kafka-cluster` izin yang diperlukan, tentukan topik dan kelompokkan sebagai sumber daya. Nama topik harus cocok dengan topik dalam pemetaan sumber acara. Nama grup harus cocok dengan UUID pemetaan sumber peristiwa.

Setelah Anda menambahkan izin yang diperlukan ke peran eksekusi, mungkin perlu beberapa menit agar perubahan diterapkan.

Berikut ini adalah contoh log tingkat sistem ESM setelah mengaktifkan [Logging Config](esm-logging.md) untuk masalah ini:

```
{
    "eventType": "ESM_PROCESSING_EVENT",
    "timestamp": 1734567890123,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:a1b2c3d4-5678-90ab-cdef-EXAMPLE11111",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/my-kafka-cluster/12345678-abcd-1234-efgh-EXAMPLE11111-1",
    "eventProcessorId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111/0",
    "logLevel": "WARN",
    "error": {
        "errorMessage": "Not authorized to access topics: [my-topic]",
        "errorCode": "org.apache.kafka.common.errors.TopicAuthorizationException"
    }
}
```

### Otentikasi SASL gagal
<a name="kafka-sasl-errors"></a>

Untuk SASL/SCRAM atau SASL/PLAIN, kesalahan ini menunjukkan bahwa kredensyal masuk yang diberikan tidak valid.

Untuk kontrol akses IAM, peran eksekusi tidak memiliki `kafka-cluster:Connect` izin untuk cluster. Tambahkan izin ini ke peran dan tentukan Amazon Resource Name (ARN) cluster sebagai sumber daya.

Anda mungkin melihat kesalahan ini terjadi sebentar-sebentar. Cluster menolak koneksi setelah jumlah koneksi TCP melebihi kuota layanan. Lambda mundur dan mencoba lagi sampai koneksi berhasil. Setelah Lambda terhubung ke cluster dan polling untuk catatan, hasil pemrosesan terakhir berubah menjadi. `OK`

Berikut ini adalah contoh log tingkat sistem ESM setelah mengaktifkan [Logging Config](esm-logging.md) untuk masalah ini saat menggunakan otentikasi IAM:

```
{
    "eventType": "ESM_PROCESSING_EVENT",
    "timestamp": 1734567890456,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:a1b2c3d4-5678-90ab-cdef-EXAMPLE22222",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/my-kafka-cluster/12345678-abcd-1234-efgh-EXAMPLE22222-1",
    "eventProcessorId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE22222/0",
    "logLevel": "WARN",
    "error": {
        "errorMessage": "[a1b2c3d4-5678-90ab-cdef-EXAMPLE22222]: Access denied",
        "errorCode": "org.apache.kafka.common.errors.SaslAuthenticationException"
    }
}
```

### Server gagal mengautentikasi Lambda
<a name="kafka-mtls-errors-server"></a>

Kesalahan ini menunjukkan bahwa broker Kafka gagal mengautentikasi Lambda. Ini dapat terjadi karena salah satu alasan berikut:
+ Anda tidak memberikan sertifikat klien untuk otentikasi mTLS.
+ Anda memberikan sertifikat klien, tetapi broker Kafka tidak dikonfigurasi untuk menggunakan otentikasi mTLS.
+ Sertifikat klien tidak dipercaya oleh broker Kafka.

### Lambda gagal mengautentikasi server
<a name="kafka-mtls-errors-lambda"></a>

Kesalahan ini menunjukkan bahwa Lambda gagal mengautentikasi broker Kafka. Ini dapat terjadi karena salah satu alasan berikut:
+ Untuk Apache Kafka yang dikelola sendiri: Broker Kafka menggunakan sertifikat yang ditandatangani sendiri atau CA pribadi, tetapi tidak memberikan sertifikat CA root server.
+ Untuk Apache Kafka yang dikelola sendiri: Sertifikat CA root server tidak cocok dengan root CA yang menandatangani sertifikat broker.
+ Validasi nama host gagal karena sertifikat broker tidak berisi nama DNS broker atau alamat IP sebagai nama alternatif subjek.

### Sertifikat atau kunci pribadi yang diberikan tidak valid
<a name="kafka-key-errors"></a>

Kesalahan ini menunjukkan bahwa konsumen Kafka tidak dapat menggunakan sertifikat atau kunci pribadi yang disediakan. Pastikan bahwa sertifikat dan kunci menggunakan format PEM, dan bahwa enkripsi kunci pribadi menggunakan PBES1 algoritma.

Berikut ini adalah contoh log tingkat sistem ESM setelah mengaktifkan [Logging Config](esm-logging.md) untuk masalah ini:

```
{
    "eventType": "ESM_PROCESSING_EVENT",
    "timestamp": 1734567891234,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:a1b2c3d4-5678-90ab-cdef-EXAMPLE44444",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/my-kafka-cluster/12345678-abcd-1234-efgh-EXAMPLE44444-1",
    "eventProcessorId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE44444/0",
    "logLevel": "WARN",
    "error": {
        "errorMessage": "Invalid PEM keystore configs",
        "errorCode": "org.apache.kafka.common.errors.InvalidConfigurationException"
    }
}
```

## Kesalahan jaringan dan konektivitas
<a name="kafka-network-errors"></a>

Masalah konfigurasi jaringan dapat mencegah Lambda terhubung ke cluster Kafka Anda. Topik berikut menjelaskan kesalahan umum terkait jaringan.

**Topics**
+ [

### Batas waktu koneksi karena konfigurasi grup keamanan
](#kafka-security-group-errors)
+ [

### Titik akhir broker Kafka tidak dapat diselesaikan
](#kafka-cluster-deleted-errors)

### Batas waktu koneksi karena konfigurasi grup keamanan
<a name="kafka-security-group-errors"></a>

Jika grup keamanan yang terkait dengan cluster Kafka Anda tidak mengizinkan lalu lintas masuk dari dirinya sendiri, Lambda tidak dapat terhubung ke klaster. Pastikan aturan masuk grup keamanan memungkinkan lalu lintas dari grup keamanan itu sendiri di port broker Kafka.

Berikut ini adalah contoh log tingkat sistem ESM setelah mengaktifkan [Logging Config](esm-logging.md) untuk masalah ini:

```
{
    "eventType": "ESM_PROCESSING_EVENT",
    "timestamp": 1734567892345,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:a1b2c3d4-5678-90ab-cdef-EXAMPLE55555",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/my-kafka-cluster/12345678-abcd-1234-efgh-EXAMPLE55555-1",
    "eventProcessorId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE55555/0",
    "logLevel": "WARN",
    "error": {
        "errorMessage": "Timeout expired while fetching topic metadata",
        "errorCode": "org.apache.kafka.common.errors.TimeoutException"
    }
}
```

Anda juga dapat memeriksa log INFO konsumen Kafka untuk memverifikasi koneksi dan konfigurasi jaringan. `brokerEndpoints`Bidang menunjukkan alamat broker Kafka, `securityProtocol` dan `saslMechanism` (jika ada) menunjukkan metode otentikasi, dan `networkConfig` bidang menunjukkan alamat IP, blok CIDR subnet, dan grup keamanan yang digunakan oleh pemetaan sumber peristiwa. Verifikasi bahwa grup keamanan yang terdaftar mengizinkan lalu lintas masuk yang diperlukan:

```
{
    "eventType": "POLLER_STATUS_EVENT",
    "timestamp": 1734567892456,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:a1b2c3d4-5678-90ab-cdef-11111EXAMPLE",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/my-kafka-cluster/a1b2c3d4-5678-90ab-cdef-11111EXAMPLE-1",
    "eventProcessorId": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE/0",
    "logLevel": "INFO",
    "kafkaEventSourceConnection": {
        "brokerEndpoints": "boot-abcd1234.c2.kafka-serverless.us-east-1.amazonaws.com:9098",
        "consumerId": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE-0",
        "topics": [
            "my-topic"
        ],
        "consumerGroupId": "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE",
        "securityProtocol": "SASL_SSL",
        "saslMechanism": "AWS_MSK_IAM",
        "totalPartitionCount": 2,
        "assignedPartitionCount": 2,
        "partitionsAssignmentGeneration": 1,
        "assignedPartitions": [
            "my-topic-0",
            "my-topic-1"
        ],
        "networkConfig": {
            "ipAddresses": [
                "10.0.0.37"
            ],
            "subnetCidrBlock": "10.0.0.32/28",
            "securityGroups": [
                "sg-0123456789abcdef0"
            ]
        }
    }
}
```

### Titik akhir broker Kafka tidak dapat diselesaikan
<a name="kafka-cluster-deleted-errors"></a>

Kesalahan ini menunjukkan bahwa cluster Kafka tidak ada atau telah dihapus. Verifikasi bahwa klaster yang ditentukan dalam pemetaan sumber peristiwa ada dan dalam keadaan aktif.

Berikut ini adalah contoh log tingkat sistem ESM setelah mengaktifkan [Logging Config](esm-logging.md) untuk masalah ini:

```
{
    "eventType": "ESM_PROCESSING_EVENT",
    "timestamp": 1734567893456,
    "resourceArn": "arn:aws:lambda:us-east-1:123456789012:event-source-mapping:a1b2c3d4-5678-90ab-cdef-EXAMPLE66666",
    "eventSourceArn": "arn:aws:kafka:us-east-1:123456789012:cluster/my-kafka-cluster/12345678-abcd-1234-efgh-EXAMPLE66666-1",
    "eventProcessorId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE66666/0",
    "logLevel": "WARN",
    "error": {
        "errorMessage": "No resolvable bootstrap urls given in bootstrap.servers",
        "errorCode": "org.apache.kafka.common.config.ConfigException"
    }
}
```

## Kesalahan pemetaan sumber peristiwa
<a name="services-event-errors"></a>

Katika Anda menambahkan klaster Apache Kafka Anda sebagai [sumber peristiwa](invocation-eventsourcemapping.md) untuk fungsi Lambda Anda, jika fungsi Anda mengalami kesalahan, konsumen Kafka Anda berhenti memproses rekaman. Konsumen partisi topik adalah mereka yang berlangganan, membaca, dan memproses catatan Anda. Konsumen Kafka Anda lainnya dapat melanjutkan pemrosesan catatan, asalkan tidak mengalami kesalahan yang sama.

Untuk menentukan penyebab penghentian konsumen, periksa bidang `StateTransitionReason` dalam respons dari `EventSourceMapping`. Daftar berikut menjelaskan kesalahan sumber peristiwa yang dapat Anda terima:

**`ESM_CONFIG_NOT_VALID`**  
Konfigurasi pemetaan sumber peristiwa tidak valid.

**`EVENT_SOURCE_AUTHN_ERROR`**  
Lambda tidak dapat mengautentikasi sumber acara.

**`EVENT_SOURCE_AUTHZ_ERROR`**  
Lambda tidak memiliki izin yang diperlukan untuk mengakses sumber acara.

**`FUNCTION_CONFIG_NOT_VALID`**  
Konfigurasi fungsi tidak valid.

**catatan**  
Jika catatan peristiwa Lambda Anda melebihi batas ukuran yang diizinkan sebesar 6 MB, catatan dapat tidak diproses.

# Memanggil fungsi Lambda menggunakan titik akhir Amazon API Gateway
<a name="services-apigateway"></a>

Anda dapat membuat API web dengan titik akhir HTTP untuk fungsi Lambda Anda dengan menggunakan Amazon API Gateway. API Gateway menyediakan alat untuk membuat dan mendokumentasikan web APIs yang merutekan permintaan HTTP ke fungsi Lambda. Anda dapat mengamankan akses ke API Anda dengan kontrol autentikasi dan otorisasi. Anda APIs dapat melayani lalu lintas melalui internet atau hanya dapat diakses dalam VPC Anda.

**Tip**  
Lambda menawarkan dua cara untuk menjalankan fungsi Anda melalui titik akhir HTTP: API Gateway dan fungsi Lambda. URLs Jika Anda tidak yakin metode mana yang terbaik untuk kasus penggunaan Anda, lihat[Pilih metode untuk menjalankan fungsi Lambda Anda menggunakan permintaan HTTP](apig-http-invoke-decision.md).

Sumber daya di API Anda menentukan satu atau beberapa metode, seperti GET atau POST. Metode memiliki integrasi yang merutekan permintaan ke fungsi Lambda atau jenis integrasi lainnya. Anda dapat menentukan setiap sumber daya dan metode secara individual, atau menggunakan jenis sumber daya dan metode khusus untuk mencocokkan semua permintaan yang sesuai dengan suatu pola. [Sumber daya proksi](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html) menangkap semua jalur di bawah sumber daya. Metode `ANY` menangkap semua metode HTTP.

**Topics**
+ [

## Memilih jenis API
](#services-apigateway-apitypes)
+ [

## Menambahkan titik akhir ke fungsi Lambda Anda
](#apigateway-add)
+ [

## Integrasi proxy
](#apigateway-proxy)
+ [

## Format peristiwa
](#apigateway-example-event)
+ [

## Format respons
](#apigateway-types-transforms)
+ [

## Izin
](#apigateway-permissions)
+ [

## Aplikasi sampel
](#services-apigateway-samples)
+ [

## Penangan acara dari Powertools untuk Lambda AWS
](#services-apigateway-powertools)
+ [

# Tutorial: Menggunakan Lambda dengan API Gateway
](services-apigateway-tutorial.md)
+ [

# Menangani kesalahan Lambda dengan API Gateway API
](services-apigateway-errors.md)
+ [

# Pilih metode untuk menjalankan fungsi Lambda Anda menggunakan permintaan HTTP
](apig-http-invoke-decision.md)

## Memilih jenis API
<a name="services-apigateway-apitypes"></a>

API Gateway mendukung tiga jenis fungsi Lambda APIs yang memanggil:
+ [HTTP API: API](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api.html) ringan, latensi rendah RESTful .
+ [REST API: API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-rest-api.html) yang dapat disesuaikan dan kaya fitur RESTful .
+ [WebSocket API: API](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html) web yang memelihara koneksi persisten dengan klien untuk komunikasi dupleks penuh.

HTTP APIs dan REST APIs keduanya RESTful APIs memproses permintaan HTTP dan mengembalikan respons. HTTP APIs lebih baru dan dibangun dengan API Gateway versi 2 API. Fitur-fitur berikut ini baru untuk HTTP APIs:

**Fitur HTTP API**
+ **Deployment otomatis** – Saat Anda memodifikasi rute atau integrasi, mengubah deployment secara otomatis ke tahap yang deployment otomatisnya diaktifkan.
+ **Tahap default** – Anda dapat membuat tahap default (`$default`) untuk melayani permintaan di jalur root URL API Anda. Untuk tahap yang diberi nama, Anda harus menyertakan nama tahap di awal jalur.
+ **Konfigurasi CORS** – Anda dapat mengonfigurasi API Anda untuk menambahkan header CORS ke respons keluar, alih-alih menambahkannya secara manual dalam kode fungsi Anda.

REST APIs adalah klasik RESTful APIs yang didukung API Gateway sejak diluncurkan. REST APIs saat ini memiliki lebih banyak fitur penyesuaian, integrasi, dan manajemen.

**Fitur REST API**
+ **Jenis integrasi** - REST APIs mendukung integrasi Lambda kustom. Dengan integrasi kustom, Anda dapat mengirim hanya badan permintaan ke fungsi, atau menerapkan templat transformasi ke badan permintaan sebelum mengirimkannya ke fungsi.
+ **Kontrol akses** - REST APIs mendukung lebih banyak opsi untuk otentikasi dan otorisasi.
+ **Pemantauan dan penelusuran** — REST APIs mendukung AWS X-Ray penelusuran dan opsi pencatatan tambahan.

Untuk perbandingan mendetail, lihat [Memilih antara HTTP APIs dan REST APIs](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-vs-rest.html) di *Panduan Pengembang API Gateway*.

WebSocket APIs juga menggunakan API Gateway API versi 2 API dan mendukung set fitur serupa. Gunakan WebSocket API untuk aplikasi yang mendapat manfaat dari koneksi persisten antara klien dan API. WebSocket APIs menyediakan komunikasi dupleks penuh, yang berarti bahwa klien dan API dapat mengirim pesan terus menerus tanpa menunggu tanggapan.

HTTP APIs mendukung format acara yang disederhanakan (versi 2.0). Untuk contoh peristiwa dari API HTTP, lihat [Membuat integrasi AWS Lambda proxy untuk HTTP APIs di API Gateway](https://docs.aws.amazon.com//apigateway/latest/developerguide/http-api-develop-integrations-lambda.html).

Untuk informasi selengkapnya, lihat [Membuat integrasi AWS Lambda proxy untuk HTTP APIs di API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html).

## Menambahkan titik akhir ke fungsi Lambda Anda
<a name="apigateway-add"></a>

**Untuk menambahkan titik akhir publik ke fungsi Lambda Anda**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi.

1. Di bagian **Gambaran umum fungsi**, pilih **Tambah pemicu**.

1. Pilih **API Gateway**.

1. Pilih **Buat API** atau **Gunakan API yang ada**.

   1. **API Baru:** Untuk **jenis API**, pilih **HTTP API**. Untuk informasi selengkapnya, lihat [Memilih jenis API](#services-apigateway-apitypes).

   1. **API yang ada:** Pilih API dari daftar dropdown atau masukkan ID API (misalnya, r3pmxmplak).

1. Untuk **Keamanan**, pilih **Terbuka**.

1. Pilih **Tambahkan**.

## Integrasi proxy
<a name="apigateway-proxy"></a>

API Gateway APIs terdiri dari tahapan, sumber daya, metode, dan integrasi. Tahap dan sumber daya menentukan jalur titik akhir:

**Format jalur API**
+ `/prod/` – Tahap `prod` dan sumber daya root.
+ `/prod/user` – Tahap `prod` dan sumber daya `user`.
+ `/dev/{proxy+}` – Rute mana pun di tahap `dev`.
+ `/`— (HTTP APIs) Tahap default dan sumber daya root.

Integrasi Lambda memetakan jalur dan kombinasi metode HTTP ke fungsi Lambda. Anda dapat mengonfigurasi API Gateway untuk mengirimkan badan permintaan HTTP sebagaimana adanya (integrasi kustom), atau untuk merangkum badan permintaan dalam dokumen yang mencakup semua informasi permintaan termasuk header, sumber daya, jalur, dan metode.

Untuk informasi selengkapnya, lihat [Integrasi proxy Lambda di API Gateway.](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html)

## Format peristiwa
<a name="apigateway-example-event"></a>

Amazon API Gateway memanggil fungsi Anda [secara sinkron](invocation-sync.md) dengan kejadian yang berisi representasi JSON permintaan HTTP. Untuk integrasi kustom, kejadian adalah badan dari permintaan. Untuk integrasi proksi, kejadian memiliki struktur yang telah ditentukan. Untuk contoh peristiwa proxy dari API REST API Gateway API, lihat [Format input fungsi Lambda untuk integrasi proxy](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-simple-proxy-for-lambda-input-format) di Panduan *Pengembang API Gateway*.

## Format respons
<a name="apigateway-types-transforms"></a>

API Gateway menunggu respons dari fungsi Anda dan menyampaikan hasilnya kepada pemanggil. Untuk integrasi kustom, Anda menentukan respons integrasi dan respons metode untuk mengonversi output dari fungsi menjadi respons HTTP. Untuk integrasi proksi, fungsi harus merespons dengan representasi respons dalam format tertentu.

Contoh berikut menunjukkan objek respons dari fungsi Node.js. Objek respons mewakili respons HTTP yang berhasil yang berisi dokumen JSON.

**Example index.mjs - Objek respons integrasi proxy (Node.js)**  

```
var response = {
      "statusCode": 200,
      "headers": {
        "Content-Type": "application/json"
      },
      "isBase64Encoded": false,
      "multiValueHeaders": { 
        "X-Custom-Header": ["My value", "My other value"],
      },
      "body": "{\n  \"TotalCodeSize\": 104330022,\n  \"FunctionCount\": 26\n}"
    }
```

Runtime Lambda menyusun objek respons menjadi JSON dan mengirimkannya ke API. API menguraikan respons dan menggunakannya untuk membuat respons HTTP, yang kemudian dikirimkan ke klien yang membuat permintaan asal.

**Example Respons HTTP**  

```
< HTTP/1.1 200 OK
  < Content-Type: application/json
  < Content-Length: 55
  < Connection: keep-alive
  < x-amzn-RequestId: 32998fea-xmpl-4268-8c72-16138d629356
  < X-Custom-Header: My value
  < X-Custom-Header: My other value
  < X-Amzn-Trace-Id: Root=1-5e6aa925-ccecxmplbae116148e52f036
  <
  {
    "TotalCodeSize": 104330022,
    "FunctionCount": 26
  }
```

## Izin
<a name="apigateway-permissions"></a>

Amazon API Gateway mendapatkan izin untuk memanggil fungsi Anda dari [kebijakan berbasis sumber daya](access-control-resource-based.md) milik fungsi tersebut. Anda dapat memberikan izin invokasi kepada seluruh API, atau memberikan akses terbatas kepada suatu tahap, sumber daya, atau metode.

Saat Anda menambahkan API ke fungsi Anda dengan menggunakan konsol Lambda, menggunakan konsol API Gateway, atau dalam templat AWS SAM , kebijakan berbasis sumber daya milik fungsi tersebut akan diperbarui secara otomatis. Berikut ini adalah contoh kebijakan fungsi.

**Example kebijakan fungsi**    
****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Id": "default",
  "Statement": [
    {
      "Sid": "nodejs-apig-functiongetEndpointPermissionProd-BWDBXMPLXE2F",
      "Effect": "Allow",
      "Principal": {
        "Service": "apigateway.amazonaws.com"
      },
      "Action": "lambda:InvokeFunction",
      "Resource": "arn:aws:lambda:us-east-2:111122223333:function:nodejs-apig-function-1G3MXMPLXVXYI",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "111122223333"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:execute-api:us-east-2:111122223333:ktyvxmpls1/*/GET/"
        }
      }
    }
  ]
}
```

Anda dapat mengelola izin kebijakan fungsi secara manual dengan operasi API berikut:
+ [AddPermission](https://docs.aws.amazon.com/lambda/latest/api/API_AddPermission.html)
+ [RemovePermission](https://docs.aws.amazon.com/lambda/latest/api/API_RemovePermission.html)
+ [GetPolicy](https://docs.aws.amazon.com/lambda/latest/api/API_GetPolicy.html)

Untuk memberikan izin invokasi kepada API yang sudah ada, gunakan perintah `add-permission`. Contoh:

```
aws lambda add-permission \
  --function-name my-function \
  --statement-id apigateway-get --action lambda:InvokeFunction \
  --principal apigateway.amazonaws.com \
  --source-arn "arn:aws:execute-api:us-east-2:123456789012:mnh1xmpli7/default/GET/"
```

Anda akan melihat output berikut:

```
{
    "Statement": "{\"Sid\":\"apigateway-test-2\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"apigateway.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-east-2:123456789012:function:my-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:execute-api:us-east-2:123456789012:mnh1xmpli7/default/GET\"}}}"
}
```

**catatan**  
Jika fungsi dan API Anda berbeda Wilayah AWS, pengenal Region di ARN sumber harus cocok dengan Region fungsi, bukan Region API. Saat API Gateway memanggil fungsi, ia menggunakan ARN sumber daya yang didasarkan pada ARN API, tetapi dimodifikasi agar sesuai dengan Wilayah fungsi tersebut.

ARN sumber dalam contoh ini memberikan izin ke integrasi di metode GET dari sumber daya akar di tahap default API, dengan `mnh1xmpli7` ID. Anda dapat menggunakan tanda bintang di ARN sumber untuk memberikan izin untuk beberapa tahap, metode, atau sumber daya.

**Pola sumber daya**
+ `mnh1xmpli7/*/GET/*` – Metode GET di semua sumber daya di semua tahap.
+ `mnh1xmpli7/prod/ANY/user` – Metode ANY pada sumber daya `user` di tahap `prod`.
+ `mnh1xmpli7/*/*/*` – Metode apa pun pada semua sumber daya di semua tahap.

Untuk perincian tentang melihat kebijakan dan menghapus pernyataan, lihat [Melihat kebijakan IAM berbasis sumber daya di Lambda](access-control-resource-based.md).

## Aplikasi sampel
<a name="services-apigateway-samples"></a>

[API Gateway dengan aplikasi sampel Node.js](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/nodejs-apig) menyertakan fungsi dengan AWS SAM templat yang membuat REST API yang mengaktifkan AWS X-Ray penelusuran. Ini juga mencakup skrip untuk menerapkan, menjalankan fungsi, menguji API, dan pembersihan.

## Penangan acara dari Powertools untuk Lambda AWS
<a name="services-apigateway-powertools"></a>

Event handler dari Powertools for AWS Lambda toolkit menyediakan routing, middleware, konfigurasi CORS, pembuatan spesifikasi OpenAPI, validasi permintaan, penanganan kesalahan, dan fitur berguna lainnya saat menulis fungsi Lambda yang dipanggil oleh titik akhir API Gateway (HTTP atau REST). Utilitas event handler tersedia untuk Python TypeScript dan/. JavaScript Untuk informasi selengkapnya, lihat [Event Handler REST API](https://docs.powertools.aws.dev/lambda/python/latest/core/event_handler/api_gateway/) dalam dokumentasi *Powertools for AWS Lambda (Python)* [dan Event Handler HTTP API](https://docs.aws.amazon.com/powertools/typescript/latest/features/event-handler/http/) dalam dokumentasi *Powertools* for Lambda (). AWS TypeScript

### Python
<a name="services-apigateway-powertools-python"></a>

```
from aws_lambda_powertools import Logger
from aws_lambda_powertools.event_handler import APIGatewayRestResolver
from aws_lambda_powertools.logging import correlation_paths
from aws_lambda_powertools.utilities.typing.lambda_context import LambdaContext

app = APIGatewayRestResolver()
logger = Logger()

@app.get("/healthz")
def ping():
    return {"message": "health status ok"}

@logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_REST)  
def lambda_handler(event: dict, context: LambdaContext) -> dict:
    return app.resolve(event, context)
```

### TypeScript
<a name="services-apigateway-powertools-typescript"></a>

```
import { Router } from '@aws-lambda-powertools/event-handler/experimental-rest';
import { Logger } from '@aws-lambda-powertools/logger';
import {
  correlationPaths,
  search,
} from '@aws-lambda-powertools/logger/correlationId';
import type { Context } from 'aws-lambda/handler';

const logger = new Logger({
  correlationIdSearchFn: search,
});

const app = new Router({ logger });

app.get("/healthz", async () => {
  return { message: "health status ok" };
});

export const handler = async (event: unknown, context: Context) => {
  // You can continue using other utilities just as before
  logger.addContext(context);
  logger.setCorrelationId(event, correlationPaths.API_GATEWAY_REST);
  return app.resolve(event, context);
};
```

# Tutorial: Menggunakan Lambda dengan API Gateway
<a name="services-apigateway-tutorial"></a>

Dalam tutorial ini, Anda membuat REST API di mana Anda menjalankan fungsi Lambda menggunakan permintaan HTTP. Fungsi Lambda Anda akan melakukan operasi membuat, membaca, memperbarui, dan menghapus (CRUD) pada tabel DynamoDB. Fungsi ini disediakan di sini untuk demonstrasi, tetapi Anda akan belajar mengkonfigurasi API Gateway REST API yang dapat menjalankan fungsi Lambda apa pun.

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/APIG_tut_resources.png)


Menggunakan API Gateway memberi pengguna titik akhir HTTP yang aman untuk menjalankan fungsi Lambda Anda dan dapat membantu mengelola panggilan dalam jumlah besar ke fungsi Anda dengan membatasi lalu lintas dan secara otomatis memvalidasi dan mengotorisasi panggilan API. API Gateway juga menyediakan kontrol keamanan fleksibel menggunakan AWS Identity and Access Management (IAM) dan Amazon Cognito. Ini berguna untuk kasus penggunaan di mana otorisasi terlebih dahulu diperlukan untuk panggilan ke aplikasi Anda.

**Tip**  
Lambda menawarkan dua cara untuk menjalankan fungsi Anda melalui titik akhir HTTP: API Gateway dan fungsi Lambda. URLs Jika Anda tidak yakin metode mana yang terbaik untuk kasus penggunaan Anda, lihat[Pilih metode untuk menjalankan fungsi Lambda Anda menggunakan permintaan HTTP](apig-http-invoke-decision.md).

Untuk menyelesaikan tutorial ini, Anda akan melalui tahapan berikut:

1. Membuat dan mengkonfigurasi fungsi Lambda di Python atau Node.js untuk melakukan operasi pada tabel DynamoDB.

1. Buat REST API di API Gateway untuk terhubung ke fungsi Lambda Anda.

1. Buat tabel DynamoDB dan mengujinya dengan fungsi Lambda Anda di konsol.

1. Terapkan API Anda dan uji penyiapan lengkap menggunakan curl di terminal.

Dengan menyelesaikan tahapan ini, Anda akan mempelajari cara menggunakan API Gateway untuk membuat titik akhir HTTP yang dapat menjalankan fungsi Lambda dengan aman pada skala apa pun. Anda juga akan mempelajari cara menerapkan API Anda, dan cara mengujinya di konsol dan dengan mengirimkan permintaan HTTP menggunakan terminal.

## Membuat kebijakan izin
<a name="services-apigateway-tutorial-policy"></a>

Sebelum Anda dapat membuat [peran eksekusi](lambda-intro-execution-role.md) untuk fungsi Lambda Anda, Anda harus terlebih dahulu membuat kebijakan izin untuk memberikan izin fungsi Anda untuk mengakses sumber daya yang diperlukan. AWS Untuk tutorial ini, kebijakan memungkinkan Lambda untuk melakukan operasi CRUD pada tabel DynamoDB dan menulis ke Amazon Logs. CloudWatch 

**Untuk membuat kebijakan**

1. Buka [halaman Kebijakan](https://console.aws.amazon.com/iam/home#/policies) konsol IAM.

1. Pilih **Buat Kebijakan**.

1. Pilih tab **JSON**, lalu tempelkan kebijakan khusus berikut ke editor JSON.

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "Stmt1428341300017",
         "Action": [
           "dynamodb:DeleteItem",
           "dynamodb:GetItem",
           "dynamodb:PutItem",
           "dynamodb:Query",
           "dynamodb:Scan",
           "dynamodb:UpdateItem"
         ],
         "Effect": "Allow",
         "Resource": "*"
       },
       {
         "Sid": "",
         "Resource": "*",
         "Action": [
           "logs:CreateLogGroup",
           "logs:CreateLogStream",
           "logs:PutLogEvents"
         ],
         "Effect": "Allow"
       }
     ]
   }
   ```

------

1. Pilih **Berikutnya: Tanda**.

1. Pilih **Berikutnya: Tinjau**.

1. Di bawah **Kebijakan peninjauan**, untuk **Nama** kebijakan, masukkan**lambda-apigateway-policy**.

1. Pilih **Buat kebijakan**.

## Membuat peran eksekusi
<a name="services-apigateway-tutorial-role"></a>

Peran [eksekusi adalah peran](lambda-intro-execution-role.md) AWS Identity and Access Management (IAM) yang memberikan izin fungsi Lambda untuk mengakses dan sumber daya. Layanan AWS Untuk mengaktifkan fungsi Anda menjalankan operasi pada tabel DynamoDB, Anda melampirkan kebijakan izin yang Anda buat di langkah sebelumnya.

**Untuk membuat peran eksekusi dan melampirkan kebijakan izin khusus Anda**

1. Buka [halaman Peran](https://console.aws.amazon.com/iam/home#/roles) dari konsol IAM.

1. Pilih **Buat peran**.

1. Untuk jenis entitas tepercaya, pilih **AWS layanan**, lalu untuk kasus penggunaan, pilih **Lambda**.

1. Pilih **Berikutnya**.

1. Dalam kotak pencarian kebijakan, masukkan **lambda-apigateway-policy**.

1. Di hasil penelusuran, pilih kebijakan yang Anda buat (`lambda-apigateway-policy`), lalu pilih **Berikutnya**.

1. Di bawah **Rincian peran**, untuk **nama Peran**, masukkan**lambda-apigateway-role**, lalu pilih **Buat peran**.

## Buat fungsi Lambda
<a name="services-apigateway-tutorial-function"></a>

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) konsol Lambda dan pilih **Buat** Fungsi.

1. Pilih **Tulis dari awal**.

1. Untuk **Nama fungsi**, masukkan `LambdaFunctionOverHttps`.

1. Untuk **Runtime, pilih runtime** Node.js atau Python terbaru.

1. (Opsional) Di bagian **Izin**, luaskan **Ubah peran eksekusi default**.

1. Pilih **Gunakan peran yang ada**, lalu pilih **lambda-apigateway-role** peran yang Anda buat sebelumnya.

1. Pilih **Buat fungsi**.

1. Di panel **sumber Kode**, ganti kode default dengan kode Node.js atau Python berikut.

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

   `region`Pengaturan harus sesuai dengan Wilayah AWS tempat Anda menyebarkan fungsi dan [membuat tabel DynamoDB](#services-apigateway-tutorial-table).

**Example index.mjs**  

   ```
   import { DynamoDBDocumentClient, PutCommand, GetCommand, 
            UpdateCommand, DeleteCommand} from "@aws-sdk/lib-dynamodb";
   import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
   
   const ddbClient = new DynamoDBClient({ region: "us-east-2" });
   const ddbDocClient = DynamoDBDocumentClient.from(ddbClient);
   
   // Define the name of the DDB table to perform the CRUD operations on
   const tablename = "lambda-apigateway";
   
   /**
    * Provide an event that contains the following keys:
    *
    *   - operation: one of 'create,' 'read,' 'update,' 'delete,' or 'echo'
    *   - payload: a JSON object containing the parameters for the table item
    *     to perform the operation on
    */
   export const handler = async (event, context) => {
      
        const operation = event.operation;
      
        if (operation == 'echo'){
             return(event.payload);
        }
        
       else { 
           event.payload.TableName = tablename;
           let response;
           
           switch (operation) {
             case 'create':
                  response = await ddbDocClient.send(new PutCommand(event.payload));
                  break;
             case 'read':
                  response = await ddbDocClient.send(new GetCommand(event.payload));
                  break;
             case 'update':
                  response = ddbDocClient.send(new UpdateCommand(event.payload));
                  break;
             case 'delete':
                  response = ddbDocClient.send(new DeleteCommand(event.payload));
                  break;
             default:
               response = 'Unknown operation: ${operation}';
             }
           console.log(response);
           return response;
       }
   };
   ```

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

**Example lambda\$1function.py**  

   ```
   import boto3
   
   # Define the DynamoDB table that Lambda will connect to
   table_name = "lambda-apigateway"
   
   # Create the DynamoDB resource
   dynamo = boto3.resource('dynamodb').Table(table_name)
   
   # Define some functions to perform the CRUD operations
   def create(payload):
       return dynamo.put_item(Item=payload['Item'])
   
   def read(payload):
       return dynamo.get_item(Key=payload['Key'])
   
   def update(payload):
       return dynamo.update_item(**{k: payload[k] for k in ['Key', 'UpdateExpression', 
       'ExpressionAttributeNames', 'ExpressionAttributeValues'] if k in payload})
   
   def delete(payload):
       return dynamo.delete_item(Key=payload['Key'])
   
   def echo(payload):
       return payload
   
   operations = {
       'create': create,
       'read': read,
       'update': update,
       'delete': delete,
       'echo': echo,
   }
   
   def lambda_handler(event, context):
       '''Provide an event that contains the following keys:
         - operation: one of the operations in the operations dict below
         - payload: a JSON object containing parameters to pass to the 
           operation being performed
       '''
       
       operation = event['operation']
       payload = event['payload']
       
       if operation in operations:
           return operations[operation](payload)
           
       else:
           raise ValueError(f'Unrecognized operation "{operation}"')
   ```

------
**catatan**  
Dalam contoh ini, nama tabel DynamoDB didefinisikan sebagai variabel dalam kode fungsi Anda. Dalam aplikasi nyata, praktik terbaik adalah meneruskan parameter ini sebagai variabel lingkungan dan untuk menghindari hardcoding nama tabel. Untuk informasi selengkapnya lihat [Menggunakan variabel AWS Lambda lingkungan](https://docs.aws.amazon.com/lambda/latest/dg/configuration-envvars.html).

1. Di bagian **DEPLOY**, pilih **Deploy** untuk memperbarui kode fungsi Anda:  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

## Uji fungsi
<a name="services-apigateway-tutorial-test-function"></a>

Sebelum mengintegrasikan fungsi Anda dengan API Gateway, konfirmasikan bahwa Anda telah berhasil menerapkan fungsi tersebut. Gunakan konsol Lambda untuk mengirim acara pengujian ke fungsi Anda.

1. Pada halaman konsol Lambda untuk fungsi Anda, pilih tab **Uji**.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/test-tab.png)

1. Gulir ke bawah ke bagian **Event JSON** dan ganti acara default dengan yang berikut ini. Acara ini cocok dengan struktur yang diharapkan oleh fungsi Lambda.

   ```
   {
       "operation": "echo",
       "payload": {
           "somekey1": "somevalue1",
           "somekey2": "somevalue2"
       }
   }
   ```

1. Pilih **Uji**.

1. **Di bawah **Fungsi Eksekusi: berhasil**, perluas Detail.** Anda akan melihat tanggapan berikut:

   ```
   {
     "somekey1": "somevalue1",
     "somekey2": "somevalue2"
   }
   ```

## Membuat REST API menggunakan API Gateway
<a name="services-apigateway-tutorial-api"></a>

Pada langkah ini, Anda membuat API Gateway REST API yang akan Anda gunakan untuk menjalankan fungsi Lambda Anda.

**Untuk membuat API**

1. Buka [konsol API Gateway](https://console.aws.amazon.com/apigateway).

1. Pilih **Buat API**.

1. Di kotak **REST API**, pilih **Build**.

1. Di bawah **detail API**, biarkan **API Baru** dipilih, dan untuk **Nama API**, masukkan**DynamoDBOperations**.

1. Pilih **Buat API**.

## Buat sumber daya di REST API Anda
<a name="services-apigateway-tutorial-resource"></a>

Untuk menambahkan metode HTTP ke API Anda, Anda harus terlebih dahulu membuat sumber daya agar metode tersebut dapat dioperasikan. Di sini Anda membuat sumber daya untuk mengelola tabel DynamoDB Anda.

**Untuk membuat sumber daya**

1. Di [konsol API Gateway](https://console.aws.amazon.com/apigateway), pada halaman **Resources** untuk API Anda, pilih **Buat sumber daya**.

1. Dalam **Rincian sumber daya**, untuk **nama Sumber daya** masukkan**DynamoDBManager**.

1. Pilih **Buat Sumber Daya**.

## Buat metode HTTP POST
<a name="services-apigateway-tutorial-method"></a>

Pada langkah ini, Anda membuat metode (`POST`) untuk `DynamoDBManager` sumber daya Anda. Anda menautkan `POST` metode ini ke fungsi Lambda Anda sehingga ketika metode menerima permintaan HTTP, API Gateway memanggil fungsi Lambda Anda.

**catatan**  
 Untuk tujuan tutorial ini, satu metode HTTP (`POST`) digunakan untuk memanggil fungsi Lambda tunggal yang melakukan semua operasi pada tabel DynamoDB Anda. Dalam aplikasi nyata, praktik terbaik adalah menggunakan fungsi Lambda dan metode HTTP yang berbeda untuk setiap operasi. Untuk informasi lebih lanjut, lihat [Monolit Lambda](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/monolith) di Tanah Tanpa Server. 

**Untuk membuat metode POST**

1. Pada halaman **Resources** untuk API Anda, pastikan `/DynamoDBManager` sumber daya disorot. Kemudian, di panel **Methods**, pilih **Create method**.

1. Untuk **jenis Metode**, pilih **POST**.

1. Untuk **jenis Integrasi**, biarkan **fungsi Lambda dipilih**.

1. Untuk **fungsi Lambda**, pilih Amazon Resource Name (ARN) untuk function (). `LambdaFunctionOverHttps`

1. Pilih **metode Buat**.

## Membuat tabel DynamoDB
<a name="services-apigateway-tutorial-table"></a>

Buat tabel DynamoDB kosong tempat fungsi Lambda Anda akan melakukan operasi CRUD.

**Untuk membuat tabel DynamoDB**

1. Buka [halaman Tabel](https://console.aws.amazon.com/dynamodbv2#tables) di konsol DynamoDB.

1. Pilih **Buat tabel**.

1. Di bawah **Rincian tabel**, lakukan hal berikut:

   1. Untuk **Nama tabel**, masukkan **lambda-apigateway**.

   1. Untuk **kunci Partition**, masukkan**id**, dan simpan tipe data yang ditetapkan sebagai **String**.

1. Di bawah **Pengaturan tabel**, pertahankan **pengaturan Default**.

1. Pilih **Buat tabel**.

## Uji integrasi API Gateway, Lambda, dan DynamoDB
<a name="services-apigateway-tutorial-test-setup"></a>

Anda sekarang siap untuk menguji integrasi metode API Gateway API Anda dengan fungsi Lambda dan tabel DynamoDB Anda. Menggunakan konsol API Gateway, Anda mengirim permintaan langsung ke `POST` metode menggunakan fungsi pengujian konsol. Pada langkah ini, pertama-tama Anda menggunakan `create` operasi untuk menambahkan item baru ke tabel DynamoDB Anda, lalu Anda menggunakan operasi untuk `update` memodifikasi item.

**Tes 1: Untuk membuat item baru di tabel DynamoDB Anda**

1. Di [konsol API Gateway](https://console.aws.amazon.com/apigateway), pilih API (`DynamoDBOperations`) Anda.

1. Pilih metode **POST** di bawah `DynamoDBManager` sumber daya.

1. Pilih tab **Uji**. Anda mungkin perlu memilih tombol panah kanan untuk menampilkan tab.

1. Di bawah **metode Test**, biarkan **string Query** dan **Header kosong.** Untuk **badan Permintaan**, tempel JSON berikut:

   ```
   {
     "operation": "create",
     "payload": {
       "Item": {
         "id": "1234ABCD",
         "number": 5
       }
     }
   }
   ```

1. Pilih **Uji**.

   Hasil yang ditampilkan saat tes selesai harus menunjukkan status`200`. Kode status ini menunjukkan bahwa `create` operasi berhasil.

    Untuk mengonfirmasi, periksa apakah tabel DynamoDB Anda sekarang berisi item baru.

1. Buka [halaman Tabel](https://console.aws.amazon.com/dynamodbv2#tables) konsol DynamoDB dan pilih tabel. `lambda-apigateway`

1. Pilih **Jelajahi item tabel**. Di panel **Item yang dikembalikan**, Anda akan melihat satu item dengan **id** `1234ABCD` dan **nomornya**`5`. Contoh:  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/items-returned.png)

**Tes 2: Untuk memperbarui item dalam tabel DynamoDB Anda**

1. Di [konsol API Gateway](https://console.aws.amazon.com/apigateway), kembali ke tab **Test metode POST** Anda.

1. Di bawah **metode Test**, biarkan **string Query** dan **Header kosong.** Untuk **badan Permintaan**, tempel JSON berikut:

   ```
   {
       "operation": "update",
       "payload": {
           "Key": {
               "id": "1234ABCD"
           },
           "UpdateExpression": "SET #num = :newNum",
           "ExpressionAttributeNames": {
               "#num": "number"
           },
           "ExpressionAttributeValues": {
               ":newNum": 10
           }
       }
   }
   ```

1. Pilih **Uji**.

   Hasil yang ditampilkan saat tes selesai harus menunjukkan status`200`. Kode status ini menunjukkan bahwa `update` operasi berhasil.

    Untuk mengonfirmasi, periksa apakah item di tabel DynamoDB Anda telah dimodifikasi.

1. Buka [halaman Tabel](https://console.aws.amazon.com/dynamodbv2#tables) konsol DynamoDB dan pilih tabel. `lambda-apigateway`

1. Pilih **Jelajahi item tabel**. Di panel **Item yang dikembalikan**, Anda akan melihat satu item dengan **id** `1234ABCD` dan **nomornya**`10`.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/items-returned-2.png)

## Terapkan API
<a name="services-apigateway-tutorial-deploy-api"></a>

Agar klien dapat memanggil API, Anda harus membuat penerapan dan tahap terkait. Tahap mewakili snapshot API Anda termasuk metode dan integrasinya.

**Untuk menerapkan API**

1. Buka **APIs**halaman [konsol API Gateway](https://console.aws.amazon.com/apigateway) dan pilih `DynamoDBOperations` API.

1. Pada halaman **Sumber Daya** untuk API Anda, pilih **Deploy API**.

1. Untuk **Stage, pilih \$1Tahap** **baru\$1, lalu untuk **nama Stage****, masukkan. **test**

1. Pilih **Deploy**.

1. Di panel **Detail tahap**, salin URL **Panggilan.** Anda akan menggunakan ini di langkah berikutnya untuk memanggil fungsi Anda menggunakan permintaan HTTP.

## Gunakan curl untuk menjalankan fungsi Anda menggunakan permintaan HTTP
<a name="services-apigateway-tutorial-invoke-function"></a>

Anda sekarang dapat menjalankan fungsi Lambda Anda dengan mengeluarkan permintaan HTTP ke API Anda. Pada langkah ini, Anda akan membuat item baru di tabel DynamoDB Anda dan kemudian melakukan operasi baca, perbarui, dan hapus pada item tersebut.

**Untuk membuat item di tabel DynamoDB Anda menggunakan curl**

1. Buka terminal atau command prompt pada mesin lokal Anda dan jalankan `curl` perintah berikut menggunakan URL pemanggilan yang Anda salin pada langkah sebelumnya. Perintah ini menggunakan opsi berikut:
   + `-H`: Menambahkan header kustom untuk permintaan. Di sini, ia menentukan jenis konten sebagai JSON.
   + `-d`: Mengirim data di badan permintaan. Opsi ini menggunakan metode HTTP POST secara default.

------
#### [ Linux/macOS ]

   ```
   curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
   -H "Content-Type: application/json" \
   -d '{"operation": "create", "payload": {"Item": {"id": "5678EFGH", "number": 15}}}'
   ```

------
#### [ PowerShell ]

   ```
   curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"create\", \"payload\": {\"Item\": {\"id\": \"5678EFGH\", \"number\": 15}}}'
   ```

------

   Jika operasi berhasil, Anda akan melihat respons yang dikembalikan dengan kode status HTTP 200.

1. Anda juga dapat menggunakan konsol DynamoDB untuk memverifikasi bahwa item baru ada di tabel Anda dengan melakukan hal berikut:

   1. Buka [halaman Tabel](https://console.aws.amazon.com/dynamodbv2#tables) konsol DynamoDB dan pilih tabel. `lambda-apigateway`

   1. Pilih **Jelajahi item tabel**. Di panel **Item yang dikembalikan**, Anda akan melihat item dengan **id** `5678EFGH` dan **nomornya**`15`.

**Untuk membaca item di tabel DynamoDB Anda menggunakan curl**
+ Di terminal atau command prompt Anda, jalankan `curl` perintah berikut untuk membaca nilai item yang baru saja Anda buat. Gunakan URL pemanggilan Anda sendiri.

------
#### [ Linux/macOS ]

  ```
  curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
  -H "Content-Type: application/json" \
  -d '{"operation": "read", "payload": {"Key": {"id": "5678EFGH"}}}'
  ```

------
#### [ PowerShell ]

  ```
  curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"read\", \"payload\": {\"Key\": {\"id\": \"5678EFGH\"}}}'
  ```

------

  Anda akan melihat output seperti salah satu dari berikut ini tergantung pada apakah Anda memilih kode fungsi Node.js atau Python:

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

  ```
  {"$metadata":{"httpStatusCode":200,"requestId":"7BP3G5Q0C0O1E50FBQI9NS099JVV4KQNSO5AEMVJF66Q9ASUAAJG",
  "attempts":1,"totalRetryDelay":0},"Item":{"id":"5678EFGH","number":15}}
  ```

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

  ```
  {"Item":{"id":"5678EFGH","number":15},"ResponseMetadata":{"RequestId":"QNDJICE52E86B82VETR6RKBE5BVV4KQNSO5AEMVJF66Q9ASUAAJG",
  "HTTPStatusCode":200,"HTTPHeaders":{"server":"Server","date":"Wed, 31 Jul 2024 00:37:01 GMT","content-type":"application/x-amz-json-1.0",
  "content-length":"52","connection":"keep-alive","x-amzn-requestid":"QNDJICE52E86B82VETR6RKBE5BVV4KQNSO5AEMVJF66Q9ASUAAJG","x-amz-crc32":"2589610852"},
  "RetryAttempts":0}}
  ```

------

**Untuk memperbarui item dalam tabel DynamoDB Anda menggunakan curl**

1. Di terminal atau command prompt Anda, jalankan `curl` perintah berikut untuk memperbarui item yang baru saja Anda buat dengan mengubah `number` nilainya. Gunakan URL pemanggilan Anda sendiri.

------
#### [ Linux/macOS ]

   ```
   curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
   -H "Content-Type: application/json" \
   -d '{"operation": "update", "payload": {"Key": {"id": "5678EFGH"}, "UpdateExpression": "SET #num = :new_value", "ExpressionAttributeNames": {"#num": "number"}, "ExpressionAttributeValues": {":new_value": 42}}}'
   ```

------
#### [ PowerShell ]

   ```
   curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"update\", \"payload\": {\"Key\": {\"id\": \"5678EFGH\"}, \"UpdateExpression\": \"SET #num = :new_value\", \"ExpressionAttributeNames\": {\"#num\": \"number\"}, \"ExpressionAttributeValues\": {\":new_value\": 42}}}'
   ```

------

1. Untuk mengonfirmasi bahwa nilai `number` item telah diperbarui, jalankan perintah baca lainnya:

------
#### [ Linux/macOS ]

   ```
   curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
   -H "Content-Type: application/json" \
   -d '{"operation": "read", "payload": {"Key": {"id": "5678EFGH"}}}'
   ```

------
#### [ PowerShell ]

   ```
   curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"read\", \"payload\": {\"Key\": {\"id\": \"5678EFGH\"}}}'
   ```

------

**Untuk menghapus item dalam tabel DynamoDB Anda menggunakan curl**

1. Di terminal atau command prompt Anda, jalankan `curl` perintah berikut untuk menghapus item yang baru saja Anda buat. Gunakan URL pemanggilan Anda sendiri.

------
#### [ Linux/macOS ]

   ```
   curl https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager \
   -H "Content-Type: application/json" \
   -d '{"operation": "delete", "payload": {"Key": {"id": "5678EFGH"}}}'
   ```

------
#### [ PowerShell ]

   ```
   curl.exe 'https://l8togsqxd8.execute-api.us-east-2.amazonaws.com/test/DynamoDBManager' -H 'Content-Type: application/json' -d '{\"operation\": \"delete\", \"payload\": {\"Key\": {\"id\": \"5678EFGH\"}}}'
   ```

------

1. Konfirmasikan bahwa operasi penghapusan berhasil. Di panel **Item yang dikembalikan** dari halaman item **Jelajahi konsol** DynamoDB, verifikasi bahwa item **dengan** `5678EFGH` id tidak lagi ada di tabel.

## Bersihkan sumber daya Anda (opsional)
<a name="cleanup"></a>

Sekarang Anda dapat menghapus sumber daya yang Anda buat untuk tutorial ini, kecuali Anda ingin mempertahankannya. Dengan menghapus AWS sumber daya yang tidak lagi Anda gunakan, Anda mencegah tagihan yang tidak perlu ke Anda Akun AWS.

**Untuk menghapus fungsi Lambda**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi yang Anda buat.

1. Pilih **Tindakan**, **Hapus**.

1. Ketik **confirm** kolom input teks dan pilih **Hapus**.

**Untuk menghapus peran eksekusi**

1. Buka [halaman Peran](https://console.aws.amazon.com/iam/home#/roles) dari konsol IAM.

1. Pilih peran eksekusi yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan nama peran di bidang input teks dan pilih **Hapus**.

**Untuk menghapus API**

1. Buka [halaman APIs ](https://console.aws.amazon.com/apigateway/main/apis) di konsol API Gateway.

1. Pilih API yang Anda buat.

1. Pilih **Tindakan**, **Hapus**.

1. Pilih **Hapus**.

**Untuk menghapus tabel DynamoDB**

1. Buka [halaman Tabel](https://console.aws.amazon.com//dynamodb/home#tables:) di konsol DynamoDB.

1. Pilih tabel yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan **delete** di kotak teks.

1. Pilih **Hapus tabel**.

# Menangani kesalahan Lambda dengan API Gateway API
<a name="services-apigateway-errors"></a>

API Gateway memperlakukan semua kesalahan invokasi dan fungsi sebagai kesalahan internal. Jika API Lambda menolak permintaan invokasi, API Gateway mengembalikan kode kesalahan 500. Jika fungsi berjalan, tetapi mengembalikan kesalahan atau mengembalikan respons dalam format yang salah, API Gateway mengembalikan kode 502. Dalam kedua kasus tersebut, badan respons dari API Gateway adalah `{"message": "Internal server error"}`.

**catatan**  
API Gateway tidak mencoba lagi invokasi Lambda apa pun. Jika Lambda mengembalikan kesalahan, API Gateway mengembalikan respons kesalahan ke klien.

Contoh berikut menunjukkan peta jejak X-Ray untuk permintaan yang mengakibatkan kesalahan fungsi dan 502 dari API Gateway. Klien menerima pesan kesalahan umum.

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/tracemap-apig-502.png)


Untuk menyesuaikan respons kesalahan, Anda harus menangkap kesalahan dalam kode dan memformat tanggapan dalam format yang diperlukan.

**Example [index.mjs](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/nodejs-apig/function/index.mjs) - Kesalahan pemformatan**  

```
var formatError = function(error){
  var response = {
    "statusCode": error.statusCode,
    "headers": {
      "Content-Type": "text/plain",
      "x-amzn-ErrorType": error.code
    },
    "isBase64Encoded": false,
    "body": error.code + ": " + error.message
  }
  return response
}
```

API Gateway mengonversi respons ini menjadi kesalahan HTTP dengan kode dan badan status kustom. Di peta jejak, node fungsi berwarna hijau karena menangani kesalahan tersebut.

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/tracemap-apig-404.png)


# Pilih metode untuk menjalankan fungsi Lambda Anda menggunakan permintaan HTTP
<a name="apig-http-invoke-decision"></a>

Banyak kasus penggunaan umum untuk Lambda melibatkan pemanggilan fungsi Anda menggunakan permintaan HTTP. Misalnya, Anda mungkin ingin aplikasi web menjalankan fungsi Anda melalui permintaan browser. Fungsi Lambda juga dapat digunakan untuk membuat REST penuh APIs, menangani interaksi pengguna dari aplikasi seluler, memproses data dari layanan eksternal melalui panggilan HTTP, atau membuat webhook khusus.

Bagian berikut menjelaskan pilihan Anda untuk memanggil Lambda melalui HTTP dan memberikan informasi untuk membantu Anda membuat keputusan yang tepat untuk kasus penggunaan khusus Anda.

## Apa pilihan Anda saat memilih metode pemanggilan HTTP?
<a name="w2aad101c29c46b9"></a>

[Lambda menawarkan dua metode utama untuk memanggil fungsi menggunakan permintaan HTTP - [fungsi](urls-configuration.md) dan API URLs Gateway.](services-apigateway.md) Perbedaan utama antara kedua opsi ini adalah sebagai berikut:
+ **Fungsi Lambda URLs** menyediakan titik akhir HTTP langsung yang sederhana untuk fungsi Lambda. Mereka dioptimalkan untuk kesederhanaan dan efektivitas biaya dan menyediakan jalur tercepat untuk mengekspos fungsi Lambda melalui HTTP.
+ **API Gateway** adalah layanan yang lebih canggih untuk membangun fitur lengkap APIs. API Gateway dioptimalkan untuk membangun dan mengelola produksi dalam APIs skala besar dan menyediakan alat komprehensif untuk keamanan, pemantauan, dan manajemen lalu lintas.

## Rekomendasi jika Anda sudah mengetahui kebutuhan Anda
<a name="w2aad101c29c46c11"></a>

Jika Anda sudah jelas tentang kebutuhan Anda, berikut adalah rekomendasi dasar kami:

Kami merekomendasikan **[fungsi URLs](urls-configuration.md)** untuk aplikasi sederhana atau prototyping di mana Anda hanya memerlukan metode otentikasi dasar dan request/response penanganan dan di mana Anda ingin meminimalkan biaya dan kompleksitas.

**[API Gateway](services-apigateway.md)** adalah pilihan yang lebih baik untuk aplikasi produksi dalam skala besar atau untuk kasus di mana Anda memerlukan fitur yang lebih canggih seperti dukungan [OpenAPI Description](https://www.openapis.org/), pilihan opsi otentikasi, nama domain khusus, atau request/response penanganan kaya termasuk throttling, caching, dan transformasi. request/response 

## Apa yang harus dipertimbangkan saat memilih metode untuk menjalankan fungsi Lambda Anda
<a name="w2aad101c29c46c13"></a>

Saat memilih antara fungsi URLs dan API Gateway, Anda perlu mempertimbangkan faktor-faktor berikut:
+ Kebutuhan otentikasi Anda, seperti apakah Anda memerlukan OAuth atau Amazon Cognito untuk mengautentikasi pengguna
+ Persyaratan penskalaan Anda dan kompleksitas API yang ingin Anda terapkan
+ Apakah Anda memerlukan fitur canggih seperti validasi permintaan dan request/response pemformatan
+ Persyaratan pemantauan Anda
+ Sasaran biaya Anda

Dengan memahami faktor-faktor ini, Anda dapat memilih opsi yang paling menyeimbangkan persyaratan keamanan, kompleksitas, dan biaya Anda.

Informasi berikut merangkum perbedaan utama antara kedua opsi.

### Autentikasi
<a name="w2aad101c29c46c13c11b1"></a>
+ **Fungsi URLs** menyediakan opsi otentikasi dasar melalui AWS Identity and Access Management (IAM). Anda dapat mengonfigurasi titik akhir Anda menjadi publik (tidak ada otentikasi) atau memerlukan otentikasi IAM. Dengan autentikasi IAM, Anda dapat menggunakan AWS kredensi standar atau peran IAM untuk mengontrol akses. Meskipun mudah diatur, pendekatan ini memberikan opsi terbatas dibandingkan dengan metode otentikat lainnya.
+ **API Gateway** menyediakan akses ke berbagai opsi otentikasi yang lebih komprehensif. Selain autentikasi IAM, Anda dapat menggunakan [otorisasi Lambda](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html) (logika otentikasi khusus), kumpulan pengguna Amazon Cognito, dan [aliran.0](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html). OAuth2 Fleksibilitas ini memungkinkan Anda menerapkan skema otentikasi yang kompleks, termasuk penyedia otentikasi pihak ketiga, otentikasi berbasis token, dan otentikasi multi-faktor.

### Penanganan permintaan/tanggapan
<a name="w2aad101c29c46c13c11b3"></a>
+ **Fungsi URLs** menyediakan permintaan HTTP dasar dan penanganan respons. Mereka mendukung metode HTTP standar dan menyertakan dukungan berbagi sumber daya lintas asal (CORS) bawaan. Meskipun mereka dapat menangani muatan JSON dan parameter kueri secara alami, mereka tidak menawarkan transformasi permintaan atau kemampuan validasi. Penanganan respons sama mudahnya — klien menerima respons dari fungsi Lambda Anda persis seperti Lambda mengembalikannya.
+ **API Gateway** menyediakan kemampuan penanganan permintaan dan respons yang canggih. Anda dapat menentukan validator permintaan, mengubah permintaan dan tanggapan menggunakan templat pemetaan, menyiapkan request/response header, dan menerapkan cache respons. API Gateway juga mendukung payload biner dan nama domain khusus dan dapat memodifikasi tanggapan sebelum mencapai klien. Anda dapat mengatur model untuk request/response validasi dan transformasi menggunakan JSON Schema.

### Penskalaan
<a name="w2aad101c29c46c13c11b5"></a>
+  URLsSkala **fungsi** secara langsung dengan batas konkurensi fungsi Lambda Anda dan tangani lonjakan lalu lintas dengan meningkatkan fungsi Anda hingga batas konkurensi maksimum yang dikonfigurasi. Setelah batas itu tercapai, Lambda merespons permintaan tambahan dengan respons HTTP 429. Tidak ada mekanisme antrian bawaan, jadi penanganan penskalaan sepenuhnya bergantung pada konfigurasi fungsi Lambda Anda. Secara default, fungsi Lambda memiliki batas 1.000 eksekusi bersamaan per. Wilayah AWS
+ **API Gateway** menyediakan kemampuan penskalaan tambahan di atas penskalaan Lambda sendiri. Ini termasuk kontrol antrian permintaan dan pelambatan bawaan, memungkinkan Anda mengelola lonjakan lalu lintas dengan lebih anggun. API Gateway dapat menangani hingga 10.000 permintaan per detik per wilayah secara default, dengan kapasitas burst 5.000 permintaan per detik. Ini juga menyediakan alat untuk membatasi permintaan pada tingkat yang berbeda (API, panggung, atau metode) untuk melindungi backend Anda.

### Memantau
<a name="w2aad101c29c46c13c11b7"></a>
+ **Fungsi URLs** menawarkan pemantauan dasar melalui CloudWatch metrik Amazon, termasuk jumlah permintaan, latensi, dan tingkat kesalahan. Anda mendapatkan akses ke metrik dan log Lambda standar, yang menunjukkan permintaan mentah yang masuk ke fungsi Anda. Meskipun ini memberikan visibilitas operasional yang penting, metrik difokuskan terutama pada eksekusi fungsi.
+ **API Gateway** menyediakan kemampuan pemantauan komprehensif termasuk metrik terperinci, pencatatan, dan opsi penelusuran. Anda dapat memantau panggilan API, latensi, tingkat kesalahan, dan hit/miss tingkat cache melalui CloudWatch. API Gateway juga terintegrasi dengan AWS X-Ray untuk penelusuran terdistribusi dan menyediakan format logging yang dapat disesuaikan.

### Biaya
<a name="w2aad101c29c46c13c11b9"></a>
+ **Fungsi URLs** mengikuti model penetapan harga Lambda standar — Anda hanya membayar untuk pemanggilan fungsi dan waktu komputasi. Tidak ada biaya tambahan untuk titik akhir URL itu sendiri. Ini menjadikannya pilihan hemat biaya untuk aplikasi sederhana APIs atau lalu lintas rendah jika Anda tidak memerlukan fitur tambahan API Gateway.
+ **API Gateway** menawarkan [tingkat gratis](https://aws.amazon.com/api-gateway/pricing/#Free_Tier) yang mencakup satu juta panggilan API yang diterima untuk REST APIs dan satu juta panggilan API yang diterima untuk HTTP APIs. Setelah ini, API Gateway mengenakan biaya untuk panggilan API, transfer data, dan caching (jika diaktifkan). Lihat [halaman harga](https://aws.amazon.com/api-gateway/pricing/) API Gateway untuk memahami biaya untuk kasus penggunaan Anda sendiri.

### Fitur lainnya
<a name="w2aad101c29c46c13c11c11"></a>
+ **Fungsi URLs** dirancang untuk kesederhanaan dan integrasi Lambda langsung. Mereka mendukung titik akhir HTTP dan HTTPS, menawarkan dukungan CORS bawaan, dan menyediakan titik akhir dual-stack (IPv4 dan). IPv6 Meskipun mereka tidak memiliki fitur canggih, mereka unggul dalam skenario di mana Anda memerlukan cara cepat dan mudah untuk mengekspos fungsi Lambda melalui HTTP.
+ **API Gateway** mencakup banyak fitur tambahan seperti versi API, manajemen tahap, kunci API untuk rencana penggunaan, dokumentasi API melalui Swagger/OpenAPI, WebSocket APIs privat dalam VPC, dan integrasi APIs WAF untuk keamanan tambahan. Ini juga mendukung penerapan kenari, integrasi tiruan untuk pengujian, dan integrasi dengan yang lain di luar Lambda. Layanan AWS 

## Pilih metode untuk menjalankan fungsi Lambda Anda
<a name="w2aad101c29c46c15"></a>

Sekarang setelah Anda membaca tentang kriteria untuk memilih antara fungsi Lambda URLs dan API Gateway dan perbedaan utama di antara keduanya, Anda dapat memilih opsi yang paling sesuai dengan kebutuhan Anda dan menggunakan sumber daya berikut untuk membantu Anda mulai menggunakannya.

------
#### [ Function URLs ]

**Memulai dengan fungsi URLs dengan sumber daya berikut**
+ Ikuti tutorial [Membuat fungsi Lambda dengan URL fungsi](urls-webhook-tutorial.md)
+ Pelajari lebih lanjut tentang fungsi URLs [Membuat dan mengelola fungsi Lambda URLs](urls-configuration.md) di bagian panduan ini
+ Coba tutorial yang dipandu dalam konsol **Buat aplikasi web sederhana** dengan melakukan hal berikut:

1. Buka [halaman fungsi konsol](https://console.aws.amazon.com/lambda/home#/functions) Lambda.

1. Buka panel bantuan dengan memilih ikon di sudut kanan atas layar.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/console_help_screenshot.png)

1. Pilih **Tutorial**.

1. Di **Buat aplikasi web sederhana**, pilih **Mulai tutorial**.

------
#### [ API Gateway ]

**Memulai Lambda dan API Gateway dengan sumber daya berikut**
+ Ikuti tutorial [Menggunakan Lambda dengan API Gateway untuk membuat REST API](services-apigateway-tutorial.md) yang terintegrasi dengan fungsi Lambda backend.
+ Pelajari selengkapnya tentang berbagai jenis API yang ditawarkan oleh API Gateway di bagian berikut dari *Panduan Pengembang Amazon API Gateway*:
  + [API Gateway REST APIs](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-rest-api.html)
  + [API Gateway HTTP APIs](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api.html)
  + [API Gateway WebSocket APIs](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-websocket-api.html)
+ Coba satu atau beberapa contoh di bagian [Tutorial dan lokakarya](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-tutorials.html) dari *Panduan Pengembang Amazon API Gateway*.

------

# Menggunakan AWS Lambda dengan AWS Infrastructure Composer
<a name="services-appcomposer"></a>

AWS Infrastructure Composer adalah pembangun visual untuk merancang aplikasi modern pada AWS. Anda mendesain arsitektur aplikasi Anda dengan menyeret, mengelompokkan, dan menghubungkan Layanan AWS dalam kanvas visual. Infrastructure Composer membuat template infrastruktur sebagai kode (IAc) dari desain Anda yang dapat Anda terapkan menggunakan atau. [AWS SAM[CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html)

## Mengekspor fungsi Lambda ke Komposer Infrastruktur
<a name="services-appcomposer-export"></a>

Anda dapat mulai menggunakan Infrastructure Composer dengan membuat proyek baru berdasarkan konfigurasi fungsi Lambda yang ada menggunakan konsol Lambda. Untuk mengekspor konfigurasi dan kode fungsi Anda ke Infrastructure Composer untuk membuat proyek baru, lakukan hal berikut:

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi yang ingin Anda gunakan sebagai dasar untuk proyek Infrastructure Composer Anda.

1. Di panel **Ikhtisar fungsi**, pilih **Ekspor ke Komposer Infrastruktur**.

   Untuk mengekspor konfigurasi dan kode fungsi Anda ke Infrastructure Composer, Lambda membuat bucket Amazon S3 di akun Anda untuk menyimpan sementara data ini.

1. Di kotak dialog, pilih **Konfirmasi dan buat proyek** untuk menerima nama default untuk bucket ini dan ekspor konfigurasi dan kode fungsi Anda ke Infrastructure Composer.

1. (Opsional) Untuk memilih nama lain untuk bucket Amazon S3 yang dibuat Lambda, masukkan nama baru dan pilih **Konfirmasi** dan buat proyek. Nama bucket Amazon S3 harus unik secara global dan mengikuti aturan [penamaan bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html).

1. Untuk menyimpan file proyek dan fungsi Anda di Infrastructure Composer, aktifkan [mode sinkronisasi lokal](https://docs.aws.amazon.com/application-composer/latest/dg/reference-features-local-sync.html).

**catatan**  
Jika Anda pernah menggunakan fitur **Ekspor ke Komposer Aplikasi** sebelumnya dan membuat bucket Amazon S3 menggunakan nama default, Lambda dapat menggunakan kembali bucket ini jika masih ada. Terima nama bucket default di kotak dialog untuk menggunakan kembali bucket yang ada.

### Konfigurasi bucket transfer Amazon S3
<a name="services-appcomposer-bucket-info"></a>

Bucket Amazon S3 yang dibuat Lambda untuk mentransfer konfigurasi fungsi Anda secara otomatis mengenkripsi objek menggunakan standar enkripsi AES 256. Lambda juga mengonfigurasi bucket untuk menggunakan [kondisi pemilik bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucket-owner-condition.html) untuk memastikan bahwa hanya Anda Akun AWS yang dapat menambahkan objek ke bucket.

Lambda mengonfigurasi bucket untuk menghapus objek secara otomatis 10 hari setelah diunggah. Namun, Lambda tidak secara otomatis menghapus bucket itu sendiri. Untuk menghapus ember dari Anda Akun AWS, ikuti petunjuk di [Menghapus ember](https://docs.aws.amazon.com/AmazonS3/latest/userguide/delete-bucket.html). Nama bucket default menggunakan awalan`lambdasam`, string alfanumerik 10 digit, dan fungsi yang Wilayah AWS Anda buat di:

```
lambdasam-06f22da95b-us-east-1
```

Untuk menghindari biaya tambahan ditambahkan ke Anda Akun AWS, kami sarankan Anda menghapus bucket Amazon S3 segera setelah Anda selesai mengekspor fungsi Anda ke Infrastructure Composer.

[Harga Amazon S3](https://aws.amazon.com/s3/pricing/) standar berlaku.

### Izin yang diperlukan
<a name="services-appcomposer-permissions"></a>

Untuk menggunakan integrasi Lambda dengan fitur Infrastructure Composer, Anda memerlukan izin tertentu untuk mengunduh AWS SAM templat dan menulis konfigurasi fungsi Anda ke Amazon S3.

Untuk mengunduh AWS SAM templat, Anda harus memiliki izin untuk menggunakan tindakan API berikut:
+ [GetPolicy](https://docs.aws.amazon.com/lambda/latest/api/API_GetPolicy.html)
+ [saya: GetPolicyVersion](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetPolicyVersion.html)
+ [saya: GetRole](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRole.html)
+ [saya: GetRolePolicy](https://docs.aws.amazon.com/IAM/latest/APIReference/API_GetRolePolicy.html)
+ [saya: ListAttachedRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListAttachedRolePolicies.html)
+ [saya: ListRolePolicies](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRolePolicies.html)
+ [saya: ListRoles](https://docs.aws.amazon.com/IAM/latest/APIReference/API_ListRoles.html)

Anda dapat memberikan izin untuk menggunakan semua tindakan ini dengan menambahkan kebijakan [https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambda_ReadOnlyAccess.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambda_ReadOnlyAccess.html) AWS terkelola ke peran pengguna IAM Anda.

Agar Lambda dapat menulis konfigurasi fungsi Anda ke Amazon S3, Anda harus memiliki izin untuk menggunakan tindakan API berikut:
+ [S3: PutObject](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html)
+ [S3: CreateBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/API_CreateBucket.html)
+ [S3: PutBucketEncryption](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketEncryption.html)
+ [S3: PutBucketLifecycleConfiguration](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutBucketLifecycleConfiguration.html)

Jika Anda tidak dapat mengekspor konfigurasi fungsi Anda ke Infrastructure Composer, periksa apakah akun Anda memiliki izin yang diperlukan untuk operasi ini. Jika Anda memiliki izin yang diperlukan, tetapi masih tidak dapat mengekspor konfigurasi fungsi Anda, periksa [kebijakan berbasis sumber daya yang mungkin membatasi](access-control-resource-based.md) akses ke Amazon S3.

## Sumber daya lainnya
<a name="w2aad101c33b7"></a>

Untuk tutorial yang lebih rinci tentang cara merancang aplikasi tanpa server di Infrastructure Composer berdasarkan fungsi Lambda yang ada, lihat. [Menggunakan Lambda dengan infrastruktur sebagai kode (IAc)](foundation-iac.md)

[Untuk menggunakan Infrastructure Composer dan AWS SAM untuk merancang dan menyebarkan aplikasi tanpa server lengkap menggunakan Lambda, Anda juga dapat mengikuti [AWS Infrastructure Composer tutorial](https://catalog.workshops.aws/serverless-patterns/en-US/dive-deeper/module1a) di Workshop Pola Tanpa Server.AWS](https://catalog.workshops.aws/serverless-patterns/en-US)

# Menggunakan AWS Lambda dengan CloudFormation
<a name="services-cloudformation"></a>

Dalam AWS CloudFormation template, Anda dapat menentukan fungsi Lambda sebagai target sumber daya khusus. Gunakan sumber daya khusus untuk memproses parameter, mengambil nilai konfigurasi, atau memanggil lainnya Layanan AWS selama peristiwa siklus hidup tumpukan.

Contoh berikut memanggil fungsi yang ditentukan di bagian lain dalam templat.

**Example – Penentuan sumber daya kustom**  

```
Resources:
  primerinvoke:
    Type: [AWS::CloudFormation::CustomResource](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-cfn-customresource.html)
    Version: "1.0"
    Properties:
      ServiceToken: !GetAtt primer.Arn
      FunctionName: !Ref randomerror
```

Token layanan adalah Nama Sumber Daya Amazon (ARN) dari fungsi yang CloudFormation dipanggil saat Anda membuat, memperbarui, atau menghapus tumpukan. Anda juga dapat menyertakan properti tambahan seperti`FunctionName`, yang CloudFormation lolos ke fungsi Anda apa adanya.

CloudFormation memanggil [fungsi](invocation-async.md) Lambda Anda secara asinkron dengan peristiwa yang menyertakan URL panggilan balik.

**Example — acara CloudFormation pesan**  

```
{
    "RequestType": "Create",
    "ServiceToken": "arn:aws:lambda:us-east-1:123456789012:function:lambda-error-processor-primer-14ROR2T3JKU66",
    "ResponseURL": "https://cloudformation-custom-resource-response-useast1.s3-us-east-1.amazonaws.com/arn%3Aaws%3Acloudformation%3Aus-east-1%3A123456789012%3Astack/lambda-error-processor/1134083a-2608-1e91-9897-022501a2c456%7Cprimerinvoke%7C5d478078-13e9-baf0-464a-7ef285ecc786?AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&Expires=1555451971&Signature=28UijZePE5I4dvukKQqM%2F9Rf1o4%3D",
    "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/lambda-error-processor/1134083a-2608-1e91-9897-022501a2c456",
    "RequestId": "5d478078-13e9-baf0-464a-7ef285ecc786",
    "LogicalResourceId": "primerinvoke",
    "ResourceType": "AWS::CloudFormation::CustomResource",
    "ResourceProperties": {
        "ServiceToken": "arn:aws:lambda:us-east-1:123456789012:function:lambda-error-processor-primer-14ROR2T3JKU66",
        "FunctionName": "lambda-error-processor-randomerror-ZWUC391MQAJK"
    }
}
```

Fungsi ini bertanggung jawab untuk mengembalikan respons ke URL callback yang menunjukkan keberhasilan atau kegagalan. Untuk sintaksis respons lengkap, lihat [Objek respons sumber daya kustom](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/crpg-ref-responses.html).

**Example — respon sumber daya CloudFormation kustom**  

```
{
    "Status": "SUCCESS",
    "PhysicalResourceId": "2019/04/18/[$LATEST]b3d1bfc65f19ec610654e4d9b9de47a0",
    "StackId": "arn:aws:cloudformation:us-east-1:123456789012:stack/lambda-error-processor/1134083a-2608-1e91-9897-022501a2c456",
    "RequestId": "5d478078-13e9-baf0-464a-7ef285ecc786",
    "LogicalResourceId": "primerinvoke"
}
```

CloudFormation menyediakan perpustakaan bernama `cfn-response` yang menangani pengiriman respons. Jika Anda menentukan fungsi Anda dalam template, Anda dapat meminta perpustakaan berdasarkan nama. CloudFormation kemudian menambahkan perpustakaan ke paket penerapan yang dibuatnya untuk fungsi tersebut.

Jika fungsi yang digunakan Sumber Daya Kustom memiliki [Antarmuka Jaringan Elastis](configuration-vpc.md#configuration-vpc-enis) yang melekat padanya, tambahkan sumber daya berikut ke kebijakan VPC di mana **region** Wilayah fungsi berada tanpa tanda hubung. Misalnya, `us-east-1` adalah`useast1`. Ini akan memungkinkan Custom Resource untuk merespons URL callback yang mengirimkan sinyal kembali ke CloudFormation tumpukan.

```
arn:aws:s3:::cloudformation-custom-resource-response-region",
"arn:aws:s3:::cloudformation-custom-resource-response-region/*",
```

Contoh fungsi berikut memanggil suatu fungsi kedua. Jika panggilan berhasil, fungsi mengirimkan respons sukses CloudFormation, dan pembaruan tumpukan berlanjut. Template menggunakan jenis [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)sumber daya yang disediakan oleh AWS Serverless Application Model.

**Example — Fungsi sumber daya khusus**  

```
Transform: 'AWS::Serverless-2016-10-31'
Resources:
  primer:
    Type: [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)
    Properties:
      Handler: index.handler
      Runtime: nodejs16.x
      InlineCode: |
        var aws = require('aws-sdk');
        var response = require('cfn-response');
        exports.handler = function(event, context) {
            // For Delete requests, immediately send a SUCCESS response.
            if (event.RequestType == "Delete") {
                response.send(event, context, "SUCCESS");
                return;
            }
            var responseStatus = "FAILED";
            var responseData = {};
            var functionName = event.ResourceProperties.FunctionName
            var lambda = new aws.Lambda();
            lambda.invoke({ FunctionName: functionName }, function(err, invokeResult) {
                if (err) {
                    responseData = {Error: "Invoke call failed"};
                    console.log(responseData.Error + ":\n", err);
                }
                else responseStatus = "SUCCESS";
                response.send(event, context, responseStatus, responseData);
            });
        };
      Description: Invoke a function to create a log stream.
      MemorySize: 128
      Timeout: 8
      Role: !GetAtt role.Arn
      Tracing: Active
```

Jika fungsi yang dipanggil sumber daya kustom tidak ditentukan dalam template, Anda bisa mendapatkan kode sumber `cfn-response` dari [modul cfn-response di Panduan](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-lambda-function-code-cfnresponsemodule.html) Pengguna. AWS CloudFormation 

Untuk informasi selengkapnya tentang sumber daya kustom, lihat [Sumber daya kustom](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-custom-resources.html) dalam *Panduan Pengguna AWS CloudFormation *.

# Memproses acara Amazon DocumentDB dengan Lambda
<a name="with-documentdb"></a>

Anda dapat menggunakan fungsi Lambda untuk memproses peristiwa di [aliran perubahan Amazon DocumentDB (dengan kompatibilitas MongoDB) dengan mengonfigurasi cluster Amazon DocumentDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/change_streams.html) sebagai sumber peristiwa. Kemudian, Anda dapat mengotomatiskan beban kerja berbasis peristiwa dengan menjalankan fungsi Lambda Anda setiap kali data berubah dengan cluster Amazon DocumentDB Anda.

**catatan**  
Lambda hanya mendukung Amazon DocumentDB versi 4.0 dan 5.0. Lambda tidak mendukung versi 3.6.  
Selain itu, untuk pemetaan sumber acara, Lambda mendukung cluster berbasis instance dan cluster regional saja. [Lambda tidak mendukung [cluster elastis atau cluster global](https://docs.aws.amazon.com/documentdb/latest/developerguide/docdb-using-elastic-clusters.html).](https://docs.aws.amazon.com/documentdb/latest/developerguide/global-clusters.html) Batasan ini tidak berlaku saat menggunakan Lambda sebagai klien untuk terhubung ke Amazon DocumentDB. Lambda dapat terhubung ke semua jenis cluster untuk melakukan operasi CRUD.

Lambda memproses peristiwa dari Amazon DocumentDB mengubah aliran secara berurutan sesuai urutan kedatangannya. Karena itu, fungsi Anda hanya dapat menangani satu pemanggilan bersamaan dari Amazon DocumentDB sekaligus. Untuk memantau fungsi Anda, Anda dapat melacak [metrik konkurensinya](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-concurrency.html).

**Awas**  
Pemetaan sumber peristiwa Lambda memproses setiap peristiwa setidaknya sekali, dan pemrosesan duplikat catatan dapat terjadi. Untuk menghindari potensi masalah yang terkait dengan duplikat peristiwa, kami sangat menyarankan agar Anda membuat kode fungsi Anda idempoten. Untuk mempelajari lebih lanjut, lihat [Bagaimana cara membuat fungsi Lambda saya idempoten](https://repost.aws/knowledge-center/lambda-function-idempotent) di Pusat Pengetahuan. AWS 

**Topics**
+ [

## Contoh acara Amazon DocumentDB
](#docdb-sample-event)
+ [

## Prasyarat dan izin
](#docdb-prereqs)
+ [

## Konfigurasikan keamanan jaringan
](#docdb-network)
+ [

## Membuat pemetaan sumber peristiwa Amazon DocumentDB (konsol)
](#docdb-configuration)
+ [

## Membuat pemetaan sumber peristiwa Amazon DocumentDB (SDK atau CLI)
](#docdb-api)
+ [

## Posisi awal polling dan streaming
](#docdb-stream-polling)
+ [

## Memantau sumber acara Amazon DocumentDB
](#docdb-monitoring)
+ [

# Tutorial: Menggunakan AWS Lambda dengan Amazon DocumentDB Streams
](with-documentdb-tutorial.md)

## Contoh acara Amazon DocumentDB
<a name="docdb-sample-event"></a>

```
{
    "eventSourceArn": "arn:aws:rds:us-east-1:123456789012:cluster:canaryclusterb2a659a2-qo5tcmqkcl03",
    "events": [
        {
            "event": {
                "_id": {
                    "_data": "0163eeb6e7000000090100000009000041e1"
                },
                "clusterTime": {
                    "$timestamp": {
                        "t": 1676588775,
                        "i": 9
                    }
                },
                "documentKey": {
                    "_id": {
                        "$oid": "63eeb6e7d418cd98afb1c1d7"
                    }
                },
                "fullDocument": {
                    "_id": {
                        "$oid": "63eeb6e7d418cd98afb1c1d7"
                    },
                    "anyField": "sampleValue"
                },
                "ns": {
                    "db": "test_database",
                    "coll": "test_collection"
                },
                "operationType": "insert"
            }
        }
    ],
    "eventSource": "aws:docdb"
}
```

Untuk informasi selengkapnya tentang peristiwa dalam contoh ini dan bentuknya, lihat [Mengubah Acara](https://www.mongodb.com/docs/manual/reference/change-events/) di situs web Dokumentasi MongoDB.

## Prasyarat dan izin
<a name="docdb-prereqs"></a>

Sebelum Anda dapat menggunakan Amazon DocumentDB sebagai sumber acara untuk fungsi Lambda Anda, perhatikan prasyarat berikut. Anda harus:
+ **Miliki klaster Amazon DocumentDB yang ada dalam fungsi yang Akun AWS sama Wilayah AWS dan sesuai dengan fungsi Anda.** *Jika Anda tidak memiliki cluster yang ada, Anda dapat membuatnya dengan mengikuti langkah-langkah di [Memulai dengan Amazon DocumentDB di Panduan Pengembang Amazon](https://docs.aws.amazon.com/documentdb/latest/developerguide/get-started-guide.html) DocumentDB.* Atau, serangkaian langkah pertama dalam [Tutorial: Menggunakan AWS Lambda dengan Amazon DocumentDB Streams](with-documentdb-tutorial.md) memandu Anda membuat cluster Amazon DocumentDB dengan semua prasyarat yang diperlukan.
+ **Izinkan Lambda mengakses sumber daya Amazon Virtual Private Cloud (Amazon VPC) yang terkait dengan cluster Amazon DocumentDB Anda.** Untuk informasi selengkapnya, lihat [Konfigurasikan keamanan jaringan](#docdb-network).
+ **Aktifkan TLS di klaster Amazon DocumentDB Anda.** Ini adalah pengaturan default. Jika Anda menonaktifkan TLS, maka Lambda tidak dapat berkomunikasi dengan cluster Anda.
+ **Aktifkan aliran perubahan di klaster Amazon DocumentDB Anda.** Untuk informasi selengkapnya, lihat [Menggunakan Ubah Aliran dengan Amazon DocumentDB](https://docs.aws.amazon.com/documentdb/latest/developerguide/change_streams.html) di Panduan Pengembang *Amazon DocumentDB*.
+ **Berikan Lambda kredensyal untuk mengakses klaster Amazon DocumentDB Anda.** Saat menyiapkan sumber acara, berikan [AWS Secrets Manager](https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html)kunci yang berisi detail otentikasi (nama pengguna dan kata sandi) yang diperlukan untuk mengakses klaster Anda. Untuk menyediakan kunci ini selama penyiapan, lakukan salah satu hal berikut:
  + Jika Anda menggunakan konsol Lambda untuk penyiapan, berikan kunci di bidang **kunci manajer Rahasia**.
  + Jika Anda menggunakan AWS Command Line Interface (AWS CLI) untuk penyiapan, berikan kunci ini di `source-access-configurations` opsi. Anda dapat menyertakan opsi ini dengan [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html)perintah atau [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html)perintah. Contoh:

    ```
    aws lambda create-event-source-mapping \
        ...
        --source-access-configurations  '[{"Type":"BASIC_AUTH","URI":"arn:aws:secretsmanager:us-west-2:123456789012:secret:DocDBSecret-AbC4E6"}]' \
        ...
    ```
+ **Berikan izin Lambda untuk mengelola sumber daya yang terkait dengan aliran Amazon DocumentDB Anda.** Tambahkan izin berikut secara manual ke [peran eksekusi](lambda-intro-execution-role.md) fungsi Anda:
  + [RDS: jelaskan DBClusters](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBClusters.html)
  + [RDSDBCluster: Jelaskan Parameter](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBClusterParameters.html)
  + [RDSDBSubnet: Jelaskan Grup](https://docs.aws.amazon.com/AmazonRDS/latest/APIReference/API_DescribeDBSubnetGroups.html)
  + [EC2: CreateNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInterface.html)
  + [EC2: DescribeNetworkInterfaces](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html)
  + [EC2: DescribeVpcs](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcs.html)
  + [EC2: DeleteNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkInterface.html)
  + [EC2: DescribeSubnets](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSubnets.html)
  + [EC2: DescribeSecurityGroups](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroups.html)
  + [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)
  + [manajer rahasia: GetSecretValue](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html)
+ **Pertahankan ukuran peristiwa aliran perubahan Amazon DocumentDB yang Anda kirim ke Lambda di bawah 6 MB.** Lambda mendukung ukuran payload hingga 6 MB. Jika aliran perubahan Anda mencoba mengirim Lambda peristiwa yang lebih besar dari 6 MB, maka Lambda akan menghapus pesan dan memancarkan metrik. `OversizedRecordCount` Lambda memancarkan semua metrik dengan upaya terbaik.

**catatan**  
Sementara fungsi Lambda biasanya memiliki batas waktu tunggu maksimum 15 menit, pemetaan sumber acara untuk Amazon MSK, Apache Kafka yang dikelola sendiri, Amazon DocumentDB, dan Amazon MQ untuk ActiveMQ dan RabbitMQ hanya mendukung fungsi dengan batas waktu tunggu maksimum 14 menit. Kendala ini memastikan bahwa pemetaan sumber peristiwa dapat menangani kesalahan fungsi dan percobaan ulang dengan benar.

## Konfigurasikan keamanan jaringan
<a name="docdb-network"></a>

Untuk memberi Lambda akses penuh ke Amazon DocumentDB melalui pemetaan sumber peristiwa, kluster Anda harus menggunakan titik akhir publik (alamat IP publik), atau Anda harus memberikan akses ke Amazon VPC tempat Anda membuat klaster.

Saat Anda menggunakan Amazon DocumentDB dengan Lambda, [AWS PrivateLink buat titik akhir VPC](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html) yang menyediakan akses fungsi Anda ke sumber daya di Amazon VPC Anda.

**catatan**  
AWS PrivateLink Titik akhir VPC diperlukan untuk fungsi dengan pemetaan sumber peristiwa yang menggunakan mode default (sesuai permintaan) untuk poller acara. Jika pemetaan sumber acara menggunakan [mode yang disediakan](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode), Anda tidak perlu mengonfigurasi titik akhir AWS PrivateLink VPC.

Buat titik akhir untuk menyediakan akses ke sumber daya berikut:
+  Lambda — Buat titik akhir untuk kepala layanan Lambda. 
+  AWS STS — Buat titik akhir AWS STS untuk prinsipal layanan untuk mengambil peran atas nama Anda. 
+  Secrets Manager - Jika klaster Anda menggunakan Secrets Manager untuk menyimpan kredensi, buat endpoint untuk Secrets Manager. 

Atau, konfigurasikan gateway NAT di setiap subnet publik di Amazon VPC. Untuk informasi selengkapnya, lihat [Aktifkan akses internet untuk fungsi Lambda yang terhubung dengan VPC](configuration-vpc-internet.md).

Saat Anda membuat pemetaan sumber peristiwa untuk Amazon DocumentDB, Lambda memeriksa apakah Elastic ENIs Network Interfaces () sudah ada untuk subnet dan grup keamanan yang dikonfigurasi untuk Amazon VPC Anda. Jika Lambda menemukan yang ada ENIs, ia mencoba untuk menggunakannya kembali. Jika tidak, Lambda membuat yang baru ENIs untuk terhubung ke sumber acara dan memanggil fungsi Anda.

**catatan**  
Fungsi Lambda selalu berjalan di dalam yang VPCs dimiliki oleh layanan Lambda. Konfigurasi VPC fungsi Anda tidak memengaruhi pemetaan sumber peristiwa. Hanya konfigurasi jaringan sumber acara yang menentukan bagaimana Lambda terhubung ke sumber acara Anda.

Konfigurasikan grup keamanan untuk VPC Amazon yang berisi cluster Anda. Secara default, Amazon DocumentDB menggunakan port berikut:. `27017`
+ Aturan masuk - Izinkan semua lalu lintas di port broker default untuk grup keamanan yang terkait dengan sumber acara Anda. Atau, Anda dapat menggunakan aturan grup keamanan referensi mandiri untuk mengizinkan akses dari instans dalam grup keamanan yang sama.
+ Aturan keluar - Izinkan semua lalu lintas di port `443` untuk tujuan eksternal jika fungsi Anda perlu berkomunikasi dengan AWS layanan. Atau, Anda juga dapat menggunakan aturan grup keamanan referensi diri untuk membatasi akses ke broker jika Anda tidak perlu berkomunikasi dengan layanan lain AWS .
+ Aturan masuk titik akhir VPC Amazon — Jika Anda menggunakan titik akhir VPC Amazon, grup keamanan yang terkait dengan titik akhir VPC Amazon Anda harus mengizinkan lalu lintas masuk pada port dari grup keamanan klaster. `443`

Jika klaster menggunakan autentikasi, Anda juga dapat membatasi kebijakan endpoint untuk titik akhir Secrets Manager. Untuk memanggil Secrets Manager API, Lambda menggunakan peran fungsi Anda, bukan kepala layanan Lambda.

**Example Kebijakan titik akhir VPC — titik akhir Secrets Manager**  

```
{
      "Statement": [
          {
              "Action": "secretsmanager:GetSecretValue",
              "Effect": "Allow",
              "Principal": {
                  "AWS": [
                      "arn:aws::iam::123456789012:role/my-role"
                  ]
              },
              "Resource": "arn:aws::secretsmanager:us-west-2:123456789012:secret:my-secret"
          }
      ]
  }
```

Saat Anda menggunakan titik akhir Amazon VPC, AWS merutekan panggilan API Anda untuk menjalankan fungsi Anda menggunakan Antarmuka Jaringan Elastis (ENI) titik akhir. Kepala layanan Lambda perlu memanggil `lambda:InvokeFunction` peran dan fungsi apa pun yang menggunakannya. ENIs

Secara default, titik akhir Amazon VPC memiliki kebijakan IAM terbuka yang memungkinkan akses luas ke sumber daya. Praktik terbaik adalah membatasi kebijakan ini untuk melakukan tindakan yang diperlukan menggunakan titik akhir tersebut. Untuk memastikan bahwa pemetaan sumber peristiwa Anda dapat menjalankan fungsi Lambda Anda, kebijakan titik akhir VPC harus mengizinkan kepala layanan Lambda untuk memanggil dan. `sts:AssumeRole` `lambda:InvokeFunction` Membatasi kebijakan titik akhir VPC Anda agar hanya mengizinkan panggilan API yang berasal dari organisasi Anda mencegah pemetaan sumber peristiwa berfungsi dengan baik, `"Resource": "*"` sehingga diperlukan dalam kebijakan ini.

Contoh kebijakan titik akhir VPC berikut menunjukkan cara memberikan akses yang diperlukan ke prinsipal layanan Lambda untuk titik akhir dan Lambda. AWS STS 

**Example Kebijakan Titik Akhir VPC — titik akhir AWS STS**  

```
{
      "Statement": [
          {
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "lambda.amazonaws.com"
                  ]
              },
              "Resource": "*"
          }
      ]
    }
```

**Example Kebijakan Titik Akhir VPC - Titik akhir Lambda**  

```
{
      "Statement": [
          {
              "Action": "lambda:InvokeFunction",
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "lambda.amazonaws.com"
                  ]
              },
              "Resource": "*"
          }
      ]
  }
```

## Membuat pemetaan sumber peristiwa Amazon DocumentDB (konsol)
<a name="docdb-configuration"></a>

[Agar fungsi Lambda dapat dibaca dari aliran perubahan klaster Amazon DocumentDB, buat pemetaan sumber peristiwa.](invocation-eventsourcemapping.md) Bagian ini menjelaskan cara melakukan ini dari konsol Lambda. Untuk AWS SDK dan AWS CLI instruksi, lihat[Membuat pemetaan sumber peristiwa Amazon DocumentDB (SDK atau CLI)](#docdb-api).

**Untuk membuat pemetaan sumber peristiwa Amazon DocumentDB (konsol)**

1. Buka [Halaman fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih nama sebuah fungsi.

1. Di bagian **Gambaran umum fungsi**, pilih **Tambah pemicu**.

1. **Di bawah **konfigurasi Trigger**, dalam daftar dropdown, pilih DocumentDB.**

1. Konfigurasikan opsi yang diperlukan, lalu pilih **Tambah**.

Lambda mendukung opsi berikut untuk sumber acara Amazon DocumentDB:
+ Cluster **DocumentDB - Pilih** cluster Amazon DocumentDB.
+ **Aktifkan pemicu** - Pilih apakah Anda ingin segera mengaktifkan pemicu. Jika Anda memilih kotak centang ini, maka fungsi Anda segera mulai menerima lalu lintas dari aliran perubahan Amazon DocumentDB yang ditentukan setelah pembuatan pemetaan sumber peristiwa. Kami menyarankan Anda mengosongkan kotak centang untuk membuat pemetaan sumber peristiwa dalam status dinonaktifkan untuk pengujian. Setelah pembuatan, Anda dapat mengaktifkan pemetaan sumber acara kapan saja.
+ **Nama database** — Masukkan nama database dalam cluster untuk dikonsumsi.
+ (Opsional) **Nama koleksi** — Masukkan nama koleksi dalam database untuk dikonsumsi. Jika Anda tidak menentukan koleksi, maka Lambda akan mendengarkan semua peristiwa dari setiap koleksi dalam database.
+ **Ukuran Batch** - Atur jumlah maksimum pesan yang akan diambil dalam satu batch, hingga 10.000. Ukuran batch default adalah 100.
+ **Posisi awal** - Pilih posisi dalam aliran untuk mulai membaca catatan.
  + **Terbaru** - Memproses hanya catatan baru yang ditambahkan ke aliran. Fungsi Anda mulai memproses catatan hanya setelah Lambda selesai membuat sumber acara Anda. Ini berarti bahwa beberapa catatan dapat dihapus sampai sumber acara Anda berhasil dibuat.
  + **Trim horizon** – Memproses semua rekaman dalam aliran. Lambda menggunakan durasi retensi log klaster Anda untuk menentukan dari mana harus mulai membaca peristiwa. Secara khusus, Lambda mulai membaca dari. `current_time - log_retention_duration` Aliran perubahan Anda harus sudah aktif sebelum stempel waktu ini agar Lambda dapat membaca semua peristiwa dengan benar.
  + **Pada stempel waktu** – Proses rekaman dimulai dari waktu tertentu. Aliran perubahan Anda harus sudah aktif sebelum stempel waktu yang ditentukan agar Lambda dapat membaca semua peristiwa dengan benar.
+ **Otentikasi** — Pilih metode otentikasi untuk mengakses broker di cluster Anda.
  + **BASIC\$1AUTH** — Dengan otentikasi dasar, Anda harus memberikan kunci Secrets Manager yang berisi kredensi untuk mengakses klaster Anda.
+ **Kunci Secrets Manager** - Pilih kunci Secrets Manager yang berisi detail otentikasi (nama pengguna dan kata sandi) yang diperlukan untuk mengakses klaster Amazon DocumentDB Anda.
+ (Opsional) **Jendela Batch** - Atur jumlah waktu maksimum dalam hitungan detik untuk mengumpulkan catatan sebelum menjalankan fungsi Anda, hingga 300.
+ (Opsional) **Konfigurasi dokumen lengkap** — Untuk operasi pembaruan dokumen, pilih apa yang ingin Anda kirim ke aliran. Nilai defaultnya adalah`Default`, yang berarti bahwa untuk setiap peristiwa aliran perubahan, Amazon DocumentDB hanya mengirimkan delta yang menjelaskan perubahan yang dibuat. Untuk informasi selengkapnya tentang bidang ini, lihat [FullDocument](https://mongodb.github.io/mongo-java-driver/3.9/javadoc/com/mongodb/client/model/changestream/FullDocument.html#DEFAULT)di dokumentasi MongoDB Javadoc API.
  + **Default** — Lambda hanya mengirimkan sebagian dokumen yang menjelaskan perubahan yang dibuat.
  + **UpdateLookup**— Lambda mengirimkan delta yang menjelaskan perubahan, bersama dengan salinan seluruh dokumen.

## Membuat pemetaan sumber peristiwa Amazon DocumentDB (SDK atau CLI)
<a name="docdb-api"></a>

Untuk membuat atau mengelola pemetaan sumber peristiwa Amazon DocumentDB dengan SDK, Anda dapat [AWS menggunakan](https://aws.amazon.com/developer/tools/) operasi API berikut:
+ [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)
+ [ListEventSourceMappings](https://docs.aws.amazon.com/lambda/latest/api/API_ListEventSourceMappings.html)
+ [GetEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_GetEventSourceMapping.html)
+ [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)
+ [DeleteEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_DeleteEventSourceMapping.html)

Untuk membuat pemetaan sumber acara dengan AWS CLI, gunakan [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html)perintah. Contoh berikut menggunakan perintah ini untuk memetakan fungsi bernama `my-function` ke aliran perubahan Amazon DocumentDB. Sumber peristiwa ditentukan oleh Amazon Resource Name (ARN), dengan ukuran batch 500, mulai dari stempel waktu dalam waktu Unix. Perintah ini juga menentukan kunci Secrets Manager yang digunakan Lambda untuk terhubung ke Amazon DocumentDB. Selain itu, ini termasuk `document-db-event-source-config` parameter yang menentukan database dan koleksi untuk dibaca.

```
aws lambda create-event-source-mapping --function-name my-function \
    --event-source-arn arn:aws:rds:us-west-2:123456789012:cluster:privatecluster7de2-epzcyvu4pjoy
    --batch-size 500 \
    --starting-position AT_TIMESTAMP \
    --starting-position-timestamp 1541139109 \
    --source-access-configurations '[{"Type":"BASIC_AUTH","URI":"arn:aws:secretsmanager:us-east-1:123456789012:secret:DocDBSecret-BAtjxi"}]' \
    --document-db-event-source-config '{"DatabaseName":"test_database", "CollectionName": "test_collection"}' \
```

Anda akan melihat output seperti ini:

```
{
    "UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284",
    "BatchSize": 500,
    "DocumentDBEventSourceConfig": {
        "CollectionName": "test_collection",
        "DatabaseName": "test_database",
        "FullDocument": "Default"
    },
    "MaximumBatchingWindowInSeconds": 0,
    "EventSourceArn": "arn:aws:rds:us-west-2:123456789012:cluster:privatecluster7de2-epzcyvu4pjoy",
    "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
    "LastModified": 1541348195.412,
    "LastProcessingResult": "No records processed",
    "State": "Creating",
    "StateTransitionReason": "User action"
}
```

Setelah pembuatan, Anda dapat menggunakan [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html)perintah untuk memperbarui pengaturan untuk sumber acara Amazon DocumentDB Anda. Contoh berikut memperbarui ukuran batch menjadi 1.000 dan jendela batch menjadi 10 detik. Untuk perintah ini, Anda memerlukan UUID pemetaan sumber acara Anda, yang dapat Anda ambil menggunakan perintah `list-event-source-mapping` atau konsol Lambda.

```
aws lambda update-event-source-mapping --function-name my-function \
    --uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \
    --batch-size 1000 \
    --batch-window 10
```

Anda akan melihat output ini yang terlihat seperti ini:

```
{
    "UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284",
    "BatchSize": 500,
    "DocumentDBEventSourceConfig": {
        "CollectionName": "test_collection",
        "DatabaseName": "test_database",
        "FullDocument": "Default"
    },
    "MaximumBatchingWindowInSeconds": 0,
    "EventSourceArn": "arn:aws:rds:us-west-2:123456789012:cluster:privatecluster7de2-epzcyvu4pjoy",
    "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
    "LastModified": 1541359182.919,
    "LastProcessingResult": "OK",
    "State": "Updating",
    "StateTransitionReason": "User action"
}
```

Lambda memperbarui pengaturan secara asinkron, sehingga Anda mungkin tidak melihat perubahan ini dalam output sampai proses selesai. Untuk melihat pengaturan saat ini dari pemetaan sumber acara Anda, gunakan [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/get-event-source-mapping.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/get-event-source-mapping.html)perintah.

```
aws lambda get-event-source-mapping --uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b
```

Anda akan melihat output ini yang terlihat seperti ini:

```
{
    "UUID": "2b733gdc-8ac3-cdf5-af3a-1827b3b11284",
    "DocumentDBEventSourceConfig": {
        "CollectionName": "test_collection",
        "DatabaseName": "test_database",
        "FullDocument": "Default"
    },
    "BatchSize": 1000,
    "MaximumBatchingWindowInSeconds": 10,
    "EventSourceArn": "arn:aws:rds:us-west-2:123456789012:cluster:privatecluster7de2-epzcyvu4pjoy",
    "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:my-function",
    "LastModified": 1541359182.919,
    "LastProcessingResult": "OK",
    "State": "Enabled",
    "StateTransitionReason": "User action"
}
```

Untuk menghapus pemetaan sumber peristiwa Amazon DocumentDB Anda, gunakan perintah. [https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/delete-event-source-mapping.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/delete-event-source-mapping.html)

```
aws lambda delete-event-source-mapping \
    --uuid 2b733gdc-8ac3-cdf5-af3a-1827b3b11284
```

## Posisi awal polling dan streaming
<a name="docdb-stream-polling"></a>

Ketahuilah bahwa polling streaming selama pembuatan dan pembaruan pemetaan sumber acara pada akhirnya konsisten.
+ Selama pembuatan pemetaan sumber acara, mungkin diperlukan beberapa menit untuk memulai acara polling dari aliran.
+ Selama pembaruan pemetaan sumber acara, mungkin diperlukan beberapa menit untuk menghentikan dan memulai kembali acara pemungutan suara dari aliran.

Perilaku ini berarti bahwa jika Anda menentukan `LATEST` sebagai posisi awal untuk aliran, pemetaan sumber peristiwa dapat melewatkan peristiwa selama pembuatan atau pembaruan. Untuk memastikan bahwa tidak ada peristiwa yang terlewatkan, tentukan posisi awal aliran sebagai `TRIM_HORIZON` atau`AT_TIMESTAMP`.

## Memantau sumber acara Amazon DocumentDB
<a name="docdb-monitoring"></a>

Untuk membantu Anda memantau sumber peristiwa Amazon DocumentDB, Lambda memancarkan metrik saat fungsi Anda `IteratorAge` selesai memproses sekumpulan rekaman. *Usia iterator* adalah perbedaan antara stempel waktu acara terbaru dan stempel waktu saat ini. Pada dasarnya, `IteratorAge` metrik menunjukkan berapa umur catatan terakhir yang diproses dalam batch. Jika fungsi Anda saat ini memproses peristiwa baru, maka Anda dapat menggunakan usia iterator untuk memperkirakan latensi antara saat catatan ditambahkan dan saat fungsi Anda memprosesnya. Tren yang meningkat `IteratorAge` dapat menunjukkan masalah dengan fungsi Anda. Untuk informasi selengkapnya, lihat [Menggunakan CloudWatch metrik dengan Lambda](monitoring-metrics.md).

Aliran perubahan Amazon DocumentDB tidak dioptimalkan untuk menangani kesenjangan waktu yang besar antar peristiwa. Jika sumber peristiwa Amazon DocumentDB Anda tidak menerima peristiwa apa pun untuk jangka waktu yang lama, Lambda dapat menonaktifkan pemetaan sumber peristiwa. Panjang periode waktu ini dapat bervariasi dari beberapa minggu hingga beberapa bulan tergantung pada ukuran cluster dan beban kerja lainnya.

Lambda mendukung muatan hingga 6 MB. Namun, peristiwa aliran perubahan Amazon DocumentDB dapat berukuran hingga 16 MB. Jika aliran perubahan Anda mencoba mengirim Lambda peristiwa aliran perubahan yang lebih besar dari 6 MB, maka Lambda akan menghapus pesan dan memancarkan metrik. `OversizedRecordCount` Lambda memancarkan semua metrik dengan upaya terbaik.

# Tutorial: Menggunakan AWS Lambda dengan Amazon DocumentDB Streams
<a name="with-documentdb-tutorial"></a>

 Dalam tutorial ini, Anda membuat fungsi Lambda dasar yang menggunakan peristiwa dari aliran perubahan Amazon DocumentDB (dengan kompatibilitas MongoDB). Untuk menyelesaikan tutorial ini, Anda akan melalui tahapan berikut: 
+ Siapkan cluster Amazon DocumentDB Anda, sambungkan ke sana, dan aktifkan aliran perubahan di dalamnya.
+ Buat fungsi Lambda Anda, dan konfigurasikan cluster Amazon DocumentDB Anda sebagai sumber peristiwa untuk fungsi Anda.
+ Uji penyiapan dengan memasukkan item ke dalam database Amazon DocumentDB Anda.

## Buat cluster Amazon DocumentDB
<a name="docdb-documentdb-cluster"></a>

1. Buka konsol [Amazon DocumentDB](https://console.aws.amazon.com/docdb/home#). Di bawah **Cluster**, pilih **Buat**.

1. Buat cluster dengan konfigurasi berikut:
   + Untuk **tipe Cluster**, pilih cluster **berbasis Instance**. Ini adalah pilihan default.
   + Di bawah **konfigurasi Cluster**, pastikan bahwa **Engine versi** 5.0.0 dipilih. Ini adalah pilihan default.
   + Di bawah **konfigurasi Instance**:
     + Untuk **kelas instans DB, pilih kelas** yang **dioptimalkan memori**. Ini adalah pilihan default.
     + Untuk **Jumlah contoh replika biasa**, pilih 1.
     + Untuk **kelas Instance**, gunakan pilihan default.
   + Di bawah **Autentikasi**, masukkan nama pengguna untuk pengguna utama, lalu pilih **Self managed**. Masukkan kata sandi, lalu konfirmasikan.
   + Simpan semua pengaturan default lainnya.

1. Pilih **Buat klaster**.

## Buat rahasia di Secrets Manager
<a name="docdb-secret-in-secrets-manager"></a>

Saat Amazon DocumentDB membuat klaster Anda, buat rahasia untuk menyimpan AWS Secrets Manager kredensi database Anda. Anda akan memberikan rahasia ini saat membuat pemetaan sumber peristiwa Lambda di langkah selanjutnya.

**Untuk membuat rahasia di Secrets Manager**

1. Buka konsol [Secrets Manager](https://console.aws.amazon.com/secretsmanager/home#) dan pilih **Simpan rahasia baru**.

1. Untuk **Pilih jenis rahasia**, pilih opsi berikut:
   + Di bawah **rincian dasar**:
     + **Jenis rahasia**: Kredensi untuk database Amazon DocumentDB Anda
     + Di bawah **Kredensial**, masukkan nama pengguna dan kata sandi yang sama dengan yang Anda gunakan untuk membuat klaster Amazon DocumentDB Anda.
     + **Database**: Pilih cluster Amazon DocumentDB Anda.
     + Pilih **Berikutnya**.

1. Untuk **Konfigurasi rahasia**, pilih opsi berikut:
   + **Nama rahasia**: `DocumentDBSecret`
   + Pilih **Berikutnya**.

1. Pilih **Berikutnya**.

1. Pilih **Toko**.

1. Segarkan konsol untuk memverifikasi bahwa Anda berhasil menyimpan `DocumentDBSecret` rahasia.

Perhatikan **Rahasia ARN**. Anda akan membutuhkannya di langkah selanjutnya.

## Menyambungkan ke klaster
<a name="docdb-connect-to-cluster"></a>

**Connect ke cluster Amazon DocumentDB Anda menggunakan AWS CloudShell**

1. Di konsol manajemen Amazon DocumentDB, **di bawah** Clusters, temukan klaster yang Anda buat. Pilih klaster Anda dengan mengklik kotak centang di sebelahnya.

1. Pilih **Connect to cluster**. Layar **perintah CloudShell Jalankan** muncul.

1. Di bidang **Nama lingkungan baru**, masukkan nama unik, seperti “uji” dan pilih **Buat dan jalankan**.

1. Saat diminta, masukkan kata sandi Anda. Ketika prompt menjadi`rs0 [direct: primary] <env-name>>`, Anda berhasil terhubung ke cluster Amazon DocumentDB Anda.

## Aktifkan aliran perubahan
<a name="docdb-activate-change-streams"></a>

Untuk tutorial ini, Anda akan melacak perubahan pada `products` koleksi `docdbdemo` database di cluster Amazon DocumentDB Anda. Anda melakukan ini dengan mengaktifkan [aliran perubahan](https://docs.aws.amazon.com/documentdb/latest/developerguide/change_streams.html).

**Untuk membuat database baru di dalam klaster Anda**

1. Jalankan perintah berikut untuk membuat database baru yang disebut`docdbdemo`:

   ```
   use docdbdemo
   ```

1. Di jendela terminal, gunakan perintah berikut untuk memasukkan catatan ke`docdbdemo`:

   ```
   db.products.insertOne({"hello":"world"})
   ```

   Anda akan melihat output seperti ini:

   ```
   {
     acknowledged: true,
     insertedId: ObjectId('67f85066ca526410fd531d59')
   }
   ```

1. Selanjutnya, aktifkan aliran perubahan pada `products` koleksi `docdbdemo` database menggunakan perintah berikut:

   ```
   db.adminCommand({modifyChangeStreams: 1,
       database: "docdbdemo",
       collection: "products", 
       enable: true});
   ```

    Anda akan melihat output seperti ini: 

   ```
   { "ok" : 1, "operationTime" : Timestamp(1680126165, 1) }
   ```

## Buat antarmuka VPC endpoint
<a name="docdb-create-interface-vpc-endpoints"></a>

Selanjutnya, buat [titik akhir VPC antarmuka](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws) untuk memastikan bahwa Lambda dan Secrets Manager (digunakan nanti untuk menyimpan kredenal akses cluster kami) dapat terhubung ke VPC default Anda.

**Untuk membuat titik akhir VPC antarmuka**

1. Buka konsol [VPC](https://console.aws.amazon.com/vpc/home#). Di menu sebelah kiri, di bawah **Virtual Private Cloud**, pilih **Endpoints**.

1. Pilih **Buat titik akhir**. Buat titik akhir dengan konfigurasi berikut:
   + Untuk **tag Nama**, masukkan`lambda-default-vpc`.
   + Untuk **kategori Layanan**, pilih AWS layanan.
   + Untuk **Layanan**, masukkan `lambda` di kotak pencarian. Pilih layanan dengan format`com.amazonaws.<region>.lambda`.
   + Untuk **VPC, pilih VPC** tempat cluster Amazon DocumentDB Anda berada. Ini biasanya [VPC default](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html).
   + Untuk **Subnet**, centang kotak di sebelah setiap zona ketersediaan. Pilih subnet ID yang benar untuk setiap zona ketersediaan.
   + Untuk **jenis alamat IP**, pilih IPv4.
   + Untuk **grup Keamanan**, pilih grup keamanan yang digunakan cluster Amazon DocumentDB Anda. Ini biasanya kelompok `default` keamanan.
   + Simpan semua pengaturan default lainnya.
   + Pilih **Buat titik akhir**.

1. Sekali lagi, pilih **Buat titik akhir**. Buat titik akhir dengan konfigurasi berikut:
   + Untuk **tag Nama**, masukkan`secretsmanager-default-vpc`.
   + Untuk **kategori Layanan**, pilih AWS layanan.
   + Untuk **Layanan**, masukkan `secretsmanager` di kotak pencarian. Pilih layanan dengan format`com.amazonaws.<region>.secretsmanager`.
   + Untuk **VPC, pilih VPC** tempat cluster Amazon DocumentDB Anda berada. Ini biasanya [VPC default](https://docs.aws.amazon.com/vpc/latest/userguide/default-vpc.html).
   + Untuk **Subnet**, centang kotak di sebelah setiap zona ketersediaan. Pilih subnet ID yang benar untuk setiap zona ketersediaan.
   + Untuk **jenis alamat IP**, pilih IPv4.
   + Untuk **grup Keamanan**, pilih grup keamanan yang digunakan cluster Amazon DocumentDB Anda. Ini biasanya kelompok `default` keamanan.
   + Simpan semua pengaturan default lainnya.
   + Pilih **Buat titik akhir**.

 Ini melengkapi bagian pengaturan cluster dari tutorial ini. 

## Buat peran eksekusi
<a name="docdb-create-the-execution-role"></a>

 Pada rangkaian langkah berikutnya, Anda akan membuat fungsi Lambda Anda. Pertama, Anda perlu membuat peran eksekusi yang memberikan izin fungsi Anda untuk mengakses klaster Anda. Anda melakukannya dengan membuat kebijakan IAM terlebih dahulu, lalu melampirkan kebijakan ini ke peran IAM. 

**Untuk membuat kebijakan IAM**

1. Buka [halaman Kebijakan](https://console.aws.amazon.com/iam/home#/policies) di konsol IAM dan pilih **Buat kebijakan**.

1. Pilih tab **JSON**. Dalam kebijakan berikut, ganti ARN sumber daya Secrets Manager di baris terakhir pernyataan dengan ARN rahasia Anda dari sebelumnya, dan salin kebijakan ke editor.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "LambdaESMNetworkingAccess",
               "Effect": "Allow",
               "Action": [
                   "ec2:CreateNetworkInterface",
                   "ec2:DescribeNetworkInterfaces",
                   "ec2:DescribeVpcs",
                   "ec2:DeleteNetworkInterface",
                   "ec2:DescribeSubnets",
                   "ec2:DescribeSecurityGroups",
                   "kms:Decrypt"
               ],
               "Resource": "*"
           },
           {
               "Sid": "LambdaDocDBESMAccess",
               "Effect": "Allow",
               "Action": [
                   "rds:DescribeDBClusters",
                   "rds:DescribeDBClusterParameters",
                   "rds:DescribeDBSubnetGroups"
               ],
               "Resource": "*"
           },
           {
               "Sid": "LambdaDocDBESMGetSecretValueAccess",
               "Effect": "Allow",
               "Action": [
                   "secretsmanager:GetSecretValue"
               ],
               "Resource": "arn:aws:secretsmanager:us-east-1:123456789012:secret:DocumentDBSecret"
           }
       ]
   }
   ```

------

1. Pilih **Berikutnya: Tag**, lalu pilih **Berikutnya: Tinjau**.

1. Untuk **Nama**, masukkan `AWSDocumentDBLambdaPolicy`.

1. Pilih **Buat kebijakan**.

**Untuk membuat peran IAM**

1. Buka [halaman Peran](https://console.aws.amazon.com/iam/home#/roles) di konsol IAM dan pilih **Buat peran**.

1. Untuk **Pilih entitas tepercaya**, pilih opsi berikut:
   + **Jenis entitas tepercaya**: AWS layanan
   + **Kasus layanan atau penggunaan**: Lambda
   + Pilih **Berikutnya**.

1. Untuk **Menambahkan izin**, pilih `AWSDocumentDBLambdaPolicy` kebijakan yang baru saja Anda buat, serta `AWSLambdaBasicExecutionRole` untuk memberikan izin fungsi Anda untuk menulis ke Amazon CloudWatch Logs.

1. Pilih **Berikutnya**.

1. Untuk **Nama peran**, masukkan `AWSDocumentDBLambdaExecutionRole`.

1. Pilih **Buat peran**.

## Buat fungsi Lambda
<a name="docdb-create-the-lambda-function"></a>

Tutorial ini menggunakan runtime Python 3.14, tetapi kami juga menyediakan contoh file kode untuk runtime lainnya. Anda dapat memilih tab di kotak berikut untuk melihat kode runtime yang Anda minati.

Kode menerima input peristiwa Amazon DocumentDB dan memproses pesan yang dikandungnya.

**Untuk membuat fungsi Lambda**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih **Buat fungsi**.

1. Pilih **Penulis dari awal**

1. Di bagian **Informasi dasar**, lakukan hal berikut:

   1. Untuk **nama Fungsi**, masukkan `ProcessDocumentDBRecords`

   1. Untuk **Runtime**, pilih **Python 3.14**.

   1. Untuk **Arsitektur**, pilih **x86\$164**.

1. Di tab **Ubah peran eksekusi default**, lakukan hal berikut:

   1. Perluas tab, lalu pilih **Gunakan peran yang ada**.

   1. Pilih yang `AWSDocumentDBLambdaExecutionRole` Anda buat sebelumnya.

1. Pilih **Buat fungsi**.

**Untuk menyebarkan kode fungsi**

1. Pilih tab **Python** di kotak berikut dan salin kodenya.

------
#### [ .NET ]

**SDK untuk .NET**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-docdb-to-lambda). 
Mengkonsumsi acara Amazon DocumentDB dengan Lambda menggunakan.NET.  

   ```
   using Amazon.Lambda.Core;
   using System.Text.Json;
   using System;
   using System.Collections.Generic;
   using System.Text.Json.Serialization;
   //Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
   [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
   
   namespace LambdaDocDb;
   
   public class Function
   {
       
        /// <summary>
       /// Lambda function entry point to process Amazon DocumentDB events.
       /// </summary>
       /// <param name="event">The Amazon DocumentDB event.</param>
       /// <param name="context">The Lambda context object.</param>
       /// <returns>A string to indicate successful processing.</returns>
       public string FunctionHandler(Event evnt, ILambdaContext context)
       {
           
           foreach (var record in evnt.Events)
           {
               ProcessDocumentDBEvent(record, context);
           }
   
           return "OK";
       }
   
        private void ProcessDocumentDBEvent(DocumentDBEventRecord record, ILambdaContext context)
       {
           
           var eventData = record.Event;
           var operationType = eventData.OperationType;
           var databaseName = eventData.Ns.Db;
           var collectionName = eventData.Ns.Coll;
           var fullDocument = JsonSerializer.Serialize(eventData.FullDocument, new JsonSerializerOptions { WriteIndented = true });
   
           context.Logger.LogLine($"Operation type: {operationType}");
           context.Logger.LogLine($"Database: {databaseName}");
           context.Logger.LogLine($"Collection: {collectionName}");
           context.Logger.LogLine($"Full document:\n{fullDocument}");
       }
   
   
   
       public class Event
       {
           [JsonPropertyName("eventSourceArn")]
           public string EventSourceArn { get; set; }
   
           [JsonPropertyName("events")]
           public List<DocumentDBEventRecord> Events { get; set; }
   
           [JsonPropertyName("eventSource")]
           public string EventSource { get; set; }
       }
   
       public class DocumentDBEventRecord
       {
           [JsonPropertyName("event")]
           public EventData Event { get; set; }
       }
   
       public class EventData
       {
           [JsonPropertyName("_id")]
           public IdData Id { get; set; }
   
           [JsonPropertyName("clusterTime")]
           public ClusterTime ClusterTime { get; set; }
   
           [JsonPropertyName("documentKey")]
           public DocumentKey DocumentKey { get; set; }
   
           [JsonPropertyName("fullDocument")]
           public Dictionary<string, object> FullDocument { get; set; }
   
           [JsonPropertyName("ns")]
           public Namespace Ns { get; set; }
   
           [JsonPropertyName("operationType")]
           public string OperationType { get; set; }
       }
   
       public class IdData
       {
           [JsonPropertyName("_data")]
           public string Data { get; set; }
       }
   
       public class ClusterTime
       {
           [JsonPropertyName("$timestamp")]
           public Timestamp Timestamp { get; set; }
       }
   
       public class Timestamp
       {
           [JsonPropertyName("t")]
           public long T { get; set; }
   
           [JsonPropertyName("i")]
           public int I { get; set; }
       }
   
       public class DocumentKey
       {
           [JsonPropertyName("_id")]
           public Id Id { get; set; }
       }
   
       public class Id
       {
           [JsonPropertyName("$oid")]
           public string Oid { get; set; }
       }
   
       public class Namespace
       {
           [JsonPropertyName("db")]
           public string Db { get; set; }
   
           [JsonPropertyName("coll")]
           public string Coll { get; set; }
       }
   }
   ```

------
#### [ Go ]

**SDK untuk Go V2**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-docdb-to-lambda). 
Mengkonsumsi acara Amazon DocumentDB dengan Lambda menggunakan Go.  

   ```
   package main
   
   import (
   	"context"
   	"encoding/json"
   	"fmt"
   
   	"github.com/aws/aws-lambda-go/lambda"
   )
   
   type Event struct {
   	Events []Record `json:"events"`
   }
   
   type Record struct {
   	Event struct {
   		OperationType string `json:"operationType"`
   		NS            struct {
   			DB   string `json:"db"`
   			Coll string `json:"coll"`
   		} `json:"ns"`
   		FullDocument interface{} `json:"fullDocument"`
   	} `json:"event"`
   }
   
   func main() {
   	lambda.Start(handler)
   }
   
   func handler(ctx context.Context, event Event) (string, error) {
   	fmt.Println("Loading function")
   	for _, record := range event.Events {
   		logDocumentDBEvent(record)
   	}
   
   	return "OK", nil
   }
   
   func logDocumentDBEvent(record Record) {
   	fmt.Printf("Operation type: %s\n", record.Event.OperationType)
   	fmt.Printf("db: %s\n", record.Event.NS.DB)
   	fmt.Printf("collection: %s\n", record.Event.NS.Coll)
   	docBytes, _ := json.MarshalIndent(record.Event.FullDocument, "", "  ")
   	fmt.Printf("Full document: %s\n", string(docBytes))
   }
   ```

------
#### [ Java ]

**SDK untuk Java 2.x**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-docdb-to-lambda). 
Mengkonsumsi acara Amazon DocumentDB dengan Lambda menggunakan Java.  

   ```
   import java.util.List;
   import java.util.Map;
   
   import com.amazonaws.services.lambda.runtime.Context;
   import com.amazonaws.services.lambda.runtime.RequestHandler;
   
   public class Example implements RequestHandler<Map<String, Object>, String> {
   
       @SuppressWarnings("unchecked")
       @Override
       public String handleRequest(Map<String, Object> event, Context context) {
           List<Map<String, Object>> events = (List<Map<String, Object>>) event.get("events");
           for (Map<String, Object> record : events) {
               Map<String, Object> eventData = (Map<String, Object>) record.get("event");
               processEventData(eventData);
           }
   
           return "OK";
       }
   
       @SuppressWarnings("unchecked")
       private void processEventData(Map<String, Object> eventData) {
           String operationType = (String) eventData.get("operationType");
           System.out.println("operationType: %s".formatted(operationType));
   
           Map<String, Object> ns = (Map<String, Object>) eventData.get("ns");
   
           String db = (String) ns.get("db");
           System.out.println("db: %s".formatted(db));
           String coll = (String) ns.get("coll");
           System.out.println("coll: %s".formatted(coll));
   
           Map<String, Object> fullDocument = (Map<String, Object>) eventData.get("fullDocument");
           System.out.println("fullDocument: %s".formatted(fullDocument));
       }
   
   }
   ```

------
#### [ JavaScript ]

**SDK untuk JavaScript (v3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-docdb-to-lambda). 
Mengkonsumsi acara Amazon DocumentDB dengan menggunakan Lambda. JavaScript  

   ```
   console.log('Loading function');
   exports.handler = async (event, context) => {
       event.events.forEach(record => {
           logDocumentDBEvent(record);
       });
       return 'OK';
   };
   
   const logDocumentDBEvent = (record) => {
       console.log('Operation type: ' + record.event.operationType);
       console.log('db: ' + record.event.ns.db);
       console.log('collection: ' + record.event.ns.coll);
       console.log('Full document:', JSON.stringify(record.event.fullDocument, null, 2));
   };
   ```
Mengkonsumsi acara Amazon DocumentDB dengan Lambda menggunakan TypeScript  

   ```
   import { DocumentDBEventRecord, DocumentDBEventSubscriptionContext } from 'aws-lambda';
   
   console.log('Loading function');
   
   export const handler = async (
     event: DocumentDBEventSubscriptionContext,
     context: any
   ): Promise<string> => {
     event.events.forEach((record: DocumentDBEventRecord) => {
       logDocumentDBEvent(record);
     });
     return 'OK';
   };
   
   const logDocumentDBEvent = (record: DocumentDBEventRecord): void => {
     console.log('Operation type: ' + record.event.operationType);
     console.log('db: ' + record.event.ns.db);
     console.log('collection: ' + record.event.ns.coll);
     console.log('Full document:', JSON.stringify(record.event.fullDocument, null, 2));
   };
   ```

------
#### [ PHP ]

**SDK untuk PHP**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-docdb-to-lambda). 
Mengkonsumsi acara Amazon DocumentDB dengan Lambda menggunakan PHP.  

   ```
   <?php
   
   require __DIR__.'/vendor/autoload.php';
   
   use Bref\Context\Context;
   use Bref\Event\Handler;
   
   class DocumentDBEventHandler implements Handler
   {
       public function handle($event, Context $context): string
       {
   
           $events = $event['events'] ?? [];
           foreach ($events as $record) {
               $this->logDocumentDBEvent($record['event']);
           }
           return 'OK';
       }
   
       private function logDocumentDBEvent($event): void
       {
           // Extract information from the event record
   
           $operationType = $event['operationType'] ?? 'Unknown';
           $db = $event['ns']['db'] ?? 'Unknown';
           $collection = $event['ns']['coll'] ?? 'Unknown';
           $fullDocument = $event['fullDocument'] ?? [];
   
           // Log the event details
   
           echo "Operation type: $operationType\n";
           echo "Database: $db\n";
           echo "Collection: $collection\n";
           echo "Full document: " . json_encode($fullDocument, JSON_PRETTY_PRINT) . "\n";
       }
   }
   return new DocumentDBEventHandler();
   ```

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

**SDK untuk Python (Boto3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-docdb-to-lambda). 
Mengkonsumsi acara Amazon DocumentDB dengan Lambda menggunakan Python.  

   ```
   import json
   
   def lambda_handler(event, context):
       for record in event.get('events', []):
           log_document_db_event(record)
       return 'OK'
   
   def log_document_db_event(record):
       event_data = record.get('event', {})
       operation_type = event_data.get('operationType', 'Unknown')
       db = event_data.get('ns', {}).get('db', 'Unknown')
       collection = event_data.get('ns', {}).get('coll', 'Unknown')
       full_document = event_data.get('fullDocument', {})
   
       print(f"Operation type: {operation_type}")
       print(f"db: {db}")
       print(f"collection: {collection}")
       print("Full document:", json.dumps(full_document, indent=2))
   ```

------
#### [ Ruby ]

**SDK untuk Ruby**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-docdb-to-lambda). 
Mengkonsumsi acara Amazon DocumentDB dengan Lambda menggunakan Ruby.  

   ```
   require 'json'
   
   def lambda_handler(event:, context:)
     event['events'].each do |record|
       log_document_db_event(record)
     end
     'OK'
   end
   
   def log_document_db_event(record)
     event_data = record['event'] || {}
     operation_type = event_data['operationType'] || 'Unknown'
     db = event_data.dig('ns', 'db') || 'Unknown'
     collection = event_data.dig('ns', 'coll') || 'Unknown'
     full_document = event_data['fullDocument'] || {}
   
     puts "Operation type: #{operation_type}"
     puts "db: #{db}"
     puts "collection: #{collection}"
     puts "Full document: #{JSON.pretty_generate(full_document)}"
   end
   ```

------
#### [ Rust ]

**SDK for Rust**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-docdb-to-lambda). 
Mengkonsumsi acara Amazon DocumentDB dengan Lambda menggunakan Rust.  

   ```
   use lambda_runtime::{service_fn, tracing, Error, LambdaEvent};
   use aws_lambda_events::{
       event::documentdb::{DocumentDbEvent, DocumentDbInnerEvent},
      };
   
   
   // Built with the following dependencies:
   //lambda_runtime = "0.11.1"
   //serde_json = "1.0"
   //tokio = { version = "1", features = ["macros"] }
   //tracing = { version = "0.1", features = ["log"] }
   //tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt"] }
   //aws_lambda_events = "0.15.0"
   
   async fn function_handler(event: LambdaEvent<DocumentDbEvent>) ->Result<(), Error> {
       
       tracing::info!("Event Source ARN: {:?}", event.payload.event_source_arn);
       tracing::info!("Event Source: {:?}", event.payload.event_source);
     
       let records = &event.payload.events;
      
       if records.is_empty() {
           tracing::info!("No records found. Exiting.");
           return Ok(());
       }
   
       for record in records{
           log_document_db_event(record);
       }
   
       tracing::info!("Document db records processed");
   
       // Prepare the response
       Ok(())
   
   }
   
   fn log_document_db_event(record: &DocumentDbInnerEvent)-> Result<(), Error>{
       tracing::info!("Change Event: {:?}", record.event);
       
       Ok(())
   
   }
   
   #[tokio::main]
   async fn main() -> Result<(), Error> {
       tracing_subscriber::fmt()
       .with_max_level(tracing::Level::INFO)
       .with_target(false)
       .without_time()
       .init();
   
       let func = service_fn(function_handler);
       lambda_runtime::run(func).await?;
       Ok(())
       
   }
   ```

------

1. Di panel **Sumber kode** di konsol Lambda, tempelkan kode ke editor kode, ganti kode yang dibuat Lambda.

1. Di bagian **DEPLOY**, pilih **Deploy** untuk memperbarui kode fungsi Anda:  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

## Buat pemetaan sumber acara Lambda
<a name="docdb-create-the-lambda-event-source-mapping"></a>

 Buat pemetaan sumber peristiwa yang mengaitkan aliran perubahan Amazon DocumentDB Anda dengan fungsi Lambda Anda. Setelah Anda membuat pemetaan sumber acara ini, AWS Lambda segera mulai polling aliran. 

**Untuk membuat pemetaan sumber acara**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih `ProcessDocumentDBRecords` fungsi yang Anda buat sebelumnya.

1. Pilih tab **Konfigurasi**, lalu pilih **Pemicu** di menu sebelah kiri.

1. Pilih **Tambahkan pemicu**.

1. Di bawah **konfigurasi Trigger**, untuk sumbernya, pilih **Amazon DocumentDB**.

1. Buat pemetaan sumber acara dengan konfigurasi berikut:
   + Cluster **Amazon DocumentDB**: Pilih cluster yang Anda buat sebelumnya.
   + **Nama database**: docdbdemo
   + **Nama koleksi**: produk
   + **Ukuran Batch**: 1
   + **Posisi awal**: Terbaru
   + **Otentikasi: BASIC\$1AUTH**
   + **Kunci Secrets Manager**: Pilih rahasia untuk cluster Amazon DocumentDB Anda. Itu akan disebut sesuatu seperti`rds!cluster-12345678-a6f0-52c0-b290-db4aga89274f`.
   + **Jendela Batch**: 1
   + **Konfigurasi dokumen lengkap**: UpdateLookup

1. Pilih **Tambahkan**. Membuat pemetaan sumber acara Anda dapat memakan waktu beberapa menit.

## Uji fungsi Anda
<a name="docdb-test-insert"></a>

Tunggu pemetaan sumber acara mencapai status **Diaktifkan**. Ini dapat memakan waktu beberapa menit. Kemudian, uji end-to-end pengaturan dengan memasukkan, memperbarui, dan menghapus catatan database. Sebelum Anda memulai:

1. [Sambungkan kembali ke cluster Amazon DocumentDB di lingkungan Anda](#docdb-connect-to-cluster). CloudShell 

1. Jalankan perintah berikut untuk memastikan bahwa Anda menggunakan `docdbdemo` database:

   ```
   use docdbdemo
   ```

### Menyisipkan catatan
<a name="docdb-test-insert"></a>

Masukkan catatan ke dalam `products` koleksi `docdbdemo` database:

```
db.products.insertOne({"name":"Pencil", "price": 1.00})
```

Verifikasi bahwa fungsi Anda berhasil memproses peristiwa ini dengan [memeriksa CloudWatch Log](monitoring-cloudwatchlogs-view.md#monitoring-cloudwatchlogs-console). Anda akan melihat entri log seperti ini:

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/documentdb-insert-log.png)


### Perbarui catatan
<a name="docdb-test-update"></a>

Perbarui catatan yang baru saja Anda masukkan dengan perintah berikut:

```
db.products.updateOne(
    { "name": "Pencil" },
    { $set: { "price": 0.50 }}
)
```

Verifikasi bahwa fungsi Anda berhasil memproses peristiwa ini dengan [memeriksa CloudWatch Log](monitoring-cloudwatchlogs-view.md#monitoring-cloudwatchlogs-console). Anda akan melihat entri log seperti ini:

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/documentdb-update-log.png)


### Hapus catatan
<a name="docdb-test-delete"></a>

Hapus catatan yang baru saja Anda perbarui dengan perintah berikut:

```
db.products.deleteOne( { "name": "Pencil" } )
```

Verifikasi bahwa fungsi Anda berhasil memproses peristiwa ini dengan [memeriksa CloudWatch Log](monitoring-cloudwatchlogs-view.md#monitoring-cloudwatchlogs-console). Anda akan melihat entri log seperti ini:

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/documentdb-delete-log.png)


## Pemecahan masalah
<a name="docdb-lambda-troubleshooting"></a>

Jika Anda tidak melihat peristiwa database apa pun di CloudWatch log fungsi Anda, periksa hal berikut:
+ **Pastikan bahwa pemetaan sumber peristiwa Lambda (juga dikenal sebagai pemicu) dalam status Diaktifkan.** Pemetaan sumber acara dapat memakan waktu beberapa menit untuk dibuat.
+ Jika pemetaan sumber peristiwa **Diaktifkan** tetapi Anda masih tidak melihat peristiwa database di CloudWatch:
  + Pastikan bahwa **nama Database** dalam pemetaan sumber peristiwa diatur ke`docdbdemo`.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/documentdb-trigger.png)
  + Periksa bidang pemetaan sumber peristiwa **Hasil pemrosesan terakhir** untuk pesan berikut “MASALAH: Kesalahan koneksi. VPC Anda harus dapat terhubung ke Lambda dan STS, serta Secrets Manager jika diperlukan otentikasi. Jika Anda melihat kesalahan ini, pastikan Anda [membuat titik akhir antarmuka VPC Lambda dan Secrets Manager, dan titik akhir menggunakan VPC](#docdb-create-interface-vpc-endpoints) dan subnet yang sama dengan yang digunakan cluster Amazon DocumentDB Anda.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/documentdb-lastprocessingresult.png)

## Bersihkan sumber daya Anda
<a name="docdb-cleanup"></a>

 Sekarang Anda dapat menghapus sumber daya yang Anda buat untuk tutorial ini, kecuali Anda ingin mempertahankannya. Dengan menghapus sumber daya AWS yang tidak lagi Anda gunakan, Anda mencegah biaya yang tidak perlu untuk Akun AWS Anda. 

**Untuk menghapus fungsi Lambda**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi yang Anda buat.

1. Pilih **Tindakan**, **Hapus**.

1. Ketik **confirm** kolom input teks dan pilih **Hapus**.

**Untuk menghapus peran eksekusi**

1. Buka [halaman Peran](https://console.aws.amazon.com/iam/home#/roles) dari konsol IAM.

1. Pilih peran eksekusi yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan nama peran di bidang input teks dan pilih **Hapus**.

**Untuk menghapus titik akhir VPC**

1. Buka konsol [VPC](https://console.aws.amazon.com/vpc/home#). Di menu sebelah kiri, di bawah **Virtual Private Cloud**, pilih **Endpoints**.

1. Pilih titik akhir yang Anda buat.

1. Pilih **Tindakan**, **Hapus titik akhir VPC**.

1. Masukkan **delete** di bidang input teks.

1. Pilih **Hapus**.

**Untuk menghapus cluster Amazon DocumentDB**

1. Buka konsol [Amazon DocumentDB](https://console.aws.amazon.com/docdb/home#).

1. Pilih cluster Amazon DocumentDB yang Anda buat untuk tutorial ini, dan nonaktifkan perlindungan penghapusan.

1. Di halaman utama **Clusters**, pilih kembali cluster Amazon DocumentDB Anda.

1. Pilih **Tindakan**, **Hapus**.

1. Untuk **Buat snapshot klaster akhir**, pilih **No**.

1. Masukkan **delete** di bidang input teks.

1. Pilih **Hapus**.

**Untuk menghapus rahasia di Secrets Manager**

1. Buka konsol [Secrets Manager](https://console.aws.amazon.com/secretsmanager/home#).

1. Pilih rahasia yang Anda buat untuk tutorial ini.

1. Pilih **Tindakan**, **Hapus rahasia**.

1. Pilih **Jadwalkan penghapusan**.

# Menggunakan AWS Lambda dengan Amazon DynamoDB
<a name="with-ddb"></a>

**catatan**  
[Jika Anda ingin mengirim data ke target selain fungsi Lambda atau memperkaya data sebelum mengirimnya, lihat Amazon Pipes. EventBridge ](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes.html)

Anda dapat menggunakan AWS Lambda fungsi untuk memproses catatan dalam aliran [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html). Dengan DynamoDB Streams, Anda dapat memicu fungsi Lambda untuk melakukan pekerjaan tambahan setiap kali tabel DynamoDB diperbarui.

Saat memproses aliran DynamoDB, Anda perlu menerapkan logika respons batch sebagian untuk mencegah catatan yang berhasil diproses dicoba ulang ketika beberapa catatan dalam batch gagal. [Utilitas Batch Processor](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/) dari Powertools for AWS Lambda tersedia dalam Python TypeScript,, .NET, dan Java dan menyederhanakan implementasi ini dengan secara otomatis menangani logika respons batch sebagian, mengurangi waktu pengembangan dan meningkatkan keandalan.

**Topics**
+ [

## Polling dan batching stream
](#dynamodb-polling-and-batching)
+ [

## Posisi awal polling dan streaming
](#dyanmo-db-stream-poll)
+ [

## Pembaca serpihan secara bersamaan di DynamoDB Streams
](#events-dynamodb-simultaneous-readers)
+ [

## Contoh peristiwa
](#events-sample-dynamodb)
+ [

# Memproses catatan DynamoDB dengan Lambda
](services-dynamodb-eventsourcemapping.md)
+ [

# Mengkonfigurasi respons batch sebagian dengan DynamoDB dan Lambda
](services-ddb-batchfailurereporting.md)
+ [

# Menyimpan catatan yang dibuang untuk sumber peristiwa DynamoDB di Lambda
](services-dynamodb-errors.md)
+ [

# Menerapkan pemrosesan aliran DynamoDB stateful di Lambda
](services-ddb-windows.md)
+ [

# Parameter Lambda untuk pemetaan sumber peristiwa Amazon DynamoDB
](services-ddb-params.md)
+ [

# Menggunakan pemfilteran acara dengan sumber acara DynamoDB
](with-ddb-filtering.md)
+ [

# Tutorial: Menggunakan AWS Lambda dengan aliran Amazon DynamoDB
](with-ddb-example.md)

## Polling dan batching stream
<a name="dynamodb-polling-and-batching"></a>

Lambda melakukan polling shard dalam aliran DynamoDB untuk catatan dengan tingkat dasar sebanyak 4 kali per detik. Saat rekaman tersedia, Lambda memanggil fungsi Anda dan menunggu hasilnya. Jika pemrosesan berhasil, Lambda melanjutkan polling sampai menerima lebih banyak catatan.

Secara default, Lambda memanggil fungsi Anda segera setelah catatan tersedia. Jika batch yang dibaca Lambda dari sumber peristiwa hanya memiliki satu catatan di dalamnya, Lambda hanya mengirimkan satu catatan ke fungsi tersebut. *Untuk menghindari menjalankan fungsi dengan sejumlah kecil catatan, Anda dapat memberi tahu sumber acara untuk menyangga catatan hingga 5 menit dengan mengonfigurasi jendela batching.* Sebelum menjalankan fungsi, Lambda terus membaca catatan dari sumber acara hingga mengumpulkan batch penuh, jendela batching kedaluwarsa, atau batch mencapai batas muatan 6 MB. Untuk informasi selengkapnya, lihat [Perilaku batching](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching).

**Awas**  
Pemetaan sumber peristiwa Lambda memproses setiap peristiwa setidaknya sekali, dan pemrosesan duplikat catatan dapat terjadi. Untuk menghindari potensi masalah yang terkait dengan duplikat peristiwa, kami sangat menyarankan agar Anda membuat kode fungsi Anda idempoten. Untuk mempelajari lebih lanjut, lihat [Bagaimana cara membuat fungsi Lambda saya idempoten](https://repost.aws/knowledge-center/lambda-function-idempotent) di Pusat Pengetahuan. AWS 

Lambda tidak menunggu [ekstensi](lambda-extensions.md) yang dikonfigurasi selesai sebelum mengirim batch berikutnya untuk diproses. Dengan kata lain, ekstensi Anda dapat terus berjalan saat Lambda memproses kumpulan catatan berikutnya. Hal ini dapat menyebabkan masalah pembatasan jika Anda melanggar pengaturan atau [batasan konkurensi](lambda-concurrency.md) akun Anda. Untuk mendeteksi apakah ini merupakan masalah potensial, pantau fungsi Anda dan periksa apakah Anda melihat [metrik konkurensi](monitoring-concurrency.md#general-concurrency-metrics) yang lebih tinggi dari yang diharapkan untuk pemetaan sumber peristiwa Anda. Karena waktu yang singkat di antara pemanggilan, Lambda mungkin secara singkat melaporkan penggunaan konkurensi yang lebih tinggi daripada jumlah pecahan. Ini bisa benar bahkan untuk fungsi Lambda tanpa ekstensi.

Konfigurasikan [ ParallelizationFactor](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-ParallelizationFactor)pengaturan untuk memproses satu pecahan aliran DynamoDB dengan lebih dari satu pemanggilan Lambda secara bersamaan. Anda dapat menentukan jumlah batch bersamaan yang polling-nya dibuat Lambda dari shard melalui faktor paralelisasi mulai dari 1 (default) hingga 10. Misalnya, saat Anda menyetel `ParallelizationFactor` ke 2, Anda dapat memiliki maksimum 200 pemanggilan Lambda bersamaan untuk memproses 100 pecahan aliran DynamoDB (meskipun dalam praktiknya, Anda mungkin melihat nilai yang berbeda untuk metrik). `ConcurrentExecutions` Hal ini membantu meningkatkan skala throughput pemrosesan ketika volume data tidak stabil dan [IteratorAge](monitoring-metrics-types.md#performance-metrics) tinggi. Saat Anda meningkatkan jumlah batch bersamaan per pecahan, Lambda masih memastikan pemrosesan dalam urutan pada level item (partisi dan kunci sortir).

## Posisi awal polling dan streaming
<a name="dyanmo-db-stream-poll"></a>

Ketahuilah bahwa polling streaming selama pembuatan dan pembaruan pemetaan sumber acara pada akhirnya konsisten.
+ Selama pembuatan pemetaan sumber acara, mungkin diperlukan beberapa menit untuk memulai acara polling dari aliran.
+ Selama pembaruan pemetaan sumber acara, mungkin diperlukan beberapa menit untuk menghentikan dan memulai kembali acara pemungutan suara dari aliran.

Perilaku ini berarti bahwa jika Anda menentukan `LATEST` sebagai posisi awal untuk aliran, pemetaan sumber peristiwa dapat melewatkan peristiwa selama pembuatan atau pembaruan. Untuk memastikan tidak ada peristiwa yang terlewatkan, tentukan posisi awal aliran sebagai`TRIM_HORIZON`.

## Pembaca serpihan secara bersamaan di DynamoDB Streams
<a name="events-dynamodb-simultaneous-readers"></a>

Untuk tabel Single-region yang bukan tabel global, Anda dapat mendesain hingga dua fungsi Lambda untuk dibaca dari pecahan DynamoDB Streams yang sama secara bersamaan. Melebihi batas ini dapat mengakibatkan throttling permintaan. Untuk tabel global, kami sarankan Anda membatasi jumlah fungsi simultan menjadi satu untuk menghindari pembatasan permintaan.

## Contoh peristiwa
<a name="events-sample-dynamodb"></a>

**Example**  

```
{
  "Records": [
    {
      "eventID": "1",
      "eventVersion": "1.0",
      "dynamodb": {
        "Keys": {
          "Id": {
            "N": "101"
          }
        },
        "NewImage": {
          "Message": {
            "S": "New item!"
          },
          "Id": {
            "N": "101"
          }
        },
        "StreamViewType": "NEW_AND_OLD_IMAGES",
        "SequenceNumber": "111",
        "SizeBytes": 26
      },
      "awsRegion": "us-west-2",
      "eventName": "INSERT",
      "eventSourceARN": "arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2024-06-10T19:26:16.525",
      "eventSource": "aws:dynamodb"
    },
    {
      "eventID": "2",
      "eventVersion": "1.0",
      "dynamodb": {
        "OldImage": {
          "Message": {
            "S": "New item!"
          },
          "Id": {
            "N": "101"
          }
        },
        "SequenceNumber": "222",
        "Keys": {
          "Id": {
            "N": "101"
          }
        },
        "SizeBytes": 59,
        "NewImage": {
          "Message": {
            "S": "This item has changed"
          },
          "Id": {
            "N": "101"
          }
        },
        "StreamViewType": "NEW_AND_OLD_IMAGES"
      },
      "awsRegion": "us-west-2",
      "eventName": "MODIFY",
      "eventSourceARN": "arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2024-06-10T19:26:16.525",
      "eventSource": "aws:dynamodb"
    }
  ]}
```

# Memproses catatan DynamoDB dengan Lambda
<a name="services-dynamodb-eventsourcemapping"></a>

Buat pemetaan sumber kejadian untuk memberi tahu Lambda agar mengirim rekaman dari aliran Anda ke fungsi Lambda. Anda dapat membuat beberapa pemetaan sumber kejadian untuk memproses data yang sama dengan beberapa fungsi Lambda, atau untuk memproses item dari beberapa aliran dengan satu fungsi.

Anda dapat mengonfigurasi pemetaan sumber peristiwa untuk memproses catatan dari aliran yang berbeda. Akun AWS Untuk mempelajari selengkapnya, lihat [Membuat pemetaan sumber peristiwa lintas akun](#services-dynamodb-eventsourcemapping-cross-account).

**Untuk mengonfigurasi fungsi agar dibaca dari DynamoDB Streams, lampirkan AWSLambda kebijakan terkelola AWS Peran [DBExecutionDynamo ke peran eksekusi](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaDynamoDBExecutionRole.html), lalu buat pemicu DynamoDB.**

**Untuk menambahkan izin dan membuat pemicu**

1. Buka [Halaman fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih nama sebuah fungsi.

1. Pilih tab **Konfigurasi**, lalu pilih **Izin**.

1. Di bawah **Nama peran**, pilih tautan ke peran eksekusi Anda. Tautan ini membuka peran di konsol IAM.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/execution-role.png)

1. Pilih **Tambahkan izin**, lalu pilih **Lampirkan kebijakan**.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/attach-policies.png)

1. Di bidang pencarian, masukkan`AWSLambdaDynamoDBExecutionRole`. Tambahkan kebijakan ini ke peran eksekusi Anda. Ini adalah kebijakan AWS terkelola yang berisi izin yang perlu dibaca fungsi Anda dari aliran DynamoDB. Untuk informasi selengkapnya tentang kebijakan ini, lihat [DBExecutionPeran AWSLambda Dynamo](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaDynamoDBExecutionRole.html) di *Referensi Kebijakan AWS Terkelola*.

1. Kembali ke fungsi Anda di konsol Lambda. Di bagian **Gambaran umum fungsi**, pilih **Tambah pemicu**.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/add-trigger.png)

1. Pilih jenis pemicu.

1. Konfigurasikan opsi yang diperlukan, lalu pilih **Tambah**.

Lambda mendukung opsi berikut untuk sumber acara DynamoDB:

**Opsi sumber kejadian**
+ **Tabel DynamoDB** – Tabel DynamoDB tempat untuk membaca catatan.
+ **Ukuran batch** – Jumlah rekaman yang akan dikirimkan ke fungsi dalam setiap batch, paling banyak 10.000. Lambda meneruskan semua rekaman dalam batch ke fungsi dalam satu panggilan, selama ukuran total kejadian tidak melebihi [batas payload](gettingstarted-limits.md) untuk invokasi sinkron (6 MB).
+ **Jendela batch** – Tentukan jumlah waktu maksimum untuk mengumpulkan rekaman sebelum memanggil fungsi, dalam hitungan detik.
+ **Posisi mulai** – Hanya memproses rekaman baru, atau semua rekaman yang ada.
  + **Terbaru** – Memproses rekaman baru yang ditambahkan ke stream.
  + **Trim horizon** – Memproses semua rekaman dalam aliran.

  Setelah memproses rekaman yang sudah ada, fungsi berhenti dan melanjutkan memproses rekaman baru.
+ **Tujuan kegagalan** — Antrian SQS standar atau topik SNS standar untuk catatan yang tidak dapat diproses. Ketika Lambda membuang sekumpulan catatan yang terlalu tua atau telah kehabisan semua percobaan ulang, Lambda mengirimkan detail tentang batch ke antrian atau topik.
+ **Percobaan ulang** – Jumlah maksimum percobaan ulang Lambda saat fungsi memunculkan kesalahan. Hal ini tidak berlaku untuk kesalahan layanan atau pembatasan di mana batch tidak mencapai fungsi.
+ **Maximum age of record** – Usia maksimum rekaman yang dikirimkan Lambda ke fungsi Anda.
+ **Split batch on error** – Ketika fungsi mengembalikan kesalahan, bagi batch menjadi dua bagian sebelum mencoba kembali. Pengaturan ukuran batch asli Anda tetap tidak berubah.
+ **Batch bersamaan per pecahan** — Secara bersamaan memproses beberapa batch dari pecahan yang sama.
+ **Diaktifkan** – Atur ke true untuk mengaktifkan pemetaan sumber kejadian. Atur ke false untuk menghentikan pemrosesan rekaman. Lambda mencatat rekaman terakhir yang diproses dan melanjutkan pemrosesan dari titik tersebut saat pemetaan diaktifkan kembali.

**catatan**  
Anda tidak dikenakan biaya untuk panggilan GetRecords API yang dipanggil oleh Lambda sebagai bagian dari pemicu DynamoDB.

Untuk mengelola konfigurasi sumber kejadian nanti, pilih pemicu di desainer.

## Membuat pemetaan sumber peristiwa lintas akun
<a name="services-dynamodb-eventsourcemapping-cross-account"></a>

[Amazon DynamoDB sekarang mendukung kebijakan berbasis sumber daya.](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/access-control-resource-based.html) Dengan kemampuan ini, Anda dapat memproses data dari aliran DynamoDB menjadi satu Akun AWS dengan fungsi Lambda di akun lain.

Untuk membuat pemetaan sumber peristiwa untuk fungsi Lambda menggunakan aliran DynamoDB di tempat Akun AWS lain, Anda harus mengonfigurasi aliran menggunakan kebijakan berbasis sumber daya untuk memberikan izin fungsi Lambda Anda untuk membaca catatan. *Untuk mempelajari cara mengonfigurasi streaming untuk akses lintas akun, lihat [Berbagi akses dengan fungsi Lambda lintas](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/rbac-cross-account-access.html#rbac-analyze-cross-account-lambda-access) akun di Panduan Pengembang Amazon DynamoDB.*

Setelah mengonfigurasi streaming Anda dengan kebijakan berbasis sumber daya yang memberi fungsi Lambda Anda izin yang diperlukan, buat pemetaan sumber peristiwa dengan ARN aliran lintas akun Anda. Anda dapat menemukan ARN streaming di bawah tab **Ekspor dan aliran** tabel di konsol DynamoDB lintas akun. 

Saat menggunakan konsol Lambda, rekatkan ARN aliran langsung ke bidang input tabel DynamoDB di halaman pembuatan pemetaan sumber peristiwa.

 **Catatan:** Pemicu lintas wilayah tidak didukung. 

# Mengkonfigurasi respons batch sebagian dengan DynamoDB dan Lambda
<a name="services-ddb-batchfailurereporting"></a>

Ketika menggunakan dan memproses data streaming dari sumber peristiwa, secara default Lambda memeriksa urutan nomor tertinggi batch hanya ketika batch berhasil diselesaikan. Lambda memperlakukan semua hasil lain sebagai sepenuhnya gagal dan mencoba lagi pemrosesan batch hingga batas coba lagi. Untuk memungkinkan keberhasilan parsial saat memproses batch dari aliran, aktifkan `ReportBatchItemFailures`. Mengizinkan keberhasilan parsial dapat membantu mengurangi jumlah percobaan ulang pada catatan, meskipun tidak sepenuhnya mencegah kemungkinan percobaan ulang dalam catatan yang sukses.

Untuk mengaktifkan `ReportBatchItemFailures`, masukkan nilai enum **ReportBatchItemFailures** dalam daftar [FunctionResponseTypes](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-FunctionResponseTypes). Daftar ini menunjukkan tipe respon yang diaktifkan untuk fungsi Anda. Anda dapat mengonfigurasi daftar ini saat [membuat](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) atau [memperbarui](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html) pemetaan sumber peristiwa.

**catatan**  
Bahkan ketika kode fungsi Anda mengembalikan respons kegagalan sebagian batch, respons ini tidak akan diproses oleh Lambda kecuali `ReportBatchItemFailures` fitur tersebut diaktifkan secara eksplisit untuk pemetaan sumber acara Anda.

## Sintaks laporan
<a name="streams-batchfailurereporting-syntax"></a>

Saat mengonfigurasi pelaporan pada kegagalan item batch, kelas `StreamsEventResponse` dikembalikan dengan daftar kegagalan item batch. Anda dapat menggunakan objek `StreamsEventResponse` untuk mengembalikan nomor urutan catatan gagal pertama dalam batch. Anda juga dapat membuat kelas kustom Anda sendiri menggunakan sintaks respons yang benar. Struktur JSON berikut menunjukkan sintaks respons yang diperlukan:

```
{ 
  "batchItemFailures": [ 
        {
            "itemIdentifier": "<SequenceNumber>"
        }
    ]
}
```

**catatan**  
Jika `batchItemFailures` array berisi beberapa item, Lambda menggunakan catatan dengan nomor urut terendah sebagai pos pemeriksaan. Lambda kemudian mencoba kembali semua catatan mulai dari pos pemeriksaan itu.

## Status berhasil dan gagal
<a name="streams-batchfailurereporting-conditions"></a>

Lambda memperlakukan batch sebagai sepenuhnya berhasil jika Anda mengembalikan salah satu dari berikut:
+ Daftar `batchItemFailure` kosong
+ Daftar `batchItemFailure` nol
+ `EventResponse` kosong
+ `EventResponse` nol

Lambda memperlakukan batch sebagai sepenuhnya gagal jika Anda mengembalikan salah satu dari berikut:
+ String `itemIdentifier` kosong
+ `itemIdentifier` nol
+ `itemIdentifier` dengan nama kunci yang buruk

Lambda mencoba kembali kegagalan berdasarkan strategi coba lagi Anda.

## Membagi batch
<a name="streams-batchfailurereporting-bisect"></a>

Jika invokasi Anda gagal dan `BisectBatchOnFunctionError` diaktifkan, batch dibagi terlepas dari pengaturan `ReportBatchItemFailures` Anda.

Ketika respons berhasil batch parsial diterima dan kedua `BisectBatchOnFunctionError` dan `ReportBatchItemFailures` diaktifkan, batch dibagi dua di nomor urutan yang dikembalikan dan Lambda mencoba hanya catatan yang tersisa.

Untuk menyederhanakan implementasi logika respons batch sebagian, pertimbangkan untuk menggunakan [utilitas Prosesor Batch](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/) dari Powertools untuk AWS Lambda, yang secara otomatis menangani kompleksitas ini untuk Anda.

Berikut adalah beberapa contoh kode fungsi yang mengembalikan daftar pesan gagal IDs dalam batch:

------
#### [ .NET ]

**SDK untuk .NET**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda-with-batch-item-handling). 
Melaporkan kegagalan item batch DynamoDB dengan Lambda menggunakan.NET.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
using System.Text.Json;
using System.Text;
using Amazon.Lambda.Core;
using Amazon.Lambda.DynamoDBEvents;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace AWSLambda_DDB;

public class Function
{
    public StreamsEventResponse FunctionHandler(DynamoDBEvent dynamoEvent, ILambdaContext context)

    {
        context.Logger.LogInformation($"Beginning to process {dynamoEvent.Records.Count} records...");
        List<StreamsEventResponse.BatchItemFailure> batchItemFailures = new List<StreamsEventResponse.BatchItemFailure>();
        StreamsEventResponse streamsEventResponse = new StreamsEventResponse();

        foreach (var record in dynamoEvent.Records)
        {
            try
            {
                var sequenceNumber = record.Dynamodb.SequenceNumber;
                context.Logger.LogInformation(sequenceNumber);
            }
            catch (Exception ex)
            {
                context.Logger.LogError(ex.Message);
                batchItemFailures.Add(new StreamsEventResponse.BatchItemFailure() { ItemIdentifier = record.Dynamodb.SequenceNumber });
            }
        }

        if (batchItemFailures.Count > 0)
        {
            streamsEventResponse.BatchItemFailures = batchItemFailures;
        }

        context.Logger.LogInformation("Stream processing complete.");
        return streamsEventResponse;
    }
}
```

------
#### [ Go ]

**SDK untuk Go V2**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda-with-batch-item-handling). 
Melaporkan kegagalan item batch DynamoDB dengan Lambda menggunakan Go.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package main

import (
	"context"
	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

type BatchItemFailure struct {
	ItemIdentifier string `json:"ItemIdentifier"`
}

type BatchResult struct {
	BatchItemFailures []BatchItemFailure `json:"BatchItemFailures"`
}

func HandleRequest(ctx context.Context, event events.DynamoDBEvent) (*BatchResult, error) {
	var batchItemFailures []BatchItemFailure
	curRecordSequenceNumber := ""

	for _, record := range event.Records {
		// Process your record
		curRecordSequenceNumber = record.Change.SequenceNumber
	}

	if curRecordSequenceNumber != "" {
		batchItemFailures = append(batchItemFailures, BatchItemFailure{ItemIdentifier: curRecordSequenceNumber})
	}
	
	batchResult := BatchResult{
		BatchItemFailures: batchItemFailures,
	}

	return &batchResult, nil
}

func main() {
	lambda.Start(HandleRequest)
}
```

------
#### [ Java ]

**SDK untuk Java 2.x**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda-with-batch-item-handling). 
Melaporkan kegagalan item batch DynamoDB dengan Lambda menggunakan Java.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent;
import com.amazonaws.services.lambda.runtime.events.StreamsEventResponse;
import com.amazonaws.services.lambda.runtime.events.models.dynamodb.StreamRecord;

import java.util.ArrayList;
import java.util.List;

public class ProcessDynamodbRecords implements RequestHandler<DynamodbEvent, StreamsEventResponse> {

    @Override
    public StreamsEventResponse handleRequest(DynamodbEvent input, Context context) {

        List<StreamsEventResponse.BatchItemFailure> batchItemFailures = new ArrayList<>();
        String curRecordSequenceNumber = "";

        for (DynamodbEvent.DynamodbStreamRecord dynamodbStreamRecord : input.getRecords()) {
          try {
                //Process your record
                StreamRecord dynamodbRecord = dynamodbStreamRecord.getDynamodb();
                curRecordSequenceNumber = dynamodbRecord.getSequenceNumber();
                
            } catch (Exception e) {
                /* Since we are working with streams, we can return the failed item immediately.
                   Lambda will immediately begin to retry processing from this failed item onwards. */
                batchItemFailures.add(new StreamsEventResponse.BatchItemFailure(curRecordSequenceNumber));
                return new StreamsEventResponse(batchItemFailures);
            }
        }
       
       return new StreamsEventResponse();   
    }
}
```

------
#### [ JavaScript ]

**SDK untuk JavaScript (v3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda-with-batch-item-handling). 
Melaporkan kegagalan item batch DynamoDB dengan penggunaan Lambda. JavaScript  

```
export const handler = async (event) => {
  const records = event.Records;
  let curRecordSequenceNumber = "";

  for (const record of records) {
    try {
      // Process your record
      curRecordSequenceNumber = record.dynamodb.SequenceNumber;
    } catch (e) {
      // Return failed record's sequence number
      return { batchItemFailures: [{ itemIdentifier: curRecordSequenceNumber }] };
    }
  }

  return { batchItemFailures: [] };
};
```
Melaporkan kegagalan item batch DynamoDB dengan penggunaan Lambda. TypeScript  

```
import {
  DynamoDBBatchResponse,
  DynamoDBBatchItemFailure,
  DynamoDBStreamEvent,
} from "aws-lambda";

export const handler = async (
  event: DynamoDBStreamEvent
): Promise<DynamoDBBatchResponse> => {
  const batchItemFailures: DynamoDBBatchItemFailure[] = [];
  let curRecordSequenceNumber;

  for (const record of event.Records) {
    curRecordSequenceNumber = record.dynamodb?.SequenceNumber;

    if (curRecordSequenceNumber) {
      batchItemFailures.push({
        itemIdentifier: curRecordSequenceNumber,
      });
    }
  }

  return { batchItemFailures: batchItemFailures };
};
```

------
#### [ PHP ]

**SDK untuk PHP**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda-with-batch-item-handling). 
Melaporkan kegagalan item batch DynamoDB dengan Lambda menggunakan PHP.  

```
<?php

# using bref/bref and bref/logger for simplicity

use Bref\Context\Context;
use Bref\Event\DynamoDb\DynamoDbEvent;
use Bref\Event\Handler as StdHandler;
use Bref\Logger\StderrLogger;

require __DIR__ . '/vendor/autoload.php';

class Handler implements StdHandler
{
    private StderrLogger $logger;
    public function __construct(StderrLogger $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @throws JsonException
     * @throws \Bref\Event\InvalidLambdaEvent
     */
    public function handle(mixed $event, Context $context): array
    {
        $dynamoDbEvent = new DynamoDbEvent($event);
        $this->logger->info("Processing records");

        $records = $dynamoDbEvent->getRecords();
        $failedRecords = [];
        foreach ($records as $record) {
            try {
                $data = $record->getData();
                $this->logger->info(json_encode($data));
                // TODO: Do interesting work based on the new data
            } catch (Exception $e) {
                $this->logger->error($e->getMessage());
                // failed processing the record
                $failedRecords[] = $record->getSequenceNumber();
            }
        }
        $totalRecords = count($records);
        $this->logger->info("Successfully processed $totalRecords records");

        // change format for the response
        $failures = array_map(
            fn(string $sequenceNumber) => ['itemIdentifier' => $sequenceNumber],
            $failedRecords
        );

        return [
            'batchItemFailures' => $failures
        ];
    }
}

$logger = new StderrLogger();
return new Handler($logger);
```

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

**SDK untuk Python (Boto3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda-with-batch-item-handling). 
Melaporkan kegagalan item batch DynamoDB dengan Lambda menggunakan Python.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def handler(event, context):
    records = event.get("Records")
    curRecordSequenceNumber = ""
    
    for record in records:
        try:
            # Process your record
            curRecordSequenceNumber = record["dynamodb"]["SequenceNumber"]
        except Exception as e:
            # Return failed record's sequence number
            return {"batchItemFailures":[{"itemIdentifier": curRecordSequenceNumber}]}

    return {"batchItemFailures":[]}
```

------
#### [ Ruby ]

**SDK untuk Ruby**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda-with-batch-item-handling). 
Melaporkan kegagalan item batch DynamoDB dengan Lambda menggunakan Ruby.  

```
def lambda_handler(event:, context:)
    records = event["Records"]
    cur_record_sequence_number = ""
  
    records.each do |record|
      begin
        # Process your record
        cur_record_sequence_number = record["dynamodb"]["SequenceNumber"]
      rescue StandardError => e
        # Return failed record's sequence number
        return {"batchItemFailures" => [{"itemIdentifier" => cur_record_sequence_number}]}
      end
    end
  
    {"batchItemFailures" => []}
  end
```

------
#### [ Rust ]

**SDK for Rust**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda-with-batch-item-handling). 
Melaporkan kegagalan item batch DynamoDB dengan Lambda menggunakan Rust.  

```
use aws_lambda_events::{
    event::dynamodb::{Event, EventRecord, StreamRecord},
    streams::{DynamoDbBatchItemFailure, DynamoDbEventResponse},
};
use lambda_runtime::{run, service_fn, Error, LambdaEvent};

/// Process the stream record
fn process_record(record: &EventRecord) -> Result<(), Error> {
    let stream_record: &StreamRecord = &record.change;

    // process your stream record here...
    tracing::info!("Data: {:?}", stream_record);

    Ok(())
}

/// Main Lambda handler here...
async fn function_handler(event: LambdaEvent<Event>) -> Result<DynamoDbEventResponse, Error> {
    let mut response = DynamoDbEventResponse {
        batch_item_failures: vec![],
    };

    let records = &event.payload.records;

    if records.is_empty() {
        tracing::info!("No records found. Exiting.");
        return Ok(response);
    }

    for record in records {
        tracing::info!("EventId: {}", record.event_id);

        // Couldn't find a sequence number
        if record.change.sequence_number.is_none() {
            response.batch_item_failures.push(DynamoDbBatchItemFailure {
                item_identifier: Some("".to_string()),
            });
            return Ok(response);
        }

        // Process your record here...
        if process_record(record).is_err() {
            response.batch_item_failures.push(DynamoDbBatchItemFailure {
                item_identifier: record.change.sequence_number.clone(),
            });
            /* Since we are working with streams, we can return the failed item immediately.
            Lambda will immediately begin to retry processing from this failed item onwards. */
            return Ok(response);
        }
    }

    tracing::info!("Successfully processed {} record(s)", records.len());

    Ok(response)
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        // disable printing the name of the module in every log line.
        .with_target(false)
        // disabling time is handy because CloudWatch will add the ingestion time.
        .without_time()
        .init();

    run(service_fn(function_handler)).await
}
```

------

## Menggunakan Powertools untuk prosesor AWS Lambda batch
<a name="services-ddb-batchfailurereporting-powertools"></a>

Utilitas prosesor batch dari Powertools untuk AWS Lambda secara otomatis menangani logika respons batch paral, mengurangi kompleksitas penerapan pelaporan kegagalan batch. Berikut adalah contoh menggunakan prosesor batch:

**Python**  
Untuk contoh lengkap dan petunjuk penyiapan, lihat [dokumentasi prosesor batch](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/).
Memproses rekaman AWS Lambda aliran DynamoDB dengan prosesor batch.  

```
import json
from aws_lambda_powertools import Logger
from aws_lambda_powertools.utilities.batch import BatchProcessor, EventType, process_partial_response
from aws_lambda_powertools.utilities.data_classes import DynamoDBStreamEvent
from aws_lambda_powertools.utilities.typing import LambdaContext

processor = BatchProcessor(event_type=EventType.DynamoDBStreams)
logger = Logger()

def record_handler(record):
    logger.info(record)
    # Your business logic here
    # Raise an exception to mark this record as failed
    
def lambda_handler(event, context: LambdaContext):
    return process_partial_response(
        event=event, 
        record_handler=record_handler, 
        processor=processor,
        context=context
    )
```

**TypeScript**  
Untuk contoh lengkap dan petunjuk penyiapan, lihat [dokumentasi prosesor batch](https://docs.aws.amazon.com/powertools/typescript/latest/features/batch/).
Memproses rekaman AWS Lambda aliran DynamoDB dengan prosesor batch.  

```
import { BatchProcessor, EventType, processPartialResponse } from '@aws-lambda-powertools/batch';
import { Logger } from '@aws-lambda-powertools/logger';
import type { DynamoDBStreamEvent, Context } from 'aws-lambda';

const processor = new BatchProcessor(EventType.DynamoDBStreams);
const logger = new Logger();

const recordHandler = async (record: any): Promise<void> => {
    logger.info('Processing record', { record });
    // Your business logic here
    // Throw an error to mark this record as failed
};

export const handler = async (event: DynamoDBStreamEvent, context: Context) => {
    return processPartialResponse(event, recordHandler, processor, {
        context,
    });
};
```

**Java**  
Untuk contoh lengkap dan petunjuk penyiapan, lihat [dokumentasi prosesor batch](https://docs.powertools.aws.dev/lambda/java/latest/utilities/batch/).
Memproses rekaman AWS Lambda aliran DynamoDB dengan prosesor batch.  

```
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent;
import com.amazonaws.services.lambda.runtime.events.StreamsEventResponse;
import software.amazon.lambda.powertools.batch.BatchMessageHandlerBuilder;
import software.amazon.lambda.powertools.batch.handler.BatchMessageHandler;

public class DynamoDBStreamBatchHandler implements RequestHandler<DynamodbEvent, StreamsEventResponse> {

    private final BatchMessageHandler<DynamodbEvent, StreamsEventResponse> handler;

    public DynamoDBStreamBatchHandler() {
        handler = new BatchMessageHandlerBuilder()
                .withDynamoDbBatchHandler()
                .buildWithRawMessageHandler(this::processMessage);
    }

    @Override
    public StreamsEventResponse handleRequest(DynamodbEvent ddbEvent, Context context) {
        return handler.processBatch(ddbEvent, context);
    }

    private void processMessage(DynamodbEvent.DynamodbStreamRecord dynamodbStreamRecord, Context context) {
        // Process the change record
    }
}
```

**.NET**  
Untuk contoh lengkap dan petunjuk penyiapan, lihat [dokumentasi prosesor batch](https://docs.aws.amazon.com/powertools/dotnet/utilities/batch-processing/).
Memproses rekaman AWS Lambda aliran DynamoDB dengan prosesor batch.  

```
using System;
using System.Threading;
using System.Threading.Tasks;
using Amazon.Lambda.Core;
using Amazon.Lambda.DynamoDBEvents;
using Amazon.Lambda.Serialization.SystemTextJson;
using AWS.Lambda.Powertools.BatchProcessing;

[assembly: LambdaSerializer(typeof(DefaultLambdaJsonSerializer))]

namespace HelloWorld;

public class Customer
{
    public string? CustomerId { get; set; }
    public string? Name { get; set; }
    public string? Email { get; set; }
    public DateTime CreatedAt { get; set; }
}

internal class TypedDynamoDbRecordHandler : ITypedRecordHandler<Customer> 
{
    public async Task<RecordHandlerResult> HandleAsync(Customer customer, CancellationToken cancellationToken)
    {
        if (string.IsNullOrEmpty(customer.Email)) 
        {
            throw new ArgumentException("Customer email is required");
        }

        return await Task.FromResult(RecordHandlerResult.None); 
    }
}

public class Function
{
    [BatchProcessor(TypedRecordHandler = typeof(TypedDynamoDbRecordHandler))]
    public BatchItemFailuresResponse HandlerUsingTypedAttribute(DynamoDBEvent _)
    {
        return TypedDynamoDbStreamBatchProcessor.Result.BatchItemFailuresResponse; 
    }
}
```

# Menyimpan catatan yang dibuang untuk sumber peristiwa DynamoDB di Lambda
<a name="services-dynamodb-errors"></a>

Penanganan kesalahan untuk pemetaan sumber peristiwa DynamoDB tergantung pada apakah kesalahan terjadi sebelum fungsi dipanggil atau selama pemanggilan fungsi:
+ **Sebelum pemanggilan:** Jika pemetaan sumber peristiwa Lambda tidak dapat menjalankan fungsi karena pelambatan atau masalah lain, ia akan mencoba lagi hingga catatan kedaluwarsa atau melebihi usia maksimum yang dikonfigurasi pada pemetaan sumber peristiwa (). [MaximumRecordAgeInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumRecordAgeInSeconds)
+ **Selama pemanggilan:** Jika fungsi dipanggil tetapi menampilkan kesalahan, Lambda mencoba ulang hingga catatan kedaluwarsa, melebihi usia maksimum ([MaximumRecordAgeInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumRecordAgeInSeconds)), atau mencapai kuota coba ulang yang dikonfigurasi (). [MaximumRetryAttempts](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumRetryAttempts) Untuk kesalahan fungsi, Anda juga dapat mengonfigurasi [BisectBatchOnFunctionError](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-response-BisectBatchOnFunctionError), yang membagi batch yang gagal menjadi dua batch yang lebih kecil, mengisolasi catatan buruk dan menghindari batas waktu. Memisahkan batch tidak menghabiskan kuota coba lagi.

Jika tindakan penanganan kesalahan gagal, Lambda membuang rekaman dan melanjutkan pemrosesan batch dari aliran. Dengan pengaturan default, ini berarti rekaman yang buruk dapat memblokir pemrosesan pada shard yang terpengaruh hingga selama satu hari. Untuk menghindari hal ini, konfigurasikan pemetaan sumber kejadian fungsi Anda dengan jumlah percobaan ulang yang wajar dan usia maksimum rekaman yang sesuai dengan kasus penggunaan Anda.

## Mengonfigurasi tujuan untuk pemanggilan yang gagal
<a name="dynamodb-on-failure-destination-console"></a>

Untuk menyimpan catatan pemanggilan pemetaan sumber peristiwa yang gagal, tambahkan tujuan ke pemetaan sumber peristiwa fungsi Anda. Setiap catatan yang dikirim ke tujuan adalah dokumen JSON yang berisi metadata tentang pemanggilan yang gagal. Untuk tujuan Amazon S3, Lambda juga mengirimkan seluruh catatan pemanggilan bersama dengan metadata. Anda dapat mengonfigurasi topik Amazon SNS, antrian Amazon SQS, bucket Amazon S3, atau Kafka sebagai tujuan.

Dengan tujuan Amazon S3, Anda dapat menggunakan fitur Pemberitahuan [Acara Amazon S3](https://docs.aws.amazon.com/) untuk menerima notifikasi saat objek diunggah ke bucket S3 tujuan Anda. Anda juga dapat mengonfigurasi Pemberitahuan Acara S3 untuk menjalankan fungsi Lambda lain untuk melakukan pemrosesan otomatis pada batch yang gagal.

Peran eksekusi Anda harus memiliki izin untuk tujuan:
+ **Untuk tujuan SQS: [sqs](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html):** SendMessage
+ **[Untuk tujuan SNS: SNS: Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)**
+ **Untuk tujuan S3: s3: PutObject** [dan [s3:](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) ListBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/ListObjectsV2.html)
+ **Untuk tujuan Kafka: [kafka-cluster](https://docs.aws.amazon.com/msk/latest/developerguide/kafka-actions.html):** WriteData

Anda dapat mengonfigurasi topik Kafka sebagai tujuan gagal untuk pemetaan sumber acara Kafka Anda. Ketika Lambda tidak dapat memproses catatan setelah percobaan ulang yang melelahkan atau ketika catatan melebihi usia maksimum, Lambda mengirimkan catatan yang gagal ke topik Kafka yang ditentukan untuk diproses nanti. Lihat [Menggunakan topik Kafka sebagai tujuan kegagalan](kafka-on-failure-destination.md).

Jika Anda telah mengaktifkan enkripsi dengan kunci KMS Anda sendiri untuk tujuan S3, peran eksekusi fungsi Anda juga harus memiliki izin untuk memanggil [kms](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html):. GenerateDataKey Jika kunci KMS dan tujuan bucket S3 berada di akun yang berbeda dari fungsi Lambda dan peran eksekusi, konfigurasikan kunci KMS untuk mempercayai peran eksekusi yang diizinkan. kms: GenerateDataKey

Untuk mengonfigurasi tujuan saat gagal menggunakan konsol, ikuti langkah-langkah berikut:

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi.

1. Di bagian **Gambaran umum fungsi**, pilih **Tambahkan tujuan**.

1. Untuk **Sumber**, pilih **Pemanggilan pemetaan sumber acara**.

1. Untuk **pemetaan sumber peristiwa**, pilih sumber peristiwa yang dikonfigurasi untuk fungsi ini.

1. Untuk **Kondisi**, pilih **On failure**. Untuk pemanggilan pemetaan sumber peristiwa, ini adalah satu-satunya kondisi yang diterima.

1. Untuk **tipe Tujuan**, pilih tipe tujuan yang Lambda kirimkan catatan pemanggilan.

1. Untuk **Tujuan**, pilih sumber daya.

1. Pilih **Simpan**.

Anda juga dapat mengonfigurasi tujuan pada kegagalan menggunakan AWS Command Line Interface (AWS CLI). Misalnya, [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html)perintah berikut menambahkan pemetaan sumber peristiwa dengan tujuan kegagalan SQS ke: `MyFunction`

```
aws lambda create-event-source-mapping \
--function-name "MyFunction" \
--event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2024-06-10T19:26:16.525 \
--destination-config '{"OnFailure": {"Destination": "arn:aws:sqs:us-east-1:123456789012:dest-queue"}}'
```

[update-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html)Perintah berikut memperbarui pemetaan sumber peristiwa untuk mengirim catatan pemanggilan yang gagal ke tujuan SNS setelah dua kali mencoba lagi, atau jika catatan berusia lebih dari satu jam.

```
aws lambda update-event-source-mapping \
--uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \
--maximum-retry-attempts 2 \
--maximum-record-age-in-seconds 3600 \
--destination-config '{"OnFailure": {"Destination": "arn:aws:sns:us-east-1:123456789012:dest-topic"}}'
```

Pengaturan yang diperbarui diterapkan secara asinkron dan tidak muncul dalam output hingga proses selesai. Gunakan perintah [get-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/get-event-source-mapping.html) untuk melihat status saat ini.

Untuk menghapus tujuan, berikan string kosong sebagai argumen ke `destination-config` parameter:

```
aws lambda update-event-source-mapping \
--uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \
--destination-config '{"OnFailure": {"Destination": ""}}'
```

### Praktik terbaik keamanan untuk tujuan Amazon S3
<a name="ddb-s3-destination-security"></a>

Menghapus bucket S3 yang dikonfigurasi sebagai tujuan tanpa menghapus tujuan dari konfigurasi fungsi Anda dapat menimbulkan risiko keamanan. Jika pengguna lain mengetahui nama bucket tujuan Anda, mereka dapat membuat ulang bucket di bucket tersebut. Akun AWS Catatan pemanggilan yang gagal akan dikirim ke bucket mereka, yang berpotensi mengekspos data dari fungsi Anda.

**Awas**  
Untuk memastikan bahwa catatan pemanggilan dari fungsi Anda tidak dapat dikirim ke bucket S3 di bucket lain Akun AWS, tambahkan kondisi ke peran eksekusi fungsi Anda yang membatasi `s3:PutObject` izin ke bucket di akun Anda. 

Contoh berikut menunjukkan kebijakan IAM yang membatasi `s3:PutObject` izin fungsi Anda ke bucket di akun Anda. Kebijakan ini juga memberi Lambda `s3:ListBucket` izin yang dibutuhkan untuk menggunakan bucket S3 sebagai tujuan.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3BucketResourceAccountWrite",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::*/*",
                "arn:aws:s3:::*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:ResourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

Untuk menambahkan kebijakan izin ke peran eksekusi fungsi Anda menggunakan Konsol Manajemen AWS atau AWS CLI, lihat instruksi dalam prosedur berikut:

------
#### [ Console ]

**Untuk menambahkan kebijakan izin ke peran eksekusi fungsi (konsol)**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi Lambda yang peran eksekusinya ingin Anda modifikasi.

1. Di tab **Konfigurasi**, pilih **Izin**.

1. Di tab **Peran eksekusi**, pilih **nama Peran** fungsi Anda untuk membuka halaman konsol IAM peran.

1. Tambahkan kebijakan izin ke peran dengan melakukan hal berikut:

   1. Di panel **Kebijakan izin**, pilih **Tambahkan izin**, lalu pilih **Buat** kebijakan sebaris.

   1. Di **Editor kebijakan**, pilih **JSON**.

   1. Rekatkan kebijakan yang ingin Anda tambahkan ke editor (ganti JSON yang ada), lalu pilih **Berikutnya**.

   1. Di bawah **Detail kebijakan**, masukkan **nama Kebijakan**.

   1. Pilih **Buat kebijakan**.

------
#### [ AWS CLI ]

**Untuk menambahkan kebijakan izin ke peran eksekusi fungsi (CLI)**

1. Buat dokumen kebijakan JSON dengan izin yang diperlukan dan simpan di direktori lokal.

1. Gunakan perintah IAM `put-role-policy` CLI untuk menambahkan izin ke peran eksekusi fungsi Anda. Jalankan perintah berikut dari direktori tempat Anda menyimpan dokumen kebijakan JSON dan ganti nama peran, nama kebijakan, dan dokumen kebijakan dengan nilai Anda sendiri.

   ```
   aws iam put-role-policy \
   --role-name my_lambda_role \
   --policy-name LambdaS3DestinationPolicy \
   --policy-document file://my_policy.json
   ```

------

### Contoh catatan pemanggilan Amazon SNS dan Amazon SQS
<a name="kinesis-on-failure-destination-example-sns-sqs"></a>

Contoh berikut menunjukkan catatan pemanggilan yang dikirim Lambda ke tujuan SQS atau SNS untuk aliran DynamoDB.

```
{
    "requestContext": {
        "requestId": "316aa6d0-8154-xmpl-9af7-85d5f4a6bc81",
        "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:myfunction",
        "condition": "RetryAttemptsExhausted",
        "approximateInvokeCount": 1
    },
    "responseContext": {
        "statusCode": 200,
        "executedVersion": "$LATEST",
        "functionError": "Unhandled"
    },
    "version": "1.0",
    "timestamp": "2019-11-14T00:13:49.717Z",
    "DDBStreamBatchInfo": {
        "shardId": "shardId-00000001573689847184-864758bb",
        "startSequenceNumber": "800000000003126276362",
        "endSequenceNumber": "800000000003126276362",
        "approximateArrivalOfFirstRecord": "2019-11-14T00:13:19Z",
        "approximateArrivalOfLastRecord": "2019-11-14T00:13:19Z",
        "batchSize": 1,
        "streamArn": "arn:aws:dynamodb:us-east-2:123456789012:table/mytable/stream/2019-11-14T00:04:06.388"
    }
}
```

Anda dapat menggunakan informasi ini guna mengambil rekaman yang terpengaruh dari aliran untuk pemecahan masalah. Rekaman aktual tidak disertakan, jadi Anda harus memproses rekaman ini dan mengambilnya dari aliran sebelum kedaluwarsa dan hilang.

### Contoh catatan pemanggilan Amazon S3
<a name="kinesis-on-failure-destination-example-sns-sqs-s3"></a>

Contoh berikut menunjukkan rekaman pemanggilan yang dikirim Lambda ke bucket S3 untuk aliran DynamoDB. Selain semua bidang dari contoh sebelumnya untuk tujuan SQS dan SNS, `payload` bidang berisi catatan pemanggilan asli sebagai string JSON yang lolos.

```
{
    "requestContext": {
        "requestId": "316aa6d0-8154-xmpl-9af7-85d5f4a6bc81",
        "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:myfunction",
        "condition": "RetryAttemptsExhausted",
        "approximateInvokeCount": 1
    },
    "responseContext": {
        "statusCode": 200,
        "executedVersion": "$LATEST",
        "functionError": "Unhandled"
    },
    "version": "1.0",
    "timestamp": "2019-11-14T00:13:49.717Z",
    "DDBStreamBatchInfo": {
        "shardId": "shardId-00000001573689847184-864758bb",
        "startSequenceNumber": "800000000003126276362",
        "endSequenceNumber": "800000000003126276362",
        "approximateArrivalOfFirstRecord": "2019-11-14T00:13:19Z",
        "approximateArrivalOfLastRecord": "2019-11-14T00:13:19Z",
        "batchSize": 1,
        "streamArn": "arn:aws:dynamodb:us-east-2:123456789012:table/mytable/stream/2019-11-14T00:04:06.388"
    },
    "payload": "<Whole Event>" // Only available in S3
}
```

Objek S3 yang berisi catatan pemanggilan menggunakan konvensi penamaan berikut:

```
aws/lambda/<ESM-UUID>/<shardID>/YYYY/MM/DD/YYYY-MM-DDTHH.MM.SS-<Random UUID>
```

# Menerapkan pemrosesan aliran DynamoDB stateful di Lambda
<a name="services-ddb-windows"></a>

Fungsi Lambda dapat menjalankan aplikasi pemrosesan aliran berkelanjutan. Aliran merupakan data tidak terbatas yang mengalir terus-menerus melalui aplikasi Anda. Untuk menganalisis informasi dari input yang terus diperbarui ini, Anda dapat mengikat catatan yang disertakan menggunakan jendela yang didefinisikan dalam hal waktu.

Jatuh jendela adalah jendela waktu yang berbeda yang membuka dan menutup secara berkala. Secara default, pemanggilan Lambda tidak memiliki status — Anda tidak dapat menggunakannya untuk memproses data di beberapa pemanggilan berkelanjutan tanpa database eksternal. Namun, dengan jendela yang jatuh, Anda dapat mempertahankan status Anda di seluruh pemanggilan. Status ini berisi hasil agregat pesan yang sebelumnya diproses untuk jendela saat ini. Status Anda maksimal bisa sebesar 1 MB per shard. Jika melebihi ukuran tersebut, Lambda mengakhiri jendela lebih awal.

Setiap rekaman dalam aliran milik jendela tertentu. Lambda akan memproses setiap rekaman setidaknya sekali, tetapi tidak menjamin bahwa setiap rekaman akan diproses hanya sekali. Dalam kasus yang jarang terjadi, seperti penanganan kesalahan, beberapa catatan mungkin diproses lebih dari sekali. Catatan selalu diproses secara berurutan pertama kali. Jika catatan diproses lebih dari satu kali, mereka mungkin diproses rusak.

## Agregasi dan pemrosesan
<a name="streams-tumbling-processing"></a>

Fungsi yang dikelola pengguna Anda dipanggil baik untuk agregasi maupun untuk memproses hasil akhir agregasi tersebut. Lambda mengumpulkan semua catatan yang diterima di jendela. Anda dapat menerima catatan ini dalam beberapa batch, masing-masing sebagai invokasi terpisah. Setiap invokasi menerima status. Jadi, saat menggunakan jendela tumbling, respons fungsi Lambda Anda harus berisi `state` properti. Jika respons tidak berisi `state` properti, Lambda menganggap ini sebagai pemanggilan yang gagal. Untuk memenuhi kondisi ini, fungsi Anda dapat mengembalikan `TimeWindowEventResponse` objek, yang memiliki bentuk JSON berikut:

**Example Nilai `TimeWindowEventResponse`**  

```
{
    "state": {
        "1": 282,
        "2": 715
    },
    "batchItemFailures": []
}
```

**catatan**  
Untuk fungsi Java, sebaiknya gunakan a `Map<String, String>` untuk mewakili status.

Di akhir jendela, tanda `isFinalInvokeForWindow` diatur ke `true` untuk menunjukkan bahwa ini adalah status akhir dan bahwa itu siap untuk diproses. Setelah pemrosesan, jendela selesai, dan invokasi akhir Anda selesai, lalu status dihapus.

Di akhir jendela Anda, Lambda menggunakan pemrosesan akhir untuk tindakan pada hasil agregasi. Pemrosesan akhir Anda dipanggil secara sinkron. Setelah pemanggilan berhasil, fungsi Anda memeriksa nomor urut dan pemrosesan aliran berlanjut. Jika invokasi tidak berhasil, fungsi Lambda Anda menunda pemrosesan lebih lanjut sampai invokasi sukses.

**Example DynamodbTimeWindowEvent**  

```
{
   "Records":[
      {
         "eventID":"1",
         "eventName":"INSERT",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "NewImage":{
               "Message":{
                  "S":"New item!"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"111",
            "SizeBytes":26,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      },
      {
         "eventID":"2",
         "eventName":"MODIFY",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "NewImage":{
               "Message":{
                  "S":"This item has changed"
               },
               "Id":{
                  "N":"101"
               }
            },
            "OldImage":{
               "Message":{
                  "S":"New item!"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"222",
            "SizeBytes":59,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      },
      {
         "eventID":"3",
         "eventName":"REMOVE",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "OldImage":{
               "Message":{
                  "S":"This item has changed"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"333",
            "SizeBytes":38,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      }
   ],
    "window": {
        "start": "2020-07-30T17:00:00Z",
        "end": "2020-07-30T17:05:00Z"
    },
    "state": {
        "1": "state1"
    },
    "shardId": "shard123456789",
    "eventSourceARN": "stream-ARN",
    "isFinalInvokeForWindow": false,
    "isWindowTerminatedEarly": false
}
```

## Konfigurasi
<a name="streams-tumbling-config"></a>

Anda dapat mengonfigurasi jendela berguling saat membuat atau memperbarui pemetaan sumber peristiwa. Untuk mengkonfigurasi jendela tumbling, tentukan jendela dalam hitungan detik ([TumblingWindowInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-TumblingWindowInSeconds)). Contoh berikut AWS Command Line Interface (AWS CLI) perintah membuat pemetaan sumber acara streaming yang memiliki jendela jatuh 120 detik. Fungsi Lambda yang didefinisikan untuk agregasi dan pemrosesan diberi nama `tumbling-window-example-function`.

```
aws lambda create-event-source-mapping \
--event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table/stream/2024-06-10T19:26:16.525 \
--function-name tumbling-window-example-function \
--starting-position TRIM_HORIZON \
--tumbling-window-in-seconds 120
```

Lambda menentukan jatuh batas jendela berguling berdasarkan waktu ketika catatan dimasukkan ke dalam aliran. Semua catatan memiliki stempel waktu perkiraan yang tersedia yang digunakan Lambda dalam penentuan batas.

Agregasi jendela berguling tidak mendukung shard ulang. Ketika shard berakhir, Lambda menganggap jendela ditutup, dan shard anak memulai jendela mereka sendiri dalam status baru.

Jendela berguling sepenuhnya mendukung kebijakan coba lagi yang ada `maxRetryAttempts` dan `maxRecordAge`.

**Example Handler.py - Agregasi dan pemrosesan**  
Fungsi Python berikut menunjukkan cara untuk menggabungkan, lalu memproses status akhir Anda:  

```
def lambda_handler(event, context):
    print('Incoming event: ', event)
    print('Incoming state: ', event['state'])

#Check if this is the end of the window to either aggregate or process.
    if event['isFinalInvokeForWindow']:
        # logic to handle final state of the window
        print('Destination invoke')
    else:
        print('Aggregate invoke')

#Check for early terminations
    if event['isWindowTerminatedEarly']:
        print('Window terminated early')

    #Aggregation logic
    state = event['state']
    for record in event['Records']:
        state[record['dynamodb']['NewImage']['Id']] = state.get(record['dynamodb']['NewImage']['Id'], 0) + 1

    print('Returning state: ', state)
    return {'state': state}
```

# Parameter Lambda untuk pemetaan sumber peristiwa Amazon DynamoDB
<a name="services-ddb-params"></a>

Semua jenis sumber peristiwa Lambda berbagi operasi yang sama [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)dan [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)API. Namun, hanya beberapa parameter yang berlaku untuk DynamoDB Streams.


| Parameter | Diperlukan | Default | Catatan | 
| --- | --- | --- | --- | 
|  BatchSize  |  T  |  100  |  Maksimum: 10.000.  | 
|  BisectBatchOnFunctionError  |  T  |  false  | none  | 
|  DestinationConfig  |  T  | N/A  |  Antrian Amazon SQS standar atau tujuan topik Amazon SNS standar untuk catatan yang dibuang  | 
|  Diaktifkan  |  T  |  true  | none  | 
|  EventSourceArn  |  Y  | N/A |  ARN dari aliran data atau konsumen aliran  | 
|  FilterCriteria  |  T  | N/A  |  [Kontrol peristiwa mana yang dikirim Lambda ke fungsi Anda](invocation-eventfiltering.md)  | 
|  FunctionName  |  Y  | N/A  | none  | 
|  FunctionResponseTypes  |  T  | N/A |  Agar fungsi Anda melaporkan kegagalan tertentu dalam satu batch, sertakan nilainya `ReportBatchItemFailures``FunctionResponseTypes`. Untuk informasi selengkapnya, lihat [Mengkonfigurasi respons batch sebagian dengan DynamoDB dan Lambda](services-ddb-batchfailurereporting.md).  | 
|  MaximumBatchingWindowInSeconds  |  T  |  0  | none  | 
|  MaximumRecordAgeInSeconds  |  T  |  -1  |  -1 berarti tak terbatas: catatan gagal dicoba ulang sampai catatan kedaluwarsa. [Batas retensi data untuk DynamoDB Streams adalah 24](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html#Streams.DataRetention) jam. Minimal: -1 Maksimal: 604.800  | 
|  MaximumRetryAttempts  |  T  |  -1  |  -1 berarti tak terbatas: catatan gagal dicoba ulang sampai catatan kedaluwarsa Minimal: 0 Maksimum: 10.000.  | 
|  ParallelizationFactor  |  T  |  1  |  Maksimal: 10  | 
|  StartingPosition  |  Y  | N/A  |  TRIM\$1HORIZON  | 
|  TumblingWindowInSeconds  |  T  | N/A  |  Minimal: 0 Maksimal: 900  | 

# Menggunakan pemfilteran acara dengan sumber acara DynamoDB
<a name="with-ddb-filtering"></a>

Anda dapat menggunakan pemfilteran peristiwa untuk mengontrol rekaman mana dari aliran atau antrian yang dikirim Lambda ke fungsi Anda. Untuk informasi umum tentang cara kerja penyaringan acara, lihat[Kontrol peristiwa mana yang dikirim Lambda ke fungsi Anda](invocation-eventfiltering.md).

Bagian ini berfokus pada penyaringan acara untuk sumber acara DynamoDB.

**catatan**  
Pemetaan sumber peristiwa DynamoDB hanya mendukung pemfilteran pada kunci. `dynamodb`

**Topics**
+ [

## Acara DynamoDB
](#filtering-ddb)
+ [

## Pemfilteran dengan atribut tabel
](#filtering-ddb-attributes)
+ [

## Memfilter dengan ekspresi Boolean
](#filtering-ddb-boolean)
+ [

## Menggunakan operator Exists
](#filtering-ddb-exists)
+ [

## Format JSON untuk pemfilteran DynamoDB
](#filtering-ddb-JSON-format)

## Acara DynamoDB
<a name="filtering-ddb"></a>

Misalkan Anda memiliki tabel DynamoDB dengan `CustomerName` kunci utama dan atribut dan. `AccountManager` `PaymentTerms` Berikut ini menunjukkan contoh catatan dari aliran tabel DynamoDB Anda.

```
{
      "eventID": "1",
      "eventVersion": "1.0",
      "dynamodb": {
          "ApproximateCreationDateTime": "1678831218.0",
          "Keys": {
              "CustomerName": {
                  "S": "AnyCompany Industries"
              }
          },
          "NewImage": {
              "AccountManager": {
                  "S": "Pat Candella"
              },
              "PaymentTerms": {
                  "S": "60 days"
              },
              "CustomerName": {
                  "S": "AnyCompany Industries"
              }
          },
          "SequenceNumber": "111",
          "SizeBytes": 26,
          "StreamViewType": "NEW_IMAGE"
      }
  }
```

Untuk memfilter berdasarkan nilai kunci dan atribut dalam tabel DynamoDB Anda, gunakan kunci `dynamodb` dalam catatan. Bagian berikut memberikan contoh untuk berbagai jenis filter.

### Memfilter dengan tombol tabel
<a name="filtering-ddb-keys"></a>

Misalkan Anda ingin fungsi Anda memproses hanya catatan-catatan di mana kunci utamanya `CustomerName` adalah “AnyCompany Industri.” `FilterCriteria`Objeknya adalah sebagai berikut.

```
{
     "Filters": [
          {
              "Pattern": "{ \"dynamodb\" : { \"Keys\" : { \"CustomerName\" : { \"S\" : [ \"AnyCompany Industries\" ] } } } }"
          }
      ]
 }
```

Untuk kejelasan tambahan, berikut adalah nilai filter yang `Pattern` diperluas di JSON biasa. 

```
{
     "dynamodb": {
          "Keys": {
              "CustomerName": {
                  "S": [ "AnyCompany Industries" ]
                  }
              }
          }
 }
```

Anda dapat menambahkan filter menggunakan konsol, AWS CLI atau AWS SAM templat.

------
#### [ Console ]

Untuk menambahkan filter ini menggunakan konsol, ikuti instruksi [Melampirkan kriteria filter ke pemetaan sumber peristiwa (konsol)](invocation-eventfiltering.md#filtering-console) dan masukkan string berikut untuk **kriteria Filter**.

```
{ "dynamodb" : { "Keys" : { "CustomerName" : { "S" : [ "AnyCompany Industries" ] } } } }
```

------
#### [ AWS CLI ]

Untuk membuat pemetaan sumber peristiwa baru dengan kriteria filter ini menggunakan AWS Command Line Interface (AWS CLI), jalankan perintah berikut.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"Keys\" : { \"CustomerName\" : { \"S\" : [ \"AnyCompany Industries\" ] } } } }"}]}'
```

Untuk menambahkan kriteria filter ini ke pemetaan sumber peristiwa yang ada, jalankan perintah berikut.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"Keys\" : { \"CustomerName\" : { \"S\" : [ \"AnyCompany Industries\" ] } } } }"}]}'
```

------
#### [ AWS SAM ]

Untuk menambahkan filter ini menggunakan AWS SAM, tambahkan cuplikan berikut ke template YAMB untuk sumber acara Anda.

```
FilterCriteria:
   Filters:
     - Pattern: '{ "dynamodb" : { "Keys" : { "CustomerName" : { "S" : [ "AnyCompany Industries" ] } } } }'
```

------

## Pemfilteran dengan atribut tabel
<a name="filtering-ddb-attributes"></a>

Dengan DynamoDB, Anda juga dapat menggunakan `NewImage` tombol `OldImage` and untuk memfilter nilai atribut. Misalkan Anda ingin memfilter catatan di mana `AccountManager` atribut dalam gambar tabel terbaru adalah “Pat Candella” atau “Shirley Rodriguez.” `FilterCriteria`Objeknya adalah sebagai berikut.

```
{
    "Filters": [
        {
            "Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\", \"Shirley Rodriguez\" ] } } } }"
        }
    ]
}
```

Untuk kejelasan tambahan, berikut adalah nilai filter yang `Pattern` diperluas di JSON biasa.

```
{
    "dynamodb": {
        "NewImage": {
            "AccountManager": {
                "S": [ "Pat Candella", "Shirley Rodriguez" ]
            }
        }
    }
}
```

Anda dapat menambahkan filter menggunakan konsol, AWS CLI atau AWS SAM templat.

------
#### [ Console ]

Untuk menambahkan filter ini menggunakan konsol, ikuti instruksi [Melampirkan kriteria filter ke pemetaan sumber peristiwa (konsol)](invocation-eventfiltering.md#filtering-console) dan masukkan string berikut untuk **kriteria Filter**.

```
{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella", "Shirley Rodriguez" ] } } } }
```

------
#### [ AWS CLI ]

Untuk membuat pemetaan sumber peristiwa baru dengan kriteria filter ini menggunakan AWS Command Line Interface (AWS CLI), jalankan perintah berikut.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\", \"Shirley Rodriguez\" ] } } } }"}]}'
```

Untuk menambahkan kriteria filter ini ke pemetaan sumber peristiwa yang ada, jalankan perintah berikut.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\", \"Shirley Rodriguez\" ] } } } }"}]}'
```

------
#### [ AWS SAM ]

Untuk menambahkan filter ini menggunakan AWS SAM, tambahkan cuplikan berikut ke template YAMB untuk sumber acara Anda.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella", "Shirley Rodriguez" ] } } } }'
```

------

## Memfilter dengan ekspresi Boolean
<a name="filtering-ddb-boolean"></a>

Anda juga dapat membuat filter menggunakan ekspresi Boolean AND. Ekspresi ini dapat mencakup parameter kunci dan atribut tabel Anda. Misalkan Anda ingin memfilter catatan di mana `NewImage` nilainya `AccountManager` adalah “Pat Candella” dan `OldImage` nilainya adalah “Terry Whitlock”. `FilterCriteria`Objeknya adalah sebagai berikut.

```
{
    "Filters": [
        {
            "Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\" ] } } } , \"dynamodb\" : { \"OldImage\" : { \"AccountManager\" : { \"S\" : [ \"Terry Whitlock\" ] } } } }"
        }
    ]
}
```

Untuk kejelasan tambahan, berikut adalah nilai filter yang `Pattern` diperluas di JSON biasa.

```
{ 
    "dynamodb" : { 
        "NewImage" : { 
            "AccountManager" : { 
                "S" : [ 
                    "Pat Candella" 
                ] 
            } 
        } 
    }, 
    "dynamodb": { 
        "OldImage": { 
            "AccountManager": { 
                "S": [ 
                    "Terry Whitlock" 
                ] 
            } 
        } 
    } 
}
```

Anda dapat menambahkan filter menggunakan konsol, AWS CLI atau AWS SAM templat.

------
#### [ Console ]

Untuk menambahkan filter ini menggunakan konsol, ikuti instruksi [Melampirkan kriteria filter ke pemetaan sumber peristiwa (konsol)](invocation-eventfiltering.md#filtering-console) dan masukkan string berikut untuk **kriteria Filter**.

```
{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella" ] } } } , "dynamodb" : { "OldImage" : { "AccountManager" : { "S" : [ "Terry Whitlock" ] } } } }
```

------
#### [ AWS CLI ]

Untuk membuat pemetaan sumber peristiwa baru dengan kriteria filter ini menggunakan AWS Command Line Interface (AWS CLI), jalankan perintah berikut.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:dynamodb:us-east-2:123456789012:table/my-table \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\" ] } } } , \"dynamodb\" : { \"OldImage\" : { \"AccountManager\" : { \"S\" : [ \"Terry Whitlock\" ] } } } } "}]}'
```

Untuk menambahkan kriteria filter ini ke pemetaan sumber peristiwa yang ada, jalankan perintah berikut.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"dynamodb\" : { \"NewImage\" : { \"AccountManager\" : { \"S\" : [ \"Pat Candella\" ] } } } , \"dynamodb\" : { \"OldImage\" : { \"AccountManager\" : { \"S\" : [ \"Terry Whitlock\" ] } } } } "}]}'
```

------
#### [ AWS SAM ]

Untuk menambahkan filter ini menggunakan AWS SAM, tambahkan cuplikan berikut ke template YAMB untuk sumber acara Anda.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "dynamodb" : { "NewImage" : { "AccountManager" : { "S" : [ "Pat Candella" ] } } } , "dynamodb" : { "OldImage" : { "AccountManager" : { "S" : [ "Terry Whitlock" ] } } } }'
```

------

**catatan**  
DynamoDB event filtering tidak mendukung penggunaan operator numerik (sama numerik dan rentang numerik). Bahkan jika item dalam tabel Anda disimpan sebagai angka, parameter ini dikonversi ke string di objek catatan JSON.

## Menggunakan operator Exists
<a name="filtering-ddb-exists"></a>

Karena cara objek peristiwa JSON dari DynamoDB terstruktur, menggunakan operator Exists memerlukan perhatian khusus. Operator Exists hanya bekerja pada node daun di acara JSON, jadi jika pola filter Anda menggunakan Exists untuk menguji node perantara, itu tidak akan berfungsi. Pertimbangkan item tabel DynamoDB berikut:

```
{
  "UserID": {"S": "12345"},
  "Name": {"S": "John Doe"},
  "Organizations": {"L": [
      {"S":"Sales"},
      {"S":"Marketing"},
      {"S":"Support"}
    ]
  }
}
```

Anda mungkin ingin membuat pola filter seperti berikut yang akan menguji peristiwa yang berisi`"Organizations"`:

```
{ "dynamodb" : { "NewImage" : { "Organizations" : [ { "exists": true } ] } } }
```

Namun, pola filter ini tidak akan pernah mengembalikan kecocokan karena `"Organizations"` bukan simpul daun. Contoh berikut menunjukkan bagaimana benar menggunakan operator Exists untuk membangun pola filter yang diinginkan:

```
{ "dynamodb" : { "NewImage" : {"Organizations": {"L": {"S": [ {"exists": true } ] } } } } }
```

## Format JSON untuk pemfilteran DynamoDB
<a name="filtering-ddb-JSON-format"></a>

Untuk memfilter peristiwa dengan benar dari sumber DynamoDB, bidang data dan kriteria filter Anda untuk bidang data `dynamodb` () harus dalam format JSON yang valid. Jika salah satu bidang tidak dalam format JSON yang valid, Lambda akan menghapus pesan atau melempar pengecualian. Tabel berikut merangkum perilaku spesifik: 


| Format data masuk | Format pola filter untuk properti data | Tindakan yang dihasilkan | 
| --- | --- | --- | 
|  JSON yang valid  |  JSON yang valid  |  Filter Lambda berdasarkan kriteria filter Anda.  | 
|  JSON yang valid  |  Tidak ada pola filter untuk properti data  |  Filter Lambda (hanya pada properti metadata lainnya) berdasarkan kriteria filter Anda.  | 
|  JSON yang valid  |  Non-JSON  |  Lambda melempar pengecualian pada saat pembuatan atau pembaruan pemetaan sumber acara. Pola filter untuk properti data harus dalam format JSON yang valid.  | 
|  Non-JSON  |  JSON yang valid  |  Lambda menjatuhkan rekor.  | 
|  Non-JSON  |  Tidak ada pola filter untuk properti data  |  Filter Lambda (hanya pada properti metadata lainnya) berdasarkan kriteria filter Anda.  | 
|  Non-JSON  |  Non-JSON  |  Lambda melempar pengecualian pada saat pembuatan atau pembaruan pemetaan sumber acara. Pola filter untuk properti data harus dalam format JSON yang valid.  | 

# Tutorial: Menggunakan AWS Lambda dengan aliran Amazon DynamoDB
<a name="with-ddb-example"></a>

 Dalam tutorial ini, Anda membuat fungsi Lambda untuk menggunakan kejadian dari aliran Amazon DynamoDB.

## Prasyarat
<a name="with-ddb-prepare"></a>

### Instal AWS Command Line Interface
<a name="install_aws_cli"></a>

Jika Anda belum menginstal AWS Command Line Interface, ikuti langkah-langkah di [Menginstal atau memperbarui versi terbaru AWS CLI untuk menginstalnya](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

Tutorial ini membutuhkan terminal baris perintah atau shell untuk menjalankan perintah. Di Linux dan macOS, gunakan shell dan manajer paket pilihan Anda.

**catatan**  
Di Windows, beberapa perintah Bash CLI yang biasa Anda gunakan dengan Lambda (`zip`seperti) tidak didukung oleh terminal bawaan sistem operasi. Untuk mendapatkan versi terintegrasi Windows dari Ubuntu dan Bash, [instal Windows Subsystem untuk](https://docs.microsoft.com/en-us/windows/wsl/install-win10) Linux. 

## Buat peran eksekusi
<a name="with-ddb-create-execution-role"></a>

Buat [peran eksekusi](lambda-intro-execution-role.md) yang memberikan izin fungsi Anda untuk mengakses AWS sumber daya.

**Untuk membuat peran eksekusi**

1. Buka [halaman peran](https://console.aws.amazon.com/iam/home#/roles) di konsol IAM.

1. Pilih **Buat peran**.

1. Buat peran dengan properti berikut.
   + **Entitas tepercaya** – Lambda.
   + **Izin - Peran AWSLambda** **Dinamo DBExecution**.
   + **Nama peran** – **lambda-dynamodb-role**.

**DBExecutionPeran AWSLambda Dynamo** memiliki izin yang diperlukan fungsi untuk membaca item dari DynamoDB dan menulis log ke Log. CloudWatch 

## Buat fungsi
<a name="with-ddb-example-create-function"></a>

Buat fungsi Lambda yang memproses peristiwa DynamoDB Anda. Kode fungsi menulis beberapa data peristiwa yang masuk ke CloudWatch Log.

------
#### [ .NET ]

**SDK untuk .NET**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda). 
Mengkonsumsi acara DynamoDB dengan Lambda menggunakan.NET.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
using System.Text.Json;
using System.Text;
using Amazon.Lambda.Core;
using Amazon.Lambda.DynamoDBEvents;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace AWSLambda_DDB;

public class Function
{
    public void FunctionHandler(DynamoDBEvent dynamoEvent, ILambdaContext context)
    {
        context.Logger.LogInformation($"Beginning to process {dynamoEvent.Records.Count} records...");

        foreach (var record in dynamoEvent.Records)
        {
            context.Logger.LogInformation($"Event ID: {record.EventID}");
            context.Logger.LogInformation($"Event Name: {record.EventName}");

            context.Logger.LogInformation(JsonSerializer.Serialize(record));
        }

        context.Logger.LogInformation("Stream processing complete.");
    }
}
```

------
#### [ Go ]

**SDK untuk Go V2**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda). 
Mengkonsumsi acara DynamoDB dengan Lambda menggunakan Go.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package main

import (
	"context"
	"github.com/aws/aws-lambda-go/lambda"
	"github.com/aws/aws-lambda-go/events"
	"fmt"
)

func HandleRequest(ctx context.Context, event events.DynamoDBEvent) (*string, error) {
	if len(event.Records) == 0 {
		return nil, fmt.Errorf("received empty event")
	}

	for _, record := range event.Records {
	 	LogDynamoDBRecord(record)
	}

	message := fmt.Sprintf("Records processed: %d", len(event.Records))
	return &message, nil
}

func main() {
	lambda.Start(HandleRequest)
}

func LogDynamoDBRecord(record events.DynamoDBEventRecord){
	fmt.Println(record.EventID)
	fmt.Println(record.EventName)
	fmt.Printf("%+v\n", record.Change)
}
```

------
#### [ Java ]

**SDK untuk Java 2.x**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda). 
Mengkonsumsi acara DynamoDB dengan Lambda menggunakan Java.  

```
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent;
import com.amazonaws.services.lambda.runtime.events.DynamodbEvent.DynamodbStreamRecord;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;

public class example implements RequestHandler<DynamodbEvent, Void> {

    private static final Gson GSON = new GsonBuilder().setPrettyPrinting().create();

    @Override
    public Void handleRequest(DynamodbEvent event, Context context) {
        System.out.println(GSON.toJson(event));
        event.getRecords().forEach(this::logDynamoDBRecord);
        return null;
    }

    private void logDynamoDBRecord(DynamodbStreamRecord record) {
        System.out.println(record.getEventID());
        System.out.println(record.getEventName());
        System.out.println("DynamoDB Record: " + GSON.toJson(record.getDynamodb()));
    }
}
```

------
#### [ JavaScript ]

**SDK untuk JavaScript (v3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda). 
Mengkonsumsi acara DynamoDB dengan Lambda menggunakan. JavaScript  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
exports.handler = async (event, context) => {
    console.log(JSON.stringify(event, null, 2));
    event.Records.forEach(record => {
        logDynamoDBRecord(record);
    });
};

const logDynamoDBRecord = (record) => {
    console.log(record.eventID);
    console.log(record.eventName);
    console.log(`DynamoDB Record: ${JSON.stringify(record.dynamodb)}`);
};
```
Mengkonsumsi acara DynamoDB dengan Lambda menggunakan. TypeScript  

```
export const handler = async (event, context) => {
    console.log(JSON.stringify(event, null, 2));
    event.Records.forEach(record => {
        logDynamoDBRecord(record);
    });
}
const logDynamoDBRecord = (record) => {
    console.log(record.eventID);
    console.log(record.eventName);
    console.log(`DynamoDB Record: ${JSON.stringify(record.dynamodb)}`);
};
```

------
#### [ PHP ]

**SDK untuk PHP**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda). 
Mengkonsumsi acara DynamoDB dengan Lambda menggunakan PHP.  

```
<?php

# using bref/bref and bref/logger for simplicity

use Bref\Context\Context;
use Bref\Event\DynamoDb\DynamoDbEvent;
use Bref\Event\DynamoDb\DynamoDbHandler;
use Bref\Logger\StderrLogger;

require __DIR__ . '/vendor/autoload.php';

class Handler extends DynamoDbHandler
{
    private StderrLogger $logger;

    public function __construct(StderrLogger $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @throws JsonException
     * @throws \Bref\Event\InvalidLambdaEvent
     */
    public function handleDynamoDb(DynamoDbEvent $event, Context $context): void
    {
        $this->logger->info("Processing DynamoDb table items");
        $records = $event->getRecords();

        foreach ($records as $record) {
            $eventName = $record->getEventName();
            $keys = $record->getKeys();
            $old = $record->getOldImage();
            $new = $record->getNewImage();
            
            $this->logger->info("Event Name:".$eventName."\n");
            $this->logger->info("Keys:". json_encode($keys)."\n");
            $this->logger->info("Old Image:". json_encode($old)."\n");
            $this->logger->info("New Image:". json_encode($new));
            
            // TODO: Do interesting work based on the new data

            // Any exception thrown will be logged and the invocation will be marked as failed
        }

        $totalRecords = count($records);
        $this->logger->info("Successfully processed $totalRecords items");
    }
}

$logger = new StderrLogger();
return new Handler($logger);
```

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

**SDK untuk Python (Boto3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda). 
Mengkonsumsi acara DynamoDB dengan Lambda menggunakan Python.  

```
import json

def lambda_handler(event, context):
    print(json.dumps(event, indent=2))

    for record in event['Records']:
        log_dynamodb_record(record)

def log_dynamodb_record(record):
    print(record['eventID'])
    print(record['eventName'])
    print(f"DynamoDB Record: {json.dumps(record['dynamodb'])}")
```

------
#### [ Ruby ]

**SDK untuk Ruby**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda). 
Mengkonsumsi acara DynamoDB dengan Lambda menggunakan Ruby.  

```
def lambda_handler(event:, context:)
    return 'received empty event' if event['Records'].empty?
  
    event['Records'].each do |record|
      log_dynamodb_record(record)
    end
  
    "Records processed: #{event['Records'].length}"
  end
  
  def log_dynamodb_record(record)
    puts record['eventID']
    puts record['eventName']
    puts "DynamoDB Record: #{JSON.generate(record['dynamodb'])}"
  end
```

------
#### [ Rust ]

**SDK for Rust**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-ddb-to-lambda). 
Mengkonsumsi acara DynamoDB dengan Lambda menggunakan Rust.  

```
use lambda_runtime::{service_fn, tracing, Error, LambdaEvent};
use aws_lambda_events::{
    event::dynamodb::{Event, EventRecord},
   };


// Built with the following dependencies:
//lambda_runtime = "0.11.1"
//serde_json = "1.0"
//tokio = { version = "1", features = ["macros"] }
//tracing = { version = "0.1", features = ["log"] }
//tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt"] }
//aws_lambda_events = "0.15.0"

async fn function_handler(event: LambdaEvent<Event>) ->Result<(), Error> {
    
    let records = &event.payload.records;
    tracing::info!("event payload: {:?}",records);
    if records.is_empty() {
        tracing::info!("No records found. Exiting.");
        return Ok(());
    }

    for record in records{
        log_dynamo_dbrecord(record);
    }

    tracing::info!("Dynamo db records processed");

    // Prepare the response
    Ok(())

}

fn log_dynamo_dbrecord(record: &EventRecord)-> Result<(), Error>{
    tracing::info!("EventId: {}", record.event_id);
    tracing::info!("EventName: {}", record.event_name);
    tracing::info!("DynamoDB Record: {:?}", record.change );
    Ok(())

}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
    .with_max_level(tracing::Level::INFO)
    .with_target(false)
    .without_time()
    .init();

    let func = service_fn(function_handler);
    lambda_runtime::run(func).await?;
    Ok(())
    
}
```

------

**Untuk membuat fungsi**

1. Salin kode sampel ke file dengan nama `example.js`.

1. Buat paket deployment.

   ```
   zip function.zip example.js
   ```

1. Buat fungsi Lambda dengan perintah `create-function`.

   ```
   aws lambda create-function --function-name ProcessDynamoDBRecords \
       --zip-file fileb://function.zip --handler example.handler --runtime nodejs24.x \
       --role arn:aws:iam::111122223333:role/lambda-dynamodb-role
   ```

## Uji fungsi Lambda
<a name="with-dbb-invoke-manually"></a>

Pada langkah ini, Anda menjalankan fungsi Lambda Anda secara manual menggunakan perintah `invoke` AWS Lambda CLI dan contoh peristiwa DynamoDB berikut. Salin berikut ini ke dalam file bernama`input.txt`.

**Example input.txt**  

```
{
   "Records":[
      {
         "eventID":"1",
         "eventName":"INSERT",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "NewImage":{
               "Message":{
                  "S":"New item!"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"111",
            "SizeBytes":26,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      },
      {
         "eventID":"2",
         "eventName":"MODIFY",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "NewImage":{
               "Message":{
                  "S":"This item has changed"
               },
               "Id":{
                  "N":"101"
               }
            },
            "OldImage":{
               "Message":{
                  "S":"New item!"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"222",
            "SizeBytes":59,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      },
      {
         "eventID":"3",
         "eventName":"REMOVE",
         "eventVersion":"1.0",
         "eventSource":"aws:dynamodb",
         "awsRegion":"us-east-1",
         "dynamodb":{
            "Keys":{
               "Id":{
                  "N":"101"
               }
            },
            "OldImage":{
               "Message":{
                  "S":"This item has changed"
               },
               "Id":{
                  "N":"101"
               }
            },
            "SequenceNumber":"333",
            "SizeBytes":38,
            "StreamViewType":"NEW_AND_OLD_IMAGES"
         },
         "eventSourceARN":"stream-ARN"
      }
   ]
}
```

Jalankan perintah `invoke` berikut. 

```
aws lambda invoke --function-name ProcessDynamoDBRecords \
    --cli-binary-format raw-in-base64-out \
    --payload file://input.txt outputfile.txt
```

**cli-binary-format**Opsi ini diperlukan jika Anda menggunakan AWS CLI versi 2. Untuk menjadikan ini pengaturan default, jalankan`aws configure set cli-binary-format raw-in-base64-out`. Untuk informasi selengkapnya, lihat [opsi baris perintah global yang AWS CLI didukung](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) di *Panduan AWS Command Line Interface Pengguna untuk Versi 2*.

Fungsi mengembalikan `message` string dalam badan respons. 

Verifikasikan output dalam `outputfile.txt` file.

## Buat tabel DynamoDB dengan aliran yang diaktifkan
<a name="with-ddb-create-buckets"></a>

Buat tabel Amazon DynamoDB dengan aliran yang diaktifkan.

**Untuk membuat tabel DynamoDB**

1. Buka [Konsol DynamoDB](https://console.aws.amazon.com/dynamodb).

1. Pilih **Buat tabel**.

1. Buat tabel dengan pengaturan berikut.
   + **Nama tabel** – **lambda-dynamodb-stream**
   + **Kunci utama** – **id** (string)

1. Pilih **Buat**.

**Untuk mengaktifkan stream**

1. Buka [Konsol DynamoDB](https://console.aws.amazon.com/dynamodb).

1. Pilih **Tables**.

1. Pilih tabel **lambda-dynamodb-stream**.

1. **Di bawah **Ekspor dan aliran, pilih detail aliran** DynamoDB.**

1. Pilih **Nyalakan**.

1. Untuk **tipe Tampilan**, pilih **Atribut kunci saja**.

1. Pilih **Aktifkan aliran**.

Tulis ARN stream. Anda memerlukan ini di langkah berikutnya ketika Anda mengaitkan aliran dengan fungsi Lambda Anda. Untuk informasi selengkapnya tentang mengaktifkan aliran, lihat [Menangkap aktivitas tabel dengan DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html).

## Tambahkan sumber acara di AWS Lambda
<a name="with-ddb-attach-notification-configuration"></a>

Buat pemetaan sumber peristiwa di AWS Lambda. Pemetaan sumber peristiwa ini mengaitkan aliran DynamoDB dengan fungsi Lambda Anda. Setelah Anda membuat pemetaan sumber acara ini, AWS Lambda mulai polling aliran.

Jalankan perintah AWS CLI `create-event-source-mapping` berikut. Setelah perintah dijalankan, catat UUID. Anda akan memerlukan UUID ini untuk merujuk ke pemetaan sumber kejadian dalam perintah apa pun, misalnya, saat menghapus pemetaan sumber kejadian.

```
aws lambda create-event-source-mapping --function-name ProcessDynamoDBRecords \
    --batch-size 100 --starting-position LATEST --event-source DynamoDB-stream-arn
```

 Ini membuat pemetaan di antara aliran DynamoDB yang ditentukan dan fungsi Lambda. Anda dapat mengaitkan aliran DynamoDB dengan beberapa fungsi Lambda, dan mengaitkan fungsi Lambda yang sama dengan beberapa aliran. Namun, fungsi Lambda akan membagikan throughput pembacaan untuk aliran yang mereka bagikan. 

Anda bisa mendapatkan daftar pemetaan sumber kejadian dengan menjalankan perintah berikut.

```
aws lambda list-event-source-mappings
```

Daftar tersebut mengembalikan semua pemetaan sumber kejadian yang Anda buat, dan antara lain menampilkan `LastProcessingResult` untuk setiap pemetaan. Bidang ini digunakan untuk memberikan pesan informatif jika terjadi masalah. Nilai seperti `No records processed` (menunjukkan bahwa AWS Lambda belum memulai polling atau bahwa tidak ada catatan dalam aliran) dan `OK` (menunjukkan AWS Lambda berhasil membaca catatan dari aliran dan memanggil fungsi Lambda Anda) menunjukkan bahwa tidak ada masalah. Jika ada masalah, Anda akan menerima pesan kesalahan.

Jika Anda memiliki banyak pemetaan sumber kejadian, gunakan parameter nama fungsi untuk mempersempit hasil.

```
aws lambda list-event-source-mappings --function-name ProcessDynamoDBRecords
```

## Uji penyiapan
<a name="with-ddb-final-integration-test-no-iam"></a>

Uji end-to-end pengalaman. Saat Anda melakukan pembaruan tabel, DynamoDB menuliskan catatan peristiwa ke aliran. Saat AWS Lambda melakukan polling terhadap aliran, ini mendeteksi catatan baru dalam aliran dan memanggil fungsi Lambda Anda atas nama Anda dengan mengirimkan peristiwa ke fungsi tersebut. 

1. Di konsol DynamoDB, tambahkan, perbarui, dan hapus item di tabel. DynamoDB menuliskan catatan tindakan ini ke aliran.

1. AWS Lambda polling aliran dan ketika mendeteksi pembaruan ke aliran, ia memanggil fungsi Lambda Anda dengan meneruskan data peristiwa yang ditemukannya di aliran.

1. Fungsi Anda berjalan dan membuat log di Amazon CloudWatch. Anda dapat memverifikasi log yang dilaporkan di CloudWatch konsol Amazon.

## Langkah selanjutnya
<a name="with-ddb-next-steps"></a>

Tutorial ini menunjukkan dasar-dasar pemrosesan peristiwa aliran DynamoDB dengan Lambda. Untuk beban kerja produksi, pertimbangkan untuk menerapkan logika respons batch sebagian untuk menangani kegagalan rekaman individu dengan lebih efisien. [Utilitas prosesor batch](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/) dari Powertools for AWS Lambda tersedia dalam Python TypeScript,, .NET, dan Java dan memberikan solusi yang kuat untuk ini, secara otomatis menangani kompleksitas respons batch sebagian dan mengurangi jumlah percobaan ulang untuk catatan yang berhasil diproses.

## Bersihkan sumber daya Anda
<a name="cleanup"></a>

Sekarang Anda dapat menghapus sumber daya yang Anda buat untuk tutorial ini, kecuali Anda ingin mempertahankannya. Dengan menghapus AWS sumber daya yang tidak lagi Anda gunakan, Anda mencegah tagihan yang tidak perlu ke Anda Akun AWS.

**Untuk menghapus fungsi Lambda**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi yang Anda buat.

1. Pilih **Tindakan**, **Hapus**.

1. Ketik **confirm** kolom input teks dan pilih **Hapus**.

**Untuk menghapus peran eksekusi**

1. Buka [halaman Peran](https://console.aws.amazon.com/iam/home#/roles) dari konsol IAM.

1. Pilih peran eksekusi yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan nama peran di bidang input teks dan pilih **Hapus**.

**Untuk menghapus tabel DynamoDB**

1. Buka [halaman Tabel](https://console.aws.amazon.com//dynamodb/home#tables:) di konsol DynamoDB.

1. Pilih tabel yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan **delete** di kotak teks.

1. Pilih **Hapus tabel**.

# Memproses peristiwa EC2 siklus hidup Amazon dengan fungsi Lambda
<a name="services-ec2"></a>

Anda dapat menggunakannya AWS Lambda untuk memproses peristiwa siklus hidup dari Amazon Elastic Compute Cloud dan mengelola sumber daya Amazon. EC2 Amazon EC2 mengirimkan peristiwa ke [Amazon EventBridge (CloudWatch Acara)](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-what-is.html) untuk [peristiwa siklus hidup](https://docs.aws.amazon.com/autoscaling/ec2/userguide/ec2-auto-scaling-lifecycle.html) seperti saat instance mengubah status, saat snapshot volume Amazon Elastic Block Store selesai, atau saat instance spot dijadwalkan untuk dihentikan. Anda mengonfigurasi EventBridge (CloudWatch Peristiwa) untuk meneruskan peristiwa tersebut ke fungsi Lambda untuk diproses.

EventBridge (CloudWatch Peristiwa) memanggil fungsi Lambda Anda secara asinkron dengan dokumen peristiwa dari Amazon. EC2

**Example kejadian siklus hidup instans**  

```
{
    "version": "0",
    "id": "b6ba298a-7732-2226-xmpl-976312c1a050",
    "detail-type": "EC2 Instance State-change Notification",
    "source": "aws.ec2",
    "account": "111122223333",
    "time": "2019-10-02T17:59:30Z",
    "region": "us-east-1",
    "resources": [
        "arn:aws:ec2:us-east-1:111122223333:instance/i-0c314xmplcd5b8173"
    ],
    "detail": {
        "instance-id": "i-0c314xmplcd5b8173",
        "state": "running"
    }
}
```

Untuk detail tentang mengonfigurasi acara, lihat[Memanggil fungsi Lambda sesuai jadwal](with-eventbridge-scheduler.md). Untuk fungsi contoh yang memproses notifikasi snapshot Amazon EBS, lihat [EventBridge Penjadwal untuk Amazon](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-cloud-watch-events.html) EBS.

Anda juga dapat menggunakan AWS SDK untuk mengelola instance dan sumber daya lainnya dengan Amazon EC2 API. 

## Memberikan izin untuk EventBridge (Acara) CloudWatch
<a name="services-ec2-permissions"></a>

Untuk memproses peristiwa siklus hidup dari Amazon EC2, EventBridge (CloudWatch Acara) memerlukan izin untuk menjalankan fungsi Anda. Izin ini berasal dari [kebijakan berbasis sumber daya](access-control-resource-based.md) milik fungsi. Jika Anda menggunakan konsol EventBridge (CloudWatch Peristiwa) untuk mengonfigurasi pemicu peristiwa, konsol akan memperbarui kebijakan berbasis sumber daya atas nama Anda. Jika tidak, tambahkan pernyataan seperti berikut:

**Example pernyataan kebijakan berbasis sumber daya untuk pemberitahuan siklus hidup Amazon EC2**  

```
{
  "Sid": "ec2-events",
  "Effect": "Allow",
  "Principal": {
    "Service": "events.amazonaws.com"
  },
  "Action": "lambda:InvokeFunction",
  "Resource": "arn:aws:lambda:us-east-1:12456789012:function:my-function",
  "Condition": {
    "ArnLike": {
      "AWS:SourceArn": "arn:aws:events:us-east-1:12456789012:rule/*"
    }
  }
}
```

Untuk menambahkan pernyataan, gunakan `add-permission` AWS CLI perintah.

```
aws lambda add-permission --action lambda:InvokeFunction --statement-id ec2-events \
--principal events.amazonaws.com --function-name my-function --source-arn 'arn:aws:events:us-east-1:12456789012:rule/*'
```

Jika fungsi Anda menggunakan AWS SDK untuk mengelola EC2 sumber daya Amazon, tambahkan EC2 izin Amazon ke peran [eksekusi](lambda-intro-execution-role.md) fungsi.

# Memproses permintaan Application Load Balancer dengan Lambda
<a name="services-alb"></a>

Anda dapat menggunakan fungsi Lambda untuk memproses permintaan dari Application Load Balancer. Elastic Load Balancing mendukung fungsi Lambda sebagai target untuk Application Load Balancer. Gunakan aturan load balancer untuk merutekan permintaan HTTP ke fungsi, berdasarkan nilai jalur atau header. Lakukan proses permintaan dan kembalikan respons HTTP dari fungsi Lambda Anda.

Elastic Load Balancing akan memanggil fungsi Lambda Anda secara sinkron dengan kejadian yang berisi badan dan metadata permintaan.

**Example Kejadian permintaan Application Load Balancer**  

```
{
    "requestContext": {
        "elb": {
            "targetGroupArn": "arn:aws:elasticloadbalancing:us-east-1:123456789012:targetgroup/lambda-279XGJDqGZ5rsrHC2Fjr/49e9d65c45c6791a"
        }
    },
    "httpMethod": "GET",
    "path": "/lambda",
    "queryStringParameters": {
        "query": "1234ABCD"
    },
    "headers": {
        "accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8",
        "accept-encoding": "gzip",
        "accept-language": "en-US,en;q=0.9",
        "connection": "keep-alive",
        "host": "lambda-alb-123578498.us-east-1.elb.amazonaws.com",
        "upgrade-insecure-requests": "1",
        "user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
        "x-amzn-trace-id": "Root=1-5c536348-3d683b8b04734faae651f476",
        "x-forwarded-for": "72.12.164.125",
        "x-forwarded-port": "80",
        "x-forwarded-proto": "http",
        "x-imforwards": "20"
    },
    "body": "",
    "isBase64Encoded": False
}
```

Fungsi Anda memproses kejadian dan mengembalikan dokumen respons ke load balancer dalam JSON. Elastic Load Balancing mengonversi dokumen menjadi respons keberhasilan atau kesalahan HTTP dan mengembalikannya ke pengguna.

**Example format dokumen respons**  

```
{
    "statusCode": 200,
    "statusDescription": "200 OK",
    "isBase64Encoded": False,
    "headers": {
        "Content-Type": "text/html"
    },
    "body": "<h1>Hello from Lambda!</h1>"
}
```

Untuk mengonfigurasi Application Load Balancer sebagai pemicu fungsi, berikan izin kepada Elastic Load Balancing untuk menjalankan fungsi, buat grup target yang merutekan permintaan ke fungsi, dan tambahkan aturan ke load balancer yang mengirim permintaan ke grup target.

Gunakan perintah `add-permission` untuk menambahkan pernyataan izin ke kebijakan berbasis sumber daya milik fungsi Anda.

```
aws lambda add-permission --function-name alb-function \
--statement-id load-balancer --action "lambda:InvokeFunction" \
--principal elasticloadbalancing.amazonaws.com
```

Anda akan melihat output berikut:

```
{
    "Statement": "{\"Sid\":\"load-balancer\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"elasticloadbalancing.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-west-2:123456789012:function:alb-function\"}"
}
```

Untuk petunjuk konfigurasi Application Load Balancer dan grup target, lihat [Fungsi Lambda sebagai target](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/lambda-functions.html) dalam *Panduan Pengguna untuk Application Load Balancer*.

## Event Handler dari Powertools untuk Lambda AWS
<a name="services-alb-powertools"></a>

Event handler dari Powertools for AWS Lambda toolkit menyediakan routing, middleware, konfigurasi CORS, pembuatan spesifikasi OpenAPI, validasi permintaan, penanganan kesalahan, dan fitur berguna lainnya saat menulis fungsi Lambda yang dipanggil oleh Application Load Balancer. Utilitas Event Handler tersedia untuk Python. Untuk informasi selengkapnya, lihat [Event Handler REST API](https://docs.powertools.aws.dev/lambda/python/latest/core/event_handler/api_gateway/) di dokumentasi *Powertools for AWS Lambda (Python)*.

### Python
<a name="services-alb-powertools-python"></a>

```
import requests
from requests import Response

from aws_lambda_powertools import Logger, Tracer
from aws_lambda_powertools.event_handler import ALBResolver
from aws_lambda_powertools.logging import correlation_paths
from aws_lambda_powertools.utilities.typing import LambdaContext

tracer = Tracer()
logger = Logger()
app = ALBResolver()


@app.get("/todos")
@tracer.capture_method
def get_todos():
    todos: Response = requests.get("https://jsonplaceholder.typicode.com/todos")
    todos.raise_for_status()

    # for brevity, we'll limit to the first 10 only
    return {"todos": todos.json()[:10]}


# You can continue to use other utilities just as before
@logger.inject_lambda_context(correlation_id_path=correlation_paths.APPLICATION_LOAD_BALANCER)
@tracer.capture_lambda_handler
def lambda_handler(event: dict, context: LambdaContext) -> dict:
    return app.resolve(event, context)
```

# Memanggil fungsi Lambda sesuai jadwal
<a name="with-eventbridge-scheduler"></a>

[Amazon EventBridge Scheduler adalah penjadwal](https://docs.aws.amazon.com/scheduler/latest/UserGuide/what-is-scheduler.html) tanpa server yang memungkinkan Anda membuat, menjalankan, dan mengelola tugas dari satu layanan terpusat dan terkelola. Dengan EventBridge Scheduler, Anda dapat membuat jadwal menggunakan ekspresi cron dan rate untuk pola berulang, atau mengonfigurasi pemanggilan satu kali. Anda dapat mengatur jendela waktu fleksibel untuk pengiriman, menentukan batas coba lagi, dan mengatur waktu retensi maksimum untuk peristiwa yang belum diproses.

Saat Anda mengatur EventBridge Scheduler dengan Lambda EventBridge , Scheduler memanggil fungsi Lambda Anda secara asinkron. Halaman ini menjelaskan cara menggunakan EventBridge Scheduler untuk menjalankan fungsi Lambda pada jadwal.

## Siapkan peran eksekusi
<a name="using-eventbridge-scheduler-execution-role"></a>

 Saat Anda membuat jadwal baru, EventBridge Scheduler harus memiliki izin untuk menjalankan operasi API targetnya atas nama Anda. Anda memberikan izin ini ke EventBridge Scheduler menggunakan peran *eksekusi*. Kebijakan izin yang Anda lampirkan ke peran eksekusi jadwal menentukan izin yang diperlukan. Izin ini bergantung pada API target yang ingin Anda panggil EventBridge Scheduler.

 Bila Anda menggunakan konsol EventBridge Scheduler untuk membuat jadwal, seperti dalam prosedur berikut, EventBridge Scheduler secara otomatis mengatur peran eksekusi berdasarkan target yang Anda pilih. Jika Anda ingin membuat jadwal menggunakan salah satu EventBridge Scheduler SDKs, atau AWS CLI CloudFormation, Anda harus memiliki peran eksekusi yang ada yang memberikan izin EventBridge Scheduler yang diperlukan untuk memanggil target. Untuk informasi selengkapnya tentang mengatur peran eksekusi secara manual untuk jadwal Anda, lihat [Menyiapkan peran eksekusi](https://docs.aws.amazon.com/scheduler/latest/UserGuide/setting-up.html#setting-up-execution-role) di *Panduan Pengguna EventBridge Penjadwal*. 

## Buat jadwal
<a name="using-eventbridge-scheduler-create"></a>

**Untuk membuat jadwal dengan menggunakan konsol**

1. Buka konsol Amazon EventBridge Scheduler di [https://console.aws.amazon.com/scheduler/rumah](https://console.aws.amazon.com/scheduler/home/).

1.  Pada halaman **Jadwal**, pilih **Buat jadwal**. 

1.  Pada halaman **Tentukan detail jadwal**, di bagian **Nama jadwal dan deskripsi**, lakukan hal berikut: 

   1. Untuk **nama Jadwal**, masukkan nama untuk jadwal Anda. Misalnya, **MyTestSchedule**. 

   1. (Opsional) Untuk **Deskripsi**, masukkan deskripsi untuk jadwal Anda. Misalnya, **My first schedule**.

   1. Untuk **grup Jadwal**, pilih grup jadwal dari daftar dropdown. Jika Anda tidak memiliki grup, pilih **default**. Untuk membuat grup jadwal, pilih **buat jadwal Anda sendiri**. 

      Anda menggunakan grup jadwal untuk menambahkan tag ke grup jadwal. 

1. 

   1. Pilih opsi jadwal Anda.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/with-eventbridge-scheduler.html)

1. (Opsional) Jika Anda memilih **Jadwal berulang** pada langkah sebelumnya, di bagian **Jangka Waktu**, lakukan hal berikut: 

   1. Untuk **Timezone**, pilih zona waktu. 

   1. Untuk **Tanggal dan waktu mulai**, masukkan tanggal yang valid dalam `YYYY/MM/DD` format, lalu tentukan stempel waktu dalam format 24 jam`hh:mm`. 

   1. Untuk **Tanggal dan waktu berakhir**, masukkan tanggal yang valid dalam `YYYY/MM/DD` format, lalu tentukan stempel waktu dalam format 24 jam`hh:mm`. 

1. Pilih **Berikutnya**. 

1. Pada halaman **Select target**, pilih operasi AWS API yang dipanggil EventBridge Scheduler: 

   1. Pilih **AWS Lambda Panggil**.

   1. Di bagian **Memanggil**, pilih fungsi atau pilih **Buat fungsi Lambda baru**.

   1. (Opsional) Masukkan payload JSON. Jika Anda tidak memasukkan payload, EventBridge Scheduler menggunakan peristiwa kosong untuk menjalankan fungsi.

1. Pilih **Berikutnya**. 

1. Pada halaman **Pengaturan**, lakukan hal berikut: 

   1. Untuk mengaktifkan jadwal, di bawah **Status jadwal**, alihkan **Aktifkan** jadwal. 

   1. Untuk mengonfigurasi kebijakan coba lagi untuk jadwal Anda, di bawah **Kebijakan Coba ulang dan antrian surat mati (DLQ**), lakukan hal berikut:
      + **Beralih Coba Lagi.**
      + Untuk **usia maksimum acara**, masukkan **jam** maksimum dan **min** yang harus disimpan oleh EventBridge Scheduler untuk menyimpan acara yang belum diproses.
      + Waktu maksimum adalah 24 jam.
      + Untuk **percobaan ulang Maksimum**, masukkan jumlah maksimum kali EventBridge Scheduler mencoba ulang jadwal jika target mengembalikan kesalahan. 

         Nilai maksimumnya adalah 185 percobaan ulang. 

      Dengan kebijakan coba lagi, jika jadwal gagal untuk memanggil targetnya, EventBridge Scheduler menjalankan kembali jadwal. Jika dikonfigurasi, Anda harus mengatur waktu retensi maksimum dan mencoba ulang untuk jadwal.

   1. Pilih tempat EventBridge Scheduler menyimpan acara yang tidak terkirim.     
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/with-eventbridge-scheduler.html)

   1. Untuk menggunakan kunci yang dikelola pelanggan untuk mengenkripsi input target Anda, di bawah **Enkripsi**, pilih **Sesuaikan pengaturan enkripsi (lanjutan)**. 

      Jika Anda memilih opsi ini, masukkan ARN kunci KMS yang ada atau **pilih AWS KMS key Buat** untuk menavigasi ke AWS KMS konsol. Untuk informasi selengkapnya tentang cara EventBridge Scheduler mengenkripsi data Anda saat istirahat, lihat [Enkripsi saat istirahat di Panduan](https://docs.aws.amazon.com/scheduler/latest/UserGuide/encryption-rest.html) Pengguna * EventBridge Penjadwal Amazon*. 

   1. Agar EventBridge Scheduler membuat peran eksekusi baru untuk Anda, pilih **Buat peran baru untuk jadwal ini**. Kemudian, masukkan nama untuk **nama Peran**. Jika Anda memilih opsi ini, EventBridge Scheduler melampirkan izin yang diperlukan untuk target template Anda ke peran.

1. Pilih **Berikutnya**. 

1.  Di halaman **Tinjau dan buat jadwal**, tinjau detail jadwal Anda. Di setiap bagian, pilih **Edit** untuk kembali ke langkah itu dan mengedit detailnya. 

1. Pilih **Buat jadwal**. 

   Anda dapat melihat daftar jadwal baru dan yang sudah ada di halaman **Jadwal**. Di bawah kolom **Status**, verifikasi bahwa jadwal baru Anda **Diaktifkan**. 

Untuk mengonfirmasi bahwa EventBridge Scheduler memanggil fungsi, [periksa log Amazon CloudWatch fungsi](monitoring-cloudwatchlogs-view.md#monitoring-cloudwatchlogs-console).

## Sumber daya terkait
<a name="using-eventbridge-scheduler-related-resources"></a>

 Untuk informasi selengkapnya tentang EventBridge Scheduler, lihat berikut ini: 
+ [EventBridge Panduan Pengguna Scheduler](https://docs.aws.amazon.com/scheduler/latest/UserGuide/what-is-scheduler.html)
+ [EventBridge Referensi API Scheduler](https://docs.aws.amazon.com/scheduler/latest/APIReference/Welcome.html)
+ [EventBridge Penetapan Harga Scheduler](https://aws.amazon.com/eventbridge/pricing/#Scheduler)

# Menggunakan AWS Lambda dengan AWS IoT
<a name="services-iot"></a>

AWS IoT menyediakan komunikasi yang aman antara perangkat yang terhubung ke internet (seperti sensor) dan Cloud. AWS Ini memungkinkan Anda untuk mengumpulkan, menyimpan, dan menganalisis data telemetri dari beberapa perangkat.

Anda dapat membuat AWS IoT aturan untuk berinteraksi dengan perangkat Anda Layanan AWS. AWS IoT [Rules Engine](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rules.html) menyediakan bahasa berbasis SQL untuk memilih data dari muatan pesan dan mengirim data ke layanan lain, seperti Amazon S3, Amazon DynamoDB, dan. AWS Lambda Anda menetapkan aturan untuk menjalankan fungsi Lambda ketika Anda ingin memanggil layanan AWS lain atau layanan pihak ketiga. 

Saat pesan IoT yang masuk memicu aturan, AWS IoT memanggil fungsi Lambda Anda secara asinkron dan meneruskan data dari pesan IoT ke [fungsi](invocation-async.md) tersebut. 

Contoh berikut menunjukkan pembacaan kelembapan dari sensor rumah kaca. Nilai **baris** dan **pos** mengidentifikasi lokasi sensor. Contoh kejadian ini didasarkan pada jenis rumah kaca dalam [tutorial Aturan AWS IoT](https://docs.aws.amazon.com/iot/latest/developerguide/iot-rules-tutorial.html). 

**Example AWS IoT pesan acara**  

```
{
    "row" : "10",
    "pos" : "23",
    "moisture" : "75"
}
```

Untuk invokasi asinkron, Lambda mengantrekan pesan dan [mencoba lagi](invocation-retries.md) jika fungsi Anda mengembalikan kesalahan. Konfigurasikan fungsi Anda dengan [tujuan](invocation-async-retain-records.md#invocation-async-destinations) untuk menyimpan kejadian yang tidak dapat diproses oleh fungsi Anda.

Anda perlu memberikan izin untuk AWS IoT layanan untuk menjalankan fungsi Lambda Anda. Gunakan perintah `add-permission` untuk menambahkan pernyataan izin ke kebijakan berbasis sumber daya milik fungsi Anda.

```
aws lambda add-permission --function-name my-function \
--statement-id iot-events --action "lambda:InvokeFunction" --principal iot.amazonaws.com
```

Anda akan melihat output berikut:

```
{
    "Statement": "{\"Sid\":\"iot-events\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:us-east-1:123456789012:function:my-function\"}"
}
```

Untuk informasi selengkapnya tentang cara menggunakan Lambda AWS IoT, lihat [Membuat AWS Lambda aturan](https://docs.aws.amazon.com/iot/latest/developerguide/iot-lambda-rule.html). 

# Menggunakan Lambda untuk memproses catatan dari Amazon Kinesis Data Streams
<a name="with-kinesis"></a>

Anda dapat menggunakan fungsi Lambda untuk memproses rekaman dalam aliran data [Amazon Kinesis](https://docs.aws.amazon.com/streams/latest/dev/introduction.html). [Anda dapat memetakan fungsi Lambda ke konsumen throughput bersama Kinesis Data Streams (iterator standar), atau ke konsumen throughput khusus dengan fan-out yang ditingkatkan.](https://docs.aws.amazon.com/kinesis/latest/dev/enhanced-consumers.html) Untuk iterator standar, Lambda melakukan polling rekaman di setiap shard dalam aliran Kinesis Anda dengan menggunakan protokol HTTP. Pemetaan sumber kejadian berbagi throughput baca dengan konsumen lain dari shard tersebut.

 Untuk perincian tentang aliran data Kinesis, lihat [Data Pembacaan dari Amazon Kinesis Data Streams](https://docs.aws.amazon.com/kinesis/latest/dev/building-consumers.html).

**catatan**  
Kinesis mengenakan biaya untuk setiap shard dan, untuk keluaran yang ditingkatkan, pembacaan data dari aliran. Untuk perincian harga, lihat [harga Amazon Kinesis](https://aws.amazon.com/kinesis/data-streams/pricing).

## Polling dan batching stream
<a name="kinesis-polling-and-batching"></a>

Lambda membaca rekaman dari aliran data dan memanggil fungsi Anda [secara sinkron](invocation-sync.md) dengan kejadian yang berisi rekaman aliran. Lambda membaca rekaman dalam batch dan memanggil fungsi Anda untuk memproses rekaman dari batch. Setiap batch berisi catatan dari satu shard/data aliran.

Fungsi Lambda Anda adalah aplikasi konsumen untuk aliran data Anda. Itu memproses satu batch rekaman pada satu waktu dari setiap shard. Anda dapat memetakan fungsi Lambda ke konsumen dengan throughput bersama (iterator standar), atau ke konsumen dengan throughput khusus dengan [keluaran yang ditingkatkan](https://docs.aws.amazon.com/kinesis/latest/dev/enhanced-consumers.html).
+ **Iterator standar:** Lambda polling setiap pecahan dalam aliran Kinesis Anda untuk catatan dengan kecepatan dasar sekali per detik. Saat tersedia lebih banyak rekaman, Lambda melanjutkan pemrosesan batch sampai fungsi dapat menyusul aliran. Pemetaan sumber kejadian berbagi throughput baca dengan konsumen lain dari shard tersebut.
+ **Peningkatan fan-out:** [Untuk meminimalkan latensi dan memaksimalkan throughput baca, buat konsumen aliran data dengan fan-out yang disempurnakan.](https://docs.aws.amazon.com/streams/latest/dev/enhanced-consumers.html) Konsumen dengan keluaran yang ditingkatkan mendapatkan koneksi khusus ke setiap shard yang tidak memengaruhi pembacaan aplikasi lain dari aliran tersebut. Konsumen aliran menggunakan HTTP/2 untuk mengurangi latensi dengan mendorong rekaman ke Lambda melalui koneksi yang sudah berlangsung lama dan dengan mengompresi header permintaan. Anda dapat membuat konsumen aliran dengan API Kinesis [RegisterStreamConsumer](https://docs.aws.amazon.com/kinesis/latest/APIReference/API_RegisterStreamConsumer.html).

```
aws kinesis register-stream-consumer \
--consumer-name con1 \
--stream-arn arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream
```

Anda akan melihat output berikut:

```
{
    "Consumer": {
        "ConsumerName": "con1",
        "ConsumerARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream/consumer/con1:1540591608",
        "ConsumerStatus": "CREATING",
        "ConsumerCreationTimestamp": 1540591608.0
    }
}
```

Untuk meningkatkan kecepatan proses fungsi Anda merekam, [tambahkan pecahan ke aliran data Anda](https://repost.aws/knowledge-center/kinesis-data-streams-open-shards). Lambda memproses rekaman dalam setiap shard secara berurutan. Lambda menghentikan pemrosesan rekaman tambahan dalam shard jika fungsi Anda mengembalikan kesalahan. Makin banyak shard, makin banyak batch yang diproses sekaligus sehingga mengurangi dampak kesalahan terhadap konkurensi.

Apabila fungsi Anda tidak dapat menskalakan naik untuk menangani jumlah total batch yang bersamaan, [mintalah kenaikan kuota](https://docs.aws.amazon.com/servicequotas/latest/userguide/request-quota-increase.html) atau [cadangkan konkurensi](configuration-concurrency.md) untuk fungsi Anda.

Secara default, Lambda memanggil fungsi Anda segera setelah catatan tersedia. Jika batch yang dibaca Lambda dari sumber peristiwa hanya memiliki satu catatan di dalamnya, Lambda hanya mengirimkan satu catatan ke fungsi tersebut. *Untuk menghindari menjalankan fungsi dengan sejumlah kecil catatan, Anda dapat memberi tahu sumber acara untuk menyangga catatan hingga 5 menit dengan mengonfigurasi jendela batching.* Sebelum menjalankan fungsi, Lambda terus membaca catatan dari sumber acara hingga mengumpulkan batch penuh, jendela batching kedaluwarsa, atau batch mencapai batas muatan 6 MB. Untuk informasi selengkapnya, lihat [Perilaku batching](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching).

**Awas**  
Pemetaan sumber peristiwa Lambda memproses setiap peristiwa setidaknya sekali, dan pemrosesan duplikat catatan dapat terjadi. Untuk menghindari potensi masalah yang terkait dengan duplikat peristiwa, kami sangat menyarankan agar Anda membuat kode fungsi Anda idempoten. Untuk mempelajari lebih lanjut, lihat [Bagaimana cara membuat fungsi Lambda saya idempoten](https://repost.aws/knowledge-center/lambda-function-idempotent) di Pusat Pengetahuan. AWS 

Lambda tidak menunggu [ekstensi](lambda-extensions.md) yang dikonfigurasi selesai sebelum mengirim batch berikutnya untuk diproses. Dengan kata lain, ekstensi Anda dapat terus berjalan saat Lambda memproses kumpulan catatan berikutnya. Hal ini dapat menyebabkan masalah pembatasan jika Anda melanggar pengaturan atau [batasan konkurensi](lambda-concurrency.md) akun Anda. Untuk mendeteksi apakah ini merupakan masalah potensial, pantau fungsi Anda dan periksa apakah Anda melihat [metrik konkurensi](monitoring-concurrency.md#general-concurrency-metrics) yang lebih tinggi dari yang diharapkan untuk pemetaan sumber peristiwa Anda. Karena waktu yang singkat di antara pemanggilan, Lambda mungkin secara singkat melaporkan penggunaan konkurensi yang lebih tinggi daripada jumlah pecahan. Ini bisa benar bahkan untuk fungsi Lambda tanpa ekstensi.

Konfigurasikan [ParallelizationFactor](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-ParallelizationFactor)pengaturan untuk memproses satu pecahan aliran data Kinesis dengan lebih dari satu pemanggilan Lambda secara bersamaan. Anda dapat menentukan jumlah batch bersamaan yang polling-nya dibuat Lambda dari shard melalui faktor paralelisasi mulai dari 1 (default) hingga 10. Misalnya, saat Anda menyetel `ParallelizationFactor` ke 2, Anda dapat memiliki maksimum 200 pemanggilan Lambda bersamaan untuk memproses 100 pecahan data Kinesis (meskipun dalam praktiknya, Anda mungkin melihat nilai yang berbeda untuk metrik). `ConcurrentExecutions` Hal ini membantu meningkatkan skala throughput pemrosesan ketika volume data tidak stabil dan `IteratorAge` tinggi. Saat Anda meningkatkan jumlah batch bersamaan per pecahan, Lambda masih memastikan pemrosesan in-order pada tingkat kunci partisi.

Anda juga dapat menggunakan `ParallelizationFactor` dengan agregasi Kinesis. Perilaku pemetaan sumber acara bergantung pada apakah Anda menggunakan [fan-out yang disempurnakan](https://docs.aws.amazon.com/streams/latest/dev/enhanced-consumers.html):
+ **Tanpa fan-out yang ditingkatkan**: Semua peristiwa di dalam acara agregat harus memiliki kunci partisi yang sama. Kunci partisi juga harus cocok dengan peristiwa agregat. Jika peristiwa di dalam peristiwa agregat memiliki kunci partisi yang berbeda, Lambda tidak dapat menjamin pemrosesan peristiwa secara berurutan dengan kunci partisi.
+ **Dengan fan-out yang disempurnakan**: Pertama, Lambda menerjemahkan peristiwa agregat ke dalam acara individualnya. Acara agregat dapat memiliki kunci partisi yang berbeda dari peristiwa yang dikandungnya. Namun, peristiwa yang tidak sesuai dengan kunci partisi [dijatuhkan dan hilang](https://github.com/awslabs/kinesis-aggregation/blob/master/potential_data_loss.md). Lambda tidak memproses peristiwa ini, dan tidak mengirimnya ke tujuan kegagalan yang dikonfigurasi.

## Contoh peristiwa
<a name="services-kinesis-event-example"></a>

**Example**  

```
{
    "Records": [
        {
            "kinesis": {
                "kinesisSchemaVersion": "1.0",
                "partitionKey": "1",
                "sequenceNumber": "49590338271490256608559692538361571095921575989136588898",
                "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==",
                "approximateArrivalTimestamp": 1545084650.987
            },
            "eventSource": "aws:kinesis",
            "eventVersion": "1.0",
            "eventID": "shardId-000000000006:49590338271490256608559692538361571095921575989136588898",
            "eventName": "aws:kinesis:record",
            "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-role",
            "awsRegion": "us-east-2",
            "eventSourceARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream"
        },
        {
            "kinesis": {
                "kinesisSchemaVersion": "1.0",
                "partitionKey": "1",
                "sequenceNumber": "49590338271490256608559692540925702759324208523137515618",
                "data": "VGhpcyBpcyBvbmx5IGEgdGVzdC4=",
                "approximateArrivalTimestamp": 1545084711.166
            },
            "eventSource": "aws:kinesis",
            "eventVersion": "1.0",
            "eventID": "shardId-000000000006:49590338271490256608559692540925702759324208523137515618",
            "eventName": "aws:kinesis:record",
            "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-role",
            "awsRegion": "us-east-2",
            "eventSourceARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream"
        }
    ]
}
```

# Memproses rekaman Amazon Kinesis Data Streams dengan Lambda
<a name="services-kinesis-create"></a>

Untuk memproses rekaman Amazon Kinesis Data Streams dengan Lambda, buat pemetaan sumber peristiwa Lambda. Anda dapat memetakan fungsi Lambda ke iterator standar atau konsumen penggemar yang disempurnakan. Untuk informasi selengkapnya, lihat [Polling dan batching stream](with-kinesis.md#kinesis-polling-and-batching).

## Buat pemetaan sumber acara Kinesis
<a name="services-kinesis-eventsourcemapping"></a>

Untuk menjalankan fungsi Lambda Anda dengan catatan dari aliran data Anda, buat pemetaan sumber [peristiwa](invocation-eventsourcemapping.md). Anda dapat membuat beberapa pemetaan sumber kejadian untuk memproses data yang sama dengan beberapa fungsi Lambda, atau untuk memproses item dari beberapa aliran data dengan satu fungsi. Saat memproses item dari beberapa aliran, setiap batch berisi catatan hanya dari satu pecahan atau aliran.

Anda dapat mengonfigurasi pemetaan sumber peristiwa untuk memproses catatan dari aliran yang berbeda. Akun AWS Untuk mempelajari selengkapnya, lihat [Membuat pemetaan sumber peristiwa lintas akun](#services-kinesis-eventsourcemapping-cross-account).

Sebelum Anda membuat pemetaan sumber peristiwa, Anda perlu memberikan izin fungsi Lambda Anda untuk membaca dari aliran data Kinesis. Lambda memerlukan izin berikut untuk mengelola sumber daya yang terkait dengan aliran data Kinesis Anda:
+ [kinesis: DescribeStream](https://docs.aws.amazon.com/lambda/latest/api/API_DescribeStream.html)
+ [kinesis: DescribeStreamSummary](https://docs.aws.amazon.com/lambda/latest/api/API_DescribeStreamSummary.html)
+ [kinesis: GetRecords](https://docs.aws.amazon.com/lambda/latest/api/API_GetRecords.html)
+ [kinesis: GetShardIterator](https://docs.aws.amazon.com/lambda/latest/api/API_GetShardIterator.html)
+ [kinesis: ListShards](https://docs.aws.amazon.com/lambda/latest/api/API_ListShards.html)
+ [kinesis: SubscribeToShard](https://docs.aws.amazon.com/lambda/latest/api/API_SubscribeToShard.html)

Kebijakan AWS terkelola [AWSLambdaKinesisExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaKinesisExecutionRole.html)mencakup izin ini. Tambahkan kebijakan terkelola ini ke fungsi Anda seperti yang dijelaskan dalam prosedur berikut.

**catatan**  
Anda tidak memerlukan `kinesis:ListStreams` izin untuk membuat dan mengelola pemetaan sumber acara untuk Kinesis. Namun, jika Anda membuat pemetaan sumber peristiwa di konsol dan Anda tidak memiliki izin ini, Anda tidak akan dapat memilih aliran Kinesis dari daftar tarik-turun dan konsol akan menampilkan kesalahan. Untuk membuat pemetaan sumber peristiwa, Anda harus memasukkan Nama Sumber Daya Amazon (ARN) secara manual dari aliran Anda.
Lambda membuat `kinesis:GetRecords` dan panggilan `kinesis:GetShardIterator` API saat mencoba kembali pemanggilan yang gagal.

------
#### [ Konsol Manajemen AWS ]

**Untuk menambahkan izin Kinesis ke fungsi Anda**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) konsol Lambda dan pilih fungsi Anda.

1. Di tab **Konfigurasi**, pilih **Izin**.

1. Di panel **Peran eksekusi**, di bawah **Nama peran**, pilih tautan ke peran eksekusi fungsi Anda. Tautan ini membuka halaman untuk peran itu di konsol IAM.

1. **Di panel **Kebijakan izin**, pilih **Tambahkan izin**, lalu pilih Lampirkan kebijakan.**

1. Di bidang pencarian, masukkan**AWSLambdaKinesisExecutionRole**.

1. Pilih kotak centang di samping kebijakan dan pilih **Tambah izin**.

------
#### [ AWS CLI ]

**Untuk menambahkan izin Kinesis ke fungsi Anda**
+ Jalankan perintah CLI berikut untuk menambahkan `AWSLambdaKinesisExecutionRole` kebijakan ke peran eksekusi fungsi Anda:

  ```
  aws iam attach-role-policy \
  --role-name MyFunctionRole \
  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaKinesisExecutionRole
  ```

------
#### [ AWS SAM ]

**Untuk menambahkan izin Kinesis ke fungsi Anda**
+ Dalam definisi fungsi Anda, tambahkan `Policies` properti seperti yang ditunjukkan pada contoh berikut:

  ```
  Resources:
    MyFunction:
      Type: AWS::Serverless::Function
      Properties:
        CodeUri: ./my-function/
        Handler: index.handler
        Runtime: nodejs24.x
        Policies:
          - AWSLambdaKinesisExecutionRole
  ```

------

Setelah mengonfigurasi izin yang diperlukan, buat pemetaan sumber acara.

------
#### [ Konsol Manajemen AWS ]

**Untuk membuat pemetaan sumber peristiwa Kinesis**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) konsol Lambda dan pilih fungsi Anda.

1. Di panel **Ikhtisar fungsi**, pilih **Tambah pemicu**.

1. Di bawah **Konfigurasi pemicu**, untuk sumbernya, pilih **Kinesis**.

1. Pilih aliran Kinesis yang ingin Anda buat pemetaan sumber acara dan, secara opsional, konsumen aliran Anda.

1. (Opsional) edit **ukuran Batch**, **Posisi awal**, dan **jendela Batch** untuk pemetaan sumber acara Anda.

1. Pilih **Tambahkan**.

Saat membuat pemetaan sumber peristiwa dari konsol, peran IAM Anda harus memiliki izin [kinesis: ListStreams dan [kinesis](https://docs.aws.amazon.com/lambda/latest/api/API_ListStreamConsumers.html):](https://docs.aws.amazon.com/lambda/latest/api/API_ListStreams.html). ListStreamConsumers

------
#### [ AWS CLI ]

**Untuk membuat pemetaan sumber peristiwa Kinesis**
+ Jalankan perintah CLI berikut untuk membuat pemetaan sumber peristiwa Kinesis. Pilih ukuran batch Anda sendiri dan posisi awal sesuai dengan kasus penggunaan Anda.

  ```
  aws lambda create-event-source-mapping \
  --function-name MyFunction \
  --event-source-arn arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream \
  --starting-position LATEST \
  --batch-size 100
  ```

Untuk menentukan jendela batching, tambahkan `--maximum-batching-window-in-seconds` opsi. Untuk informasi selengkapnya tentang penggunaan parameter ini dan parameter lainnya, lihat [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html)di *AWS CLI Command Reference*.

------
#### [ AWS SAM ]

**Untuk membuat pemetaan sumber peristiwa Kinesis**
+ Dalam definisi fungsi Anda, tambahkan `KinesisEvent` properti seperti yang ditunjukkan pada contoh berikut:

  ```
  Resources:
    MyFunction:
      Type: AWS::Serverless::Function
      Properties:
        CodeUri: ./my-function/
        Handler: index.handler
        Runtime: nodejs24.x
        Policies:
          - AWSLambdaKinesisExecutionRole
        Events:
          KinesisEvent:
            Type: Kinesis
            Properties:
              Stream: !GetAtt MyKinesisStream.Arn
              StartingPosition: LATEST
              BatchSize: 100
  
    MyKinesisStream:
      Type: AWS::Kinesis::Stream
      Properties:
        ShardCount: 1
  ```

*Untuk mempelajari selengkapnya tentang membuat pemetaan sumber peristiwa untuk Kinesis Data Streams di AWS SAM, lihat [Kinesis](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-kinesis.html) dalam Panduan Pengembang.AWS Serverless Application Model *

------

## Posisi awal polling dan streaming
<a name="services-kinesis-stream-start-pos"></a>

Ketahuilah bahwa polling streaming selama pembuatan dan pembaruan pemetaan sumber acara pada akhirnya konsisten.
+ Selama pembuatan pemetaan sumber acara, mungkin diperlukan beberapa menit untuk memulai acara polling dari aliran.
+ Selama pembaruan pemetaan sumber acara, mungkin diperlukan beberapa menit untuk menghentikan dan memulai kembali acara pemungutan suara dari aliran.

Perilaku ini berarti bahwa jika Anda menentukan `LATEST` sebagai posisi awal untuk aliran, pemetaan sumber peristiwa dapat melewatkan peristiwa selama pembuatan atau pembaruan. Untuk memastikan bahwa tidak ada peristiwa yang terlewatkan, tentukan posisi awal aliran sebagai `TRIM_HORIZON` atau`AT_TIMESTAMP`.

## Membuat pemetaan sumber peristiwa lintas akun
<a name="services-kinesis-eventsourcemapping-cross-account"></a>

Amazon Kinesis Data [Streams](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_identity-vs-resource.html) mendukung kebijakan berbasis sumber daya. Karena itu, Anda dapat memproses data yang dicerna ke dalam aliran dalam satu Akun AWS dengan fungsi Lambda di akun lain.

Untuk membuat pemetaan sumber peristiwa untuk fungsi Lambda Anda menggunakan aliran Kinesis yang Akun AWS berbeda, Anda harus mengonfigurasi aliran menggunakan kebijakan berbasis sumber daya untuk memberikan izin fungsi Lambda Anda untuk membaca item. Untuk mempelajari cara mengonfigurasi streaming agar memungkinkan akses lintas akun, lihat [Berbagi akses dengan AWS Lambda fungsi lintas akun](https://docs.aws.amazon.com/streams/latest/dev/resource-based-policy-examples.html#Resource-based-policy-examples-lambda) di panduan Pengembang *Amazon Kinesis Streams*.

Setelah mengonfigurasi aliran Anda dengan kebijakan berbasis sumber daya yang memberi fungsi Lambda Anda izin yang diperlukan, buat pemetaan sumber peristiwa menggunakan salah satu metode yang dijelaskan di bagian sebelumnya.

Jika Anda memilih untuk membuat pemetaan sumber acara menggunakan konsol Lambda, tempelkan ARN aliran Anda langsung ke bidang input. Jika Anda ingin menentukan konsumen untuk streaming Anda, menempelkan ARN konsumen secara otomatis mengisi bidang aliran.

# Mengonfigurasi respons batch sebagian dengan Kinesis Data Streams dan Lambda
<a name="services-kinesis-batchfailurereporting"></a>

Ketika menggunakan dan memproses data streaming dari sumber peristiwa, secara default Lambda memeriksa urutan nomor tertinggi batch hanya ketika batch berhasil diselesaikan. Lambda memperlakukan semua hasil lain sebagai sepenuhnya gagal dan mencoba lagi pemrosesan batch hingga batas coba lagi. Untuk memungkinkan keberhasilan parsial saat memproses batch dari aliran, aktifkan `ReportBatchItemFailures`. Mengizinkan keberhasilan parsial dapat membantu mengurangi jumlah percobaan ulang pada catatan, meskipun tidak sepenuhnya mencegah kemungkinan percobaan ulang dalam catatan yang sukses.

Untuk mengaktifkan `ReportBatchItemFailures`, masukkan nilai enum **ReportBatchItemFailures** dalam daftar [FunctionResponseTypes](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-FunctionResponseTypes). Daftar ini menunjukkan tipe respon yang diaktifkan untuk fungsi Anda. Anda dapat mengonfigurasi daftar ini saat [membuat](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html) atau [memperbarui](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html) pemetaan sumber peristiwa.

**catatan**  
Bahkan ketika kode fungsi Anda mengembalikan respons kegagalan sebagian batch, respons ini tidak akan diproses oleh Lambda kecuali `ReportBatchItemFailures` fitur tersebut diaktifkan secara eksplisit untuk pemetaan sumber acara Anda.

## Sintaks laporan
<a name="streams-batchfailurereporting-syntax"></a>

Saat mengonfigurasi pelaporan pada kegagalan item batch, kelas `StreamsEventResponse` dikembalikan dengan daftar kegagalan item batch. Anda dapat menggunakan objek `StreamsEventResponse` untuk mengembalikan nomor urutan catatan gagal pertama dalam batch. Anda juga dapat membuat kelas kustom Anda sendiri menggunakan sintaks respons yang benar. Struktur JSON berikut menunjukkan sintaks respons yang diperlukan:

```
{ 
  "batchItemFailures": [ 
        {
            "itemIdentifier": "<SequenceNumber>"
        }
    ]
}
```

**catatan**  
Jika `batchItemFailures` array berisi beberapa item, Lambda menggunakan catatan dengan nomor urut terendah sebagai pos pemeriksaan. Lambda kemudian mencoba kembali semua catatan mulai dari pos pemeriksaan itu.

## Status berhasil dan gagal
<a name="streams-batchfailurereporting-conditions"></a>

Lambda memperlakukan batch sebagai sepenuhnya berhasil jika Anda mengembalikan salah satu dari berikut:
+ Daftar `batchItemFailure` kosong
+ Daftar `batchItemFailure` nol
+ `EventResponse` kosong
+ `EventResponse` nol

Lambda memperlakukan batch sebagai sepenuhnya gagal jika Anda mengembalikan salah satu dari berikut:
+ String `itemIdentifier` kosong
+ `itemIdentifier` nol
+ `itemIdentifier` dengan nama kunci yang buruk

Lambda mencoba kembali kegagalan berdasarkan strategi coba lagi Anda.

## Membagi batch
<a name="streams-batchfailurereporting-bisect"></a>

Jika invokasi Anda gagal dan `BisectBatchOnFunctionError` diaktifkan, batch dibagi terlepas dari pengaturan `ReportBatchItemFailures` Anda.

Ketika respons berhasil batch parsial diterima dan kedua `BisectBatchOnFunctionError` dan `ReportBatchItemFailures` diaktifkan, batch dibagi dua di nomor urutan yang dikembalikan dan Lambda mencoba hanya catatan yang tersisa.

Untuk menyederhanakan implementasi logika respons batch sebagian, pertimbangkan untuk menggunakan [utilitas Prosesor Batch](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/) dari Powertools untuk AWS Lambda, yang secara otomatis menangani kompleksitas ini untuk Anda.

Berikut adalah beberapa contoh kode fungsi yang mengembalikan daftar pesan gagal IDs dalam batch:

------
#### [ .NET ]

**SDK untuk .NET**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda-with-batch-item-handling). 
Melaporkan kegagalan item batch Kinesis dengan Lambda menggunakan.NET.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
﻿using System.Text;
using System.Text.Json.Serialization;
using Amazon.Lambda.Core;
using Amazon.Lambda.KinesisEvents;
using AWS.Lambda.Powertools.Logging;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace KinesisIntegration;

public class Function
{
    // Powertools Logger requires an environment variables against your function
    // POWERTOOLS_SERVICE_NAME
    [Logging(LogEvent = true)]
    public async Task<StreamsEventResponse> FunctionHandler(KinesisEvent evnt, ILambdaContext context)
    {
        if (evnt.Records.Count == 0)
        {
            Logger.LogInformation("Empty Kinesis Event received");
            return new StreamsEventResponse();
        }

        foreach (var record in evnt.Records)
        {
            try
            {
                Logger.LogInformation($"Processed Event with EventId: {record.EventId}");
                string data = await GetRecordDataAsync(record.Kinesis, context);
                Logger.LogInformation($"Data: {data}");
                // TODO: Do interesting work based on the new data
            }
            catch (Exception ex)
            {
                Logger.LogError($"An error occurred {ex.Message}");
                /* Since we are working with streams, we can return the failed item immediately.
                   Lambda will immediately begin to retry processing from this failed item onwards. */
                return new StreamsEventResponse
                {
                    BatchItemFailures = new List<StreamsEventResponse.BatchItemFailure>
                    {
                        new StreamsEventResponse.BatchItemFailure { ItemIdentifier = record.Kinesis.SequenceNumber }
                    }
                };
            }
        }
        Logger.LogInformation($"Successfully processed {evnt.Records.Count} records.");
        return new StreamsEventResponse();
    }

    private async Task<string> GetRecordDataAsync(KinesisEvent.Record record, ILambdaContext context)
    {
        byte[] bytes = record.Data.ToArray();
        string data = Encoding.UTF8.GetString(bytes);
        await Task.CompletedTask; //Placeholder for actual async work
        return data;
    }
}

public class StreamsEventResponse
{
    [JsonPropertyName("batchItemFailures")]
    public IList<BatchItemFailure> BatchItemFailures { get; set; }
    public class BatchItemFailure
    {
        [JsonPropertyName("itemIdentifier")]
        public string ItemIdentifier { get; set; }
    }
}
```

------
#### [ Go ]

**SDK untuk Go V2**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda-with-batch-item-handling). 
Melaporkan kegagalan item batch Kinesis dengan Lambda menggunakan Go.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package main

import (
	"context"
	"fmt"
	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(ctx context.Context, kinesisEvent events.KinesisEvent) (map[string]interface{}, error) {
	batchItemFailures := []map[string]interface{}{}

	for _, record := range kinesisEvent.Records {
		curRecordSequenceNumber := ""

		// Process your record
		if /* Your record processing condition here */ {
			curRecordSequenceNumber = record.Kinesis.SequenceNumber
		}

		// Add a condition to check if the record processing failed
		if curRecordSequenceNumber != "" {
			batchItemFailures = append(batchItemFailures, map[string]interface{}{"itemIdentifier": curRecordSequenceNumber})
		}
	}

	kinesisBatchResponse := map[string]interface{}{
		"batchItemFailures": batchItemFailures,
	}
	return kinesisBatchResponse, nil
}

func main() {
	lambda.Start(handler)
}
```

------
#### [ Java ]

**SDK untuk Java 2.x**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda-with-batch-item-handling). 
Melaporkan kegagalan item batch Kinesis dengan Lambda menggunakan Java.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.KinesisEvent;
import com.amazonaws.services.lambda.runtime.events.StreamsEventResponse;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

public class ProcessKinesisRecords implements RequestHandler<KinesisEvent, StreamsEventResponse> {

    @Override
    public StreamsEventResponse handleRequest(KinesisEvent input, Context context) {

        List<StreamsEventResponse.BatchItemFailure> batchItemFailures = new ArrayList<>();
        String curRecordSequenceNumber = "";

        for (KinesisEvent.KinesisEventRecord kinesisEventRecord : input.getRecords()) {
            try {
                //Process your record
                KinesisEvent.Record kinesisRecord = kinesisEventRecord.getKinesis();
                curRecordSequenceNumber = kinesisRecord.getSequenceNumber();

            } catch (Exception e) {
                /* Since we are working with streams, we can return the failed item immediately.
                   Lambda will immediately begin to retry processing from this failed item onwards. */
                batchItemFailures.add(new StreamsEventResponse.BatchItemFailure(curRecordSequenceNumber));
                return new StreamsEventResponse(batchItemFailures);
            }
        }
       
       return new StreamsEventResponse(batchItemFailures);   
    }
}
```

------
#### [ JavaScript ]

**SDK untuk JavaScript (v3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/blob/main/integration-kinesis-to-lambda-with-batch-item-handling). 
Melaporkan kegagalan item batch Kinesis dengan Lambda menggunakan Javascript.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
exports.handler = async (event, context) => {
  for (const record of event.Records) {
    try {
      console.log(`Processed Kinesis Event - EventID: ${record.eventID}`);
      const recordData = await getRecordDataAsync(record.kinesis);
      console.log(`Record Data: ${recordData}`);
      // TODO: Do interesting work based on the new data
    } catch (err) {
      console.error(`An error occurred ${err}`);
      /* Since we are working with streams, we can return the failed item immediately.
            Lambda will immediately begin to retry processing from this failed item onwards. */
      return {
        batchItemFailures: [{ itemIdentifier: record.kinesis.sequenceNumber }],
      };
    }
  }
  console.log(`Successfully processed ${event.Records.length} records.`);
  return { batchItemFailures: [] };
};

async function getRecordDataAsync(payload) {
  var data = Buffer.from(payload.data, "base64").toString("utf-8");
  await Promise.resolve(1); //Placeholder for actual async work
  return data;
}
```
Melaporkan kegagalan item batch Kinesis dengan penggunaan Lambda. TypeScript  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import {
  KinesisStreamEvent,
  Context,
  KinesisStreamHandler,
  KinesisStreamRecordPayload,
  KinesisStreamBatchResponse,
} from "aws-lambda";
import { Buffer } from "buffer";
import { Logger } from "@aws-lambda-powertools/logger";

const logger = new Logger({
  logLevel: "INFO",
  serviceName: "kinesis-stream-handler-sample",
});

export const functionHandler: KinesisStreamHandler = async (
  event: KinesisStreamEvent,
  context: Context
): Promise<KinesisStreamBatchResponse> => {
  for (const record of event.Records) {
    try {
      logger.info(`Processed Kinesis Event - EventID: ${record.eventID}`);
      const recordData = await getRecordDataAsync(record.kinesis);
      logger.info(`Record Data: ${recordData}`);
      // TODO: Do interesting work based on the new data
    } catch (err) {
      logger.error(`An error occurred ${err}`);
      /* Since we are working with streams, we can return the failed item immediately.
            Lambda will immediately begin to retry processing from this failed item onwards. */
      return {
        batchItemFailures: [{ itemIdentifier: record.kinesis.sequenceNumber }],
      };
    }
  }
  logger.info(`Successfully processed ${event.Records.length} records.`);
  return { batchItemFailures: [] };
};

async function getRecordDataAsync(
  payload: KinesisStreamRecordPayload
): Promise<string> {
  var data = Buffer.from(payload.data, "base64").toString("utf-8");
  await Promise.resolve(1); //Placeholder for actual async work
  return data;
}
```

------
#### [ PHP ]

**SDK untuk PHP**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda-with-batch-item-handling). 
Melaporkan kegagalan item batch Kinesis dengan Lambda menggunakan PHP.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
<?php

# using bref/bref and bref/logger for simplicity

use Bref\Context\Context;
use Bref\Event\Kinesis\KinesisEvent;
use Bref\Event\Handler as StdHandler;
use Bref\Logger\StderrLogger;

require __DIR__ . '/vendor/autoload.php';

class Handler implements StdHandler
{
    private StderrLogger $logger;
    public function __construct(StderrLogger $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @throws JsonException
     * @throws \Bref\Event\InvalidLambdaEvent
     */
    public function handle(mixed $event, Context $context): array
    {
        $kinesisEvent = new KinesisEvent($event);
        $this->logger->info("Processing records");
        $records = $kinesisEvent->getRecords();

        $failedRecords = [];
        foreach ($records as $record) {
            try {
                $data = $record->getData();
                $this->logger->info(json_encode($data));
                // TODO: Do interesting work based on the new data
            } catch (Exception $e) {
                $this->logger->error($e->getMessage());
                // failed processing the record
                $failedRecords[] = $record->getSequenceNumber();
            }
        }
        $totalRecords = count($records);
        $this->logger->info("Successfully processed $totalRecords records");

        // change format for the response
        $failures = array_map(
            fn(string $sequenceNumber) => ['itemIdentifier' => $sequenceNumber],
            $failedRecords
        );

        return [
            'batchItemFailures' => $failures
        ];
    }
}

$logger = new StderrLogger();
return new Handler($logger);
```

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

**SDK untuk Python (Boto3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda-with-batch-item-handling). 
Melaporkan kegagalan item batch Kinesis dengan Lambda menggunakan Python.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def handler(event, context):
    records = event.get("Records")
    curRecordSequenceNumber = ""
    
    for record in records:
        try:
            # Process your record
            curRecordSequenceNumber = record["kinesis"]["sequenceNumber"]
        except Exception as e:
            # Return failed record's sequence number
            return {"batchItemFailures":[{"itemIdentifier": curRecordSequenceNumber}]}

    return {"batchItemFailures":[]}
```

------
#### [ Ruby ]

**SDK untuk Ruby**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda-with-batch-item-handling). 
Melaporkan kegagalan item batch Kinesis dengan Lambda menggunakan Ruby.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
require 'aws-sdk'

def lambda_handler(event:, context:)
  batch_item_failures = []

  event['Records'].each do |record|
    begin
      puts "Processed Kinesis Event - EventID: #{record['eventID']}"
      record_data = get_record_data_async(record['kinesis'])
      puts "Record Data: #{record_data}"
      # TODO: Do interesting work based on the new data
    rescue StandardError => err
      puts "An error occurred #{err}"
      # Since we are working with streams, we can return the failed item immediately.
      # Lambda will immediately begin to retry processing from this failed item onwards.
      return { batchItemFailures: [{ itemIdentifier: record['kinesis']['sequenceNumber'] }] }
    end
  end

  puts "Successfully processed #{event['Records'].length} records."
  { batchItemFailures: batch_item_failures }
end

def get_record_data_async(payload)
  data = Base64.decode64(payload['data']).force_encoding('utf-8')
  # Placeholder for actual async work
  sleep(1)
  data
end
```

------
#### [ Rust ]

**SDK for Rust**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda-with-batch-item-handling). 
Melaporkan kegagalan item batch Kinesis dengan Lambda menggunakan Rust.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
use aws_lambda_events::{
    event::kinesis::KinesisEvent,
    kinesis::KinesisEventRecord,
    streams::{KinesisBatchItemFailure, KinesisEventResponse},
};
use lambda_runtime::{run, service_fn, Error, LambdaEvent};

async fn function_handler(event: LambdaEvent<KinesisEvent>) -> Result<KinesisEventResponse, Error> {
    let mut response = KinesisEventResponse {
        batch_item_failures: vec![],
    };

    if event.payload.records.is_empty() {
        tracing::info!("No records found. Exiting.");
        return Ok(response);
    }

    for record in &event.payload.records {
        tracing::info!(
            "EventId: {}",
            record.event_id.as_deref().unwrap_or_default()
        );

        let record_processing_result = process_record(record);

        if record_processing_result.is_err() {
            response.batch_item_failures.push(KinesisBatchItemFailure {
                item_identifier: record.kinesis.sequence_number.clone(),
            });
            /* Since we are working with streams, we can return the failed item immediately.
            Lambda will immediately begin to retry processing from this failed item onwards. */
            return Ok(response);
        }
    }

    tracing::info!(
        "Successfully processed {} records",
        event.payload.records.len()
    );

    Ok(response)
}

fn process_record(record: &KinesisEventRecord) -> Result<(), Error> {
    let record_data = std::str::from_utf8(record.kinesis.data.as_slice());

    if let Some(err) = record_data.err() {
        tracing::error!("Error: {}", err);
        return Err(Error::from(err));
    }

    let record_data = record_data.unwrap_or_default();

    // do something interesting with the data
    tracing::info!("Data: {}", record_data);

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        // disable printing the name of the module in every log line.
        .with_target(false)
        // disabling time is handy because CloudWatch will add the ingestion time.
        .without_time()
        .init();

    run(service_fn(function_handler)).await
}
```

------

## Menggunakan Powertools untuk prosesor AWS Lambda batch
<a name="services-kinesis-batchfailurereporting-powertools"></a>

Utilitas prosesor batch dari Powertools untuk AWS Lambda secara otomatis menangani logika respons batch paral, mengurangi kompleksitas penerapan pelaporan kegagalan batch. Berikut adalah contoh menggunakan prosesor batch:

**Python**  
Untuk contoh lengkap dan petunjuk penyiapan, lihat [dokumentasi prosesor batch](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/).
Memproses Kinesis Data Streams stream AWS Lambda record dengan batch processor.  

```
import json
from aws_lambda_powertools import Logger
from aws_lambda_powertools.utilities.batch import BatchProcessor, EventType, process_partial_response
from aws_lambda_powertools.utilities.data_classes import KinesisEvent
from aws_lambda_powertools.utilities.typing import LambdaContext

processor = BatchProcessor(event_type=EventType.KinesisDataStreams)
logger = Logger()

def record_handler(record):
    logger.info(record)
    # Your business logic here
    # Raise an exception to mark this record as failed
    
def lambda_handler(event, context: LambdaContext):
    return process_partial_response(
        event=event, 
        record_handler=record_handler, 
        processor=processor,
        context=context
    )
```

**TypeScript**  
Untuk contoh lengkap dan petunjuk penyiapan, lihat [dokumentasi prosesor batch](https://docs.aws.amazon.com/powertools/typescript/latest/features/batch/).
Memproses Kinesis Data Streams stream AWS Lambda record dengan batch processor.  

```
import { BatchProcessor, EventType, processPartialResponse } from '@aws-lambda-powertools/batch';
import { Logger } from '@aws-lambda-powertools/logger';
import type { KinesisEvent, Context } from 'aws-lambda';

const processor = new BatchProcessor(EventType.KinesisDataStreams);
const logger = new Logger();

const recordHandler = async (record: any): Promise<void> => {
    logger.info('Processing record', { record });
    // Your business logic here
    // Throw an error to mark this record as failed
};

export const handler = async (event: KinesisEvent, context: Context) => {
    return processPartialResponse(event, recordHandler, processor, {
        context,
    });
};
```

**Java**  
Untuk contoh lengkap dan petunjuk penyiapan, lihat [dokumentasi prosesor batch](https://docs.powertools.aws.dev/lambda/java/latest/utilities/batch/).
Memproses Kinesis Data Streams stream AWS Lambda record dengan batch processor.  

```
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.KinesisEvent;
import com.amazonaws.services.lambda.runtime.events.StreamsEventResponse;
import software.amazon.lambda.powertools.batch.BatchMessageHandlerBuilder;
import software.amazon.lambda.powertools.batch.handler.BatchMessageHandler;

public class KinesisStreamBatchHandler implements RequestHandler<KinesisEvent, StreamsEventResponse> {

    private final BatchMessageHandler<KinesisEvent, StreamsEventResponse> handler;

    public KinesisStreamBatchHandler() {
        handler = new BatchMessageHandlerBuilder()
                .withKinesisBatchHandler()
                .buildWithRawMessageHandler(this::processMessage);
    }

    @Override
    public StreamsEventResponse handleRequest(KinesisEvent kinesisEvent, Context context) {
        return handler.processBatch(kinesisEvent, context);
    }

    private void processMessage(KinesisEvent.KinesisEventRecord kinesisEventRecord, Context context) {
        // Process the stream record
    }
}
```

**.NET**  
Untuk contoh lengkap dan petunjuk penyiapan, lihat [dokumentasi prosesor batch](https://docs.aws.amazon.com/powertools/dotnet/utilities/batch-processing/).
Memproses Kinesis Data Streams stream AWS Lambda record dengan batch processor.  

```
using System;
using System.Threading;
using System.Threading.Tasks;
using Amazon.Lambda.Core;
using Amazon.Lambda.KinesisEvents;
using Amazon.Lambda.Serialization.SystemTextJson;
using AWS.Lambda.Powertools.BatchProcessing;

[assembly: LambdaSerializer(typeof(DefaultLambdaJsonSerializer))]

namespace HelloWorld;

public class OrderEvent
{
    public string? OrderId { get; set; }
    public string? CustomerId { get; set; }
    public decimal Amount { get; set; }
    public DateTime OrderDate { get; set; }
}

internal class TypedKinesisRecordHandler : ITypedRecordHandler<OrderEvent> 
{
    public async Task<RecordHandlerResult> HandleAsync(OrderEvent orderEvent, CancellationToken cancellationToken)
    {
        if (string.IsNullOrEmpty(orderEvent.OrderId)) 
        {
            throw new ArgumentException("Order ID is required");
        }

        return await Task.FromResult(RecordHandlerResult.None); 
    }
}

public class Function
{
    [BatchProcessor(TypedRecordHandler = typeof(TypedKinesisRecordHandler))]
    public BatchItemFailuresResponse HandlerUsingTypedAttribute(KinesisEvent _)
    {
        return TypedKinesisStreamBatchProcessor.Result.BatchItemFailuresResponse; 
    }
}
```

# Menyimpan catatan batch yang dibuang untuk sumber peristiwa Kinesis Data Streams di Lambda
<a name="kinesis-on-failure-destination"></a>

Penanganan kesalahan untuk pemetaan sumber peristiwa Kinesis bergantung pada apakah kesalahan terjadi sebelum fungsi dipanggil atau selama pemanggilan fungsi:
+ **Sebelum pemanggilan:** Jika pemetaan sumber peristiwa Lambda tidak dapat menjalankan fungsi karena pelambatan atau masalah lain, ia akan mencoba lagi hingga catatan kedaluwarsa atau melebihi usia maksimum yang dikonfigurasi pada pemetaan sumber peristiwa (). [MaximumRecordAgeInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumRecordAgeInSeconds)
+ **Selama pemanggilan:** Jika fungsi dipanggil tetapi menampilkan kesalahan, Lambda mencoba ulang hingga catatan kedaluwarsa, melebihi usia maksimum ([MaximumRecordAgeInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumRecordAgeInSeconds)), atau mencapai kuota coba ulang yang dikonfigurasi (). [MaximumRetryAttempts](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumRetryAttempts) Untuk kesalahan fungsi, Anda juga dapat mengonfigurasi [BisectBatchOnFunctionError](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-response-BisectBatchOnFunctionError), yang membagi batch yang gagal menjadi dua batch yang lebih kecil, mengisolasi catatan buruk dan menghindari batas waktu. Memisahkan batch tidak menghabiskan kuota coba lagi.

Jika tindakan penanganan kesalahan gagal, Lambda membuang rekaman dan melanjutkan pemrosesan batch dari aliran. Dengan pengaturan default, ini berarti rekaman yang buruk dapat memblokir pemrosesan pada shard yang terpengaruh selama hingga satu minggu. Untuk menghindari hal ini, konfigurasikan pemetaan sumber kejadian fungsi Anda dengan jumlah percobaan ulang yang wajar dan usia maksimum rekaman yang sesuai dengan kasus penggunaan Anda.

## Mengonfigurasi tujuan untuk pemanggilan yang gagal
<a name="kinesis-on-failure-destination-console"></a>

Untuk menyimpan catatan pemanggilan pemetaan sumber peristiwa yang gagal, tambahkan tujuan ke pemetaan sumber peristiwa fungsi Anda. Setiap catatan yang dikirim ke tujuan adalah dokumen JSON yang berisi metadata tentang pemanggilan yang gagal. Untuk tujuan Amazon S3, Lambda juga mengirimkan seluruh catatan pemanggilan bersama dengan metadata. Anda dapat mengonfigurasi topik Amazon SNS, antrian Amazon SQS, bucket Amazon S3, atau Kafka sebagai tujuan.

Dengan tujuan Amazon S3, Anda dapat menggunakan fitur Pemberitahuan [Acara Amazon S3](https://docs.aws.amazon.com/) untuk menerima notifikasi saat objek diunggah ke bucket S3 tujuan Anda. Anda juga dapat mengonfigurasi Pemberitahuan Acara S3 untuk menjalankan fungsi Lambda lain untuk melakukan pemrosesan otomatis pada batch yang gagal.

Peran eksekusi Anda harus memiliki izin untuk tujuan:
+ **Untuk tujuan SQS: [sqs](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_SendMessage.html):** SendMessage
+ **[Untuk tujuan SNS: SNS: Publish](https://docs.aws.amazon.com/sns/latest/api/API_Publish.html)**
+ **Untuk tujuan S3: s3: PutObject** [dan [s3:](https://docs.aws.amazon.com/AmazonS3/latest/API/API_PutObject.html) ListBucket](https://docs.aws.amazon.com/AmazonS3/latest/API/ListObjectsV2.html)
+ **Untuk tujuan Kafka: [kafka-cluster](https://docs.aws.amazon.com/msk/latest/developerguide/kafka-actions.html):** WriteData

Anda dapat mengonfigurasi topik Kafka sebagai tujuan gagal untuk pemetaan sumber acara Kafka Anda. Ketika Lambda tidak dapat memproses catatan setelah percobaan ulang yang melelahkan atau ketika catatan melebihi usia maksimum, Lambda mengirimkan catatan yang gagal ke topik Kafka yang ditentukan untuk diproses nanti. Lihat [Menggunakan topik Kafka sebagai tujuan kegagalan](kafka-on-failure-destination.md).

Jika Anda telah mengaktifkan enkripsi dengan kunci KMS Anda sendiri untuk tujuan S3, peran eksekusi fungsi Anda juga harus memiliki izin untuk memanggil [kms](https://docs.aws.amazon.com/kms/latest/APIReference/API_GenerateDataKey.html):. GenerateDataKey Jika kunci KMS dan tujuan bucket S3 berada di akun yang berbeda dari fungsi Lambda dan peran eksekusi, konfigurasikan kunci KMS untuk mempercayai peran eksekusi yang diizinkan. kms: GenerateDataKey

Untuk mengonfigurasi tujuan saat gagal menggunakan konsol, ikuti langkah-langkah berikut:

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi.

1. Di bagian **Gambaran umum fungsi**, pilih **Tambahkan tujuan**.

1. Untuk **Sumber**, pilih **Pemanggilan pemetaan sumber acara**.

1. Untuk **pemetaan sumber peristiwa**, pilih sumber peristiwa yang dikonfigurasi untuk fungsi ini.

1. Untuk **Kondisi**, pilih **On failure**. Untuk pemanggilan pemetaan sumber peristiwa, ini adalah satu-satunya kondisi yang diterima.

1. Untuk **tipe Tujuan**, pilih tipe tujuan yang Lambda kirimkan catatan pemanggilan.

1. Untuk **Tujuan**, pilih sumber daya.

1. Pilih **Simpan**.

Anda juga dapat mengonfigurasi tujuan pada kegagalan menggunakan AWS Command Line Interface (AWS CLI). Misalnya, [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html)perintah berikut menambahkan pemetaan sumber peristiwa dengan tujuan kegagalan SQS ke: `MyFunction`

```
aws lambda create-event-source-mapping \
--function-name "MyFunction" \
--event-source-arn arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream \
--destination-config '{"OnFailure": {"Destination": "arn:aws:sqs:us-east-1:123456789012:dest-queue"}}'
```

[update-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html)Perintah berikut memperbarui pemetaan sumber peristiwa untuk mengirim catatan pemanggilan yang gagal ke tujuan SNS setelah dua kali mencoba lagi, atau jika catatan berusia lebih dari satu jam.

```
aws lambda update-event-source-mapping \
--uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \
--maximum-retry-attempts 2 \
--maximum-record-age-in-seconds 3600 \
--destination-config '{"OnFailure": {"Destination": "arn:aws:sns:us-east-1:123456789012:dest-topic"}}'
```

Pengaturan yang diperbarui diterapkan secara asinkron dan tidak muncul dalam output hingga proses selesai. Gunakan perintah [get-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/get-event-source-mapping.html) untuk melihat status saat ini.

Untuk menghapus tujuan, berikan string kosong sebagai argumen ke `destination-config` parameter:

```
aws lambda update-event-source-mapping \
--uuid f89f8514-cdd9-4602-9e1f-01a5b77d449b \
--destination-config '{"OnFailure": {"Destination": ""}}'
```

### Praktik terbaik keamanan untuk tujuan Amazon S3
<a name="kinesis-s3-destination-security"></a>

Menghapus bucket S3 yang dikonfigurasi sebagai tujuan tanpa menghapus tujuan dari konfigurasi fungsi Anda dapat menimbulkan risiko keamanan. Jika pengguna lain mengetahui nama bucket tujuan Anda, mereka dapat membuat ulang bucket di bucket tersebut. Akun AWS Catatan pemanggilan yang gagal akan dikirim ke bucket mereka, yang berpotensi mengekspos data dari fungsi Anda.

**Awas**  
Untuk memastikan bahwa catatan pemanggilan dari fungsi Anda tidak dapat dikirim ke bucket S3 di bucket lain Akun AWS, tambahkan kondisi ke peran eksekusi fungsi Anda yang membatasi `s3:PutObject` izin ke bucket di akun Anda. 

Contoh berikut menunjukkan kebijakan IAM yang membatasi `s3:PutObject` izin fungsi Anda ke bucket di akun Anda. Kebijakan ini juga memberi Lambda `s3:ListBucket` izin yang dibutuhkan untuk menggunakan bucket S3 sebagai tujuan.

```
{
    "Version": "2012-10-17",		 	 	 
    "Statement": [
        {
            "Sid": "S3BucketResourceAccountWrite",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:ListBucket"
            ],
            "Resource": [
                "arn:aws:s3:::*/*",
                "arn:aws:s3:::*"
            ],
            "Condition": {
                "StringEquals": {
                    "s3:ResourceAccount": "111122223333"
                }
            }
        }
    ]
}
```

Untuk menambahkan kebijakan izin ke peran eksekusi fungsi Anda menggunakan Konsol Manajemen AWS atau AWS CLI, lihat instruksi dalam prosedur berikut:

------
#### [ Console ]

**Untuk menambahkan kebijakan izin ke peran eksekusi fungsi (konsol)**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi Lambda yang peran eksekusinya ingin Anda modifikasi.

1. Di tab **Konfigurasi**, pilih **Izin**.

1. Di tab **Peran eksekusi**, pilih **nama Peran** fungsi Anda untuk membuka halaman konsol IAM peran.

1. Tambahkan kebijakan izin ke peran dengan melakukan hal berikut:

   1. Di panel **Kebijakan izin**, pilih **Tambahkan izin**, lalu pilih **Buat** kebijakan sebaris.

   1. Di **Editor kebijakan**, pilih **JSON**.

   1. Rekatkan kebijakan yang ingin Anda tambahkan ke editor (ganti JSON yang ada), lalu pilih **Berikutnya**.

   1. Di bawah **Detail kebijakan**, masukkan **nama Kebijakan**.

   1. Pilih **Buat kebijakan**.

------
#### [ AWS CLI ]

**Untuk menambahkan kebijakan izin ke peran eksekusi fungsi (CLI)**

1. Buat dokumen kebijakan JSON dengan izin yang diperlukan dan simpan di direktori lokal.

1. Gunakan perintah IAM `put-role-policy` CLI untuk menambahkan izin ke peran eksekusi fungsi Anda. Jalankan perintah berikut dari direktori tempat Anda menyimpan dokumen kebijakan JSON dan ganti nama peran, nama kebijakan, dan dokumen kebijakan dengan nilai Anda sendiri.

   ```
   aws iam put-role-policy \
   --role-name my_lambda_role \
   --policy-name LambdaS3DestinationPolicy \
   --policy-document file://my_policy.json
   ```

------

### Contoh catatan pemanggilan Amazon SNS dan Amazon SQS
<a name="kinesis-on-failure-destination-example-sns-sqs"></a>

Contoh berikut menunjukkan apa yang Lambda kirim ke antrian SQS atau topik SNS untuk pemanggilan sumber peristiwa Kinesis yang gagal. Karena Lambda hanya mengirimkan metadata untuk jenis tujuan ini, gunakan,, `streamArn` `shardId``startSequenceNumber`, dan `endSequenceNumber` bidang untuk mendapatkan catatan asli lengkap. Semua bidang yang ditampilkan di `KinesisBatchInfo` properti akan selalu ada.

```
{
    "requestContext": {
        "requestId": "c9b8fa9f-5a7f-xmpl-af9c-0c604cde93a5",
        "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:myfunction",
        "condition": "RetryAttemptsExhausted",
        "approximateInvokeCount": 1
    },
    "responseContext": {
        "statusCode": 200,
        "executedVersion": "$LATEST",
        "functionError": "Unhandled"
    },
    "version": "1.0",
    "timestamp": "2019-11-14T00:38:06.021Z",
    "KinesisBatchInfo": {
        "shardId": "shardId-000000000001",
        "startSequenceNumber": "49601189658422359378836298521827638475320189012309704722",
        "endSequenceNumber": "49601189658422359378836298522902373528957594348623495186",
        "approximateArrivalOfFirstRecord": "2019-11-14T00:38:04.835Z",
        "approximateArrivalOfLastRecord": "2019-11-14T00:38:05.580Z",
        "batchSize": 500,
        "streamArn": "arn:aws:kinesis:us-east-2:123456789012:stream/mystream"
    }
}
```

Anda dapat menggunakan informasi ini guna mengambil rekaman yang terpengaruh dari aliran untuk pemecahan masalah. Rekaman aktual tidak disertakan, jadi Anda harus memproses rekaman ini dan mengambilnya dari aliran sebelum kedaluwarsa dan hilang.

### Contoh catatan pemanggilan Amazon S3
<a name="kinesis-on-failure-destination-example-sns-sqs-s3"></a>

Contoh berikut menunjukkan apa yang dikirim Lambda ke bucket Amazon S3 untuk pemanggilan sumber peristiwa Kinesis yang gagal. Selain semua bidang dari contoh sebelumnya untuk tujuan SQS dan SNS, `payload` bidang berisi catatan pemanggilan asli sebagai string JSON yang lolos.

```
{
    "requestContext": {
        "requestId": "c9b8fa9f-5a7f-xmpl-af9c-0c604cde93a5",
        "functionArn": "arn:aws:lambda:us-east-2:123456789012:function:myfunction",
        "condition": "RetryAttemptsExhausted",
        "approximateInvokeCount": 1
    },
    "responseContext": {
        "statusCode": 200,
        "executedVersion": "$LATEST",
        "functionError": "Unhandled"
    },
    "version": "1.0",
    "timestamp": "2019-11-14T00:38:06.021Z",
    "KinesisBatchInfo": {
        "shardId": "shardId-000000000001",
        "startSequenceNumber": "49601189658422359378836298521827638475320189012309704722",
        "endSequenceNumber": "49601189658422359378836298522902373528957594348623495186",
        "approximateArrivalOfFirstRecord": "2019-11-14T00:38:04.835Z",
        "approximateArrivalOfLastRecord": "2019-11-14T00:38:05.580Z",
        "batchSize": 500,
        "streamArn": "arn:aws:kinesis:us-east-2:123456789012:stream/mystream"
    },
    "payload": "<Whole Event>" // Only available in S3
}
```

Objek S3 yang berisi catatan pemanggilan menggunakan konvensi penamaan berikut:

```
aws/lambda/<ESM-UUID>/<shardID>/YYYY/MM/DD/YYYY-MM-DDTHH.MM.SS-<Random UUID>
```

# Menerapkan pemrosesan Kinesis Data Streams stateful di Lambda
<a name="services-kinesis-windows"></a>

Fungsi Lambda dapat menjalankan aplikasi pemrosesan aliran berkelanjutan. Aliran merupakan data tidak terbatas yang mengalir terus-menerus melalui aplikasi Anda. Untuk menganalisis informasi dari input yang terus diperbarui ini, Anda dapat mengikat catatan yang disertakan menggunakan jendela yang didefinisikan dalam hal waktu.

Jatuh jendela adalah jendela waktu yang berbeda yang membuka dan menutup secara berkala. Secara default, pemanggilan Lambda tidak memiliki status — Anda tidak dapat menggunakannya untuk memproses data di beberapa pemanggilan berkelanjutan tanpa database eksternal. Namun, dengan jendela yang jatuh, Anda dapat mempertahankan status Anda di seluruh pemanggilan. Status ini berisi hasil agregat pesan yang sebelumnya diproses untuk jendela saat ini. Status Anda maksimal bisa sebesar 1 MB per shard. Jika melebihi ukuran tersebut, Lambda mengakhiri jendela lebih awal.

Setiap rekaman dalam aliran milik jendela tertentu. Lambda akan memproses setiap rekaman setidaknya sekali, tetapi tidak menjamin bahwa setiap rekaman akan diproses hanya sekali. Dalam kasus yang jarang terjadi, seperti penanganan kesalahan, beberapa catatan mungkin diproses lebih dari sekali. Catatan selalu diproses secara berurutan pertama kali. Jika catatan diproses lebih dari satu kali, mereka mungkin diproses rusak.

## Agregasi dan pemrosesan
<a name="streams-tumbling-processing"></a>

Fungsi yang dikelola pengguna Anda dipanggil baik untuk agregasi maupun untuk memproses hasil akhir agregasi tersebut. Lambda mengumpulkan semua catatan yang diterima di jendela. Anda dapat menerima catatan ini dalam beberapa batch, masing-masing sebagai invokasi terpisah. Setiap invokasi menerima status. Jadi, saat menggunakan jendela tumbling, respons fungsi Lambda Anda harus berisi `state` properti. Jika respons tidak berisi `state` properti, Lambda menganggap ini sebagai pemanggilan yang gagal. Untuk memenuhi kondisi ini, fungsi Anda dapat mengembalikan `TimeWindowEventResponse` objek, yang memiliki bentuk JSON berikut:

**Example Nilai `TimeWindowEventResponse`**  

```
{
    "state": {
        "1": 282,
        "2": 715
    },
    "batchItemFailures": []
}
```

**catatan**  
Untuk fungsi Java, sebaiknya gunakan a `Map<String, String>` untuk mewakili status.

Di akhir jendela, tanda `isFinalInvokeForWindow` diatur ke `true` untuk menunjukkan bahwa ini adalah status akhir dan bahwa itu siap untuk diproses. Setelah pemrosesan, jendela selesai, dan invokasi akhir Anda selesai, lalu status dihapus.

Di akhir jendela Anda, Lambda menggunakan pemrosesan akhir untuk tindakan pada hasil agregasi. Pemrosesan akhir Anda dipanggil secara sinkron. Setelah pemanggilan berhasil, fungsi Anda memeriksa nomor urut dan pemrosesan aliran berlanjut. Jika invokasi tidak berhasil, fungsi Lambda Anda menunda pemrosesan lebih lanjut sampai invokasi sukses.

**Example KinesisTimeWindowEvent**  

```
{
    "Records": [
        {
            "kinesis": {
                "kinesisSchemaVersion": "1.0",
                "partitionKey": "1",
                "sequenceNumber": "49590338271490256608559692538361571095921575989136588898",
                "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==",
                "approximateArrivalTimestamp": 1607497475.000
            },
            "eventSource": "aws:kinesis",
            "eventVersion": "1.0",
            "eventID": "shardId-000000000006:49590338271490256608559692538361571095921575989136588898",
            "eventName": "aws:kinesis:record",
            "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-kinesis-role",
            "awsRegion": "us-east-1",
            "eventSourceARN": "arn:aws:kinesis:us-east-1:123456789012:stream/lambda-stream"
        }
    ],
    "window": {
        "start": "2020-12-09T07:04:00Z",
        "end": "2020-12-09T07:06:00Z"
    },
    "state": {
        "1": 282,
        "2": 715
    },
    "shardId": "shardId-000000000006",
    "eventSourceARN": "arn:aws:kinesis:us-east-1:123456789012:stream/lambda-stream",
    "isFinalInvokeForWindow": false,
    "isWindowTerminatedEarly": false
}
```

## Konfigurasi
<a name="streams-tumbling-config"></a>

Anda dapat mengonfigurasi jendela berguling saat membuat atau memperbarui pemetaan sumber peristiwa. Untuk mengkonfigurasi jendela tumbling, tentukan jendela dalam hitungan detik ([TumblingWindowInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-TumblingWindowInSeconds)). Contoh berikut AWS Command Line Interface (AWS CLI) perintah membuat pemetaan sumber acara streaming yang memiliki jendela jatuh 120 detik. Fungsi Lambda yang didefinisikan untuk agregasi dan pemrosesan diberi nama `tumbling-window-example-function`.

```
aws lambda create-event-source-mapping \
--event-source-arn arn:aws:kinesis:us-east-1:123456789012:stream/lambda-stream \
--function-name tumbling-window-example-function \
--starting-position TRIM_HORIZON \
--tumbling-window-in-seconds 120
```

Lambda menentukan jatuh batas jendela berguling berdasarkan waktu ketika catatan dimasukkan ke dalam aliran. Semua catatan memiliki stempel waktu perkiraan yang tersedia yang digunakan Lambda dalam penentuan batas.

Agregasi jendela berguling tidak mendukung shard ulang. Ketika pecahan berakhir, Lambda menganggap jendela saat ini ditutup, dan setiap pecahan anak akan memulai jendela mereka sendiri dalam keadaan baru. Ketika tidak ada catatan baru yang ditambahkan ke jendela saat ini, Lambda menunggu hingga 2 menit sebelum mengasumsikan bahwa jendela sudah selesai. Ini membantu memastikan bahwa fungsi membaca semua catatan di jendela saat ini, bahkan jika catatan ditambahkan sebentar-sebentar.

Jendela berguling sepenuhnya mendukung kebijakan coba lagi yang ada `maxRetryAttempts` dan `maxRecordAge`.

**Example Handler.py - Agregasi dan pemrosesan**  
Fungsi Python berikut menunjukkan cara untuk menggabungkan, lalu memproses status akhir Anda:  

```
def lambda_handler(event, context):
    print('Incoming event: ', event)
    print('Incoming state: ', event['state'])

#Check if this is the end of the window to either aggregate or process.
    if event['isFinalInvokeForWindow']:
        # logic to handle final state of the window
        print('Destination invoke')
    else:
        print('Aggregate invoke')

#Check for early terminations
    if event['isWindowTerminatedEarly']:
        print('Window terminated early')

    #Aggregation logic
    state = event['state']
    for record in event['Records']:
        state[record['kinesis']['partitionKey']] = state.get(record['kinesis']['partitionKey'], 0) + 1

    print('Returning state: ', state)
    return {'state': state}
```

# Parameter Lambda untuk pemetaan sumber peristiwa Amazon Kinesis Data Streams
<a name="services-kinesis-parameters"></a>

Semua pemetaan sumber peristiwa Lambda berbagi operasi yang sama [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)dan API. [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html) Namun, hanya beberapa parameter yang berlaku untuk Kinesis.


| Parameter | Diperlukan | Default | Catatan | 
| --- | --- | --- | --- | 
|  [BatchSize](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-BatchSize)  |  T  |  100  |  Maksimum: 10.000.  | 
|  [BisectBatchOnFunctionError](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-BisectBatchOnFunctionError)  |  T  |  false  |  none | 
|  [DestinationConfig](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-DestinationConfig)  |  T  | N/A |  Antrian Amazon SQS atau tujuan topik Amazon SNS untuk catatan yang dibuang. Untuk informasi selengkapnya, lihat [Mengonfigurasi tujuan untuk pemanggilan yang gagal](kinesis-on-failure-destination.md#kinesis-on-failure-destination-console).  | 
|  [Diaktifkan](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-Enabled)  |  T  |  true  |  none | 
|  [EventSourceArn](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-EventSourceArn)  |  T  | N/A |  ARN dari aliran data atau konsumen aliran  | 
|  [FunctionName](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-FunctionName)  |  T  | N/A |  none | 
|  [FunctionResponseTypes](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-FunctionResponseTypes)  |  T  |  N/A |  Agar fungsi Anda melaporkan kegagalan tertentu dalam satu batch, sertakan nilainya `ReportBatchItemFailures``FunctionResponseTypes`. Untuk informasi selengkapnya, lihat [Mengonfigurasi respons batch sebagian dengan Kinesis Data Streams dan Lambda](services-kinesis-batchfailurereporting.md).  | 
|  [MaximumBatchingWindowInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumBatchingWindowInSeconds)  |  T  |  0  |  none | 
|  [MaximumRecordAgeInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumRecordAgeInSeconds)  |  T  |  -1  |  -1 berarti tak terbatas: Lambda tidak membuang catatan (pengaturan retensi data [Kinesis Data Streams](https://docs.aws.amazon.com/streams/latest/dev/kinesis-extended-retention.html) masih berlaku) Minimal: -1 Maksimal: 604.800  | 
|  [MaximumRetryAttempts](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-MaximumRetryAttempts)  |  T  |  -1  |  -1 berarti tak terbatas: catatan gagal dicoba ulang sampai catatan kedaluwarsa Minimal: -1 Maksimum: 10.000.  | 
|  [ParallelizationFactor](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-ParallelizationFactor)  |  T  |  1  |  Maksimal: 10  | 
|  [StartingPosition](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-StartingPosition)  |  T  |  N/A |  AT\$1TIMESTAMP, TRIM\$1HORIZON, atau TERBARU  | 
|  [StartingPositionTimestamp](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-StartingPositionTimestamp)  |  T  |  N/A |  Hanya valid jika StartingPosition disetel ke AT\$1TIMESTAMP. Waktu untuk mulai membaca, dalam detik waktu Unix  | 
|  [TumblingWindowInSeconds](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html#lambda-CreateEventSourceMapping-request-TumblingWindowInSeconds)  |  T  |  N/A |  Minimal: 0 Maksimal: 900  | 

# Menggunakan pemfilteran acara dengan sumber acara Kinesis
<a name="with-kinesis-filtering"></a>

Anda dapat menggunakan pemfilteran peristiwa untuk mengontrol rekaman mana dari aliran atau antrian yang dikirim Lambda ke fungsi Anda. Untuk informasi umum tentang cara kerja penyaringan acara, lihat[Kontrol peristiwa mana yang dikirim Lambda ke fungsi Anda](invocation-eventfiltering.md).

Bagian ini berfokus pada penyaringan acara untuk sumber acara Kinesis.

**catatan**  
Pemetaan sumber peristiwa Kinesis hanya mendukung pemfilteran pada kunci. `data`

**Topics**
+ [

## Dasar-dasar penyaringan acara Kinesis
](#filtering-kinesis)
+ [

## Menyaring catatan agregat Kinesis
](#filtering-kinesis-efo)

## Dasar-dasar penyaringan acara Kinesis
<a name="filtering-kinesis"></a>

Misalkan produser memasukkan data yang diformat JSON ke dalam aliran data Kinesis Anda. Contoh catatan akan terlihat seperti berikut, dengan data JSON dikonversi ke string yang dikodekan Base64 di lapangan. `data`

```
{
    "kinesis": {
        "kinesisSchemaVersion": "1.0",
        "partitionKey": "1",
        "sequenceNumber": "49590338271490256608559692538361571095921575989136588898",
        "data": "eyJSZWNvcmROdW1iZXIiOiAiMDAwMSIsICJUaW1lU3RhbXAiOiAieXl5eS1tbS1kZFRoaDptbTpzcyIsICJSZXF1ZXN0Q29kZSI6ICJBQUFBIn0=",
        "approximateArrivalTimestamp": 1545084650.987
        },
    "eventSource": "aws:kinesis",
    "eventVersion": "1.0",
    "eventID": "shardId-000000000006:49590338271490256608559692538361571095921575989136588898",
    "eventName": "aws:kinesis:record",
    "invokeIdentityArn": "arn:aws:iam::123456789012:role/lambda-role",
    "awsRegion": "us-east-2",
    "eventSourceARN": "arn:aws:kinesis:us-east-2:123456789012:stream/lambda-stream"
}
```

Selama data yang dimasukkan produsen ke dalam aliran adalah JSON yang valid, Anda dapat menggunakan pemfilteran peristiwa untuk memfilter catatan menggunakan kunci. `data` Misalkan produser memasukkan catatan ke dalam aliran Kinesis Anda dalam format JSON berikut.

```
{
    "record": 12345,
    "order": {
        "type": "buy",
        "stock": "ANYCO",
        "quantity": 1000
        }
}
```

Untuk memfilter hanya catatan di mana jenis pesanan adalah “beli,” `FilterCriteria` objeknya adalah sebagai berikut.

```
{
    "Filters": [
        {
            "Pattern": "{ \"data\" : { \"order\" : { \"type\" : [ \"buy\" ] } } }"
        }
    ]
}
```

Untuk kejelasan tambahan, berikut adalah nilai filter yang `Pattern` diperluas di JSON biasa. 

```
{
    "data": {
        "order": {
            "type": [ "buy" ]
            }
      }
}
```

Anda dapat menambahkan filter menggunakan konsol, AWS CLI atau AWS SAM templat.

------
#### [ Console ]

Untuk menambahkan filter ini menggunakan konsol, ikuti instruksi [Melampirkan kriteria filter ke pemetaan sumber peristiwa (konsol)](invocation-eventfiltering.md#filtering-console) dan masukkan string berikut untuk **kriteria Filter**.

```
{ "data" : { "order" : { "type" : [ "buy" ] } } }
```

------
#### [ AWS CLI ]

Untuk membuat pemetaan sumber peristiwa baru dengan kriteria filter ini menggunakan AWS Command Line Interface (AWS CLI), jalankan perintah berikut.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:kinesis:us-east-2:123456789012:stream/my-stream \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : { \"order\" : { \"type\" : [ \"buy\" ] } } }"}]}'
```

Untuk menambahkan kriteria filter ini ke pemetaan sumber peristiwa yang ada, jalankan perintah berikut.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : { \"order\" : { \"type\" : [ \"buy\" ] } } }"}]}'
```

------
#### [ AWS SAM ]

Untuk menambahkan filter ini menggunakan AWS SAM, tambahkan cuplikan berikut ke template YAMAL untuk sumber acara Anda.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "data" : { "order" : { "type" : [ "buy" ] } } }'
```

------

Untuk memfilter peristiwa dengan benar dari sumber Kinesis, bidang data dan kriteria filter Anda untuk bidang data harus dalam format JSON yang valid. Jika salah satu bidang tidak dalam format JSON yang valid, Lambda akan menghapus pesan atau melempar pengecualian. Tabel berikut merangkum perilaku spesifik: 


| Format data masuk | Format pola filter untuk properti data | Tindakan yang dihasilkan | 
| --- | --- | --- | 
|  JSON yang valid  |  JSON yang valid  |  Filter Lambda berdasarkan kriteria filter Anda.  | 
|  JSON yang valid  |  Tidak ada pola filter untuk properti data  |  Filter Lambda (hanya pada properti metadata lainnya) berdasarkan kriteria filter Anda.  | 
|  JSON yang valid  |  Non-JSON  |  Lambda melempar pengecualian pada saat pembuatan atau pembaruan pemetaan sumber acara. Pola filter untuk properti data harus dalam format JSON yang valid.  | 
|  Non-JSON  |  JSON yang valid  |  Lambda menjatuhkan rekor.  | 
|  Non-JSON  |  Tidak ada pola filter untuk properti data  |  Filter Lambda (hanya pada properti metadata lainnya) berdasarkan kriteria filter Anda.  | 
|  Non-JSON  |  Non-JSON  |  Lambda melempar pengecualian pada saat pembuatan atau pembaruan pemetaan sumber acara. Pola filter untuk properti data harus dalam format JSON yang valid.  | 

## Menyaring catatan agregat Kinesis
<a name="filtering-kinesis-efo"></a>

Dengan Kinesis, Anda dapat menggabungkan beberapa catatan ke dalam satu catatan Kinesis Data Streams untuk meningkatkan throughput data Anda. [Lambda hanya dapat menerapkan kriteria filter ke rekaman agregat saat Anda menggunakan Kinesis yang ditingkatkan fan-out.](https://docs.aws.amazon.com/streams/latest/dev/enhanced-consumers.html) Memfilter rekaman agregat dengan Kinesis standar tidak didukung. Saat menggunakan fan-out yang disempurnakan, Anda mengonfigurasi konsumen throughput khusus Kinesis untuk bertindak sebagai pemicu fungsi Lambda Anda. Lambda kemudian memfilter catatan agregat dan hanya meneruskan catatan yang memenuhi kriteria filter Anda.

Untuk mempelajari lebih lanjut tentang agregasi catatan Kinesis, lihat bagian [Agregasi](https://docs.aws.amazon.com/streams/latest/dev/kinesis-kpl-concepts.html#kinesis-kpl-concepts-aggretation) pada halaman Konsep Kunci Perpustakaan Produsen Kinesis (KPL). Untuk mempelajari lebih lanjut tentang menggunakan Lambda dengan Kinesis yang ditingkatkan fan-out, lihat [Meningkatkan performa pemrosesan streaming real-time dengan Amazon Kinesis Data Streams yang disempurnakan oleh fan-out dan Lambda di blog komputasi](https://aws.amazon.com/blogs/compute/increasing-real-time-stream-processing-performance-with-amazon-kinesis-data-streams-enhanced-fan-out-and-aws-lambda/). AWS AWS 

# Tutorial: Menggunakan Lambda dengan Kinesis Data Streams
<a name="with-kinesis-example"></a>

Dalam tutorial ini, Anda membuat fungsi Lambda untuk mengkonsumsi peristiwa dari aliran data Amazon Kinesis. 

1. Aplikasi kustom menulis rekaman ke aliran.

1. AWS Lambda polling aliran dan, ketika mendeteksi catatan baru dalam aliran, memanggil fungsi Lambda Anda.

1. AWS Lambda menjalankan fungsi Lambda dengan mengasumsikan peran eksekusi yang Anda tentukan pada saat Anda membuat fungsi Lambda.

## Prasyarat
<a name="with-kinesis-prepare"></a>

### Instal AWS Command Line Interface
<a name="install_aws_cli"></a>

Jika Anda belum menginstal AWS Command Line Interface, ikuti langkah-langkah di [Menginstal atau memperbarui versi terbaru AWS CLI untuk menginstalnya](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

Tutorial ini membutuhkan terminal baris perintah atau shell untuk menjalankan perintah. Di Linux dan macOS, gunakan shell dan manajer paket pilihan Anda.

**catatan**  
Di Windows, beberapa perintah Bash CLI yang biasa Anda gunakan dengan Lambda (`zip`seperti) tidak didukung oleh terminal bawaan sistem operasi. Untuk mendapatkan versi terintegrasi Windows dari Ubuntu dan Bash, [instal Windows Subsystem untuk](https://docs.microsoft.com/en-us/windows/wsl/install-win10) Linux. 

## Buat peran eksekusi
<a name="with-kinesis-example-create-iam-role"></a>

Buat [peran eksekusi](lambda-intro-execution-role.md) yang memberikan izin fungsi Anda untuk mengakses AWS sumber daya.

**Untuk membuat peran eksekusi**

1. Buka [halaman peran](https://console.aws.amazon.com/iam/home#/roles) di konsol IAM.

1. Pilih **Buat peran**.

1. Buat peran dengan properti berikut.
   + **Entitas tepercaya** – **AWS Lambda**.
   + **Izin** – **AWSLambdaKinesisExecutionRole**.
   + **Nama peran** – **lambda-kinesis-role**.

**AWSLambdaKinesisExecutionRole**Kebijakan memiliki izin yang diperlukan fungsi untuk membaca item dari Kinesis dan menulis log ke Log CloudWatch .

## Buat fungsi
<a name="with-kinesis-example-create-function"></a>

Buat fungsi Lambda yang memproses pesan Kinesis Anda. Kode fungsi mencatat ID peristiwa dan data peristiwa dari catatan Kinesis ke CloudWatch Log.

Tutorial ini menggunakan runtime Node.js 24, tetapi kami juga menyediakan kode contoh dalam bahasa runtime lainnya. Anda dapat memilih tab di kotak berikut untuk melihat kode runtime yang Anda minati. JavaScript Kode yang akan Anda gunakan dalam langkah ini adalah pada contoh pertama yang ditunjukkan di **JavaScript**tab.

------
#### [ .NET ]

**SDK untuk .NET**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda). 
Mengkonsumsi acara Kinesis dengan Lambda menggunakan.NET.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
﻿using System.Text;
using Amazon.Lambda.Core;
using Amazon.Lambda.KinesisEvents;
using AWS.Lambda.Powertools.Logging;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace KinesisIntegrationSampleCode;

public class Function
{
    // Powertools Logger requires an environment variables against your function
    // POWERTOOLS_SERVICE_NAME
    [Logging(LogEvent = true)]
    public async Task FunctionHandler(KinesisEvent evnt, ILambdaContext context)
    {
        if (evnt.Records.Count == 0)
        {
            Logger.LogInformation("Empty Kinesis Event received");
            return;
        }

        foreach (var record in evnt.Records)
        {
            try
            {
                Logger.LogInformation($"Processed Event with EventId: {record.EventId}");
                string data = await GetRecordDataAsync(record.Kinesis, context);
                Logger.LogInformation($"Data: {data}");
                // TODO: Do interesting work based on the new data
            }
            catch (Exception ex)
            {
                Logger.LogError($"An error occurred {ex.Message}");
                throw;
            }
        }
        Logger.LogInformation($"Successfully processed {evnt.Records.Count} records.");
    }

    private async Task<string> GetRecordDataAsync(KinesisEvent.Record record, ILambdaContext context)
    {
        byte[] bytes = record.Data.ToArray();
        string data = Encoding.UTF8.GetString(bytes);
        await Task.CompletedTask; //Placeholder for actual async work
        return data;
    }
}
```

------
#### [ Go ]

**SDK untuk Go V2**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda). 
Mengkonsumsi acara Kinesis dengan Lambda menggunakan Go.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package main

import (
	"context"
	"log"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(ctx context.Context, kinesisEvent events.KinesisEvent) error {
	if len(kinesisEvent.Records) == 0 {
		log.Printf("empty Kinesis event received")
		return nil
	}

	for _, record := range kinesisEvent.Records {
		log.Printf("processed Kinesis event with EventId: %v", record.EventID)
		recordDataBytes := record.Kinesis.Data
		recordDataText := string(recordDataBytes)
		log.Printf("record data: %v", recordDataText)
		// TODO: Do interesting work based on the new data
	}
	log.Printf("successfully processed %v records", len(kinesisEvent.Records))
	return nil
}

func main() {
	lambda.Start(handler)
}
```

------
#### [ Java ]

**SDK untuk Java 2.x**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda). 
Mengkonsumsi acara Kinesis dengan Lambda menggunakan Java.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package example;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.KinesisEvent;

public class Handler implements RequestHandler<KinesisEvent, Void> {
    @Override
    public Void handleRequest(final KinesisEvent event, final Context context) {
        LambdaLogger logger = context.getLogger();
        if (event.getRecords().isEmpty()) {
            logger.log("Empty Kinesis Event received");
            return null;
        }
        for (KinesisEvent.KinesisEventRecord record : event.getRecords()) {
            try {
                logger.log("Processed Event with EventId: "+record.getEventID());
                String data = new String(record.getKinesis().getData().array());
                logger.log("Data:"+ data);
                // TODO: Do interesting work based on the new data
            }
            catch (Exception ex) {
                logger.log("An error occurred:"+ex.getMessage());
                throw ex;
            }
        }
        logger.log("Successfully processed:"+event.getRecords().size()+" records");
        return null;
    }

}
```

------
#### [ JavaScript ]

**SDK untuk JavaScript (v3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/blob/main/integration-kinesis-to-lambda). 
Mengkonsumsi acara Kinesis dengan menggunakan Lambda. JavaScript  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
exports.handler = async (event, context) => {
  for (const record of event.Records) {
    try {
      console.log(`Processed Kinesis Event - EventID: ${record.eventID}`);
      const recordData = await getRecordDataAsync(record.kinesis);
      console.log(`Record Data: ${recordData}`);
      // TODO: Do interesting work based on the new data
    } catch (err) {
      console.error(`An error occurred ${err}`);
      throw err;
    }
  }
  console.log(`Successfully processed ${event.Records.length} records.`);
};

async function getRecordDataAsync(payload) {
  var data = Buffer.from(payload.data, "base64").toString("utf-8");
  await Promise.resolve(1); //Placeholder for actual async work
  return data;
}
```
Mengkonsumsi acara Kinesis dengan menggunakan Lambda. TypeScript  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import {
  KinesisStreamEvent,
  Context,
  KinesisStreamHandler,
  KinesisStreamRecordPayload,
} from "aws-lambda";
import { Buffer } from "buffer";
import { Logger } from "@aws-lambda-powertools/logger";

const logger = new Logger({
  logLevel: "INFO",
  serviceName: "kinesis-stream-handler-sample",
});

export const functionHandler: KinesisStreamHandler = async (
  event: KinesisStreamEvent,
  context: Context
): Promise<void> => {
  for (const record of event.Records) {
    try {
      logger.info(`Processed Kinesis Event - EventID: ${record.eventID}`);
      const recordData = await getRecordDataAsync(record.kinesis);
      logger.info(`Record Data: ${recordData}`);
      // TODO: Do interesting work based on the new data
    } catch (err) {
      logger.error(`An error occurred ${err}`);
      throw err;
    }
    logger.info(`Successfully processed ${event.Records.length} records.`);
  }
};

async function getRecordDataAsync(
  payload: KinesisStreamRecordPayload
): Promise<string> {
  var data = Buffer.from(payload.data, "base64").toString("utf-8");
  await Promise.resolve(1); //Placeholder for actual async work
  return data;
}
```

------
#### [ PHP ]

**SDK untuk PHP**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda). 
Mengkonsumsi acara Kinesis dengan Lambda menggunakan PHP.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
<?php

# using bref/bref and bref/logger for simplicity

use Bref\Context\Context;
use Bref\Event\Kinesis\KinesisEvent;
use Bref\Event\Kinesis\KinesisHandler;
use Bref\Logger\StderrLogger;

require __DIR__ . '/vendor/autoload.php';

class Handler extends KinesisHandler
{
    private StderrLogger $logger;
    public function __construct(StderrLogger $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @throws JsonException
     * @throws \Bref\Event\InvalidLambdaEvent
     */
    public function handleKinesis(KinesisEvent $event, Context $context): void
    {
        $this->logger->info("Processing records");
        $records = $event->getRecords();
        foreach ($records as $record) {
            $data = $record->getData();
            $this->logger->info(json_encode($data));
            // TODO: Do interesting work based on the new data

            // Any exception thrown will be logged and the invocation will be marked as failed
        }
        $totalRecords = count($records);
        $this->logger->info("Successfully processed $totalRecords records");
    }
}

$logger = new StderrLogger();
return new Handler($logger);
```

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

**SDK untuk Python (Boto3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda). 
Mengkonsumsi acara Kinesis dengan Lambda menggunakan Python.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
import base64
def lambda_handler(event, context):

    for record in event['Records']:
        try:
            print(f"Processed Kinesis Event - EventID: {record['eventID']}")
            record_data = base64.b64decode(record['kinesis']['data']).decode('utf-8')
            print(f"Record Data: {record_data}")
            # TODO: Do interesting work based on the new data
        except Exception as e:
            print(f"An error occurred {e}")
            raise e
    print(f"Successfully processed {len(event['Records'])} records.")
```

------
#### [ Ruby ]

**SDK untuk Ruby**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda). 
Mengkonsumsi acara Kinesis dengan Lambda menggunakan Ruby.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
require 'aws-sdk'

def lambda_handler(event:, context:)
  event['Records'].each do |record|
    begin
      puts "Processed Kinesis Event - EventID: #{record['eventID']}"
      record_data = get_record_data_async(record['kinesis'])
      puts "Record Data: #{record_data}"
      # TODO: Do interesting work based on the new data
    rescue => err
      $stderr.puts "An error occurred #{err}"
      raise err
    end
  end
  puts "Successfully processed #{event['Records'].length} records."
end

def get_record_data_async(payload)
  data = Base64.decode64(payload['data']).force_encoding('UTF-8')
  # Placeholder for actual async work
  # You can use Ruby's asynchronous programming tools like async/await or fibers here.
  return data
end
```

------
#### [ Rust ]

**SDK for Rust**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-kinesis-to-lambda). 
Mengkonsumsi acara Kinesis dengan Lambda menggunakan Rust.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
use aws_lambda_events::event::kinesis::KinesisEvent;
use lambda_runtime::{run, service_fn, Error, LambdaEvent};

async fn function_handler(event: LambdaEvent<KinesisEvent>) -> Result<(), Error> {
    if event.payload.records.is_empty() {
        tracing::info!("No records found. Exiting.");
        return Ok(());
    }

    event.payload.records.iter().for_each(|record| {
        tracing::info!("EventId: {}",record.event_id.as_deref().unwrap_or_default());

        let record_data = std::str::from_utf8(&record.kinesis.data);

        match record_data {
            Ok(data) => {
                // log the record data
                tracing::info!("Data: {}", data);
            }
            Err(e) => {
                tracing::error!("Error: {}", e);
            }
        }
    });

    tracing::info!(
        "Successfully processed {} records",
        event.payload.records.len()
    );

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        // disable printing the name of the module in every log line.
        .with_target(false)
        // disabling time is handy because CloudWatch will add the ingestion time.
        .without_time()
        .init();

    run(service_fn(function_handler)).await
}
```

------

**Untuk membuat fungsi**

1. Buat direktori untuk proyek, dan kemudian beralih ke direktori itu.

   ```
   mkdir kinesis-tutorial
   cd kinesis-tutorial
   ```

1. Salin JavaScript kode sampel ke file baru bernama`index.js`.

1. Buat paket deployment.

   ```
   zip function.zip index.js
   ```

1. Buat fungsi Lambda dengan perintah `create-function`.

   ```
   aws lambda create-function --function-name ProcessKinesisRecords \
   --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
   --role arn:aws:iam::111122223333:role/lambda-kinesis-role
   ```

## Uji fungsi Lambda
<a name="walkthrough-kinesis-events-adminuser-create-test-function-upload-zip-test-manual-invoke"></a>

Panggil fungsi Lambda Anda secara manual menggunakan perintah `invoke` AWS Lambda CLI dan contoh peristiwa Kinesis.

**Untuk menguji fungsi Lambda**

1. Salin JSON berikut ke dalam file dan simpan sebagai `input.txt`. 

   ```
   {
       "Records": [
           {
               "kinesis": {
                   "kinesisSchemaVersion": "1.0",
                   "partitionKey": "1",
                   "sequenceNumber": "49590338271490256608559692538361571095921575989136588898",
                   "data": "SGVsbG8sIHRoaXMgaXMgYSB0ZXN0Lg==",
                   "approximateArrivalTimestamp": 1545084650.987
               },
               "eventSource": "aws:kinesis",
               "eventVersion": "1.0",
               "eventID": "shardId-000000000006:49590338271490256608559692538361571095921575989136588898",
               "eventName": "aws:kinesis:record",
               "invokeIdentityArn": "arn:aws:iam::111122223333:role/lambda-kinesis-role",
               "awsRegion": "us-east-2",
               "eventSourceARN": "arn:aws:kinesis:us-east-2:111122223333:stream/lambda-stream"
           }
       ]
   }
   ```

1. Gunakan perintah `invoke` untuk mengirim kejadian ke fungsi.

   ```
   aws lambda invoke --function-name ProcessKinesisRecords \
   --cli-binary-format raw-in-base64-out \
   --payload file://input.txt outputfile.txt
   ```

   **cli-binary-format**Opsi ini diperlukan jika Anda menggunakan AWS CLI versi 2. Untuk menjadikan ini pengaturan default, jalankan`aws configure set cli-binary-format raw-in-base64-out`. Untuk informasi selengkapnya, lihat [opsi baris perintah global yang AWS CLI didukung](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) di *Panduan AWS Command Line Interface Pengguna untuk Versi 2*.

   Respons disimpan ke `out.txt`.

## Buat aliran Kinesis
<a name="with-kinesis-example-configure-event-source-create"></a>

Gunakan perintah `create-stream ` untuk membuat aliran.

```
aws kinesis create-stream --stream-name lambda-stream --shard-count 1
```

Jalankan perintah `describe-stream` berikut untuk mendapatkan ARN aliran.

```
aws kinesis describe-stream --stream-name lambda-stream
```

Anda akan melihat output berikut:

```
{
    "StreamDescription": {
        "Shards": [
            {
                "ShardId": "shardId-000000000000",
                "HashKeyRange": {
                    "StartingHashKey": "0",
                    "EndingHashKey": "340282366920746074317682119384634633455"
                },
                "SequenceNumberRange": {
                    "StartingSequenceNumber": "49591073947768692513481539594623130411957558361251844610"
                }
            }
        ],
        "StreamARN": "arn:aws:kinesis:us-east-1:111122223333:stream/lambda-stream",
        "StreamName": "lambda-stream",
        "StreamStatus": "ACTIVE",
        "RetentionPeriodHours": 24,
        "EnhancedMonitoring": [
            {
                "ShardLevelMetrics": []
            }
        ],
        "EncryptionType": "NONE",
        "KeyId": null,
        "StreamCreationTimestamp": 1544828156.0
    }
}
```

Anda menggunakan ARN aliran di langkah berikutnya untuk Anda mengasosiasikan aliran dengan fungsi Lambda Anda.

## Tambahkan sumber acara di AWS Lambda
<a name="with-kinesis-example-configure-event-source-add-event-source"></a>

Jalankan perintah AWS CLI `add-event-source` berikut.

```
aws lambda create-event-source-mapping --function-name ProcessKinesisRecords \
--event-source  arn:aws:kinesis:us-east-1:111122223333:stream/lambda-stream \
--batch-size 100 --starting-position LATEST
```

Catat ID pemetaan untuk penggunaan selanjutnya. Anda bisa mendapatkan daftar pemetaan sumber kejadian dengan menjalankan perintah `list-event-source-mappings`.

```
aws lambda list-event-source-mappings --function-name ProcessKinesisRecords \
--event-source arn:aws:kinesis:us-east-1:111122223333:stream/lambda-stream
```

Dalam respons, Anda dapat memverifikasi nilai status adalah `enabled`. Pemetaan sumber peristiwa dapat dinonaktifkan untuk menjeda polling sementara tanpa kehilangan catatan.

## Uji penyiapan
<a name="with-kinesis-example-configure-event-source-test-end-to-end"></a>

Untuk menguji pemetaan sumber kejadian, tambahkan rekaman kejadian ke aliran Kinesis Anda. Nilai `--data` adalah string yang dienkodekan CLI ke base64 sebelum mengirimkannya ke Kinesis. Anda dapat menjalankan perintah yang sama lebih dari satu kali untuk menambahkan beberapa rekaman ke aliran.

```
aws kinesis put-record --stream-name lambda-stream --partition-key 1 \
--data "Hello, this is a test."
```

Lambda menggunakan peran eksekusi untuk membaca rekaman dari aliran. Kemudian, itu akan memanggil fungsi Lambda Anda, dengan mengirimkan batch rekaman. Fungsi ini menerjemahkan data dari setiap catatan dan mencatatnya, mengirimkan output ke CloudWatch Log. Lihat log di [konsol CloudWatch ](https://console.aws.amazon.com/cloudwatch).

## Bersihkan sumber daya Anda
<a name="cleanup"></a>

Sekarang Anda dapat menghapus sumber daya yang Anda buat untuk tutorial ini, kecuali Anda ingin mempertahankannya. Dengan menghapus AWS sumber daya yang tidak lagi Anda gunakan, Anda mencegah tagihan yang tidak perlu ke Anda Akun AWS.

**Untuk menghapus peran eksekusi**

1. Buka [halaman Peran](https://console.aws.amazon.com/iam/home#/roles) dari konsol IAM.

1. Pilih peran eksekusi yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan nama peran di bidang input teks dan pilih **Hapus**.

**Untuk menghapus fungsi Lambda**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi yang Anda buat.

1. Pilih **Tindakan**, **Hapus**.

1. Ketik **confirm** kolom input teks dan pilih **Hapus**.

**Untuk menghapus aliran Kinesis**

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

1. Pilih aliran yang Anda buat.

1. Pilih **Tindakan**, **Hapus**.

1. Masukkan **delete** di bidang input teks.

1. Pilih **Hapus**.

# Menggunakan Lambda dengan Kubernetes
<a name="with-kubernetes"></a>

[Anda dapat menerapkan dan mengelola fungsi Lambda dengan API Kubernetes [AWS menggunakan Controllers for](https://aws-controllers-k8s.github.io/community/docs/community/overview/) Kubernetes (ACK) atau Crossplane.](https://docs.crossplane.io/latest/packages/providers/)

## AWS Pengontrol untuk Kubernetes (ACK)
<a name="kubernetes-ack"></a>

Anda dapat menggunakan ACK untuk menyebarkan dan mengelola AWS sumber daya dari Kubernetes API. Melalui ACK, AWS menyediakan pengontrol kustom open-source untuk AWS layanan seperti Lambda, Amazon Elastic Container Registry (Amazon ECR), Amazon Simple Storage Service (Amazon S3), dan Amazon AI. SageMaker Setiap AWS layanan yang didukung memiliki pengontrol kustom sendiri. Di klaster Kubernetes Anda, instal pengontrol untuk setiap AWS layanan yang ingin Anda gunakan. Kemudian, buat [Definisi Sumber Daya Kustom (CRD)](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/) untuk menentukan AWS sumber daya.

Kami menyarankan Anda menggunakan [Helm 3.8 atau yang lebih baru](https://helm.sh/docs/intro/install/) untuk menginstal pengontrol ACK. Setiap pengontrol ACK dilengkapi dengan bagan Helm sendiri, yang menginstal pengontrol CRDs, dan aturan RBAC Kubernetes. Untuk informasi selengkapnya, lihat [Menginstal ACK Controller](https://aws-controllers-k8s.github.io/community/docs/user-docs/install/) di dokumentasi ACK.

Setelah Anda membuat sumber daya kustom ACK, Anda dapat menggunakannya seperti objek Kubernetes bawaan lainnya. [Misalnya, Anda dapat menerapkan dan mengelola fungsi Lambda dengan toolchain Kubernetes pilihan Anda, termasuk kubectl.](https://kubernetes.io/docs/reference/kubectl/)

Berikut adalah beberapa contoh kasus penggunaan untuk menyediakan fungsi Lambda melalui ACK:
+ Organisasi Anda menggunakan [peran kontrol akses berbasis peran (RBAC)](https://kubernetes.io/docs/reference/access-authn-authz/rbac/) dan [IAM untuk akun layanan guna](https://docs.aws.amazon.com/eks/latest/userguide/iam-roles-for-service-accounts.html) membuat batas izin. Dengan ACK, Anda dapat menggunakan kembali model keamanan ini untuk Lambda tanpa harus membuat pengguna dan kebijakan baru.
+ Organisasi Anda memiliki DevOps proses untuk menyebarkan sumber daya ke dalam klaster Amazon Elastic Kubernetes Service (Amazon EKS) menggunakan manifes Kubernetes. Dengan ACK, Anda dapat menggunakan manifes untuk menyediakan fungsi Lambda tanpa membuat infrastruktur terpisah sebagai templat kode.

Untuk informasi selengkapnya tentang penggunaan ACK, lihat [tutorial Lambda di dokumentasi ACK](https://aws-controllers-k8s.github.io/community/docs/tutorials/lambda-oci-example/).

## Crossplane
<a name="kubernetes-crossplane"></a>

[Crossplane](https://docs.crossplane.io/latest/packages/providers/) adalah proyek Cloud Native Computing Foundation (CNCF) open-source yang menggunakan Kubernetes untuk mengelola sumber daya infrastruktur cloud. Dengan Crossplane, pengembang dapat meminta infrastruktur tanpa perlu memahami kompleksitasnya. Tim platform mempertahankan kendali atas bagaimana infrastruktur disediakan dan dikelola.

Menggunakan Crossplane, Anda dapat menerapkan dan mengelola fungsi Lambda dengan toolchain Kubernetes pilihan Anda seperti [kubectl, dan pipeline apa pun yang dapat menyebarkan manifes ke Kubernetes](https://kubernetes.io/docs/reference/kubectl/). CI/CD Berikut adalah beberapa contoh kasus penggunaan untuk menyediakan fungsi Lambda melalui Crossplane:
+ [Organisasi Anda ingin menegakkan kepatuhan dengan memastikan bahwa fungsi Lambda memiliki tag yang benar.](configuration-tags.md) Tim platform dapat menggunakan [Komposisi Crossplane](https://docs.crossplane.io/latest/get-started/get-started-with-composition/) untuk menentukan kebijakan ini melalui abstraksi API. Pengembang kemudian dapat menggunakan abstraksi ini untuk menyebarkan fungsi Lambda dengan tag.
+ Proyek Anda menggunakan GitOps Kubernetes. Dalam model ini, Kubernetes terus-menerus merekonsiliasi repositori git (status yang diinginkan) dengan sumber daya yang berjalan di dalam cluster (status saat ini). Jika ada perbedaan, GitOps proses secara otomatis membuat perubahan pada cluster. [Anda dapat menggunakan GitOps Kubernetes untuk menyebarkan dan mengelola fungsi Lambda melalui Crossplane, menggunakan alat dan konsep Kubernetes yang sudah dikenal seperti dan Controller. [CRDs](https://kubernetes.io/docs/tasks/extend-kubernetes/custom-resources/custom-resource-definitions/)](https://kubernetes.io/docs/concepts/architecture/controller/)

Untuk mempelajari lebih lanjut tentang menggunakan Crossplane dengan Lambda, lihat berikut ini:
+ [AWS Blueprints for Crossplane](https://github.com/awslabs/crossplane-on-eks/blob/main/examples/upbound-aws-provider/README.md#deploy-the-examples): Repositori ini mencakup contoh cara menggunakan Crossplane untuk menyebarkan sumber daya, termasuk fungsi Lambda. AWS 
**catatan**  
AWS Cetak biru untuk Crossplane sedang dalam pengembangan aktif dan tidak boleh digunakan dalam produksi.
+ [Menyebarkan Lambda dengan Amazon EKS dan](https://www.youtube.com/watch?v=m-9KLq29K4k) Crossplane: Video ini menunjukkan contoh lanjutan dari penerapan AWS arsitektur tanpa server dengan Crossplane, mengeksplorasi desain dari perspektif pengembang dan platform.

# Menggunakan Lambda dengan Amazon MQ
<a name="with-mq"></a>

**catatan**  
[Jika Anda ingin mengirim data ke target selain fungsi Lambda atau memperkaya data sebelum mengirimnya, lihat Amazon Pipes. EventBridge ](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes.html)

Amazon MQ adalah layanan broker pesan terkelola untuk [Apache ActiveMQ](https://activemq.apache.org/) dan [RabbitMQ](https://www.rabbitmq.com). *Broker pesan* memungkinkan aplikasi dan komponen perangkat lunak untuk berkomunikasi menggunakan berbagai bahasa pemrograman, sistem operasi, dan protokol pesan formal baik melalui topik atau tujuan acara antrian.

Amazon MQ juga dapat mengelola instans Amazon Elastic Compute Cloud (Amazon EC2) atas nama Anda dengan menginstal broker ActiveMQ atau RabbitMQ dan dengan menyediakan berbagai topologi jaringan dan kebutuhan infrastruktur lainnya.

Anda dapat menggunakan fungsi Lambda untuk memproses rekaman dari broker pesan Amazon MQ Anda. [Lambda memanggil fungsi Anda melalui [pemetaan sumber peristiwa, sumber](invocation-eventsourcemapping.md) daya Lambda yang membaca pesan dari broker Anda dan memanggil fungsi secara serempak.](invocation-sync.md)

**Awas**  
Pemetaan sumber peristiwa Lambda memproses setiap peristiwa setidaknya sekali, dan pemrosesan duplikat catatan dapat terjadi. Untuk menghindari potensi masalah yang terkait dengan duplikat peristiwa, kami sangat menyarankan agar Anda membuat kode fungsi Anda idempoten. Untuk mempelajari lebih lanjut, lihat [Bagaimana cara membuat fungsi Lambda saya idempoten](https://repost.aws/knowledge-center/lambda-function-idempotent) di Pusat Pengetahuan. AWS 

Pemetaan sumber kejadian Amazon MQ memiliki pembatasan konfigurasi berikut:
+ [Konkurensi - Fungsi Lambda yang menggunakan pemetaan sumber peristiwa Amazon MQ memiliki pengaturan konkurensi maksimum default.](lambda-concurrency.md) Untuk ActiveMQ, layanan Lambda membatasi jumlah lingkungan eksekusi bersamaan hingga lima per pemetaan sumber peristiwa Amazon MQ. Untuk RabbitMQ, jumlah lingkungan eksekusi bersamaan dibatasi hingga 1 per pemetaan sumber peristiwa Amazon MQ. Bahkan jika Anda mengubah setelan konkurensi yang dicadangkan atau disediakan fungsi, layanan Lambda tidak akan membuat lebih banyak lingkungan eksekusi tersedia. Untuk meminta peningkatan konkurensi maksimum default untuk satu pemetaan sumber peristiwa Amazon MQ, Dukungan hubungi UUID pemetaan sumber peristiwa, serta wilayah. Karena peningkatan diterapkan pada tingkat pemetaan sumber peristiwa tertentu, bukan tingkat akun atau wilayah, Anda perlu meminta peningkatan penskalaan secara manual untuk setiap pemetaan sumber peristiwa.
+ Lintas akun — Lambda tidak mendukung pemrosesan lintas akun. Anda tidak dapat menggunakan Lambda untuk memproses catatan dari broker pesan Amazon MQ yang berbeda. Akun AWS
+ Otentikasi - Untuk ActiveMQ, hanya ActiveMQ yang didukung. [SimpleAuthenticationPlugin](https://activemq.apache.org/security#simple-authentication-plugin) Untuk RabbitMQ, hanya mekanisme otentikasi [PLAIN](https://www.rabbitmq.com/access-control.html#mechanisms) yang didukung. Pengguna harus menggunakan AWS Secrets Manager untuk mengelola kredensialnya. *Untuk informasi selengkapnya tentang otentikasi ActiveMQ, lihat [Mengintegrasikan broker ActiveMQ dengan LDAP di Panduan Pengembang Amazon MQ](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/security-authentication-authorization.html).*
+ Kuota koneksi – Broker memiliki jumlah maksimum koneksi yang diizinkan untuk setiap protokol wire-level. Kuota ini didasarkan pada jenis instans broker. Untuk informasi lebih lanjut, lihat bagian [Broker](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/amazon-mq-limits.html#broker-limits) dari **Kuota di Amazon MQ** dalam *Panduan Developer Amazon MQ*.
+ Konektivitas – Anda dapat membuat broker di virtual private cloud (VPC) publik atau privat. Untuk pribadi VPCs, fungsi Lambda Anda memerlukan akses ke VPC untuk menerima pesan. Untuk informasi lebih lanjut, lihat [Konfigurasikan keamanan jaringan](process-mq-messages-with-lambda.md#process-mq-messages-with-lambda-networkconfiguration) nanti di bagian ini.
+ Tujuan kejadian – Hanya tujuan antrean yang didukung. Namun, Anda dapat menggunakan topik virtual, yang berfungsi sebagai topik secara internal sambil berinteraksi dengan Lambda sebagai antrean. Untuk informasi lebih lanjut, lihat [Tujuan Virtual](https://activemq.apache.org/virtual-destinations) di situs web Apache ActiveMQ, [dan Host Virtual](https://www.rabbitmq.com/vhosts.html) di situs web RabbitMQ.
+ Topologi jaringan - Untuk ActiveMQ, hanya satu broker tunggal atau siaga yang didukung per pemetaan sumber peristiwa. Untuk RabbitMQ, hanya satu broker instans tunggal atau penerapan klaster yang didukung per pemetaan sumber peristiwa. Broker instans tunggal memerlukan titik akhir failover. Untuk informasi selengkapnya tentang mode penyebaran broker ini, lihat Arsitektur Broker [MQ Aktif dan Arsitektur Broker](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/amazon-mq-broker-architecture.html) [MQ Kelinci di Panduan Pengembang](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/rabbitmq-broker-architecture.html) Amazon *MQ*.
+ Protokol — Protokol yang didukung bergantung pada jenis integrasi Amazon MQ.
  + Untuk integrasi ActiveMQ, Lambda menggunakan pesan menggunakan OpenWire/Java protokol Message Service (JMS). Tidak ada protokol lain yang didukung untuk mengkonsumsi pesan. Dalam protokol JMS, hanya [https://activemq.apache.org/components/cms/api_docs/activemqcpp-3.6.0/html/classactivemq_1_1commands_1_1_active_m_q_text_message.html](https://activemq.apache.org/components/cms/api_docs/activemqcpp-3.6.0/html/classactivemq_1_1commands_1_1_active_m_q_text_message.html) dan [https://activemq.apache.org/components/cms/api_docs/activemqcpp-3.9.0/html/classactivemq_1_1commands_1_1_active_m_q_bytes_message.html](https://activemq.apache.org/components/cms/api_docs/activemqcpp-3.9.0/html/classactivemq_1_1commands_1_1_active_m_q_bytes_message.html) yang didukung. Lambda juga mendukung properti kustom JMS. Untuk informasi lebih lanjut tentang OpenWire protokol, lihat [OpenWire](https://activemq.apache.org/openwire.html)di situs web Apache ActiveMQ.
  + Untuk integrasi RabbitMQ, Lambda mengkonsumsi pesan menggunakan protokol AMQP 0-9-1. Tidak ada protokol lain yang didukung untuk mengkonsumsi pesan. Untuk informasi lebih lanjut tentang implementasi protokol AMQP 0-9-1 RabbitMQ, lihat [AMQP 0-9-1 Panduan Referensi Lengkap di situs web RabbitMQ](https://www.rabbitmq.com/amqp-0-9-1-reference.html).

Lambda secara otomatis mendukung versi terbaru ActiveMQ dan RabbitMQ yang didukung Amazon MQ. Untuk versi terbaru yang didukung, lihat [catatan rilis Amazon MQ di Panduan Pengembang](https://docs.aws.amazon.com/amazon-mq/latest/developer-guide/amazon-mq-release-notes.html) *Amazon MQ*.

**catatan**  
Secara default, Amazon MQ memiliki jangka waktu pemeliharaan mingguan untuk broker. Selama jangka waktu tersebut, broker tidak tersedia. Untuk broker tanpa standby, Lambda tidak dapat memproses pesan apa pun selama jangka waktu tersebut.

**Topics**
+ [

## Memahami grup konsumen Lambda untuk Amazon MQ
](#services-mq-configure)
+ [

# Mengonfigurasi sumber acara Amazon MQ untuk Lambda
](process-mq-messages-with-lambda.md)
+ [

# Parameter pemetaan sumber peristiwa
](services-mq-params.md)
+ [

# Filter peristiwa dari sumber acara Amazon MQ
](with-mq-filtering.md)
+ [

# Memecahkan masalah kesalahan pemetaan sumber peristiwa Amazon MQ
](services-mq-errors.md)

## Memahami grup konsumen Lambda untuk Amazon MQ
<a name="services-mq-configure"></a>

Untuk berinteraksi dengan Amazon MQ, Lambda membuat grup konsumen yang dapat membaca dari broker Amazon MQ Anda. Grup konsumen dibuat dengan ID yang sama dengan UUID pemetaan sumber kejadian.

Untuk sumber peristiwa Amazon MQ, Lambda mengumpulkan catatan bersama dan mengirimkannya ke fungsi Anda dalam satu muatan. Untuk mengontrol perilaku, Anda dapat mengonfigurasi jendela batching dan ukuran batch. Lambda menarik pesan hingga memproses ukuran muatan maksimum 6 MB, jendela batching kedaluwarsa, atau jumlah catatan mencapai ukuran batch penuh. Untuk informasi selengkapnya, lihat [Perilaku batching](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching).

Grup konsumen mengambil pesan sebagai BLOB byte, base64-mengkodekannya ke dalam satu muatan JSON, dan kemudian memanggil fungsi Anda. Jika fungsi Anda mengembalikan kesalahan untuk salah satu pesan dalam batch, Lambda mencoba ulang seluruh batch pesan sampai berhasil diproses atau pesan berakhir.

**catatan**  
Sementara fungsi Lambda biasanya memiliki batas waktu tunggu maksimum 15 menit, pemetaan sumber acara untuk Amazon MSK, Apache Kafka yang dikelola sendiri, Amazon DocumentDB, dan Amazon MQ untuk ActiveMQ dan RabbitMQ hanya mendukung fungsi dengan batas waktu tunggu maksimum 14 menit. Kendala ini memastikan bahwa pemetaan sumber peristiwa dapat menangani kesalahan fungsi dan percobaan ulang dengan benar.

Anda dapat memantau penggunaan konkurensi fungsi tertentu menggunakan `ConcurrentExecutions` metrik di Amazon CloudWatch. Untuk informasi selengkapnya tentang konkurensi, lihat [Mengkonfigurasi konkurensi cadangan untuk suatu fungsi](configuration-concurrency.md).

**Example Acara rekam Amazon MQ**  

```
{
   "eventSource": "aws:mq",
   "eventSourceArn": "arn:aws:mq:us-east-2:111122223333:broker:test:b-9bcfa592-423a-4942-879d-eb284b418fc8",
   "messages": [
      { 
        "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1---mq---us-east-2.amazonaws.com.rproxy.goskope.com-37557-1234520418293-4:1:1:1:1", 
        "messageType": "jms/text-message",
        "deliveryMode": 1,
        "replyTo": null,
        "type": null,
        "expiration": "60000",
        "priority": 1,
        "correlationId": "myJMSCoID",
        "redelivered": false,
        "destination": { 
          "physicalName": "testQueue" 
        },
        "data":"QUJDOkFBQUE=",
        "timestamp": 1598827811958,
        "brokerInTime": 1598827811958, 
        "brokerOutTime": 1598827811959, 
        "properties": {
          "index": "1",
          "doAlarm": "false",
          "myCustomProperty": "value"
        }
      },
      { 
        "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1---mq---us-east-2.amazonaws.com.rproxy.goskope.com-37557-1234520418293-4:1:1:1:1",
        "messageType": "jms/bytes-message",
        "deliveryMode": 1,
        "replyTo": null,
        "type": null,
        "expiration": "60000",
        "priority": 2,
        "correlationId": "myJMSCoID1",
        "redelivered": false,
        "destination": { 
          "physicalName": "testQueue" 
        },
        "data":"LQaGQ82S48k=",
        "timestamp": 1598827811958,
        "brokerInTime": 1598827811958, 
        "brokerOutTime": 1598827811959, 
        "properties": {
          "index": "1",
          "doAlarm": "false",
          "myCustomProperty": "value"
        }
      }
   ]
}
```

```
{
  "eventSource": "aws:rmq",
  "eventSourceArn": "arn:aws:mq:us-east-2:111122223333:broker:pizzaBroker:b-9bcfa592-423a-4942-879d-eb284b418fc8",
  "rmqMessagesByQueue": {
    "pizzaQueue::/": [
      {
        "basicProperties": {
          "contentType": "text/plain",
          "contentEncoding": null,
          "headers": {
            "header1": {
              "bytes": [
                118,
                97,
                108,
                117,
                101,
                49
              ]
            },
            "header2": {
              "bytes": [
                118,
                97,
                108,
                117,
                101,
                50
              ]
            },
            "numberInHeader": 10
          },
          "deliveryMode": 1,
          "priority": 34,
          "correlationId": null,
          "replyTo": null,
          "expiration": "60000",
          "messageId": null,
          "timestamp": "Jan 1, 1970, 12:33:41 AM",
          "type": null,
          "userId": "AIDACKCEVSQ6C2EXAMPLE",
          "appId": null,
          "clusterId": null,
          "bodySize": 80
        },
        "redelivered": false,
        "data": "eyJ0aW1lb3V0IjowLCJkYXRhIjoiQ1pybWYwR3c4T3Y0YnFMUXhENEUifQ=="
      }
    ]
  }
}
```
Dalam contoh RabbitMQ, `pizzaQueue` adalah nama antrian RabbitMQ, dan `/` merupakan nama host virtual. Saat menerima pesan, sumber acara mencantumkan pesan di bawah`pizzaQueue::/`.

# Mengonfigurasi sumber acara Amazon MQ untuk Lambda
<a name="process-mq-messages-with-lambda"></a>

**Topics**
+ [

## Konfigurasikan keamanan jaringan
](#process-mq-messages-with-lambda-networkconfiguration)
+ [

## Buat pemetaan sumber acara
](#services-mq-eventsourcemapping)

## Konfigurasikan keamanan jaringan
<a name="process-mq-messages-with-lambda-networkconfiguration"></a>

Untuk memberi Lambda akses penuh ke Amazon MQ melalui pemetaan sumber acara Anda, broker Anda harus menggunakan titik akhir publik (alamat IP publik), atau Anda harus memberikan akses ke VPC Amazon tempat Anda membuat broker.

Saat Anda menggunakan Amazon MQ dengan Lambda, buat [titik akhir AWS PrivateLink VPC](https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html) yang menyediakan akses fungsi Anda ke sumber daya di VPC Amazon Anda.

**catatan**  
AWS PrivateLink Titik akhir VPC diperlukan untuk fungsi dengan pemetaan sumber peristiwa yang menggunakan mode default (sesuai permintaan) untuk poller acara. Jika pemetaan sumber acara menggunakan [mode yang disediakan](invocation-eventsourcemapping.md#invocation-eventsourcemapping-provisioned-mode), Anda tidak perlu mengonfigurasi titik akhir AWS PrivateLink VPC.

Buat titik akhir untuk menyediakan akses ke sumber daya berikut:
+  Lambda — Buat titik akhir untuk kepala layanan Lambda. 
+  AWS STS — Buat titik akhir AWS STS untuk prinsipal layanan untuk mengambil peran atas nama Anda. 
+  Secrets Manager — Jika broker Anda menggunakan Secrets Manager untuk menyimpan kredensi, buat endpoint untuk Secrets Manager. 

Atau, konfigurasikan gateway NAT di setiap subnet publik di Amazon VPC. Untuk informasi selengkapnya, lihat [Aktifkan akses internet untuk fungsi Lambda yang terhubung dengan VPC](configuration-vpc-internet.md).

Saat Anda membuat pemetaan sumber peristiwa untuk Amazon MQ, Lambda memeriksa apakah Antarmuka Jaringan Elastis ENIs () sudah ada untuk subnet dan grup keamanan yang dikonfigurasi untuk Amazon VPC Anda. Jika Lambda menemukan yang ada ENIs, ia mencoba untuk menggunakannya kembali. Jika tidak, Lambda membuat yang baru ENIs untuk terhubung ke sumber acara dan memanggil fungsi Anda.

**catatan**  
Fungsi Lambda selalu berjalan di dalam yang VPCs dimiliki oleh layanan Lambda. Konfigurasi VPC fungsi Anda tidak memengaruhi pemetaan sumber peristiwa. Hanya konfigurasi jaringan sumber acara yang menentukan bagaimana Lambda terhubung ke sumber acara Anda.

Konfigurasikan grup keamanan untuk VPC Amazon yang berisi broker Anda. Secara default, Amazon MQ menggunakan port berikut: `61617` (Amazon MQ untuk ActiveMQ), `5671` dan (Amazon MQ untuk RabbitMQ).
+ Aturan masuk - Izinkan semua lalu lintas di port broker default untuk grup keamanan yang terkait dengan sumber acara Anda. Atau, Anda dapat menggunakan aturan grup keamanan referensi mandiri untuk mengizinkan akses dari instans dalam grup keamanan yang sama.
+ Aturan keluar - Izinkan semua lalu lintas di port `443` untuk tujuan eksternal jika fungsi Anda perlu berkomunikasi dengan AWS layanan. Atau, Anda juga dapat menggunakan aturan grup keamanan referensi diri untuk membatasi akses ke broker jika Anda tidak perlu berkomunikasi dengan layanan lain AWS .
+ Aturan masuk titik akhir VPC Amazon — Jika Anda menggunakan titik akhir VPC Amazon, grup keamanan yang terkait dengan titik akhir VPC Amazon Anda harus mengizinkan lalu lintas masuk di port dari grup keamanan broker. `443`

Jika broker Anda menggunakan otentikasi, Anda juga dapat membatasi kebijakan titik akhir untuk titik akhir Secrets Manager. Untuk memanggil Secrets Manager API, Lambda menggunakan peran fungsi Anda, bukan kepala layanan Lambda.

**Example Kebijakan titik akhir VPC — titik akhir Secrets Manager**  

```
{
      "Statement": [
          {
              "Action": "secretsmanager:GetSecretValue",
              "Effect": "Allow",
              "Principal": {
                  "AWS": [
                      "arn:aws::iam::123456789012:role/my-role"
                  ]
              },
              "Resource": "arn:aws::secretsmanager:us-west-2:123456789012:secret:my-secret"
          }
      ]
  }
```

Saat Anda menggunakan titik akhir Amazon VPC, AWS merutekan panggilan API Anda untuk menjalankan fungsi Anda menggunakan Antarmuka Jaringan Elastis (ENI) titik akhir. Kepala layanan Lambda perlu memanggil `lambda:InvokeFunction` peran dan fungsi apa pun yang menggunakannya. ENIs

Secara default, titik akhir Amazon VPC memiliki kebijakan IAM terbuka yang memungkinkan akses luas ke sumber daya. Praktik terbaik adalah membatasi kebijakan ini untuk melakukan tindakan yang diperlukan menggunakan titik akhir tersebut. Untuk memastikan bahwa pemetaan sumber peristiwa Anda dapat menjalankan fungsi Lambda Anda, kebijakan titik akhir VPC harus mengizinkan kepala layanan Lambda untuk memanggil dan. `sts:AssumeRole` `lambda:InvokeFunction` Membatasi kebijakan titik akhir VPC Anda agar hanya mengizinkan panggilan API yang berasal dari organisasi Anda mencegah pemetaan sumber peristiwa berfungsi dengan baik, `"Resource": "*"` sehingga diperlukan dalam kebijakan ini.

Contoh kebijakan titik akhir VPC berikut menunjukkan cara memberikan akses yang diperlukan ke prinsipal layanan Lambda untuk titik akhir dan Lambda. AWS STS 

**Example Kebijakan Titik Akhir VPC — titik akhir AWS STS**  

```
{
      "Statement": [
          {
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "lambda.amazonaws.com"
                  ]
              },
              "Resource": "*"
          }
      ]
    }
```

**Example Kebijakan Titik Akhir VPC - Titik akhir Lambda**  

```
{
      "Statement": [
          {
              "Action": "lambda:InvokeFunction",
              "Effect": "Allow",
              "Principal": {
                  "Service": [
                      "lambda.amazonaws.com"
                  ]
              },
              "Resource": "*"
          }
      ]
  }
```

## Buat pemetaan sumber acara
<a name="services-mq-eventsourcemapping"></a>

Buat [pemetaan sumber kejadian](invocation-eventsourcemapping.md) untuk memberi tahu Lambda agar mengirim rekaman dari broker Amazon MQ ke fungsi Lambda. Anda dapat membuat beberapa pemetaan sumber kejadian untuk memproses data yang sama dengan beberapa fungsi, atau untuk memproses item dari beberapa sumber dengan satu fungsi.

Untuk mengonfigurasi fungsi agar dibaca dari Amazon MQ, tambahkan izin yang diperlukan dan buat **pemicu MQ** di konsol Lambda.

Untuk membaca catatan dari broker Amazon MQ, fungsi Lambda Anda memerlukan izin berikut. [Anda memberi Lambda izin untuk berinteraksi dengan broker Amazon MQ Anda dan sumber yang mendasarinya dengan menambahkan pernyataan izin ke peran eksekusi fungsi Anda:](lambda-intro-execution-role.md)
+ [mq: DescribeBroker](https://docs.aws.amazon.com/amazon-mq/latest/api-reference/brokers-broker-id.html#brokers-broker-id-http-methods)
+ [manajer rahasia: GetSecretValue](https://docs.aws.amazon.com/secretsmanager/latest/apireference/API_GetSecretValue.html)
+ [EC2: CreateNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateNetworkInterface.html)
+ [EC2: DeleteNetworkInterface](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteNetworkInterface.html)
+ [EC2: DescribeNetworkInterfaces](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeNetworkInterfaces.html)
+ [EC2: DescribeSecurityGroups](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSecurityGroups.html)
+ [EC2: DescribeSubnets](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeSubnets.html)
+ [EC2: DescribeVpcs](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DescribeVpcs.html)
+ [log: CreateLogGroup](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogGroup.html)
+ [log: CreateLogStream](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_CreateLogStream.html)
+ [log: PutLogEvents](https://docs.aws.amazon.com/AmazonCloudWatchLogs/latest/APIReference/API_PutLogEvents.html)

**catatan**  
Saat menggunakan kunci terkelola pelanggan yang terenkripsi, tambahkan juga izin `[kms:Decrypt](https://docs.aws.amazon.com/msk/1.0/apireference/clusters-clusterarn-bootstrap-brokers.html#clusters-clusterarn-bootstrap-brokersget)`.

**Untuk menambahkan izin dan membuat pemicu**

1. Buka [Halaman fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih nama sebuah fungsi.

1. Pilih tab **Konfigurasi**, lalu pilih **Izin**.

1. Di bawah **Nama peran**, pilih tautan ke peran eksekusi Anda. Tautan ini membuka peran di konsol IAM.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/execution-role.png)

1. Pilih **Tambahkan izin**, lalu pilih **Buat kebijakan sebaris**.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/inline-policy.png)

1. Di **editor Kebijakan**, pilih **JSON**. Masukkan kebijakan berikut. Fungsi Anda memerlukan izin ini untuk membaca dari broker Amazon MQ.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
         {
           "Effect": "Allow",
           "Action": [
             "mq:DescribeBroker",
             "secretsmanager:GetSecretValue",
             "ec2:CreateNetworkInterface",
             "ec2:DeleteNetworkInterface",
             "ec2:DescribeNetworkInterfaces", 
             "ec2:DescribeSecurityGroups",
             "ec2:DescribeSubnets",
             "ec2:DescribeVpcs",
             "logs:CreateLogGroup",
             "logs:CreateLogStream", 
             "logs:PutLogEvents"		
           ],
           "Resource": "*"
         }
       ]
     }
   ```

------
**catatan**  
Saat menggunakan kunci terkelola pelanggan terenkripsi, Anda juga harus menambahkan izin. `kms:Decrypt`

1. Pilih **Berikutnya**. Masukkan nama kebijakan, lalu pilih **Buat kebijakan**.

1. Kembali ke fungsi Anda di konsol Lambda. Di bagian **Gambaran umum fungsi**, pilih **Tambah pemicu**.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/add-trigger.png)

1. Pilih jenis pemicu **MQ**.

1. Konfigurasikan opsi yang diperlukan, lalu pilih **Tambah**.

Lambda mendukung opsi berikut untuk sumber kejadian Amazon MQ:
+ **MQ broker** – Pilih broker Amazon MQ.
+ **Ukuran batch** – Atur jumlah maksimum pesan yang akan diambil dalam satu batch.
+ **Nama antrean** – Masukkan antrean Amazon MQ yang akan digunakan.
+ **Konfigurasi akses sumber** — Masukkan informasi host virtual dan rahasia Secrets Manager yang menyimpan kredensi broker Anda.
+ **Aktifkan pemicu** – Nonaktifkan pemicu untuk menghentikan pemrosesan rekaman.

Untuk mengaktifkan atau menonaktifkan pemicu (atau menghapusnya) pilih pemicu **MQ** di desainer. Untuk mengonfigurasi ulang pemicu, gunakan operasi API pemetaan sumber kejadian.

# Parameter pemetaan sumber peristiwa
<a name="services-mq-params"></a>

Semua jenis sumber peristiwa Lambda berbagi operasi yang sama [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)dan [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)API. Namun, hanya beberapa parameter yang berlaku untuk Amazon MQ dan RabbitMQ.


| Parameter | Diperlukan | Default | Catatan | 
| --- | --- | --- | --- | 
|  BatchSize  |  T  |  100  |  Maksimum: 10.000.  | 
|  Diaktifkan  |  T  |  true  | none | 
|  FunctionName  |  T  | N/A  | none | 
|  FilterCriteria  |  T  |  N/A   |  [Kontrol peristiwa mana yang dikirim Lambda ke fungsi Anda](invocation-eventfiltering.md)  | 
|  MaximumBatchingWindowInSeconds  |  T  |  500 ms  |  [Perilaku batching](invocation-eventsourcemapping.md#invocation-eventsourcemapping-batching)  | 
|  Antrean  |  T  | N/A |  Nama antrean tujuan broker Amazon MQ yang akan digunakan.  | 
|  SourceAccessConfigurations  |  T  | N/A  |  Untuk ActiveMQ, kredensial BASIC\$1AUTH. Untuk RabbitMQ, dapat berisi kredensial BASIC\$1AUTH dan informasi VIRTUAL\$1HOST.  | 

# Filter peristiwa dari sumber acara Amazon MQ
<a name="with-mq-filtering"></a>

Anda dapat menggunakan pemfilteran peristiwa untuk mengontrol rekaman mana dari aliran atau antrian yang dikirim Lambda ke fungsi Anda. Untuk informasi umum tentang cara kerja penyaringan acara, lihat[Kontrol peristiwa mana yang dikirim Lambda ke fungsi Anda](invocation-eventfiltering.md).

Bagian ini berfokus pada pemfilteran acara untuk sumber acara Amazon MQ.

**catatan**  
Pemetaan sumber acara Amazon MQ hanya mendukung pemfilteran pada kunci. `data`

**Topics**
+ [

## Dasar-dasar penyaringan acara Amazon MQ
](#filtering-AMQ)

## Dasar-dasar penyaringan acara Amazon MQ
<a name="filtering-AMQ"></a>

Misalkan antrian pesan Amazon MQ Anda berisi pesan baik dalam format JSON yang valid atau sebagai string biasa. Contoh catatan akan terlihat seperti berikut, dengan data dikonversi ke string yang dikodekan Base64 di lapangan. `data`

------
#### [ ActiveMQ ]

```
{ 
    "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1---mq---us-east-2.amazonaws.com.rproxy.goskope.com-37557-1234520418293-4:1:1:1:1", 
    "messageType": "jms/text-message",
    "deliveryMode": 1,
    "replyTo": null,
    "type": null,
    "expiration": "60000",
    "priority": 1,
    "correlationId": "myJMSCoID",
    "redelivered": false,
    "destination": { 
      "physicalName": "testQueue" 
    },
    "data":"QUJDOkFBQUE=",
    "timestamp": 1598827811958,
    "brokerInTime": 1598827811958, 
    "brokerOutTime": 1598827811959, 
    "properties": {
      "index": "1",
      "doAlarm": "false",
      "myCustomProperty": "value"
    }
}
```

------
#### [ RabbitMQ ]

```
{
    "basicProperties": {
        "contentType": "text/plain",
        "contentEncoding": null,
        "headers": {
            "header1": {
                "bytes": [
                  118,
                  97,
                  108,
                  117,
                  101,
                  49
                ]
            },
            "header2": {
                "bytes": [
                  118,
                  97,
                  108,
                  117,
                  101,
                  50
                ]
            },
            "numberInHeader": 10
        },
        "deliveryMode": 1,
        "priority": 34,
        "correlationId": null,
        "replyTo": null,
        "expiration": "60000",
        "messageId": null,
        "timestamp": "Jan 1, 1970, 12:33:41 AM",
        "type": null,
        "userId": "AIDACKCEVSQ6C2EXAMPLE",
        "appId": null,
        "clusterId": null,
        "bodySize": 80
        },
    "redelivered": false,
    "data": "eyJ0aW1lb3V0IjowLCJkYXRhIjoiQ1pybWYwR3c4T3Y0YnFMUXhENEUifQ=="
}
```

------

Untuk broker MQ Aktif dan MQ Kelinci, Anda dapat menggunakan penyaringan acara untuk memfilter catatan menggunakan kunci. `data` Misalkan antrian Amazon MQ Anda berisi pesan dalam format JSON berikut.

```
{
    "timeout": 0,
    "IPAddress": "203.0.113.254"
}
```

Untuk memfilter hanya catatan yang `timeout` bidangnya lebih besar dari 0, `FilterCriteria` objeknya adalah sebagai berikut.

```
{
    "Filters": [
        {
            "Pattern": "{ \"data\" : { \"timeout\" : [ { \"numeric\": [ \">\", 0] } } ] } }"
        }
    ]
}
```

Untuk kejelasan tambahan, berikut adalah nilai filter yang `Pattern` diperluas di JSON biasa.

```
{
    "data": {
        "timeout": [ { "numeric": [ ">", 0 ] } ]
        }
}
```

Anda dapat menambahkan filter menggunakan konsol, AWS CLI atau AWS SAM templat.

------
#### [ Console ]

untuk menambahkan filter ini menggunakan konsol, ikuti instruksi [Melampirkan kriteria filter ke pemetaan sumber peristiwa (konsol)](invocation-eventfiltering.md#filtering-console) dan masukkan string berikut untuk **kriteria Filter**.

```
{ "data" : { "timeout" : [ { "numeric": [ ">", 0 ] } ] } }
```

------
#### [ AWS CLI ]

Untuk membuat pemetaan sumber peristiwa baru dengan kriteria filter ini menggunakan AWS Command Line Interface (AWS CLI), jalankan perintah berikut.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:mq:us-east-2:123456789012:broker:my-broker:b-8ac7cc01-5898-482d-be2f-a6b596050ea8 \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : { \"timeout\" : [ { \"numeric\": [ \">\", 0 ] } ] } }"}]}'
```

Untuk menambahkan kriteria filter ini ke pemetaan sumber peristiwa yang ada, jalankan perintah berikut.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : { \"timeout\" : [ { \"numeric\": [ \">\", 0 ] } ] } }"}]}'
```

Untuk menambahkan kriteria filter ini ke pemetaan sumber peristiwa yang ada, jalankan perintah berikut.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : { \"timeout\" : [ { \"numeric\": [ \">\", 0 ] } ] } }"}]}'
```

------
#### [ AWS SAM ]

Untuk menambahkan filter ini menggunakan AWS SAM, tambahkan cuplikan berikut ke template YAMAL untuk sumber acara Anda.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "data" : { "timeout" : [ { "numeric": [ ">", 0 ] } ] } }'
```

------

Dengan Amazon MQ, Anda juga dapat memfilter catatan di mana pesan adalah string biasa. Misalkan Anda hanya ingin memproses catatan di mana pesan dimulai dengan “Hasil:”. `FilterCriteria`Objek akan terlihat sebagai berikut.

```
{
    "Filters": [
        {
            "Pattern": "{ \"data\" : [ { \"prefix\": \"Result: \" } ] }"
        }
    ]
}
```

Untuk kejelasan tambahan, berikut adalah nilai filter yang `Pattern` diperluas di JSON biasa.

```
{
    "data": [
        {
        "prefix": "Result: "
        }
    ]
}
```

Anda dapat menambahkan filter menggunakan konsol, AWS CLI atau AWS SAM templat.

------
#### [ Console ]

Untuk menambahkan filter ini menggunakan konsol, ikuti instruksi [Melampirkan kriteria filter ke pemetaan sumber peristiwa (konsol)](invocation-eventfiltering.md#filtering-console) dan masukkan string berikut untuk **kriteria Filter**.

```
{ "data" : [ { "prefix": "Result: " } ] }
```

------
#### [ AWS CLI ]

Untuk membuat pemetaan sumber peristiwa baru dengan kriteria filter ini menggunakan AWS Command Line Interface (AWS CLI), jalankan perintah berikut.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:mq:us-east-2:123456789012:broker:my-broker:b-8ac7cc01-5898-482d-be2f-a6b596050ea8 \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : [ { \"prefix\": \"Result: \" } ] }"}]}'
```

Untuk menambahkan kriteria filter ini ke pemetaan sumber peristiwa yang ada, jalankan perintah berikut.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"data\" : [ { \"prefix\": \"Result: \" } ] }"}]}'
```

------
#### [ AWS SAM ]

Untuk menambahkan filter ini menggunakan AWS SAM, tambahkan cuplikan berikut ke template YAMAL untuk sumber acara Anda.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "data" : [ { "prefix": "Result " } ] }'
```

------

Pesan Amazon MQ harus berupa string yang dikodekan UTF-8, baik string biasa atau dalam format JSON. Itu karena Lambda menerjemahkan array byte Amazon MQ ke UTF-8 sebelum menerapkan kriteria filter. Jika pesan Anda menggunakan pengkodean lain, seperti UTF-16 atau ASCII, atau jika format pesan tidak cocok dengan format`FilterCriteria`, Lambda hanya memproses filter metadata. Tabel berikut merangkum perilaku spesifik:


| Format pesan masuk | Format pola filter untuk properti pesan | Tindakan yang dihasilkan | 
| --- | --- | --- | 
|  Tali polos  |  Tali polos  |  Filter Lambda berdasarkan kriteria filter Anda.  | 
|  Tali polos  |  Tidak ada pola filter untuk properti data  |  Filter Lambda (hanya pada properti metadata lainnya) berdasarkan kriteria filter Anda.  | 
|  Tali polos  |  JSON yang valid  |  Filter Lambda (hanya pada properti metadata lainnya) berdasarkan kriteria filter Anda.  | 
|  JSON yang valid  |  Tali polos  |  Filter Lambda (hanya pada properti metadata lainnya) berdasarkan kriteria filter Anda.  | 
|  JSON yang valid  |  Tidak ada pola filter untuk properti data  |  Filter Lambda (hanya pada properti metadata lainnya) berdasarkan kriteria filter Anda.  | 
|  JSON yang valid  |  JSON yang valid  |  Filter Lambda berdasarkan kriteria filter Anda.  | 
|  String yang tidak dikodekan UTF-8  |  JSON, string polos, atau tidak ada pola  |  Filter Lambda (hanya pada properti metadata lainnya) berdasarkan kriteria filter Anda.  | 

# Memecahkan masalah kesalahan pemetaan sumber peristiwa Amazon MQ
<a name="services-mq-errors"></a>

Ketika fungsi Lambda mengalami kesalahan yang tidak dapat dipulihkan, konsumen Amazon MQ Anda menghentikan pemrosesan rekaman. Konsumen lain dapat melanjutkan pemrosesan, asalkan mereka tidak mengalami kesalahan yang sama. Untuk menentukan kemungkinan penyebab dari konsumen yang dihentikan, periksa bidang `StateTransitionReason` dalam detail pengembalian `EventSourceMapping` untuk salah satu kode berikut:

**`ESM_CONFIG_NOT_VALID`**  
Konfigurasi pemetaan sumber kejadian tidak valid.

**`EVENT_SOURCE_AUTHN_ERROR`**  
Lambda gagal mengautentikasi sumber kejadian.

**`EVENT_SOURCE_AUTHZ_ERROR`**  
Lambda tidak memiliki izin yang diperlukan untuk mengakses sumber kejadian.

**`FUNCTION_CONFIG_NOT_VALID`**  
Konfigurasi fungsi tidak valid.

Catatan juga tidak diproses jika Lambda menjatuhkannya karena ukurannya. Batas ukuran untuk rekaman Lambda adalah 6 MB. Untuk mengirim ulang pesan setelah kesalahan fungsi, Anda dapat menggunakan antrian huruf mati (DLQ). [Untuk informasi selengkapnya, lihat [Pengiriman Ulang Pesan dan Penanganan DLQ](https://activemq.apache.org/message-redelivery-and-dlq-handling) di situs web Apache ActiveMQ dan Panduan Keandalan di situs web RabbitMQ.](https://www.rabbitmq.com/reliability.html)

**catatan**  
Lambda tidak mendukung kebijakan pengiriman ulang khusus. Sebagai gantinya, Lambda menggunakan kebijakan dengan nilai default dari halaman [Kebijakan Pengiriman Ulang di situs](https://activemq.apache.org/redelivery-policy) web Apache ActiveMQ, dengan disetel ke 6. `maximumRedeliveries`

# Menggunakan AWS Lambda dengan Amazon RDS
<a name="services-rds"></a>

Anda dapat menghubungkan fungsi Lambda ke database Amazon Relational Database Service (Amazon RDS) secara langsung dan melalui Amazon RDS Proxy. Koneksi langsung berguna dalam skenario sederhana, dan proxy direkomendasikan untuk produksi. Proksi basis data mengelola kumpulan koneksi basis data bersama yang memungkinkan fungsi Anda mencapai tingkat konkurensi tinggi tanpa menghabiskan koneksi basis data.

Sebaiknya gunakan Amazon RDS Proxy untuk fungsi Lambda yang sering membuat koneksi database pendek, atau membuka dan menutup sejumlah besar koneksi database. Untuk informasi selengkapnya, lihat [Menghubungkan fungsi Lambda dan instans DB secara otomatis](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/lambda-rds-connect.html) di Panduan Pengembang Layanan Amazon Relational Database Service.

**Tip**  
Untuk menghubungkan fungsi Lambda dengan cepat ke database Amazon RDS, Anda dapat menggunakan panduan panduan dalam konsol. Untuk membuka wizard, lakukan hal berikut:  
Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.
Pilih fungsi yang ingin Anda sambungkan ke database.
Pada tab **Konfigurasi**, pilih **database RDS**.
Pilih **Connect to RDS database**.
Setelah menghubungkan fungsi ke database, Anda dapat membuat proxy dengan memilih **Add proxy**.

## Mengkonfigurasi fungsi Anda untuk bekerja dengan sumber daya RDS
<a name="rds-configuration"></a>

Di konsol Lambda, Anda dapat menyediakan, dan mengonfigurasi, instans database Amazon RDS dan sumber daya proxy. **Anda dapat melakukan ini dengan menavigasi ke **database RDS** di bawah tab Konfigurasi.** Atau, Anda juga dapat membuat dan mengonfigurasi koneksi ke fungsi Lambda di konsol Amazon RDS. Saat mengonfigurasi instance database RDS untuk digunakan dengan Lambda, perhatikan kriteria berikut:
+ Untuk terhubung ke database, fungsi Anda harus berada di VPC Amazon yang sama tempat database Anda berjalan.
+ Anda dapat menggunakan database Amazon RDS dengan mesin MySQL, MariaDB, PostgreSQL, atau Microsoft SQL Server.
+ Anda juga dapat menggunakan cluster Aurora DB dengan mesin MySQL atau PostgreSQL.
+ Anda perlu memberikan rahasia Secrets Manager untuk otentikasi database.
+ Peran IAM harus memberikan izin untuk menggunakan rahasia, dan kebijakan kepercayaan harus memungkinkan Amazon RDS untuk mengambil peran tersebut.
+  Prinsipal IAM yang menggunakan konsol untuk mengonfigurasi sumber daya Amazon RDS, dan menghubungkannya ke fungsi Anda harus memiliki izin berikut:

### Contoh kebijakan izin
<a name="rds-lambda-permissions"></a>

**catatan**  
 Anda memerlukan izin Amazon RDS Proxy hanya jika Anda mengonfigurasi Proxy Amazon RDS untuk mengelola kumpulan koneksi database Anda. 

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Action": [
        "ec2:CreateSecurityGroup",
        "ec2:DescribeSecurityGroups",
        "ec2:DescribeSubnets",
        "ec2:DescribeVpcs",
        "ec2:AuthorizeSecurityGroupIngress",
        "ec2:AuthorizeSecurityGroupEgress",
        "ec2:RevokeSecurityGroupEgress",
        "ec2:CreateNetworkInterface",
        "ec2:DeleteNetworkInterface",
        "ec2:DescribeNetworkInterfaces"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "rds-db:connect",
        "rds:CreateDBProxy",
        "rds:CreateDBInstance",
        "rds:CreateDBSubnetGroup",
        "rds:DescribeDBClusters",
        "rds:DescribeDBInstances",
        "rds:DescribeDBSubnetGroups",
        "rds:DescribeDBProxies",
        "rds:DescribeDBProxyTargets",
        "rds:DescribeDBProxyTargetGroups",
        "rds:RegisterDBProxyTargets",
        "rds:ModifyDBInstance",
        "rds:ModifyDBProxy"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "lambda:CreateFunction",
        "lambda:ListFunctions",
        "lambda:UpdateFunctionConfiguration"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "iam:AttachRolePolicy",
        "iam:CreateRole",
        "iam:CreatePolicy"
      ],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "secretsmanager:GetResourcePolicy",
        "secretsmanager:GetSecretValue",
        "secretsmanager:DescribeSecret",
        "secretsmanager:ListSecretVersionIds",
        "secretsmanager:CreateSecret"
      ],
      "Resource": "*"
    }
  ]
}
```

------

Amazon RDS mengenakan tarif per jam untuk proxy berdasarkan ukuran instans database, lihat harga Proxy [RDS](https://aws.amazon.com/rds/proxy/pricing/) untuk detailnya. Untuk informasi selengkapnya tentang koneksi proxy secara umum, lihat [Menggunakan Proxy Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.html) di Panduan Pengguna Amazon RDS.

### Persyaratan SSL/TLS untuk koneksi Amazon RDS
<a name="rds-lambda-certificates"></a>

Untuk membuat SSL/TLS koneksi aman ke instans database Amazon RDS, fungsi Lambda Anda harus memverifikasi identitas server database menggunakan sertifikat tepercaya. Lambda menangani sertifikat ini secara berbeda tergantung pada jenis paket penerapan Anda:
+ [arsip file.zip](configuration-function-zip.md): Penanganan sertifikat bervariasi menurut runtime:
  + **Node.js 18 dan sebelumnya**: Lambda secara otomatis menyertakan sertifikat CA dan sertifikat RDS.
  + **Node.js 20 dan yang lebih baru**: Lambda tidak lagi memuat sertifikat CA tambahan secara default. Atur `NODE_EXTRA_CA_CERTS` variabel lingkungan ke `/var/runtime/ca-cert.pem`.

  Mungkin diperlukan waktu hingga 4 minggu untuk sertifikat Amazon RDS Wilayah AWS agar baru ditambahkan ke runtime terkelola Lambda.
+ [Gambar kontainer](images-create.md): gambar AWS dasar hanya menyertakan sertifikat CA. Jika fungsi Anda tersambung ke instans database Amazon RDS, Anda harus menyertakan sertifikat yang sesuai dalam image container Anda. Di Dockerfile Anda, unduh [bundel sertifikat yang sesuai dengan Wilayah AWS tempat Anda meng-host database Anda](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/UsingWithRDS.SSL.html#UsingWithRDS.SSL.CertificatesDownload). Contoh:

  ```
  RUN curl https://truststore.pki.rds.amazonaws.com/us-east-1/us-east-1-bundle.pem -o /us-east-1-bundle.pem
  ```

Perintah ini mengunduh bundel sertifikat Amazon RDS dan menyimpannya di jalur absolut `/us-east-1-bundle.pem` di direktori root container Anda. Saat mengonfigurasi koneksi database dalam kode fungsi Anda, Anda harus mereferensikan jalur yang tepat ini. Contoh:

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

`readFileSync`Fungsi ini diperlukan karena klien database Node.js memerlukan konten sertifikat yang sebenarnya dalam memori, bukan hanya jalur ke file sertifikat. Tanpa`readFileSync`, klien menafsirkan string jalur sebagai konten sertifikat, menghasilkan kesalahan “sertifikat yang ditandatangani sendiri dalam rantai sertifikat”.

**Example Konfigurasi koneksi Node.js untuk fungsi OCI**  

```
import { readFileSync } from 'fs';

// ...

let connectionConfig = {
    host: process.env.ProxyHostName,
    user: process.env.DBUserName,
    password: token,
    database: process.env.DBName,
    ssl: {
        ca: readFileSync('/us-east-1-bundle.pem') // Load RDS certificate content from file into memory
    }
};
```

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

**Example Konfigurasi koneksi Python untuk fungsi OCI**  

```
connection = pymysql.connect(
    host=proxy_host_name,
    user=db_username,
    password=token,
    db=db_name,
    port=port,
    ssl={'ca': '/us-east-1-bundle.pem'}  #Path to the certificate in container
)
```

------
#### [ Java ]

Untuk fungsi Java yang menggunakan koneksi JDBC, string koneksi harus mencakup:
+ `useSSL=true`
+ `requireSSL=true`
+ `sslCA`Parameter yang menunjuk ke lokasi sertifikat Amazon RDS dalam gambar kontainer

**Example String koneksi Java untuk fungsi OCI**  

```
// Define connection string
String connectionString = String.format("jdbc:mysql://%s:%s/%s?useSSL=true&requireSSL=true&sslCA=/us-east-1-bundle.pem", // Path to the certificate in container
        System.getenv("ProxyHostName"),
        System.getenv("Port"),
        System.getenv("DBName"));
```

------
#### [ .NET ]

**Example .NET string koneksi untuk koneksi MySQL dalam fungsi OCI**  

```
/// Build the Connection String with the Token 
string connectionString = $"Server={Environment.GetEnvironmentVariable("RDS_ENDPOINT")};" +
                         $"Port={Environment.GetEnvironmentVariable("RDS_PORT")};" +
                         $"Uid={Environment.GetEnvironmentVariable("RDS_USERNAME")};" +
                         $"Pwd={authToken};" +
                         "SslMode=Required;" +
                         "SslCa=/us-east-1-bundle.pem";  // Path to the certificate in container
```

------
#### [ Go ]

Untuk fungsi Go yang menggunakan koneksi MySQL, muat sertifikat Amazon RDS ke dalam kumpulan sertifikat dan daftarkan dengan driver MySQL. String koneksi kemudian harus mereferensikan konfigurasi ini menggunakan `tls` parameter.

**Example Kode Go untuk koneksi MySQL dalam fungsi OCI**  

```
import (
    "crypto/tls"
    "crypto/x509"
    "os"
    "github.com/go-sql-driver/mysql"
)

...

// Create certificate pool and register TLS config
rootCertPool := x509.NewCertPool()
pem, err := os.ReadFile("/us-east-1-bundle.pem")  // Path to the certificate in container
if err != nil {
    panic("failed to read certificate file: " + err.Error())
}
if ok := rootCertPool.AppendCertsFromPEM(pem); !ok {
    panic("failed to append PEM")
}

mysql.RegisterTLSConfig("custom", &tls.Config{
    RootCAs: rootCertPool,
})

dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?allowCleartextPasswords=true&tls=custom",
    dbUser, authenticationToken, dbEndpoint, dbName,
)
```

------
#### [ Ruby ]

**Example Konfigurasi koneksi Ruby untuk fungsi OCI**  

```
conn = Mysql2::Client.new(
    host: endpoint,
    username: user,
    password: token,
    port: port,
    database: db_name,
    sslca: '/us-east-1-bundle.pem',  # Path to the certificate in container
    sslverify: true
)
```

------

## Menghubungkan ke database Amazon RDS dalam fungsi Lambda
<a name="rds-connection"></a>

Contoh kode berikut menunjukkan cara menerapkan fungsi Lambda yang terhubung ke database Amazon RDS. Fungsi membuat permintaan database sederhana dan mengembalikan hasilnya.

**catatan**  
Contoh kode ini hanya berlaku untuk [paket.zip deployment](configuration-function-zip.md). Jika Anda menerapkan fungsi menggunakan [gambar kontainer,](images-create.md) Anda harus menentukan file sertifikat Amazon RDS dalam kode fungsi Anda, seperti yang dijelaskan di bagian [sebelumnya](#oci-certificate).

------
#### [ .NET ]

**SDK untuk .NET**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-connect-rds-iam). 
Menghubungkan ke database Amazon RDS dalam fungsi Lambda menggunakan.NET.  

```
using System.Data;
using System.Text.Json;
using Amazon.Lambda.APIGatewayEvents;
using Amazon.Lambda.Core;
using MySql.Data.MySqlClient;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace aws_rds;

public class InputModel
{
    public string key1 { get; set; }
    public string key2 { get; set; }
}

public class Function
{
    /// <summary>
    // Handles the Lambda function execution for connecting to RDS using IAM authentication.
    /// </summary>
    /// <param name="input">The input event data passed to the Lambda function</param>
    /// <param name="context">The Lambda execution context that provides runtime information</param>
    /// <returns>A response object containing the execution result</returns>

    public async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)
    {
        // Sample Input: {"body": "{\"key1\":\"20\", \"key2\":\"25\"}"}
        var input = JsonSerializer.Deserialize<InputModel>(request.Body);

        /// Obtain authentication token
        var authToken = RDSAuthTokenGenerator.GenerateAuthToken(
            Environment.GetEnvironmentVariable("RDS_ENDPOINT"),
            Convert.ToInt32(Environment.GetEnvironmentVariable("RDS_PORT")),
            Environment.GetEnvironmentVariable("RDS_USERNAME")
        );

        /// Build the Connection String with the Token 
        string connectionString = $"Server={Environment.GetEnvironmentVariable("RDS_ENDPOINT")};" +
                                  $"Port={Environment.GetEnvironmentVariable("RDS_PORT")};" +
                                  $"Uid={Environment.GetEnvironmentVariable("RDS_USERNAME")};" +
                                  $"Pwd={authToken};";


        try
        {
            await using var connection = new MySqlConnection(connectionString);
            await connection.OpenAsync();

            const string sql = "SELECT @param1 + @param2 AS Sum";

            await using var command = new MySqlCommand(sql, connection);
            command.Parameters.AddWithValue("@param1", int.Parse(input.key1 ?? "0"));
            command.Parameters.AddWithValue("@param2", int.Parse(input.key2 ?? "0"));

            await using var reader = await command.ExecuteReaderAsync();
            if (await reader.ReadAsync())
            {
                int result = reader.GetInt32("Sum");

                //Sample Response: {"statusCode":200,"body":"{\"message\":\"The sum is: 45\"}","isBase64Encoded":false}
                return new APIGatewayProxyResponse
                {
                    StatusCode = 200,
                    Body = JsonSerializer.Serialize(new { message = $"The sum is: {result}" })
                };
            }

        }
        catch (Exception ex)
        {
            Console.WriteLine($"Error: {ex.Message}");
        }

        return new APIGatewayProxyResponse
        {
            StatusCode = 500,
            Body = JsonSerializer.Serialize(new { error = "Internal server error" })
        };
    }
}
```

------
#### [ Go ]

**SDK untuk Go V2**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-connect-rds-iam). 
Menghubungkan ke database Amazon RDS dalam fungsi Lambda menggunakan Go.  

```
/*
Golang v2 code here.
*/

package main

import (
	"context"
	"database/sql"
	"encoding/json"
	"fmt"
	"os"

	"github.com/aws/aws-lambda-go/lambda"
	"github.com/aws/aws-sdk-go-v2/config"
	"github.com/aws/aws-sdk-go-v2/feature/rds/auth"
	_ "github.com/go-sql-driver/mysql"
)

type MyEvent struct {
	Name string `json:"name"`
}

func HandleRequest(event *MyEvent) (map[string]interface{}, error) {

	var dbName string = os.Getenv("DatabaseName")
	var dbUser string = os.Getenv("DatabaseUser")
	var dbHost string = os.Getenv("DBHost") // Add hostname without https
	var dbPort int = os.Getenv("Port")      // Add port number
	var dbEndpoint string = fmt.Sprintf("%s:%d", dbHost, dbPort)
	var region string = os.Getenv("AWS_REGION")

	cfg, err := config.LoadDefaultConfig(context.TODO())
	if err != nil {
		panic("configuration error: " + err.Error())
	}

	authenticationToken, err := auth.BuildAuthToken(
		context.TODO(), dbEndpoint, region, dbUser, cfg.Credentials)
	if err != nil {
		panic("failed to create authentication token: " + err.Error())
	}

	dsn := fmt.Sprintf("%s:%s@tcp(%s)/%s?tls=true&allowCleartextPasswords=true",
		dbUser, authenticationToken, dbEndpoint, dbName,
	)

	db, err := sql.Open("mysql", dsn)
	if err != nil {
		panic(err)
	}

	defer db.Close()

	var sum int
	err = db.QueryRow("SELECT ?+? AS sum", 3, 2).Scan(&sum)
	if err != nil {
		panic(err)
	}
	s := fmt.Sprint(sum)
	message := fmt.Sprintf("The selected sum is: %s", s)

	messageBytes, err := json.Marshal(message)
	if err != nil {
		return nil, err
	}

	messageString := string(messageBytes)
	return map[string]interface{}{
		"statusCode": 200,
		"headers":    map[string]string{"Content-Type": "application/json"},
		"body":       messageString,
	}, nil
}

func main() {
	lambda.Start(HandleRequest)
}
```

------
#### [ Java ]

**SDK untuk Java 2.x**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-connect-rds-iam). 
Menghubungkan ke database Amazon RDS dalam fungsi Lambda menggunakan Java.  

```
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyRequestEvent;
import com.amazonaws.services.lambda.runtime.events.APIGatewayProxyResponseEvent;
import software.amazon.awssdk.auth.credentials.DefaultCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.rdsdata.RdsDataClient;
import software.amazon.awssdk.services.rdsdata.model.ExecuteStatementRequest;
import software.amazon.awssdk.services.rdsdata.model.ExecuteStatementResponse;
import software.amazon.awssdk.services.rdsdata.model.Field;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;

public class RdsLambdaHandler implements RequestHandler<APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {

    @Override
    public APIGatewayProxyResponseEvent handleRequest(APIGatewayProxyRequestEvent event, Context context) {
        APIGatewayProxyResponseEvent response = new APIGatewayProxyResponseEvent();

        try {
            // Obtain auth token
            String token = createAuthToken();

            // Define connection configuration
            String connectionString = String.format("jdbc:mysql://%s:%s/%s?useSSL=true&requireSSL=true",
                    System.getenv("ProxyHostName"),
                    System.getenv("Port"),
                    System.getenv("DBName"));

            // Establish a connection to the database
            try (Connection connection = DriverManager.getConnection(connectionString, System.getenv("DBUserName"), token);
                 PreparedStatement statement = connection.prepareStatement("SELECT ? + ? AS sum")) {

                statement.setInt(1, 3);
                statement.setInt(2, 2);

                try (ResultSet resultSet = statement.executeQuery()) {
                    if (resultSet.next()) {
                        int sum = resultSet.getInt("sum");
                        response.setStatusCode(200);
                        response.setBody("The selected sum is: " + sum);
                    }
                }
            }

        } catch (Exception e) {
            response.setStatusCode(500);
            response.setBody("Error: " + e.getMessage());
        }

        return response;
    }

    private String createAuthToken() {
        // Create RDS Data Service client
        RdsDataClient rdsDataClient = RdsDataClient.builder()
                .region(Region.of(System.getenv("AWS_REGION")))
                .credentialsProvider(DefaultCredentialsProvider.create())
                .build();

        // Define authentication request
        ExecuteStatementRequest request = ExecuteStatementRequest.builder()
                .resourceArn(System.getenv("ProxyHostName"))
                .secretArn(System.getenv("DBUserName"))
                .database(System.getenv("DBName"))
                .sql("SELECT 'RDS IAM Authentication'")
                .build();

        // Execute request and obtain authentication token
        ExecuteStatementResponse response = rdsDataClient.executeStatement(request);
        Field tokenField = response.records().get(0).get(0);

        return tokenField.stringValue();
    }
}
```

------
#### [ JavaScript ]

**SDK untuk JavaScript (v3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-connect-rds-iam). 
Menghubungkan ke database Amazon RDS dalam fungsi Lambda menggunakan. JavaScript  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
/* 
Node.js code here.
*/
// ES6+ example
import { Signer } from "@aws-sdk/rds-signer";
import mysql from 'mysql2/promise';

async function createAuthToken() {
  // Define connection authentication parameters
  const dbinfo = {

    hostname: process.env.ProxyHostName,
    port: process.env.Port,
    username: process.env.DBUserName,
    region: process.env.AWS_REGION,

  }

  // Create RDS Signer object
  const signer = new Signer(dbinfo);

  // Request authorization token from RDS, specifying the username
  const token = await signer.getAuthToken();
  return token;
}

async function dbOps() {

  // Obtain auth token
  const token = await createAuthToken();
  // Define connection configuration
  let connectionConfig = {
    host: process.env.ProxyHostName,
    user: process.env.DBUserName,
    password: token,
    database: process.env.DBName,
    ssl: 'Amazon RDS'
  }
  // Create the connection to the DB
  const conn = await mysql.createConnection(connectionConfig);
  // Obtain the result of the query
  const [res,] = await conn.execute('select ?+? as sum', [3, 2]);
  return res;

}

export const handler = async (event) => {
  // Execute database flow
  const result = await dbOps();
  // Return result
  return {
    statusCode: 200,
    body: JSON.stringify("The selected sum is: " + result[0].sum)
  }
};
```
Menghubungkan ke database Amazon RDS dalam fungsi Lambda menggunakan. TypeScript  

```
import { Signer } from "@aws-sdk/rds-signer";
import mysql from 'mysql2/promise';

// RDS settings
// Using '!' (non-null assertion operator) to tell the TypeScript compiler that the DB settings are not null or undefined,
const proxy_host_name = process.env.PROXY_HOST_NAME!
const port = parseInt(process.env.PORT!)
const db_name = process.env.DB_NAME!
const db_user_name = process.env.DB_USER_NAME!
const aws_region = process.env.AWS_REGION!


async function createAuthToken(): Promise<string> {

    // Create RDS Signer object
    const signer = new Signer({
        hostname: proxy_host_name,
        port: port,
        region: aws_region,
        username: db_user_name
    });

    // Request authorization token from RDS, specifying the username
    const token = await signer.getAuthToken();
    return token;
}

async function dbOps(): Promise<mysql.QueryResult | undefined> {
    try {
        // Obtain auth token
        const token = await createAuthToken();
        const conn = await mysql.createConnection({
            host: proxy_host_name,
            user: db_user_name,
            password: token,
            database: db_name,
            ssl: 'Amazon RDS' // Ensure you have the CA bundle for SSL connection
        });
        const [rows, fields] = await conn.execute('SELECT ? + ? AS sum', [3, 2]);
        console.log('result:', rows);
        return rows;
    }
    catch (err) {
        console.log(err);
    }
}

export const lambdaHandler = async (event: any): Promise<{ statusCode: number; body: string }> => {
    // Execute database flow
    const result = await dbOps();

    // Return error is result is undefined
    if (result == undefined)
        return {
            statusCode: 500,
            body: JSON.stringify(`Error with connection to DB host`)
        }

    // Return result
    return {
        statusCode: 200,
        body: JSON.stringify(`The selected sum is: ${result[0].sum}`)
    };
};
```

------
#### [ PHP ]

**SDK untuk PHP**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-connect-rds-iam). 
Menghubungkan ke database Amazon RDS dalam fungsi Lambda menggunakan PHP.  

```
<?php
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0

# using bref/bref and bref/logger for simplicity

use Bref\Context\Context;
use Bref\Event\Handler as StdHandler;
use Bref\Logger\StderrLogger;
use Aws\Rds\AuthTokenGenerator;
use Aws\Credentials\CredentialProvider;

require __DIR__ . '/vendor/autoload.php';

class Handler implements StdHandler
{
    private StderrLogger $logger;
    public function __construct(StderrLogger $logger)
    {
        $this->logger = $logger;
    }


    private function getAuthToken(): string {
        // Define connection authentication parameters
        $dbConnection = [
            'hostname' => getenv('DB_HOSTNAME'),
            'port' => getenv('DB_PORT'),
            'username' => getenv('DB_USERNAME'),
            'region' => getenv('AWS_REGION'),
        ];

        // Create RDS AuthTokenGenerator object
        $generator = new AuthTokenGenerator(CredentialProvider::defaultProvider());

        // Request authorization token from RDS, specifying the username
        return $generator->createToken(
            $dbConnection['hostname'] . ':' . $dbConnection['port'],
            $dbConnection['region'],
            $dbConnection['username']
        );
    }

    private function getQueryResults() {
        // Obtain auth token
        $token = $this->getAuthToken();

        // Define connection configuration
        $connectionConfig = [
            'host' => getenv('DB_HOSTNAME'),
            'user' => getenv('DB_USERNAME'),
            'password' => $token,
            'database' => getenv('DB_NAME'),
        ];

        // Create the connection to the DB
        $conn = new PDO(
            "mysql:host={$connectionConfig['host']};dbname={$connectionConfig['database']}",
            $connectionConfig['user'],
            $connectionConfig['password'],
            [
                PDO::MYSQL_ATTR_SSL_CA => '/path/to/rds-ca-2019-root.pem',
                PDO::MYSQL_ATTR_SSL_VERIFY_SERVER_CERT => true,
            ]
        );

        // Obtain the result of the query
        $stmt = $conn->prepare('SELECT ?+? AS sum');
        $stmt->execute([3, 2]);

        return $stmt->fetch(PDO::FETCH_ASSOC);
    }

    /**
     * @param mixed $event
     * @param Context $context
     * @return array
     */
    public function handle(mixed $event, Context $context): array
    {
        $this->logger->info("Processing query");

        // Execute database flow
        $result = $this->getQueryResults();

        return [
            'sum' => $result['sum']
        ];
    }
}

$logger = new StderrLogger();
return new Handler($logger);
```

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

**SDK untuk Python (Boto3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-connect-rds-iam). 
Menghubungkan ke database Amazon RDS dalam fungsi Lambda menggunakan Python.  

```
import json
import os
import boto3
import pymysql

# RDS settings
proxy_host_name = os.environ['PROXY_HOST_NAME']
port = int(os.environ['PORT'])
db_name = os.environ['DB_NAME']
db_user_name = os.environ['DB_USER_NAME']
aws_region = os.environ['AWS_REGION']


# Fetch RDS Auth Token
def get_auth_token():
    client = boto3.client('rds')
    token = client.generate_db_auth_token(
        DBHostname=proxy_host_name,
        Port=port
        DBUsername=db_user_name
        Region=aws_region
    )
    return token

def lambda_handler(event, context):
    token = get_auth_token()
    try:
        connection = pymysql.connect(
            host=proxy_host_name,
            user=db_user_name,
            password=token,
            db=db_name,
            port=port,
            ssl={'ca': 'Amazon RDS'}  # Ensure you have the CA bundle for SSL connection
        )
        
        with connection.cursor() as cursor:
            cursor.execute('SELECT %s + %s AS sum', (3, 2))
            result = cursor.fetchone()

        return result
        
    except Exception as e:
        return (f"Error: {str(e)}")  # Return an error message if an exception occurs
```

------
#### [ Ruby ]

**SDK untuk Ruby**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-connect-rds-iam). 
Menghubungkan ke database Amazon RDS dalam fungsi Lambda menggunakan Ruby.  

```
# Ruby code here.

require 'aws-sdk-rds'
require 'json'
require 'mysql2'

def lambda_handler(event:, context:)
  endpoint = ENV['DBEndpoint'] # Add the endpoint without https"
  port = ENV['Port']           # 3306
  user = ENV['DBUser']
  region = ENV['DBRegion']     # 'us-east-1'
  db_name = ENV['DBName']

  credentials = Aws::Credentials.new(
    ENV['AWS_ACCESS_KEY_ID'],
    ENV['AWS_SECRET_ACCESS_KEY'],
    ENV['AWS_SESSION_TOKEN']
  )
  rds_client = Aws::RDS::AuthTokenGenerator.new(
    region: region, 
    credentials: credentials
  )

  token = rds_client.auth_token(
    endpoint: endpoint+ ':' + port,
    user_name: user,
    region: region
  )

  begin
    conn = Mysql2::Client.new(
      host: endpoint,
      username: user,
      password: token,
      port: port,
      database: db_name,
      sslca: '/var/task/global-bundle.pem', 
      sslverify: true,
      enable_cleartext_plugin: true
    )
    a = 3
    b = 2
    result = conn.query("SELECT #{a} + #{b} AS sum").first['sum']
    puts result
    conn.close
    {
      statusCode: 200,
      body: result.to_json
    }
  rescue => e
    puts "Database connection failed due to #{e}"
  end
end
```

------
#### [ Rust ]

**SDK for Rust**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-connect-rds-iam). 
Menghubungkan ke database Amazon RDS dalam fungsi Lambda menggunakan Rust.  

```
use aws_config::BehaviorVersion;
use aws_credential_types::provider::ProvideCredentials;
use aws_sigv4::{
    http_request::{sign, SignableBody, SignableRequest, SigningSettings},
    sign::v4,
};
use lambda_runtime::{run, service_fn, Error, LambdaEvent};
use serde_json::{json, Value};
use sqlx::postgres::PgConnectOptions;
use std::env;
use std::time::{Duration, SystemTime};

const RDS_CERTS: &[u8] = include_bytes!("global-bundle.pem");

async fn generate_rds_iam_token(
    db_hostname: &str,
    port: u16,
    db_username: &str,
) -> Result<String, Error> {
    let config = aws_config::load_defaults(BehaviorVersion::v2024_03_28()).await;

    let credentials = config
        .credentials_provider()
        .expect("no credentials provider found")
        .provide_credentials()
        .await
        .expect("unable to load credentials");
    let identity = credentials.into();
    let region = config.region().unwrap().to_string();

    let mut signing_settings = SigningSettings::default();
    signing_settings.expires_in = Some(Duration::from_secs(900));
    signing_settings.signature_location = aws_sigv4::http_request::SignatureLocation::QueryParams;

    let signing_params = v4::SigningParams::builder()
        .identity(&identity)
        .region(&region)
        .name("rds-db")
        .time(SystemTime::now())
        .settings(signing_settings)
        .build()?;

    let url = format!(
        "https://{db_hostname}:{port}/?Action=connect&DBUser={db_user}",
        db_hostname = db_hostname,
        port = port,
        db_user = db_username
    );

    let signable_request =
        SignableRequest::new("GET", &url, std::iter::empty(), SignableBody::Bytes(&[]))
            .expect("signable request");

    let (signing_instructions, _signature) =
        sign(signable_request, &signing_params.into())?.into_parts();

    let mut url = url::Url::parse(&url).unwrap();
    for (name, value) in signing_instructions.params() {
        url.query_pairs_mut().append_pair(name, &value);
    }

    let response = url.to_string().split_off("https://".len());

    Ok(response)
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    run(service_fn(handler)).await
}

async fn handler(_event: LambdaEvent<Value>) -> Result<Value, Error> {
    let db_host = env::var("DB_HOSTNAME").expect("DB_HOSTNAME must be set");
    let db_port = env::var("DB_PORT")
        .expect("DB_PORT must be set")
        .parse::<u16>()
        .expect("PORT must be a valid number");
    let db_name = env::var("DB_NAME").expect("DB_NAME must be set");
    let db_user_name = env::var("DB_USERNAME").expect("DB_USERNAME must be set");

    let token = generate_rds_iam_token(&db_host, db_port, &db_user_name).await?;

    let opts = PgConnectOptions::new()
        .host(&db_host)
        .port(db_port)
        .username(&db_user_name)
        .password(&token)
        .database(&db_name)
        .ssl_root_cert_from_pem(RDS_CERTS.to_vec())
        .ssl_mode(sqlx::postgres::PgSslMode::Require);

    let pool = sqlx::postgres::PgPoolOptions::new()
        .connect_with(opts)
        .await?;

    let result: i32 = sqlx::query_scalar("SELECT $1 + $2")
        .bind(3)
        .bind(2)
        .fetch_one(&pool)
        .await?;

    println!("Result: {:?}", result);

    Ok(json!({
        "statusCode": 200,
        "content-type": "text/plain",
        "body": format!("The selected sum is: {result}")
    }))
}
```

------

## Memproses pemberitahuan acara dari Amazon RDS
<a name="rds-events"></a>

Anda dapat menggunakan Lambda untuk memproses pemberitahuan peristiwa dari database Amazon RDS. Amazon RDS mengirimkan pemberitahuan ke topik Amazon Simple Notification Service (Amazon SNS) yang dapat Anda konfigurasikan untuk memanggil fungsi Lambda. Amazon SNS merangkum pesan dari Amazon RDS dalam dokumen kejadiannya sendiri dan mengirimkannya ke fungsi Anda.

Untuk informasi selengkapnya tentang mengonfigurasi database Amazon RDS untuk mengirim notifikasi, lihat Menggunakan pemberitahuan [peristiwa Amazon RDS.](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/USER_Events.html) 

**Example Pesan Amazon RDS di kejadian Amazon SNS**  

```
{
        "Records": [
          {
            "EventVersion": "1.0",
            "EventSubscriptionArn": "arn:aws:sns:us-east-2:123456789012:rds-lambda:21be56ed-a058-49f5-8c98-aedd2564c486",
            "EventSource": "aws:sns",
            "Sns": {
              "SignatureVersion": "1",
              "Timestamp": "2023-01-02T12:45:07.000Z",
              "Signature": "tcc6faL2yUC6dgZdmrwh1Y4cGa/ebXEkAi6RibDsvpi+tE/1+82j...65r==",
              "SigningCertUrl": "https://sns.us-east-2.amazonaws.com/SimpleNotificationService-ac565b8b1a6c5d002d285f9598aa1d9b.pem",
              "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
              "Message": "{\"Event Source\":\"db-instance\",\"Event Time\":\"2023-01-02 12:45:06.000\",\"Identifier Link\":\"https://console.aws.amazon.com/rds/home?region=eu-west-1#dbinstance:id=dbinstanceid\",\"Source ID\":\"dbinstanceid\",\"Event ID\":\"http://docs.amazonwebservices.com/AmazonRDS/latest/UserGuide/USER_Events.html#RDS-EVENT-0002\",\"Event Message\":\"Finished DB Instance backup\"}",
              "MessageAttributes": {},
              "Type": "Notification",
              "UnsubscribeUrl": "https://sns.us-east-2.amazonaws.com/?Action=Unsubscribe&amp;SubscriptionArn=arn:aws:sns:us-east-2:123456789012:test-lambda:21be56ed-a058-49f5-8c98-aedd2564c486",
              "TopicArn":"arn:aws:sns:us-east-2:123456789012:sns-lambda",
              "Subject": "RDS Notification Message"
            }
          }
        ]
      }
```

## Lengkap Lambda dan Amazon RDS tutorial
<a name="rds-database-samples"></a>
+ [Menggunakan fungsi Lambda untuk mengakses database Amazon RDS](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-lambda-tutorial.html) — Dari Panduan Pengguna Amazon RDS, pelajari cara menggunakan fungsi Lambda untuk menulis data ke database Amazon RDS melalui Proxy Amazon RDS. Fungsi Lambda Anda akan membaca catatan dari antrian Amazon SQS dan menulis item baru ke tabel di database Anda setiap kali pesan ditambahkan.

# Pilih layanan database untuk aplikasi berbasis Lambda
<a name="ddb-rds-database-decision"></a>

Banyak aplikasi tanpa server perlu menyimpan dan mengambil data. AWS menawarkan beberapa opsi database yang bekerja dengan fungsi Lambda. Dua pilihan yang paling populer adalah Amazon DynamoDB, layanan database NoSQL, dan Amazon RDS, solusi database relasional tradisional. Bagian berikut menjelaskan perbedaan utama antara layanan ini saat menggunakannya dengan Lambda dan membantu Anda memilih layanan database yang tepat untuk aplikasi tanpa server Anda.

Untuk mempelajari lebih lanjut tentang layanan database lain yang ditawarkan oleh AWS, dan untuk memahami kasus penggunaan dan pengorbanannya secara lebih umum, lihat [Memilih](https://docs.aws.amazon.com/decision-guides/latest/databases-on-aws-how-to-choose/databases-on-aws-how-to-choose.html) layanan basis data. AWS Semua layanan AWS database kompatibel dengan Lambda, tetapi tidak semuanya cocok untuk kasus penggunaan khusus Anda.

## Apa pilihan Anda saat memilih layanan database dengan Lambda?
<a name="w2aad101d101c19b9"></a>

AWS menawarkan beberapa layanan database. Untuk aplikasi tanpa server, dua pilihan paling populer adalah DynamoDB dan Amazon RDS.
+ **DynamoDB** adalah layanan database NoSQL yang dikelola sepenuhnya yang dioptimalkan untuk aplikasi tanpa server. Ini memberikan penskalaan yang mulus dan kinerja milidetik satu digit yang konsisten pada skala apa pun.
+ **Amazon RDS** adalah layanan database relasional terkelola yang mendukung beberapa mesin database termasuk MySQL dan PostgreSQL. Ini memberikan kemampuan SQL yang akrab dengan infrastruktur terkelola.

## Rekomendasi jika Anda sudah mengetahui kebutuhan Anda
<a name="w2aad101d101c19c11"></a>

Jika Anda sudah jelas tentang kebutuhan Anda, berikut adalah rekomendasi dasar kami:

Kami merekomendasikan [DynamoDB](with-ddb.md) untuk aplikasi tanpa server yang membutuhkan kinerja latensi rendah yang konsisten, penskalaan otomatis, dan tidak memerlukan gabungan atau transaksi yang rumit. Ini sangat cocok untuk aplikasi berbasis Lambda karena sifatnya yang tanpa server.

[Amazon RDS](services-rds.md) adalah pilihan yang lebih baik ketika Anda membutuhkan kueri SQL yang kompleks, bergabung, atau memiliki aplikasi yang ada menggunakan database relasional. Namun, ketahuilah bahwa menghubungkan fungsi Lambda ke Amazon RDS memerlukan konfigurasi tambahan dan dapat memengaruhi waktu mulai yang dingin.

## Apa yang harus dipertimbangkan ketika memilih layanan database
<a name="w2aad101d101c19c13"></a>

Saat memilih antara DynamoDB dan Amazon RDS untuk aplikasi Lambda Anda, pertimbangkan faktor-faktor berikut:
+ Manajemen koneksi dan start dingin
+ Pola akses data
+ Kompleksitas kueri
+ Persyaratan konsistensi data
+ Karakteristik penskalaan
+ Model biaya

Dengan memahami faktor-faktor ini, Anda dapat memilih opsi yang paling sesuai dengan kebutuhan kasus penggunaan khusus Anda.

### Manajemen koneksi dan start dingin
<a name="w2aad101d101c19c13b9b1"></a>
+ DynamoDB menggunakan API HTTP untuk semua operasi. Fungsi Lambda dapat membuat permintaan langsung tanpa mempertahankan koneksi, menghasilkan kinerja start dingin yang lebih baik. Setiap permintaan diautentikasi menggunakan AWS kredensil tanpa overhead koneksi.
+ Amazon RDS memerlukan pengelolaan kumpulan koneksi karena menggunakan koneksi database tradisional. Ini dapat memengaruhi awal dingin karena instance Lambda baru perlu membuat koneksi. Anda harus menerapkan strategi penyatuan koneksi dan berpotensi menggunakan [Amazon RDS Proxy](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-proxy.html) untuk mengelola koneksi secara efektif. Perhatikan bahwa menggunakan Amazon RDS Proxy menimbulkan biaya tambahan.

### Pola akses data
<a name="w2aad101d101c19c13b9b3"></a>
+ DynamoDB bekerja paling baik dengan pola akses yang dikenal dan desain meja tunggal. Ini ideal untuk aplikasi Lambda yang membutuhkan akses latensi rendah yang konsisten ke data berdasarkan kunci primer atau indeks sekunder.
+ Amazon RDS memberikan fleksibilitas untuk kueri kompleks dan mengubah pola akses. Ini lebih cocok ketika fungsi Lambda Anda perlu melakukan kueri yang unik dan disesuaikan atau gabungan kompleks di beberapa tabel.

### Kompleksitas kueri
<a name="w2aad101d101c19c13b9b5"></a>
+ DynamoDB unggul dalam operasi sederhana berbasis kunci dan pola akses yang telah ditentukan sebelumnya. Kueri kompleks harus dirancang di sekitar struktur indeks, dan gabungan harus ditangani dalam kode aplikasi.
+ Amazon RDS mendukung kueri SQL yang kompleks dengan gabungan, subkueri, dan agregasi. Ini dapat menyederhanakan kode fungsi Lambda Anda ketika operasi data yang kompleks diperlukan.

### Persyaratan konsistensi data
<a name="w2aad101d101c19c13b9b7"></a>
+ DynamoDB menawarkan opsi konsistensi akhir dan kuat, dengan konsistensi yang kuat tersedia untuk pembacaan item tunggal. Transaksi didukung tetapi dengan beberapa batasan.
+ Amazon RDS memberikan kepatuhan atomisitas, konsistensi, isolasi, dan daya tahan (ACID) penuh dan dukungan transaksi yang kompleks. Jika fungsi Lambda Anda memerlukan transaksi yang kompleks atau konsistensi yang kuat di beberapa catatan, Amazon RDS mungkin lebih cocok.

### Karakteristik penskalaan
<a name="w2aad101d101c19c13b9b9"></a>
+ DynamoDB menskalakan secara otomatis dengan beban kerja Anda. Ini dapat menangani lonjakan lalu lintas tiba-tiba dari fungsi Lambda tanpa pra-penyediaan. Anda dapat menggunakan mode kapasitas sesuai permintaan untuk membayar hanya untuk apa yang Anda gunakan, sangat cocok dengan model penskalaan Lambda.
+ Amazon RDS memiliki kapasitas tetap berdasarkan ukuran instans yang Anda pilih. Jika beberapa fungsi Lambda mencoba terhubung secara bersamaan, Anda dapat melebihi kuota koneksi Anda. Anda perlu mengelola kumpulan koneksi dengan hati-hati dan berpotensi menerapkan logika coba lagi.

### Model biaya
<a name="w2aad101d101c19c13b9c11"></a>
+ Harga DynamoDB selaras dengan aplikasi tanpa server. Dengan kapasitas sesuai permintaan, Anda hanya membayar untuk membaca dan menulis aktual yang dilakukan oleh fungsi Lambda Anda. Tidak ada biaya untuk waktu idle.
+ Amazon RDS mengenakan biaya untuk instans yang sedang berjalan terlepas dari penggunaannya. Ini bisa menjadi kurang hemat biaya untuk beban kerja sporadis yang dapat menjadi tipikal dalam aplikasi tanpa server. Namun, mungkin lebih ekonomis untuk beban kerja throughput tinggi dengan penggunaan yang konsisten.

## Memulai dengan layanan database pilihan Anda
<a name="w2aad101d101c19c15"></a>

Sekarang setelah Anda membaca tentang kriteria untuk memilih antara DynamoDB dan Amazon RDS dan perbedaan utama di antara keduanya, Anda dapat memilih opsi yang paling sesuai dengan kebutuhan Anda dan menggunakan sumber daya berikut untuk mulai menggunakannya.

------
#### [ DynamoDB ]

**Memulai DynamoDB dengan sumber daya berikut**
+ Untuk pengenalan layanan DynamoDB, baca [Apa](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) itu DynamoDB? di Panduan Pengembang *Amazon DynamoDB*.
+ Ikuti tutorial [Menggunakan Lambda dengan API Gateway](services-apigateway-tutorial.md) untuk melihat contoh penggunaan fungsi Lambda untuk melakukan operasi CRUD pada tabel DynamoDB sebagai respons terhadap permintaan API.
+ Baca [Pemrograman dengan DynamoDB dan AWS SDKs](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.html) di Panduan *Pengembang Amazon DynamoDB untuk mempelajari lebih lanjut tentang cara mengakses DynamoDB* dari dalam fungsi Lambda Anda dengan menggunakan salah satu file. AWS SDKs

------
#### [ Amazon RDS ]

**Memulai Amazon RDS dengan sumber daya berikut**
+ Untuk pengenalan layanan Amazon RDS, baca [Apa itu Amazon Relational Database Service (Amazon](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Welcome.html) RDS)? dalam *Panduan Pengguna Layanan Amazon Relational Database Service*.
+ Ikuti tutorial [Menggunakan fungsi Lambda untuk mengakses database Amazon RDS di Panduan Pengguna Layanan *Amazon Relational* Database](https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/rds-lambda-tutorial.html) Service.
+ Pelajari lebih lanjut tentang menggunakan Lambda dengan Amazon RDS dengan membaca. [Menggunakan AWS Lambda dengan Amazon RDS](services-rds.md)

------

# Memproses pemberitahuan acara Amazon S3 dengan Lambda
<a name="with-s3"></a>

Anda dapat menggunakan Lambda untuk memproses [pemberitahuan kejadian](https://docs.aws.amazon.com/AmazonS3/latest/userguide/NotificationHowTo.html) dari Amazon Simple Storage Service. Amazon S3 dapat mengirimkan kejadian ke fungsi Lambda saat objek dibuat atau dihapus. Anda mengonfigurasi pengaturan pemberitahuan di bucket, dan memberikan izin kepada Amazon S3 untuk memanggil fungsi di kebijakan izin berbasis sumber daya milik fungsi.

**Awas**  
Jika fungsi Lambda Anda menggunakan bucket yang sama dengan bucket yang memicunya, hal ini dapat menyebabkan fungsi berjalan secara berulang-ulang. Misalnya, jika bucket memicu fungsi setiap kali suatu objek diunggah, dan fungsi mengunggah sebuah objek ke bucket, fungsi tersebut secara tidak langsung akan memicu dirinya sendiri. Untuk menghindari hal ini, gunakan dua bucket, atau konfigurasikan pemicu agar hanya diterapkan ke awalan yang digunakan untuk objek masuk.

Amazon S3 memanggil fungsi Anda [secara asinkron](invocation-async.md) dengan kejadian yang berisi detail tentang objek. Contoh berikut menunjukkan kejadian yang dikirimkan Amazon S3 saat paket deployment diunggah ke Amazon S3.

**Example Kejadian pemberitahuan Amazon S3**  

```
{
  "Records": [
    {
      "eventVersion": "2.1",
      "eventSource": "aws:s3",
      "awsRegion": "us-east-2",
      "eventTime": "2019-09-03T19:37:27.192Z",
      "eventName": "ObjectCreated:Put",
      "userIdentity": {
        "principalId": "AWS:AIDAINPONIXQXHT3IKHL2"
      },
      "requestParameters": {
        "sourceIPAddress": "205.255.255.255"
      },
      "responseElements": {
        "x-amz-request-id": "D82B88E5F771F645",
        "x-amz-id-2": "vlR7PnpV2Ce81l0PRw6jlUpck7Jo5ZsQjryTjKlc5aLWGVHPZLj5NeC6qMa0emYBDXOo6QBU0Wo="
      },
      "s3": {
        "s3SchemaVersion": "1.0",
        "configurationId": "828aa6fc-f7b5-4305-8584-487c791949c1",
        "bucket": {
          "name": "amzn-s3-demo-bucket",
          "ownerIdentity": {
            "principalId": "A3I5XTEXAMAI3E"
          },
          "arn": "arn:aws:s3:::lambda-artifacts-deafc19498e3f2df"
        },
        "object": {
          "key": "b21b84d653bb07b05b1e6b33684dc11b",
          "size": 1305107,
          "eTag": "b21b84d653bb07b05b1e6b33684dc11b",
          "sequencer": "0C0F6F405D6ED209E1"
        }
      }
    }
  ]
}
```

Untuk memanggil fungsi Anda, Amazon S3 memerlukan izin dari [kebijakan berbasis sumber daya](access-control-resource-based.md) milik fungsi. Saat Anda mengonfigurasi pemicu Amazon S3 di konsol Lambda, konsol memodifikasi kebijakan berbasis sumber daya untuk mengizinkan Amazon S3 memanggil fungsi jika nama bucket dan ID akun cocok. Jika Anda mengonfigurasi pemberitahuan di Amazon S3, Anda menggunakan API Lambda untuk memperbarui kebijakan. Anda juga dapat menggunakan API Lambda untuk memberikan izin kepada akun lain, atau membatasi izin pada alias yang ditunjuk.

[Jika fungsi Anda menggunakan AWS SDK untuk mengelola sumber daya Amazon S3, fungsi tersebut juga memerlukan izin Amazon S3 dalam peran pelaksanaannya.](lambda-intro-execution-role.md) 

**Topics**
+ [

# Tutorial: Menggunakan pemicu Amazon S3 untuk memanggil fungsi Lambda
](with-s3-example.md)
+ [

# Tutorial: Menggunakan pemicu Amazon S3 untuk membuat gambar thumbnail
](with-s3-tutorial.md)

# Tutorial: Menggunakan pemicu Amazon S3 untuk memanggil fungsi Lambda
<a name="with-s3-example"></a>

Dalam tutorial ini, Anda menggunakan konsol untuk membuat fungsi Lambda dan mengonfigurasi pemicu untuk bucket Amazon Simple Storage Service (Amazon S3). Setiap kali Anda menambahkan objek ke bucket Amazon S3, fungsi Anda berjalan dan mengeluarkan jenis objek ke Amazon Logs. CloudWatch 

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-example/s3_tut_config.png)


Tutorial ini menunjukkan bagaimana untuk:

1. Buat bucket Amazon S3.

1. Buat fungsi Lambda yang mengembalikan jenis objek objek dalam bucket Amazon S3.

1. Konfigurasikan pemicu Lambda yang memanggil fungsi Anda saat objek diunggah ke bucket Anda.

1. Uji fungsi Anda, pertama dengan acara dummy, dan kemudian gunakan pelatuknya.

Dengan menyelesaikan langkah-langkah ini, Anda akan mempelajari cara mengonfigurasi fungsi Lambda agar berjalan setiap kali objek ditambahkan atau dihapus dari bucket Amazon S3. Anda dapat menyelesaikan tutorial ini hanya dengan menggunakan Konsol Manajemen AWS.

## Buat bucket Amazon S3.
<a name="with-s3-example-create-bucket"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps1.png)


**Untuk membuat bucket Amazon S3**

1. Buka [konsol Amazon S3](https://console.aws.amazon.com/s3) dan pilih halaman **Bucket tujuan umum**.

1. Pilih yang Wilayah AWS paling dekat dengan lokasi geografis Anda. Anda dapat mengubah wilayah Anda menggunakan daftar drop-down di bagian atas layar. Kemudian dalam tutorial, Anda harus membuat fungsi Lambda Anda di Wilayah yang sama.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/console_region_select.png)

1. Pilih **Buat bucket**.

1. Pada **Konfigurasi umum**, lakukan hal berikut:

   1. Untuk **jenis Bucket**, pastikan **Tujuan umum** dipilih.

   1. Untuk **nama Bucket**, masukkan nama unik global yang memenuhi aturan [penamaan Amazon S3 Bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html). Nama bucket hanya dapat berisi huruf kecil, angka, titik (.), dan tanda hubung (-).

1. Biarkan semua opsi lain disetel ke nilai defaultnya dan pilih **Buat bucket**.

## Unggah objek uji ke bucket Anda
<a name="with-s3-example-upload-test-object"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps2.png)


**Untuk mengunggah objek uji**

1. Buka halaman [Bucket di](https://console.aws.amazon.com/s3/buckets) konsol Amazon S3 dan pilih bucket yang Anda buat selama langkah sebelumnya.

1. Pilih **Unggah**.

1. Pilih **Tambahkan file** dan pilih objek yang ingin Anda unggah. Anda dapat memilih file apa saja (misalnya,`HappyFace.jpg`).

1. Pilih **Buka**, lalu pilih **Unggah**.

Kemudian dalam tutorial, Anda akan menguji fungsi Lambda Anda menggunakan objek ini.

## Membuat kebijakan izin
<a name="with-s3-example-create-policy"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps3.png)


Buat kebijakan izin yang memungkinkan Lambda mendapatkan objek dari bucket Amazon S3 dan menulis ke Amazon Log. CloudWatch 

**Untuk membuat kebijakan**

1. Buka [halaman Kebijakan](https://console.aws.amazon.com/iam/home#/policies) konsol IAM.

1. Pilih **Buat Kebijakan**.

1. Pilih tab **JSON**, lalu tempelkan kebijakan khusus berikut ke editor JSON.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "logs:PutLogEvents",
                   "logs:CreateLogGroup",
                   "logs:CreateLogStream"
               ],
               "Resource": "arn:aws:logs:*:*:*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject"
               ],
               "Resource": "arn:aws:s3:::*/*"
           }
       ]
   }
   ```

------

1. Pilih **Berikutnya: Tanda**.

1. Pilih **Berikutnya: Tinjau**.

1. Di bawah **Kebijakan peninjauan**, untuk **Nama** kebijakan, masukkan**s3-trigger-tutorial**.

1. Pilih **Buat kebijakan**.

## Membuat peran eksekusi
<a name="with-s3-example-create-role"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps4.png)


Peran [eksekusi adalah peran](lambda-intro-execution-role.md) AWS Identity and Access Management (IAM) yang memberikan izin fungsi Lambda untuk mengakses dan sumber daya. Layanan AWS Pada langkah ini, buat peran eksekusi menggunakan kebijakan izin yang Anda buat di langkah sebelumnya.

**Untuk membuat peran eksekusi dan melampirkan kebijakan izin kustom**

1. Buka [halaman Peran](https://console.aws.amazon.com/iam/home#/roles) dari konsol IAM.

1. Pilih **Buat peran**.

1. Untuk jenis entitas tepercaya, pilih **AWS layanan**, lalu untuk kasus penggunaan, pilih **Lambda**.

1. Pilih **Berikutnya**.

1. Dalam kotak pencarian kebijakan, masukkan **s3-trigger-tutorial**.

1. Di hasil penelusuran, pilih kebijakan yang Anda buat (`s3-trigger-tutorial`), lalu pilih **Berikutnya**.

1. Di bawah **Rincian peran**, untuk **nama Peran**, masukkan**lambda-s3-trigger-role**, lalu pilih **Buat peran**.

## Buat fungsi Lambda
<a name="with-s3-example-create-function"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps5.png)


Buat fungsi Lambda di konsol menggunakan runtime Python 3.14.

**Untuk membuat fungsi Lambda**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pastikan Anda bekerja di tempat yang sama dengan saat Wilayah AWS Anda membuat bucket Amazon S3. Anda dapat mengubah Wilayah Anda menggunakan daftar drop-down di bagian atas layar.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/console_region_select.png)

1. Pilih **Buat fungsi**.

1. Pilih **Penulis dari awal**

1. Di bagian **Informasi dasar**, lakukan hal berikut:

   1. Untuk **nama Fungsi**, masukkan `s3-trigger-tutorial`

   1. Untuk **Runtime**, pilih **Python 3.14**.

   1. Untuk **Arsitektur**, pilih **x86\$164**.

1. Di tab **Ubah peran eksekusi default**, lakukan hal berikut:

   1. Perluas tab, lalu pilih **Gunakan peran yang ada**.

   1. Pilih yang `lambda-s3-trigger-role` Anda buat sebelumnya.

1. Pilih **Buat fungsi**.

## Menyebarkan kode fungsi
<a name="with-s3-example-deploy-code"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps6.png)


Tutorial ini menggunakan runtime Python 3.14, tetapi kami juga menyediakan contoh file kode untuk runtime lainnya. Anda dapat memilih tab di kotak berikut untuk melihat kode runtime yang Anda minati.

Fungsi Lambda mengambil nama kunci objek yang diunggah dan nama bucket dari `event` parameter yang diterimanya dari Amazon S3. Fungsi kemudian menggunakan metode [get\$1object](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/s3/client/get_object.html) dari AWS SDK untuk Python (Boto3) untuk mengambil metadata objek, termasuk tipe konten (tipe MIME) dari objek yang diunggah.

**Untuk menyebarkan kode fungsi**

1. Pilih tab **Python** di kotak berikut dan salin kodenya.

------
#### [ .NET ]

**SDK untuk .NET**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda). 
Menggunakan peristiwa S3 dengan Lambda menggunakan.NET.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   ﻿using System.Threading.Tasks;
   using Amazon.Lambda.Core;
   using Amazon.S3;
   using System;
   using Amazon.Lambda.S3Events;
   using System.Web;
   
   // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
   [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
   
   namespace S3Integration
   {
       public class Function
       {
           private static AmazonS3Client _s3Client;
           public Function() : this(null)
           {
           }
   
           internal Function(AmazonS3Client s3Client)
           {
               _s3Client = s3Client ?? new AmazonS3Client();
           }
   
           public async Task<string> Handler(S3Event evt, ILambdaContext context)
           {
               try
               {
                   if (evt.Records.Count <= 0)
                   {
                       context.Logger.LogLine("Empty S3 Event received");
                       return string.Empty;
                   }
   
                   var bucket = evt.Records[0].S3.Bucket.Name;
                   var key = HttpUtility.UrlDecode(evt.Records[0].S3.Object.Key);
   
                   context.Logger.LogLine($"Request is for {bucket} and {key}");
   
                   var objectResult = await _s3Client.GetObjectAsync(bucket, key);
   
                   context.Logger.LogLine($"Returning {objectResult.Key}");
   
                   return objectResult.Key;
               }
               catch (Exception e)
               {
                   context.Logger.LogLine($"Error processing request - {e.Message}");
   
                   return string.Empty;
               }
           }
       }
   }
   ```

------
#### [ Go ]

**SDK untuk Go V2**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda). 
Menggunakan peristiwa S3 dengan Lambda menggunakan Go.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   package main
   
   import (
   	"context"
   	"log"
   
   	"github.com/aws/aws-lambda-go/events"
   	"github.com/aws/aws-lambda-go/lambda"
   	"github.com/aws/aws-sdk-go-v2/config"
   	"github.com/aws/aws-sdk-go-v2/service/s3"
   )
   
   func handler(ctx context.Context, s3Event events.S3Event) error {
   	sdkConfig, err := config.LoadDefaultConfig(ctx)
   	if err != nil {
   		log.Printf("failed to load default config: %s", err)
   		return err
   	}
   	s3Client := s3.NewFromConfig(sdkConfig)
   
   	for _, record := range s3Event.Records {
   		bucket := record.S3.Bucket.Name
   		key := record.S3.Object.URLDecodedKey
   		headOutput, err := s3Client.HeadObject(ctx, &s3.HeadObjectInput{
   			Bucket: &bucket,
   			Key:    &key,
   		})
   		if err != nil {
   			log.Printf("error getting head of object %s/%s: %s", bucket, key, err)
   			return err
   		}
   		log.Printf("successfully retrieved %s/%s of type %s", bucket, key, *headOutput.ContentType)
   	}
   
   	return nil
   }
   
   func main() {
   	lambda.Start(handler)
   }
   ```

------
#### [ Java ]

**SDK untuk Java 2.x**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda). 
Menggunakan peristiwa S3 dengan Lambda menggunakan Java.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   package example;
   
   import software.amazon.awssdk.services.s3.model.HeadObjectRequest;
   import software.amazon.awssdk.services.s3.model.HeadObjectResponse;
   import software.amazon.awssdk.services.s3.S3Client;
   
   import com.amazonaws.services.lambda.runtime.Context;
   import com.amazonaws.services.lambda.runtime.RequestHandler;
   import com.amazonaws.services.lambda.runtime.events.S3Event;
   import com.amazonaws.services.lambda.runtime.events.models.s3.S3EventNotification.S3EventNotificationRecord;
   
   import org.slf4j.Logger;
   import org.slf4j.LoggerFactory;
   
   public class Handler implements RequestHandler<S3Event, String> {
       private static final Logger logger = LoggerFactory.getLogger(Handler.class);
       @Override
       public String handleRequest(S3Event s3event, Context context) {
           try {
             S3EventNotificationRecord record = s3event.getRecords().get(0);
             String srcBucket = record.getS3().getBucket().getName();
             String srcKey = record.getS3().getObject().getUrlDecodedKey();
   
             S3Client s3Client = S3Client.builder().build();
             HeadObjectResponse headObject = getHeadObject(s3Client, srcBucket, srcKey);
   
             logger.info("Successfully retrieved " + srcBucket + "/" + srcKey + " of type " + headObject.contentType());
   
             return "Ok";
           } catch (Exception e) {
             throw new RuntimeException(e);
           }
       }
   
       private HeadObjectResponse getHeadObject(S3Client s3Client, String bucket, String key) {
           HeadObjectRequest headObjectRequest = HeadObjectRequest.builder()
                   .bucket(bucket)
                   .key(key)
                   .build();
           return s3Client.headObject(headObjectRequest);
       }
   }
   ```

------
#### [ JavaScript ]

**SDK untuk JavaScript (v3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda). 
Mengkonsumsi acara S3 dengan menggunakan JavaScript Lambda.  

   ```
   import { S3Client, HeadObjectCommand } from "@aws-sdk/client-s3";
   
   const client = new S3Client();
   
   export const handler = async (event, context) => {
   
       // Get the object from the event and show its content type
       const bucket = event.Records[0].s3.bucket.name;
       const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
   
       try {
           const { ContentType } = await client.send(new HeadObjectCommand({
               Bucket: bucket,
               Key: key,
           }));
   
           console.log('CONTENT TYPE:', ContentType);
           return ContentType;
   
       } catch (err) {
           console.log(err);
           const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`;
           console.log(message);
           throw new Error(message);
       }
   };
   ```
Mengkonsumsi acara S3 dengan menggunakan TypeScript Lambda.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   import { S3Event } from 'aws-lambda';
   import { S3Client, HeadObjectCommand } from '@aws-sdk/client-s3';
   
   const s3 = new S3Client({ region: process.env.AWS_REGION });
   
   export const handler = async (event: S3Event): Promise<string | undefined> => {
     // Get the object from the event and show its content type
     const bucket = event.Records[0].s3.bucket.name;
     const key = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, ' '));
     const params = {
       Bucket: bucket,
       Key: key,
     };
     try {
       const { ContentType } = await s3.send(new HeadObjectCommand(params));
       console.log('CONTENT TYPE:', ContentType);
       return ContentType;
     } catch (err) {
       console.log(err);
       const message = `Error getting object ${key} from bucket ${bucket}. Make sure they exist and your bucket is in the same region as this function.`;
       console.log(message);
       throw new Error(message);
     }
   };
   ```

------
#### [ PHP ]

**SDK untuk PHP**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda). 
Mengkonsumsi acara S3 dengan Lambda menggunakan PHP.  

   ```
   <?php
   
   use Bref\Context\Context;
   use Bref\Event\S3\S3Event;
   use Bref\Event\S3\S3Handler;
   use Bref\Logger\StderrLogger;
   
   require __DIR__ . '/vendor/autoload.php';
   
   
   class Handler extends S3Handler 
   {
       private StderrLogger $logger;
       public function __construct(StderrLogger $logger)
       {
           $this->logger = $logger;
       }
       
       public function handleS3(S3Event $event, Context $context) : void
       {
           $this->logger->info("Processing S3 records");
   
           // Get the object from the event and show its content type
           $records = $event->getRecords();
           
           foreach ($records as $record) 
           {
               $bucket = $record->getBucket()->getName();
               $key = urldecode($record->getObject()->getKey());
   
               try {
                   $fileSize = urldecode($record->getObject()->getSize());
                   echo "File Size: " . $fileSize . "\n";
                   // TODO: Implement your custom processing logic here
               } catch (Exception $e) {
                   echo $e->getMessage() . "\n";
                   echo 'Error getting object ' . $key . ' from bucket ' . $bucket . '. Make sure they exist and your bucket is in the same region as this function.' . "\n";
                   throw $e;
               }
           }
       }
   }
   
   $logger = new StderrLogger();
   return new Handler($logger);
   ```

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

**SDK untuk Python (Boto3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda). 
Menggunakan peristiwa S3 dengan Lambda menggunakan Python.  

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   import json
   import urllib.parse
   import boto3
   
   print('Loading function')
   
   s3 = boto3.client('s3')
   
   
   def lambda_handler(event, context):
       #print("Received event: " + json.dumps(event, indent=2))
   
       # Get the object from the event and show its content type
       bucket = event['Records'][0]['s3']['bucket']['name']
       key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
       try:
           response = s3.get_object(Bucket=bucket, Key=key)
           print("CONTENT TYPE: " + response['ContentType'])
           return response['ContentType']
       except Exception as e:
           print(e)
           print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
           raise e
   ```

------
#### [ Ruby ]

**SDK untuk Ruby**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda). 
Mengkonsumsi acara S3 dengan Lambda menggunakan Ruby.  

   ```
   require 'json'
   require 'uri'
   require 'aws-sdk'
   
   puts 'Loading function'
   
   def lambda_handler(event:, context:)
     s3 = Aws::S3::Client.new(region: 'region') # Your AWS region
     # puts "Received event: #{JSON.dump(event)}"
   
     # Get the object from the event and show its content type
     bucket = event['Records'][0]['s3']['bucket']['name']
     key = URI.decode_www_form_component(event['Records'][0]['s3']['object']['key'], Encoding::UTF_8)
     begin
       response = s3.get_object(bucket: bucket, key: key)
       puts "CONTENT TYPE: #{response.content_type}"
       return response.content_type
     rescue StandardError => e
       puts e.message
       puts "Error getting object #{key} from bucket #{bucket}. Make sure they exist and your bucket is in the same region as this function."
       raise e
     end
   end
   ```

------
#### [ Rust ]

**SDK for Rust**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-s3-to-lambda). 
Menggunakan peristiwa S3 dengan Lambda menggunakan Rust.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   use aws_lambda_events::event::s3::S3Event;
   use aws_sdk_s3::{Client};
   use lambda_runtime::{run, service_fn, Error, LambdaEvent};
   
   
   /// Main function
   #[tokio::main]
   async fn main() -> Result<(), Error> {
       tracing_subscriber::fmt()
           .with_max_level(tracing::Level::INFO)
           .with_target(false)
           .without_time()
           .init();
   
       // Initialize the AWS SDK for Rust
       let config = aws_config::load_from_env().await;
       let s3_client = Client::new(&config);
   
       let res = run(service_fn(|request: LambdaEvent<S3Event>| {
           function_handler(&s3_client, request)
       })).await;
   
       res
   }
   
   async fn function_handler(
       s3_client: &Client,
       evt: LambdaEvent<S3Event>
   ) -> Result<(), Error> {
       tracing::info!(records = ?evt.payload.records.len(), "Received request from SQS");
   
       if evt.payload.records.len() == 0 {
           tracing::info!("Empty S3 event received");
       }
   
       let bucket = evt.payload.records[0].s3.bucket.name.as_ref().expect("Bucket name to exist");
       let key = evt.payload.records[0].s3.object.key.as_ref().expect("Object key to exist");
   
       tracing::info!("Request is for {} and object {}", bucket, key);
   
       let s3_get_object_result = s3_client
           .get_object()
           .bucket(bucket)
           .key(key)
           .send()
           .await;
   
       match s3_get_object_result {
           Ok(_) => tracing::info!("S3 Get Object success, the s3GetObjectResult contains a 'body' property of type ByteStream"),
           Err(_) => tracing::info!("Failure with S3 Get Object request")
       }
   
       Ok(())
   }
   ```

------

1. Di panel **Sumber kode** di konsol Lambda, tempelkan kode ke editor kode, ganti kode yang dibuat Lambda.

1. Di bagian **DEPLOY**, pilih **Deploy** untuk memperbarui kode fungsi Anda:  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

## Buat pemicu Amazon S3
<a name="with-s3-example-create-trigger"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps7.png)


**Untuk membuat pemicu Amazon S3**

1. Di panel **Ikhtisar fungsi**, pilih **Tambah pemicu**.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/overview-trigger.png)

1. Pilih **S3**.

1. Di bawah **Bucket**, pilih bucket yang Anda buat sebelumnya di tutorial.

1. Di bawah **Jenis acara**, pastikan bahwa **Semua peristiwa pembuatan objek** dipilih.

1. Di bawah **Pemanggilan rekursif**, pilih kotak centang untuk mengetahui bahwa tidak disarankan menggunakan bucket Amazon S3 yang sama untuk input dan output.

1. Pilih **Tambahkan**.

**catatan**  
[Saat Anda membuat pemicu Amazon S3 untuk fungsi Lambda menggunakan konsol Lambda, Amazon S3 mengonfigurasi pemberitahuan peristiwa di bucket yang Anda tentukan.](https://docs.aws.amazon.com/AmazonS3/latest/userguide/EventNotifications.html) Sebelum mengonfigurasi pemberitahuan peristiwa ini, Amazon S3 melakukan serangkaian pemeriksaan untuk mengonfirmasi bahwa tujuan acara ada dan memiliki kebijakan IAM yang diperlukan. Amazon S3 juga melakukan pengujian ini pada notifikasi acara lain yang dikonfigurasi untuk bucket itu.  
Karena pemeriksaan ini, jika bucket sebelumnya telah mengonfigurasi tujuan peristiwa untuk sumber daya yang tidak ada lagi, atau untuk sumber daya yang tidak memiliki kebijakan izin yang diperlukan, Amazon S3 tidak akan dapat membuat notifikasi peristiwa baru. Anda akan melihat pesan galat berikut yang menunjukkan bahwa pemicu Anda tidak dapat dibuat:  

```
An error occurred when creating the trigger: Unable to validate the following destination configurations.
```
Anda dapat melihat kesalahan ini jika sebelumnya mengonfigurasi pemicu untuk fungsi Lambda lain menggunakan bucket yang sama, dan sejak itu Anda telah menghapus fungsi tersebut atau memodifikasi kebijakan izinnya.

## Uji fungsi Lambda Anda dengan acara dummy
<a name="with-s3-example-test-dummy-event"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps8.png)


**Untuk menguji fungsi Lambda dengan acara dummy**

1. Di halaman konsol Lambda untuk fungsi Anda, pilih tab **Uji**.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/test-tab.png)

1. Untuk **Nama peristiwa**, masukkan `MyTestEvent`.

1. Di **Event JSON**, tempel peristiwa pengujian berikut. Pastikan untuk mengganti nilai-nilai ini:
   + Ganti `us-east-1` dengan wilayah tempat Anda membuat bucket Amazon S3.
   + Ganti kedua instance `amzn-s3-demo-bucket` dengan nama bucket Amazon S3 Anda sendiri.
   + Ganti `test%2FKey` dengan nama objek pengujian yang Anda unggah ke bucket sebelumnya (misalnya,`HappyFace.jpg`).

   ```
   {
     "Records": [
       {
         "eventVersion": "2.0",
         "eventSource": "aws:s3",
         "awsRegion": "us-east-1",
         "eventTime": "1970-01-01T00:00:00.000Z",
         "eventName": "ObjectCreated:Put",
         "userIdentity": {
           "principalId": "EXAMPLE"
         },
         "requestParameters": {
           "sourceIPAddress": "127.0.0.1"
         },
         "responseElements": {
           "x-amz-request-id": "EXAMPLE123456789",
           "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
         },
         "s3": {
           "s3SchemaVersion": "1.0",
           "configurationId": "testConfigRule",
           "bucket": {
             "name": "amzn-s3-demo-bucket",
             "ownerIdentity": {
               "principalId": "EXAMPLE"
             },
             "arn": "arn:aws:s3:::amzn-s3-demo-bucket"
           },
           "object": {
             "key": "test%2Fkey",
             "size": 1024,
             "eTag": "0123456789abcdef0123456789abcdef",
             "sequencer": "0A1B2C3D4E5F678901"
           }
         }
       }
     ]
   }
   ```

1. Pilih **Simpan**.

1. Pilih **Uji**.

1. Jika fungsi Anda berjalan dengan sukses, Anda akan melihat output yang mirip dengan yang berikut ini di tab **Hasil eksekusi**.

   ```
   Response
   "image/jpeg"
   
   Function Logs
   START RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6 Version: $LATEST
   2021-02-18T21:40:59.280Z    12b3cae7-5f4e-415e-93e6-416b8f8b66e6    INFO    INPUT BUCKET AND KEY:  { Bucket: 'amzn-s3-demo-bucket', Key: 'HappyFace.jpg' }
   2021-02-18T21:41:00.215Z    12b3cae7-5f4e-415e-93e6-416b8f8b66e6    INFO    CONTENT TYPE: image/jpeg
   END RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6
   REPORT RequestId: 12b3cae7-5f4e-415e-93e6-416b8f8b66e6    Duration: 976.25 ms    Billed Duration: 977 ms    Memory Size: 128 MB    Max Memory Used: 90 MB    Init Duration: 430.47 ms        
   
   Request ID
   12b3cae7-5f4e-415e-93e6-416b8f8b66e6
   ```

### Uji fungsi Lambda dengan pemicu Amazon S3
<a name="with-s3-example-test-s3-trigger"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-example/s3trigger_tut_steps9.png)


Untuk menguji fungsi Anda dengan pemicu yang dikonfigurasi, unggah objek ke bucket Amazon S3 menggunakan konsol. Untuk memverifikasi bahwa fungsi Lambda Anda berjalan seperti yang diharapkan, gunakan CloudWatch Log untuk melihat output fungsi Anda.

**Untuk mengunggah objek ke bucket Amazon S3 Anda**

1. Buka halaman [Bucket di](https://console.aws.amazon.com/s3/buckets) konsol Amazon S3 dan pilih bucket yang Anda buat sebelumnya.

1. Pilih **Unggah**.

1. Pilih **Tambahkan file** dan gunakan pemilih file untuk memilih objek yang ingin Anda unggah. Objek ini dapat berupa file apa pun yang Anda pilih.

1. Pilih **Buka**, lalu pilih **Unggah**.

**Untuk memverifikasi pemanggilan fungsi menggunakan Log CloudWatch**

1. Buka konsol [CloudWatch](https://console.aws.amazon.com/cloudwatch/home).

1. Pastikan Anda bekerja sama dengan saat Wilayah AWS Anda membuat fungsi Lambda Anda. Anda dapat mengubah Wilayah Anda menggunakan daftar drop-down di bagian atas layar.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/console_region_select.png)

1. Pilih **Log**, lalu pilih **Grup log**.

1. Pilih grup log untuk fungsi Anda (`/aws/lambda/s3-trigger-tutorial`).

1. Di bawah **Aliran log**, pilih aliran log terbaru.

1. Jika fungsi Anda dipanggil dengan benar sebagai respons terhadap pemicu Amazon S3 Anda, Anda akan melihat output yang mirip dengan berikut ini. Yang `CONTENT TYPE` Anda lihat tergantung pada jenis file yang Anda unggah ke bucket Anda.

   ```
   2022-05-09T23:17:28.702Z	0cae7f5a-b0af-4c73-8563-a3430333cc10	INFO	CONTENT TYPE: image/jpeg
   ```

## Bersihkan sumber daya Anda
<a name="cleanup"></a>

Sekarang Anda dapat menghapus sumber daya yang Anda buat untuk tutorial ini, kecuali Anda ingin mempertahankannya. Dengan menghapus AWS sumber daya yang tidak lagi Anda gunakan, Anda mencegah tagihan yang tidak perlu ke Anda Akun AWS.

**Untuk menghapus fungsi Lambda**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi yang Anda buat.

1. Pilih **Tindakan**, **Hapus**.

1. Ketik **confirm** kolom input teks dan pilih **Hapus**.

**Untuk menghapus peran eksekusi**

1. Buka [halaman Peran](https://console.aws.amazon.com/iam/home#/roles) dari konsol IAM.

1. Pilih peran eksekusi yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan nama peran di bidang input teks dan pilih **Hapus**.

**Untuk menghapus bucket S3**

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

1. Pilih bucket yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan nama ember di bidang input teks.

1. Pilih **Hapus bucket**.

## Langkah selanjutnya
<a name="next-steps"></a>

Di[Tutorial: Menggunakan pemicu Amazon S3 untuk membuat gambar thumbnail](with-s3-tutorial.md), pemicu Amazon S3 memanggil fungsi yang membuat gambar thumbnail untuk setiap file gambar yang diunggah ke bucket. Tutorial ini membutuhkan pengetahuan domain Lambda AWS dan tingkat moderat. Ini menunjukkan cara membuat sumber daya menggunakan AWS Command Line Interface (AWS CLI) dan cara membuat paket penyebaran arsip file.zip untuk fungsi dan dependensinya.

# Tutorial: Menggunakan pemicu Amazon S3 untuk membuat gambar thumbnail
<a name="with-s3-tutorial"></a>

Dalam tutorial ini, Anda membuat dan mengonfigurasi fungsi Lambda yang mengubah ukuran gambar yang ditambahkan ke bucket Amazon Simple Storage Service (Amazon S3). Saat Anda menambahkan file gambar ke bucket, Amazon S3 akan memanggil fungsi Lambda Anda. Fungsi tersebut kemudian membuat versi thumbnail gambar dan mengeluarkannya ke bucket Amazon S3 yang berbeda.

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_resources.png)


Untuk menyelesaikan tutorial ini, Anda melakukan langkah-langkah berikut:

1. Buat bucket Amazon S3 sumber dan tujuan dan unggah gambar sampel.

1. Buat fungsi Lambda yang mengubah ukuran gambar dan mengeluarkan thumbnail ke bucket Amazon S3.

1. Konfigurasikan pemicu Lambda yang memanggil fungsi Anda saat objek diunggah ke bucket sumber Anda.

1. Uji fungsi Anda, pertama dengan acara dummy, lalu dengan mengunggah gambar ke bucket sumber Anda.

Dengan menyelesaikan langkah-langkah ini, Anda akan mempelajari cara menggunakan Lambda untuk menjalankan tugas pemrosesan file pada objek yang ditambahkan ke bucket Amazon S3. Anda dapat menyelesaikan tutorial ini menggunakan AWS Command Line Interface (AWS CLI) atau Konsol Manajemen AWS.

Jika Anda mencari contoh sederhana untuk mempelajari cara mengonfigurasi pemicu Amazon S3 untuk Lambda, Anda dapat mencoba [Tutorial: Menggunakan pemicu Amazon S3 untuk](https://docs.aws.amazon.com/lambda/latest/dg/with-s3-example.html) menjalankan fungsi Lambda.

**Topics**
+ [

## Prasyarat
](#with-s3-example-prereqs)
+ [

## Buat dua ember Amazon S3
](#with-s3-tutorial-prepare-create-buckets)
+ [

## Unggah gambar uji ke bucket sumber Anda
](#with-s3-tutorial-test-image)
+ [

## Membuat kebijakan izin
](#with-s3-tutorial-create-policy)
+ [

## Membuat peran eksekusi
](#with-s3-tutorial-create-execution-role)
+ [

## Buat paket penerapan fungsi
](#with-s3-tutorial-create-function-package)
+ [

## Buat fungsi Lambda
](#with-s3-tutorial-create-function-createfunction)
+ [

## Konfigurasikan Amazon S3 untuk menjalankan fungsi
](#with-s3-tutorial-configure-s3-trigger)
+ [

## Uji fungsi Lambda Anda dengan acara dummy
](#with-s3-tutorial-dummy-test)
+ [

## Uji fungsi Anda menggunakan pemicu Amazon S3
](#with-s3-tutorial-test-s3)
+ [

## Bersihkan sumber daya Anda
](#s3-tutorial-cleanup)

## Prasyarat
<a name="with-s3-example-prereqs"></a>

Jika Anda ingin menggunakan AWS CLI untuk menyelesaikan tutorial, instal [versi terbaru dari AWS Command Line Interface]().

Untuk kode fungsi Lambda Anda, Anda dapat menggunakan Python atau Node.js. Instal alat dukungan bahasa dan manajer paket untuk bahasa yang ingin Anda gunakan. 

### Instal AWS Command Line Interface
<a name="install_aws_cli"></a>

Jika Anda belum menginstal AWS Command Line Interface, ikuti langkah-langkah di [Menginstal atau memperbarui versi terbaru AWS CLI untuk menginstalnya](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

Tutorial ini membutuhkan terminal baris perintah atau shell untuk menjalankan perintah. Di Linux dan macOS, gunakan shell dan manajer paket pilihan Anda.

**catatan**  
Di Windows, beberapa perintah Bash CLI yang biasa Anda gunakan dengan Lambda (`zip`seperti) tidak didukung oleh terminal bawaan sistem operasi. Untuk mendapatkan versi terintegrasi Windows dari Ubuntu dan Bash, [instal Windows Subsystem untuk](https://docs.microsoft.com/en-us/windows/wsl/install-win10) Linux. 

## Buat dua ember Amazon S3
<a name="with-s3-tutorial-prepare-create-buckets"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps1.png)


Pertama buat dua ember Amazon S3. Bucket pertama adalah bucket sumber tempat Anda akan mengunggah gambar Anda. Bucket kedua digunakan oleh Lambda untuk menyimpan thumbnail yang diubah ukurannya saat Anda menjalankan fungsi.

------
#### [ Konsol Manajemen AWS ]

**Untuk membuat bucket Amazon S3 (konsol)**

1. Buka [konsol Amazon S3](https://console.aws.amazon.com/s3) dan pilih halaman **Bucket tujuan umum**.

1. Pilih yang Wilayah AWS paling dekat dengan lokasi geografis Anda. Anda dapat mengubah wilayah Anda menggunakan daftar drop-down di bagian atas layar. Kemudian dalam tutorial, Anda harus membuat fungsi Lambda Anda di Wilayah yang sama.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/console_region_select.png)

1. Pilih **Buat bucket**.

1. Pada **Konfigurasi umum**, lakukan hal berikut:

   1. Untuk **jenis Bucket**, pastikan **Tujuan umum** dipilih.

   1. Untuk **nama Bucket**, masukkan nama unik global yang memenuhi aturan [penamaan Amazon S3 Bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html). Nama bucket hanya dapat berisi huruf kecil, angka, titik (.), dan tanda hubung (-).

1. Biarkan semua opsi lain disetel ke nilai defaultnya dan pilih **Buat bucket**.

1. Ulangi langkah 1 hingga 5 untuk membuat bucket tujuan Anda. Untuk **nama Bucket**`amzn-s3-demo-source-bucket-resized`, masukkan, di `amzn-s3-demo-source-bucket` mana nama bucket sumber yang baru saja Anda buat.

------
#### [ AWS CLI ]

**Untuk membuat bucket Amazon S3 ()AWS CLI**

1. Jalankan perintah CLI berikut untuk membuat bucket sumber Anda. Nama yang Anda pilih untuk bucket Anda harus unik secara global dan ikuti aturan [penamaan Amazon S3 Bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html). Nama hanya dapat berisi huruf kecil, angka, titik (.), dan tanda hubung (-). Untuk `region` dan`LocationConstraint`, pilih yang paling [Wilayah AWS](https://docs.aws.amazon.com/general/latest/gr/lambda-service.html)dekat dengan lokasi geografis Anda.

   ```
   aws s3api create-bucket --bucket amzn-s3-demo-source-bucket --region us-east-1 \
   --create-bucket-configuration LocationConstraint=us-east-1
   ```

   Kemudian dalam tutorial, Anda harus membuat fungsi Lambda Anda Wilayah AWS sama dengan bucket sumber Anda, jadi catat wilayah yang Anda pilih.

1. Jalankan perintah berikut untuk membuat bucket tujuan Anda. Untuk nama bucket, Anda harus menggunakan`amzn-s3-demo-source-bucket-resized`, di `amzn-s3-demo-source-bucket` mana nama bucket sumber yang Anda buat di langkah 1. Untuk `region` dan`LocationConstraint`, pilih yang sama dengan yang Wilayah AWS Anda gunakan untuk membuat bucket sumber Anda.

   ```
   aws s3api create-bucket --bucket amzn-s3-demo-source-bucket-resized --region us-east-1 \
   --create-bucket-configuration LocationConstraint=us-east-1
   ```

------

## Unggah gambar uji ke bucket sumber Anda
<a name="with-s3-tutorial-test-image"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps2.png)


Kemudian dalam tutorial, Anda akan menguji fungsi Lambda Anda dengan memanggilnya menggunakan atau konsol Lambda. AWS CLI Untuk mengonfirmasi bahwa fungsi Anda beroperasi dengan benar, bucket sumber Anda harus berisi gambar uji. Gambar ini dapat berupa file JPG atau PNG yang Anda pilih.

------
#### [ Konsol Manajemen AWS ]

**Untuk mengunggah gambar uji ke bucket sumber Anda (konsol)**

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

1. Pilih bucket sumber yang Anda buat di langkah sebelumnya.

1. Pilih **Unggah**.

1. Pilih **Tambahkan file** dan gunakan pemilih file untuk memilih objek yang ingin Anda unggah.

1. Pilih **Buka**, lalu pilih **Unggah**.

------
#### [ AWS CLI ]

**Untuk mengunggah gambar uji ke bucket sumber Anda (AWS CLI)**
+ Dari direktori yang berisi gambar yang ingin Anda unggah, jalankan perintah CLI berikut. Ganti `--bucket` parameter dengan nama bucket sumber Anda. Untuk `--body` parameter `--key` dan, gunakan nama file gambar pengujian Anda.

  ```
  aws s3api put-object --bucket amzn-s3-demo-source-bucket --key HappyFace.jpg --body ./HappyFace.jpg
  ```

------

## Membuat kebijakan izin
<a name="with-s3-tutorial-create-policy"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps3.png)


Langkah pertama dalam membuat fungsi Lambda Anda adalah membuat kebijakan izin. Kebijakan ini memberi fungsi Anda izin yang diperlukan untuk mengakses AWS sumber daya lain. Untuk tutorial ini, kebijakan memberikan izin baca dan tulis Lambda untuk bucket Amazon S3 dan memungkinkannya untuk menulis ke Amazon Log. CloudWatch 

------
#### [ Konsol Manajemen AWS ]

**Untuk membuat kebijakan (konsol)**

1. Buka halaman [Kebijakan](https://console.aws.amazon.com/iamv2/home#policies) konsol AWS Identity and Access Management (IAM).

1. Pilih **Buat kebijakan**.

1. Pilih tab **JSON**, lalu tempelkan kebijakan khusus berikut ke editor JSON.  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "logs:PutLogEvents",
                   "logs:CreateLogGroup",
                   "logs:CreateLogStream"
               ],
               "Resource": "arn:aws:logs:*:*:*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject"
               ],
               "Resource": "arn:aws:s3:::*/*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject"
               ],
               "Resource": "arn:aws:s3:::*/*"
           }
       ]
   }
   ```

1. Pilih **Berikutnya**.

1. Di bawah **Detail kebijakan**, untuk **nama Kebijakan**, masukkan`LambdaS3Policy`.

1. Pilih **Buat kebijakan**.

------
#### [ AWS CLI ]

**Untuk membuat kebijakan (AWS CLI)**

1. Simpan JSON berikut dalam file bernama`policy.json`.  
****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "logs:PutLogEvents",
                   "logs:CreateLogGroup",
                   "logs:CreateLogStream"
               ],
               "Resource": "arn:aws:logs:*:*:*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:GetObject"
               ],
               "Resource": "arn:aws:s3:::*/*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject"
               ],
               "Resource": "arn:aws:s3:::*/*"
           }
       ]
   }
   ```

1. Dari direktori tempat Anda menyimpan dokumen kebijakan JSON, jalankan perintah CLI berikut.

   ```
   aws iam create-policy --policy-name LambdaS3Policy --policy-document file://policy.json
   ```

------

## Membuat peran eksekusi
<a name="with-s3-tutorial-create-execution-role"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps4.png)


Peran eksekusi adalah peran IAM yang memberikan izin fungsi Lambda untuk mengakses dan sumber daya. Layanan AWS Untuk memberikan akses baca dan tulis fungsi ke bucket Amazon S3, Anda melampirkan kebijakan izin yang Anda buat di langkah sebelumnya.

------
#### [ Konsol Manajemen AWS ]

**Untuk membuat peran eksekusi dan melampirkan kebijakan izin Anda (konsol)**

1. Buka halaman [Peran](https://console.aws.amazon.com/iamv2/home#roles) konsol (IAM).

1. Pilih **Buat peran**.

1. Untuk **jenis entitas Tepercaya**, pilih **Layanan AWS**, dan untuk **kasus Penggunaan**, pilih **Lambda**.

1. Pilih **Berikutnya**.

1. Tambahkan kebijakan izin yang Anda buat di langkah sebelumnya dengan melakukan hal berikut:

   1. Dalam kotak pencarian kebijakan, masukkan `LambdaS3Policy`.

   1. Dalam hasil pencarian, pilih kotak centang untuk`LambdaS3Policy`.

   1. Pilih **Berikutnya**.

1. Di bawah **Rincian peran**, untuk **nama Peran** masuk`LambdaS3Role`.

1. Pilih **Buat peran**.

------
#### [ AWS CLI ]

**Untuk membuat peran eksekusi dan melampirkan kebijakan izin Anda ()AWS CLI**

1. Simpan JSON berikut dalam file bernama`trust-policy.json`. Kebijakan kepercayaan ini memungkinkan Lambda untuk menggunakan izin peran dengan memberikan `lambda.amazonaws.com` izin utama layanan untuk memanggil tindakan AWS Security Token Service ()AWS STS. `AssumeRole`  
****  

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

1. Dari direktori tempat Anda menyimpan dokumen kebijakan kepercayaan JSON, jalankan perintah CLI berikut untuk membuat peran eksekusi.

   ```
   aws iam create-role --role-name LambdaS3Role --assume-role-policy-document file://trust-policy.json
   ```

1. Untuk melampirkan kebijakan izin yang Anda buat pada langkah sebelumnya, jalankan perintah CLI berikut. Ganti Akun AWS nomor di ARN polis dengan nomor akun Anda sendiri.

   ```
   aws iam attach-role-policy --role-name LambdaS3Role --policy-arn arn:aws:iam::123456789012:policy/LambdaS3Policy
   ```

------

## Buat paket penerapan fungsi
<a name="with-s3-tutorial-create-function-package"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps5.png)


Untuk membuat fungsi Anda, Anda membuat *paket deployment* yang berisi kode fungsi dan dependensinya. Untuk `CreateThumbnail` fungsi ini, kode fungsi Anda menggunakan pustaka terpisah untuk mengubah ukuran gambar. Ikuti instruksi untuk bahasa yang Anda pilih untuk membuat paket penyebaran yang berisi pustaka yang diperlukan.

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

**Untuk membuat paket penyebaran (Node.js)**

1. Buat direktori bernama `lambda-s3` untuk kode fungsi dan dependensi Anda dan navigasikan ke dalamnya.

   ```
   mkdir lambda-s3
   cd lambda-s3
   ```

1. Buat proyek Node.js baru dengan`npm`. Untuk menerima opsi default yang disediakan dalam pengalaman interaktif, tekan`Enter`.

   ```
   npm init
   ```

1. Simpan kode fungsi berikut dalam file bernama`index.mjs`. Pastikan untuk mengganti `us-east-1` dengan Wilayah AWS di mana Anda membuat ember sumber dan tujuan Anda sendiri.

   ```
   // dependencies
   import { S3Client, GetObjectCommand, PutObjectCommand } from '@aws-sdk/client-s3';
   
   import { Readable } from 'stream';
   
   import sharp from 'sharp';
   import util from 'util';
   
   
   // create S3 client
   const s3 = new S3Client({region: 'us-east-1'});
   
   // define the handler function
   export const handler = async (event, context) => {
   
   // Read options from the event parameter and get the source bucket
   console.log("Reading options from event:\n", util.inspect(event, {depth: 5}));
     const srcBucket = event.Records[0].s3.bucket.name;
     
   // Object key may have spaces or unicode non-ASCII characters
   const srcKey    = decodeURIComponent(event.Records[0].s3.object.key.replace(/\+/g, " "));
   const dstBucket = srcBucket + "-resized";
   const dstKey    = "resized-" + srcKey;
   
   // Infer the image type from the file suffix
   const typeMatch = srcKey.match(/\.([^.]*)$/);
   if (!typeMatch) {
     console.log("Could not determine the image type.");
     return;
   }
   
   // Check that the image type is supported
   const imageType = typeMatch[1].toLowerCase();
   if (imageType != "jpg" && imageType != "png") {
     console.log(`Unsupported image type: ${imageType}`);
     return;
   }
   
   // Get the image from the source bucket. GetObjectCommand returns a stream.
   try {
     const params = {
       Bucket: srcBucket,
       Key: srcKey
     };
     var response = await s3.send(new GetObjectCommand(params));
     var stream = response.Body;
     
   // Convert stream to buffer to pass to sharp resize function.
     if (stream instanceof Readable) {
       var content_buffer = Buffer.concat(await stream.toArray());
       
     } else {
       throw new Error('Unknown object stream type');
     }
   
   
   } catch (error) {
     console.log(error);
     return;
   }
   
     
   // set thumbnail width. Resize will set the height automatically to maintain aspect ratio.
   const width  = 200;
   
   // Use the sharp module to resize the image and save in a buffer.
   try {    
     var output_buffer = await sharp(content_buffer).resize(width).toBuffer();
   
   } catch (error) {
     console.log(error);
     return;
   }
   
   // Upload the thumbnail image to the destination bucket
   try {
     const destparams = {
       Bucket: dstBucket,
       Key: dstKey,
       Body: output_buffer,
       ContentType: "image"
     };
   
     const putResult = await s3.send(new PutObjectCommand(destparams));
   
     } catch (error) {
       console.log(error);
       return;
     }
   
     console.log('Successfully resized ' + srcBucket + '/' + srcKey +
       ' and uploaded to ' + dstBucket + '/' + dstKey);
     };
   ```

1. Di `lambda-s3` direktori Anda, instal perpustakaan tajam menggunakan npm. Perhatikan bahwa versi terbaru dari sharp (0.33) tidak kompatibel dengan Lambda. Instal versi 0.32.6 untuk menyelesaikan tutorial ini.

   ```
   npm install sharp@0.32.6
   ```

   `install`Perintah npm membuat `node_modules` direktori untuk modul Anda. Setelah langkah ini, struktur direktori Anda akan terlihat seperti berikut.

   ```
   lambda-s3
   |- index.mjs
   |- node_modules
   |  |- base64js
   |  |- bl
   |  |- buffer
   ...
   |- package-lock.json
   |- package.json
   ```

1. Buat paket deployment .zip yang berisi kode fungsi Anda dan dependensinya. Di macOS dan Linux, jalankan perintah berikut.

   ```
   zip -r function.zip .
   ```

   Di Windows, gunakan utilitas zip pilihan Anda untuk membuat file.zip. Pastikan bahwa `package-lock.json` file `index.mjs``package.json`, dan `node_modules` direktori Anda semuanya berada di root file.zip Anda.

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

**Untuk membuat paket penyebaran (Python)**

1. Simpan kode contoh sebagai file bernama `lambda_function.py`.

   ```
   import boto3
   import os
   import sys
   import uuid
   from urllib.parse import unquote_plus
   from PIL import Image
   import PIL.Image
               
   s3_client = boto3.client('s3')
               
   def resize_image(image_path, resized_path):
     with Image.open(image_path) as image:
       image.thumbnail(tuple(x / 2 for x in image.size))
       image.save(resized_path)
               
   def lambda_handler(event, context):
     for record in event['Records']:
       bucket = record['s3']['bucket']['name']
       key = unquote_plus(record['s3']['object']['key'])
       tmpkey = key.replace('/', '')
       download_path = '/tmp/{}{}'.format(uuid.uuid4(), tmpkey)
       upload_path = '/tmp/resized-{}'.format(tmpkey)
       s3_client.download_file(bucket, key, download_path)
       resize_image(download_path, upload_path)
       s3_client.upload_file(upload_path, '{}-resized'.format(bucket), 'resized-{}'.format(key))
   ```

1. Di direktori yang sama di mana Anda membuat `lambda_function.py` file Anda, buat direktori baru bernama `package` dan instal pustaka [Pillow (PIL)](https://pypi.org/project/Pillow/) dan AWS SDK untuk Python (Boto3). Meskipun runtime Lambda Python menyertakan versi Boto3 SDK, kami menyarankan agar Anda menambahkan semua dependensi fungsi Anda ke paket penerapan Anda, meskipun mereka disertakan dalam runtime. Untuk informasi selengkapnya, lihat [Dependensi runtime](https://docs.aws.amazon.com/lambda/latest/dg/python-package.html#python-package-dependencies) dengan Python.

   ```
   mkdir package
   pip install \
   --platform manylinux2014_x86_64 \
   --target=package \
   --implementation cp \
   --python-version 3.12 \
   --only-binary=:all: --upgrade \
   pillow boto3
   ```

   Pustaka Pillow berisi kode C/C \$1\$1. Dengan menggunakan `--only-binary=:all:` opsi `--platform manylinux_2014_x86_64` dan, pip akan mengunduh dan menginstal versi Pillow yang berisi binari pra-kompilasi yang kompatibel dengan sistem operasi Amazon Linux 2. Ini memastikan bahwa paket penerapan Anda akan berfungsi di lingkungan eksekusi Lambda, terlepas dari sistem operasi dan arsitektur mesin build lokal Anda.

1. Buat file.zip yang berisi kode aplikasi Anda dan pustaka Pillow dan Boto3. Di Linux atau macOS, jalankan perintah berikut dari antarmuka baris perintah Anda.

   ```
   cd package
   zip -r ../lambda_function.zip .
   cd ..
   zip lambda_function.zip lambda_function.py
   ```

    Di Windows, gunakan alat zip pilihan Anda untuk membuat file `lambda_function.zip`. Pastikan bahwa `lambda_function.py` file Anda dan folder yang berisi dependensi Anda semuanya berada di root file.zip.

Anda juga dapat membuat paket deployment menggunakan lingkungan virtual Python. Lihat [Bekerja dengan arsip file.zip untuk fungsi Python Lambda](python-package.md)

------

## Buat fungsi Lambda
<a name="with-s3-tutorial-create-function-createfunction"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps6.png)


Anda dapat membuat fungsi Lambda menggunakan konsol Lambda AWS CLI atau Lambda. Ikuti instruksi untuk bahasa yang Anda pilih untuk membuat fungsi.

------
#### [ Konsol Manajemen AWS ]

**Untuk membuat fungsi (konsol)**

Untuk membuat fungsi Lambda menggunakan konsol, pertama-tama Anda membuat fungsi dasar yang berisi beberapa kode 'Hello world'. Anda kemudian mengganti kode ini dengan kode fungsi Anda sendiri dengan mengunggah file the.zip atau JAR yang Anda buat pada langkah sebelumnya.

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pastikan Anda bekerja di tempat yang sama dengan saat Wilayah AWS Anda membuat bucket Amazon S3. Anda dapat mengubah wilayah Anda menggunakan daftar drop-down di bagian atas layar.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/console_region_select.png)

1. Pilih **Buat fungsi**.

1. Pilih **Penulis dari scratch**.

1. Di bagian **Informasi dasar**, lakukan hal berikut:

   1. Untuk **Nama fungsi**, masukkan `CreateThumbnail`.

   1. Untuk **Runtime**, pilih **Node.js 22.x** atau **Python 3.12** sesuai dengan bahasa yang Anda pilih untuk fungsi Anda.

   1. Untuk **Arsitektur**, pilih **x86\$164**.

1. Di tab **Ubah peran eksekusi default**, lakukan hal berikut:

   1. Perluas tab, lalu pilih **Gunakan peran yang ada**.

   1. Pilih yang `LambdaS3Role` Anda buat sebelumnya.

1. Pilih **Buat fungsi**.

**Untuk mengunggah kode fungsi (konsol)**

1. Di panel **Sumber kode**, pilih **Unggah dari**.

1. Pilih **file.zip**. 

1. Pilih **Unggah**.

1. **Di pemilih file, pilih file.zip Anda dan pilih Buka.**

1. Pilih **Simpan**.

------
#### [ AWS CLI ]

**Untuk membuat fungsi (AWS CLI)**
+ Jalankan perintah CLI untuk bahasa yang Anda pilih. Untuk `role` parameter, pastikan untuk mengganti `123456789012` dengan Akun AWS ID Anda sendiri. Untuk `region` parameternya, ganti `us-east-1` dengan wilayah tempat Anda membuat bucket Amazon S3.
  + Untuk **Node.js**, jalankan perintah berikut dari direktori yang berisi `function.zip` file Anda.

    ```
    aws lambda create-function --function-name CreateThumbnail \
    --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
    --timeout 10 --memory-size 1024 \
    --role arn:aws:iam::123456789012:role/LambdaS3Role --region us-east-1
    ```
  + Untuk **Python**, jalankan perintah berikut dari direktori yang berisi file Anda`lambda_function.zip`.

    ```
    aws lambda create-function --function-name CreateThumbnail \
    --zip-file fileb://lambda_function.zip --handler lambda_function.lambda_handler \
    --runtime python3.14 --timeout 10 --memory-size 1024 \
    --role arn:aws:iam::123456789012:role/LambdaS3Role --region us-east-1
    ```

------

## Konfigurasikan Amazon S3 untuk menjalankan fungsi
<a name="with-s3-tutorial-configure-s3-trigger"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps7.png)


Agar fungsi Lambda dapat berjalan saat mengunggah gambar ke bucket sumber, Anda perlu mengonfigurasi pemicu untuk fungsi Anda. Anda dapat mengonfigurasi pemicu Amazon S3 menggunakan konsol atau. AWS CLI

**penting**  
Prosedur ini mengonfigurasi bucket Amazon S3 untuk menjalankan fungsi Anda setiap kali objek dibuat di bucket. Pastikan untuk mengonfigurasi ini hanya di bucket sumber. Jika fungsi Lambda Anda membuat objek dalam bucket yang sama yang memanggilnya, fungsi Anda dapat [dipanggil terus menerus](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/recursive-runaway) dalam satu loop. Hal ini dapat mengakibatkan biaya yang tidak diharapkan ditagih ke Anda Akun AWS.

------
#### [ Konsol Manajemen AWS ]

**Untuk mengonfigurasi pemicu Amazon S3 (konsol)**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) konsol Lambda dan pilih fungsi Anda ()`CreateThumbnail`.

1. Pilih **Tambahkan pemicu**.

1. Pilih **S3**.

1. Di bawah **Bucket**, pilih bucket sumber Anda.

1. Di bawah **Jenis acara**, pilih **Semua objek membuat acara**.

1. Di bawah **Pemanggilan rekursif**, pilih kotak centang untuk mengetahui bahwa tidak disarankan menggunakan bucket Amazon S3 yang sama untuk input dan output. Anda dapat mempelajari lebih lanjut tentang pola pemanggilan rekursif di Lambda dengan membaca [pola rekursif yang menyebabkan fungsi Lambda yang tidak terkendali](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/recursive-runaway) di Tanah Tanpa Server.

1. Pilih **Tambahkan**.

   Saat Anda membuat pemicu menggunakan konsol Lambda, Lambda secara otomatis membuat [kebijakan berbasis sumber daya](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html) untuk memberikan layanan yang Anda pilih izin untuk menjalankan fungsi Anda. 

------
#### [ AWS CLI ]

**Untuk mengonfigurasi pemicu Amazon S3 ()AWS CLI**

1. [Agar bucket sumber Amazon S3 menjalankan fungsi saat menambahkan file gambar, pertama-tama Anda harus mengonfigurasi izin untuk fungsi menggunakan kebijakan berbasis sumber daya.](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html) Pernyataan kebijakan berbasis sumber daya memberikan Layanan AWS izin lain untuk menjalankan fungsi Anda. Untuk memberikan izin Amazon S3 untuk menjalankan fungsi Anda, jalankan perintah CLI berikut. Pastikan untuk mengganti `source-account` parameter dengan Akun AWS ID Anda sendiri dan menggunakan nama bucket sumber Anda sendiri.

   ```
   aws lambda add-permission --function-name CreateThumbnail \
   --principal s3.amazonaws.com --statement-id s3invoke --action "lambda:InvokeFunction" \
   --source-arn arn:aws:s3:::amzn-s3-demo-source-bucket \
   --source-account 123456789012
   ```

   Kebijakan yang Anda tetapkan dengan perintah ini memungkinkan Amazon S3 untuk menjalankan fungsi Anda hanya ketika tindakan dilakukan di bucket sumber Anda.
**catatan**  
Meskipun nama bucket Amazon S3 unik secara global, saat menggunakan kebijakan berbasis sumber daya, praktik terbaik adalah menentukan bahwa bucket harus menjadi milik akun Anda. Ini karena jika Anda menghapus bucket, Anda dapat membuat bucket dengan Amazon Resource Name (ARN) yang sama. Akun AWS 

1. Simpan JSON berikut dalam file bernama`notification.json`. Saat diterapkan ke bucket sumber Anda, JSON ini mengonfigurasi bucket untuk mengirim notifikasi ke fungsi Lambda Anda setiap kali objek baru ditambahkan. Ganti Akun AWS nomor dan Wilayah AWS dalam fungsi Lambda ARN dengan nomor akun dan wilayah Anda sendiri.

   ```
   {
   "LambdaFunctionConfigurations": [
       {
         "Id": "CreateThumbnailEventConfiguration",
         "LambdaFunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:CreateThumbnail",
         "Events": [ "s3:ObjectCreated:Put" ]
       }
     ]
   }
   ```

1. Jalankan perintah CLI berikut untuk menerapkan pengaturan notifikasi dalam file JSON yang Anda buat ke bucket sumber Anda. Ganti `amzn-s3-demo-source-bucket` dengan nama bucket sumber Anda sendiri.

   ```
   aws s3api put-bucket-notification-configuration --bucket amzn-s3-demo-source-bucket \
   --notification-configuration file://notification.json
   ```

   Untuk mempelajari lebih lanjut tentang `put-bucket-notification-configuration` perintah dan `notification-configuration` opsi, lihat [put-bucket-notification-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-notification-configuration.html)di Referensi *Perintah AWS CLI*.

------

## Uji fungsi Lambda Anda dengan acara dummy
<a name="with-s3-tutorial-dummy-test"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps8.png)


Sebelum menguji seluruh penyiapan dengan menambahkan file gambar ke bucket sumber Amazon S3, Anda menguji apakah fungsi Lambda berfungsi dengan benar dengan memanggilnya dengan acara dummy. Peristiwa di Lambda adalah dokumen berformat JSON yang berisi data untuk diproses fungsi Anda. Saat fungsi Anda dipanggil oleh Amazon S3, peristiwa yang dikirim ke fungsi berisi informasi seperti nama bucket, ARN bucket, dan kunci objek.

------
#### [ Konsol Manajemen AWS ]

**Untuk menguji fungsi Lambda Anda dengan acara dummy (konsol)**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) konsol Lambda dan pilih fungsi Anda ()`CreateThumbnail`.

1. Pilih tab **Uji**.

1. Untuk membuat acara pengujian, di panel **acara Uji**, lakukan hal berikut:

   1. Di bawah **Uji tindakan peristiwa**, pilih **Buat acara baru**.

   1. Untuk **Nama peristiwa**, masukkan **myTestEvent**.

   1. Untuk **Template**, pilih **S3 Put**.

   1. Ganti nilai untuk parameter berikut dengan nilai Anda sendiri.
      + Untuk`awsRegion`, ganti `us-east-1` dengan bucket Amazon S3 yang Wilayah AWS Anda buat.
      + Untuk`name`, ganti `amzn-s3-demo-bucket` dengan nama bucket sumber Amazon S3 Anda sendiri.
      + Untuk`key`, ganti `test%2Fkey` dengan nama file objek pengujian yang Anda unggah ke bucket sumber di langkah tersebut. [Unggah gambar uji ke bucket sumber Anda](#with-s3-tutorial-test-image)

      ```
      {
        "Records": [
          {
            "eventVersion": "2.0",
            "eventSource": "aws:s3",
            "awsRegion": "us-east-1",
            "eventTime": "1970-01-01T00:00:00.000Z",
            "eventName": "ObjectCreated:Put",
            "userIdentity": {
              "principalId": "EXAMPLE"
            },
            "requestParameters": {
              "sourceIPAddress": "127.0.0.1"
            },
            "responseElements": {
              "x-amz-request-id": "EXAMPLE123456789",
              "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
            },
            "s3": {
              "s3SchemaVersion": "1.0",
              "configurationId": "testConfigRule",
              "bucket": {
                "name": "amzn-s3-demo-bucket",
                "ownerIdentity": {
                  "principalId": "EXAMPLE"
                },
                "arn": "arn:aws:s3:::amzn-s3-demo-bucket"
              },
              "object": {
                "key": "test%2Fkey",
                "size": 1024,
                "eTag": "0123456789abcdef0123456789abcdef",
                "sequencer": "0A1B2C3D4E5F678901"
              }
            }
          }
        ]
      }
      ```

   1. Pilih **Simpan**.

1. Di panel **acara Uji**, pilih **Uji**.

1. Untuk memeriksa fungsi Anda telah membuat verison yang diubah ukurannya dari gambar Anda dan menyimpannya di bucket Amazon S3 target Anda, lakukan hal berikut:

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

   1. Pilih bucket target Anda dan konfirmasikan bahwa file yang diubah ukurannya tercantum di panel **Objects**.

------
#### [ AWS CLI ]

**Untuk menguji fungsi Lambda Anda dengan acara dummy ()AWS CLI**

1. Simpan JSON berikut dalam file bernama`dummyS3Event.json`. Ganti nilai untuk parameter berikut dengan nilai Anda sendiri:
   + Untuk`awsRegion`, ganti `us-east-1` dengan bucket Amazon S3 yang Wilayah AWS Anda buat.
   + Untuk`name`, ganti `amzn-s3-demo-bucket` dengan nama bucket sumber Amazon S3 Anda sendiri.
   + Untuk`key`, ganti `test%2Fkey` dengan nama file objek pengujian yang Anda unggah ke bucket sumber di langkah tersebut. [Unggah gambar uji ke bucket sumber Anda](#with-s3-tutorial-test-image)

   ```
   {
     "Records": [
       {
         "eventVersion": "2.0",
         "eventSource": "aws:s3",
         "awsRegion": "us-east-1",
         "eventTime": "1970-01-01T00:00:00.000Z",
         "eventName": "ObjectCreated:Put",
         "userIdentity": {
           "principalId": "EXAMPLE"
         },
         "requestParameters": {
           "sourceIPAddress": "127.0.0.1"
         },
         "responseElements": {
           "x-amz-request-id": "EXAMPLE123456789",
           "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
         },
         "s3": {
           "s3SchemaVersion": "1.0",
           "configurationId": "testConfigRule",
           "bucket": {
             "name": "amzn-s3-demo-bucket",
             "ownerIdentity": {
               "principalId": "EXAMPLE"
             },
             "arn": "arn:aws:s3:::amzn-s3-demo-bucket"
           },
           "object": {
             "key": "test%2Fkey",
             "size": 1024,
             "eTag": "0123456789abcdef0123456789abcdef",
             "sequencer": "0A1B2C3D4E5F678901"
           }
         }
       }
     ]
   }
   ```

1. Dari direktori tempat Anda menyimpan `dummyS3Event.json` file Anda, panggil fungsi dengan menjalankan perintah CLI berikut. Perintah ini memanggil fungsi Lambda Anda secara sinkron dengan `RequestResponse` menentukan sebagai nilai parameter tipe pemanggilan. [Untuk mempelajari lebih lanjut tentang pemanggilan sinkron dan asinkron, lihat Memanggil fungsi Lambda.](https://docs.aws.amazon.com/lambda/latest/dg/lambda-invocation.html)

   ```
   aws lambda invoke --function-name CreateThumbnail \
   --invocation-type RequestResponse --cli-binary-format raw-in-base64-out \
   --payload file://dummyS3Event.json outputfile.txt
   ```

    cli-binary-formatOpsi ini diperlukan jika Anda menggunakan versi 2 dari AWS CLI. Untuk menjadikan ini pengaturan default, jalankan`aws configure set cli-binary-format raw-in-base64-out`. Untuk informasi selengkapnya, lihat [opsi baris perintah global yang AWS CLI didukung](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list).

1. Verifikasi bahwa fungsi Anda telah membuat versi thumbnail gambar Anda dan menyimpannya ke bucket Amazon S3 target Anda. Jalankan perintah CLI berikut, ganti `amzn-s3-demo-source-bucket-resized` dengan nama bucket tujuan Anda sendiri.

   ```
   aws s3api list-objects-v2 --bucket amzn-s3-demo-source-bucket-resized
   ```

   Anda akan melihat output seperti yang berikut ini. `Key`Parameter menunjukkan nama file file gambar Anda yang diubah ukurannya.

   ```
   {
       "Contents": [
           {
               "Key": "resized-HappyFace.jpg",
               "LastModified": "2023-06-06T21:40:07+00:00",
               "ETag": "\"d8ca652ffe83ba6b721ffc20d9d7174a\"",
               "Size": 2633,
               "StorageClass": "STANDARD"
           }
       ]
   }
   ```

------

## Uji fungsi Anda menggunakan pemicu Amazon S3
<a name="with-s3-tutorial-test-s3"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-s3-tutorial/s3thumb_tut_steps9.png)


Sekarang setelah Anda mengonfirmasi bahwa fungsi Lambda Anda beroperasi dengan benar, Anda siap untuk menguji penyiapan lengkap Anda dengan menambahkan file gambar ke bucket sumber Amazon S3 Anda. Saat Anda menambahkan gambar ke bucket sumber, fungsi Lambda Anda akan dipanggil secara otomatis. Fungsi Anda membuat versi file yang diubah ukurannya dan menyimpannya di bucket target Anda.

------
#### [ Konsol Manajemen AWS ]

**Untuk menguji fungsi Lambda Anda menggunakan pemicu Amazon S3 (konsol)**

1. Untuk mengunggah gambar ke bucket Amazon S3 Anda, lakukan hal berikut:

   1. Buka halaman [Bucket di](https://console.aws.amazon.com/s3/buckets) konsol Amazon S3 dan pilih bucket sumber Anda.

   1. Pilih **Unggah**.

   1. Pilih **Tambahkan file** dan gunakan pemilih file untuk memilih file gambar yang ingin Anda unggah. Objek gambar Anda dapat berupa file.jpg atau.png.

   1. Pilih **Buka**, lalu pilih **Unggah**.

1. Verifikasi bahwa Lambda telah menyimpan versi file gambar yang diubah ukurannya di bucket target dengan melakukan hal berikut:

   1. Arahkan kembali ke halaman [Bucket di](https://console.aws.amazon.com/s3/buckets) konsol Amazon S3 dan pilih bucket tujuan Anda.

   1. Di panel **Objects**, Anda sekarang akan melihat dua file gambar yang diubah ukurannya, satu dari setiap pengujian fungsi Lambda Anda. Untuk mengunduh gambar yang diubah ukurannya, pilih file, lalu pilih **Unduh**.

------
#### [ AWS CLI ]

**Untuk menguji fungsi Lambda Anda menggunakan pemicu Amazon S3 ()AWS CLI**

1. Dari direktori yang berisi gambar yang ingin Anda unggah, jalankan perintah CLI berikut. Ganti `--bucket` parameter dengan nama bucket sumber Anda. Untuk `--body` parameter `--key` dan, gunakan nama file gambar pengujian Anda. Gambar uji Anda dapat berupa file.jpg atau.png.

   ```
   aws s3api put-object --bucket amzn-s3-demo-source-bucket --key SmileyFace.jpg --body ./SmileyFace.jpg
   ```

1. Verifikasi bahwa fungsi Anda telah membuat versi thumbnail gambar Anda dan menyimpannya ke bucket Amazon S3 target Anda. Jalankan perintah CLI berikut, ganti `amzn-s3-demo-source-bucket-resized` dengan nama bucket tujuan Anda sendiri.

   ```
   aws s3api list-objects-v2 --bucket amzn-s3-demo-source-bucket-resized
   ```

   Jika fungsi Anda berjalan dengan sukses, Anda akan melihat output yang mirip dengan berikut ini. Bucket target Anda sekarang harus berisi dua file yang diubah ukurannya.

   ```
   {
       "Contents": [
           {
               "Key": "resized-HappyFace.jpg",
               "LastModified": "2023-06-07T00:15:50+00:00",
               "ETag": "\"7781a43e765a8301713f533d70968a1e\"",
               "Size": 2763,
               "StorageClass": "STANDARD"
           },
           {
               "Key": "resized-SmileyFace.jpg",
               "LastModified": "2023-06-07T00:13:18+00:00",
               "ETag": "\"ca536e5a1b9e32b22cd549e18792cdbc\"",
               "Size": 1245,
               "StorageClass": "STANDARD"
           }
       ]
   }
   ```

------

## Bersihkan sumber daya Anda
<a name="s3-tutorial-cleanup"></a>

Sekarang Anda dapat menghapus sumber daya yang Anda buat untuk tutorial ini, kecuali Anda ingin mempertahankannya. Dengan menghapus AWS sumber daya yang tidak lagi Anda gunakan, Anda mencegah tagihan yang tidak perlu ke Anda Akun AWS.

**Untuk menghapus fungsi Lambda**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi yang Anda buat.

1. Pilih **Tindakan**, **Hapus**.

1. Ketik **confirm** kolom input teks dan pilih **Hapus**.

**Untuk menghapus kebijakan yang Anda buat.**

1. Buka [halaman Kebijakan](https://console.aws.amazon.com/iam/home#/policies) konsol IAM.

1. Pilih kebijakan yang Anda buat (**AWSLambdaS3Policy**).

1. Pilih **Tindakan kebijakan**, **Hapus**.

1. Pilih **Hapus**.

**Untuk menghapus peran eksekusi**

1. Buka [halaman Peran](https://console.aws.amazon.com/iam/home#/roles) dari konsol IAM.

1. Pilih peran eksekusi yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan nama peran di bidang input teks dan pilih **Hapus**.

**Untuk menghapus bucket S3**

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

1. Pilih bucket yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan nama ember di bidang input teks.

1. Pilih **Hapus bucket**.

# Gunakan rahasia Secrets Manager dalam fungsi Lambda
<a name="with-secrets-manager"></a>

AWS Secrets Manager membantu Anda mengelola kredensi, kunci API, dan rahasia lain yang dibutuhkan fungsi Lambda Anda. Anda memiliki dua pendekatan utama untuk mengambil rahasia dalam fungsi Lambda Anda, keduanya menawarkan kinerja yang lebih baik dan biaya yang lebih rendah dibandingkan dengan mengambil rahasia secara langsung menggunakan SDK: AWS 
+ **AWS parameter dan rahasia Ekstensi Lambda** - Solusi runtime-agnostik yang menyediakan antarmuka HTTP sederhana untuk mengambil rahasia
+ **Powertools untuk utilitas AWS Lambda parameter** - Solusi terintegrasi kode yang mendukung beberapa penyedia (Secrets Manager, Parameter Store, AppConfig) dengan transformasi bawaan

Kedua pendekatan mempertahankan cache rahasia lokal, menghilangkan kebutuhan fungsi Anda untuk memanggil Secrets Manager untuk setiap pemanggilan. Ketika fungsi Anda meminta rahasia, cache diperiksa terlebih dahulu. Jika rahasia tersedia dan belum kedaluwarsa, itu segera dikembalikan. Jika tidak, itu diambil dari Secrets Manager, di-cache, dan dikembalikan. Mekanisme caching ini menghasilkan waktu respons yang lebih cepat dan mengurangi biaya dengan meminimalkan panggilan API.

## Memilih pendekatan
<a name="lambda-secrets-manager-choosing-approach"></a>

Pertimbangkan faktor-faktor ini ketika memilih antara ekstensi dan PowerTools:

Gunakan AWS parameter dan rahasia ekstensi Lambda saat:  
+ Anda menginginkan solusi runtime-agnostik yang berfungsi dengan runtime Lambda apa pun
+ Anda memilih untuk tidak menambahkan dependensi kode ke fungsi Anda
+ Anda hanya perlu mengambil rahasia dari Secrets Manager atau Parameter Store

Gunakan Powertools untuk utilitas AWS Lambda parameter saat:  
+ Anda menginginkan pengalaman pengembangan terintegrasi dengan kode aplikasi Anda
+ Anda memerlukan dukungan untuk beberapa penyedia (Secrets Manager, Parameter Store, AppConfig)
+ Anda ingin transformasi data bawaan (penguraian JSON, decoding base64)
+ Anda menggunakan runtime Python,, Java TypeScript, atau .NET

## Kapan menggunakan Secrets Manager dengan Lambda
<a name="lambda-secrets-manager-when-to-use"></a>

Skenario umum untuk menggunakan Secrets Manager dengan Lambda meliputi:
+ Menyimpan kredensi database yang digunakan fungsi Anda untuk terhubung ke Amazon RDS atau database lainnya
+ Mengelola kunci API untuk layanan eksternal yang dipanggil fungsi Anda
+ Menyimpan kunci enkripsi atau data konfigurasi sensitif lainnya
+ Memutar kredensil secara otomatis tanpa perlu memperbarui kode fungsi Anda

## Menggunakan AWS parameter dan rahasia ekstensi Lambda
<a name="lambda-secrets-manager-extension-approach"></a>

 AWS Parameter dan rahasia ekstensi Lambda menggunakan antarmuka HTTP sederhana yang kompatibel dengan runtime Lambda apa pun. Secara default, ini menyimpan rahasia selama 300 detik (5 menit) dan dapat menampung hingga 1.000 rahasia. Anda dapat [menyesuaikan pengaturan ini dengan variabel lingkungan](#lambda-secrets-manager-env-vars).

### Gunakan Secrets Manager dalam fungsi Lambda
<a name="lambda-secrets-manager-setup"></a>

Bagian ini mengasumsikan bahwa Anda sudah memiliki rahasia Secrets Manager. Untuk membuat rahasia, lihat [Membuat AWS Secrets Manager rahasia](https://docs.aws.amazon.com/secretsmanager/latest/userguide/create_secret.html).

#### Buat paket deployment
<a name="lambda-secrets-manager-function-code"></a>

Pilih runtime pilihan Anda dan ikuti langkah-langkah untuk membuat fungsi yang mengambil rahasia dari Secrets Manager. Fungsi contoh mengambil rahasia dari Secrets Manager dan dapat digunakan untuk mengakses kredensi database, kunci API, atau data konfigurasi sensitif lainnya dalam aplikasi Anda.

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

**Untuk membuat fungsi Python**

1. Buat dan arahkan ke direktori proyek baru. Contoh:

   ```
   mkdir my_function
   cd my_function
   ```

1. Buat file bernama `lambda_function.py` dengan kode berikut. Untuk`secret_name`, gunakan nama atau Amazon Resource Name (ARN) rahasia Anda.

   ```
   import json
   import os
   import requests
   
   def lambda_handler(event, context):
       try:
           # Replace with the name or ARN of your secret
           secret_name = "arn:aws:secretsmanager:us-east-1:111122223333:secret:SECRET_NAME"
           
           secrets_extension_endpoint = f"http://localhost:2773/secretsmanager/get?secretId={secret_name}"
           headers = {"X-Aws-Parameters-Secrets-Token": os.environ.get('AWS_SESSION_TOKEN')}
           
           response = requests.get(secrets_extension_endpoint, headers=headers)
           print(f"Response status code: {response.status_code}")
           
           secret = json.loads(response.text)["SecretString"]
           print(f"Retrieved secret: {secret}")
           
           return {
               'statusCode': response.status_code,
               'body': json.dumps({
                   'message': 'Successfully retrieved secret',
                   'secretRetrieved': True
               })
           }
       
       except Exception as e:
           print(f"Error: {str(e)}")
           return {
               'statusCode': 500,
               'body': json.dumps({
                   'message': 'Error retrieving secret',
                   'error': str(e)
               })
           }
   ```

1. Buat file bernama `requirements.txt` dengan konten ini:

   ```
   requests
   ```

1. Instal dependensi:

   ```
   pip install -r requirements.txt -t .
   ```

1. Buat file.zip yang berisi semua file:

   ```
   zip -r function.zip .
   ```

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

**Untuk membuat fungsi Node.js**

1. Buat dan arahkan ke direktori proyek baru. Contoh:

   ```
   mkdir my_function
   cd my_function
   ```

1. Buat file bernama `index.mjs` dengan kode berikut. Untuk`secret_name`, gunakan nama atau Amazon Resource Name (ARN) rahasia Anda.

   ```
   import http from 'http';
   
   export const handler = async (event) => {
       try {
           // Replace with the name or ARN of your secret
           const secretName = "arn:aws:secretsmanager:us-east-1:111122223333:secret:SECRET_NAME";
           const options = {
               hostname: 'localhost',
               port: 2773,
               path: `/secretsmanager/get?secretId=${secretName}`,
               headers: {
                   'X-Aws-Parameters-Secrets-Token': process.env.AWS_SESSION_TOKEN
               }
           };
   
           const response = await new Promise((resolve, reject) => {
               http.get(options, (res) => {
                   let data = '';
                   res.on('data', (chunk) => { data += chunk; });
                   res.on('end', () => {
                       resolve({ 
                           statusCode: res.statusCode, 
                           body: data 
                       });
                   });
               }).on('error', reject);
           });
   
           const secret = JSON.parse(response.body).SecretString;
           console.log('Retrieved secret:', secret);
   
           return {
               statusCode: response.statusCode,
               body: JSON.stringify({
                   message: 'Successfully retrieved secret',
                   secretRetrieved: true
               })
           };
       } catch (error) {
           console.error('Error:', error);
           return {
               statusCode: 500,
               body: JSON.stringify({
                   message: 'Error retrieving secret',
                   error: error.message
               })
           };
       }
   };
   ```

1. Buat file.zip yang berisi `index.mjs` file:

   ```
   zip -r function.zip index.mjs
   ```

------
#### [ Java ]

**Untuk membuat fungsi Java**

1. Buat proyek Maven:

   ```
   mvn archetype:generate \
       -DgroupId=example \
       -DartifactId=lambda-secrets-demo \
       -DarchetypeArtifactId=maven-archetype-quickstart \
       -DarchetypeVersion=1.4 \
       -DinteractiveMode=false
   ```

1. Arahkan ke direktori proyek:

   ```
   cd lambda-secrets-demo
   ```

1. Buka `pom.xml` dan ganti isinya dengan yang berikut:

   ```
   <project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
   
       <groupId>example</groupId>
       <artifactId>lambda-secrets-demo</artifactId>
       <version>1.0-SNAPSHOT</version>
   
       <properties>
           <maven.compiler.source>11</maven.compiler.source>
           <maven.compiler.target>11</maven.compiler.target>
       </properties>
   
       <dependencies>
           <dependency>
               <groupId>com.amazonaws</groupId>
               <artifactId>aws-lambda-java-core</artifactId>
               <version>1.2.1</version>
           </dependency>
       </dependencies>
   
       <build>
           <plugins>
               <plugin>
                   <groupId>org.apache.maven.plugins</groupId>
                   <artifactId>maven-shade-plugin</artifactId>
                   <version>3.2.4</version>
                   <executions>
                       <execution>
                           <phase>package</phase>
                           <goals>
                               <goal>shade</goal>
                           </goals>
                           <configuration>
                               <createDependencyReducedPom>false</createDependencyReducedPom>
                               <finalName>function</finalName>
                           </configuration>
                       </execution>
                   </executions>
               </plugin>
           </plugins>
       </build>
   </project>
   ```

1. Ganti nama `/lambda-secrets-demo/src/main/java/example/App.java` `Hello.java` untuk mencocokkan nama penangan Java default Lambda (): `example.Hello::handleRequest`

   ```
   mv src/main/java/example/App.java src/main/java/example/Hello.java
   ```

1. Buka `Hello.java` file dan ganti isinya dengan yang berikut ini. Untuk`secretName`, gunakan nama atau Amazon Resource Name (ARN) rahasia Anda. 

   ```
   package example;
   
   import com.amazonaws.services.lambda.runtime.Context;
   import com.amazonaws.services.lambda.runtime.RequestHandler;
   import java.net.URI;
   import java.net.http.HttpClient;
   import java.net.http.HttpRequest;
   import java.net.http.HttpResponse;
   
   public class Hello implements RequestHandler<Object, String> {
       private final HttpClient client = HttpClient.newHttpClient();
   
       @Override
       public String handleRequest(Object input, Context context) {
           try {
               // Replace with the name or ARN of your secret
               String secretName = "arn:aws:secretsmanager:us-east-1:111122223333:secret:SECRET_NAME";
               String endpoint = "http://localhost:2773/secretsmanager/get?secretId=" + secretName;
   
               HttpRequest request = HttpRequest.newBuilder()
                   .uri(URI.create(endpoint))
                   .header("X-Aws-Parameters-Secrets-Token", System.getenv("AWS_SESSION_TOKEN"))
                   .GET()
                   .build();
   
               HttpResponse<String> response = client.send(request, 
                   HttpResponse.BodyHandlers.ofString());
   
               String secret = response.body();
               secret = secret.substring(secret.indexOf("SecretString") + 15);
               secret = secret.substring(0, secret.indexOf("\""));
   
               System.out.println("Retrieved secret: " + secret);
               return String.format(
                   "{\"statusCode\": %d, \"body\": \"%s\"}",
                   response.statusCode(), "Successfully retrieved secret"
               );
   
           } catch (Exception e) {
               e.printStackTrace();
               return String.format(
                   "{\"body\": \"Error retrieving secret: %s\"}", 
                   e.getMessage()
               );
           }
       }
   }
   ```

1. Hapus direktori pengujian. Maven membuat ini secara default, tetapi kami tidak membutuhkannya untuk contoh ini.

   ```
   rm -rf src/test
   ```

1. Membangun proyek:

   ```
   mvn package
   ```

1. Unduh file JAR (`target/function.jar`) untuk digunakan nanti.

------

#### Buat fungsi
<a name="lambda-secrets-manager-create"></a>

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih **Buat fungsi**.

1. Pilih **Penulis dari awal**.

1. Untuk **Nama fungsi**, masukkan **secret-retrieval-demo**.

1. Pilih **Runtime** pilihan Anda.

1. Pilih **Buat fungsi**.

**Untuk meng-upload paket deployment**

1. Di tab **Kode** fungsi, pilih **Unggah dari** dan pilih **file.zip** (untuk Python dan Node.js) **atau file.jar** (untuk Java).

1. Unggah paket penerapan yang Anda buat sebelumnya.

1. Pilih **Simpan**.

#### Tambahkan ekstensi
<a name="lambda-secrets-manager-extension"></a>

**Untuk menambahkan ekstensi AWS Parameter dan Rahasia Lambda sebagai lapisan**

1. Di tab **Code** fungsi, gulir ke bawah ke **Layers**.

1. Pilih **Tambahkan lapisan**.

1. Pilih **AWS layer**.

1. Pilih **AWS-Parameter-dan-rahasia-Lambda-ekstensi**.

1. Pilih versi terbaru.

1. Pilih **Tambahkan**.

#### Tambahkan izin
<a name="lambda-secrets-manager-permissions"></a>

**Untuk menambahkan izin Secrets Manager ke peran eksekusi**

1. Pilih tab **Konfigurasi**, lalu pilih **Izin**.

1. Di bawah **Nama peran**, pilih tautan ke peran eksekusi Anda. Tautan ini membuka peran di konsol IAM.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/execution-role-console.png)

1. Pilih **Tambahkan izin**, lalu pilih **Buat kebijakan sebaris**.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/create-inline-policy.png)

1. Pilih tab **JSON** dan tambahkan kebijakan berikut. Untuk`Resource`, masukkan ARN rahasia Anda.

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "secretsmanager:GetSecretValue",
               "Resource": "arn:aws:secretsmanager:us-east-1:111122223333:secret:SECRET_NAME"
           }
       ]
   }
   ```

------

1. Pilih **Berikutnya**.

1. Masukkan nama untuk kebijakan.

1. Pilih **Buat kebijakan**.

#### Uji fungsi
<a name="lambda-secrets-manager-test"></a>

**Untuk menguji fungsi**

1. Kembali ke konsol Lambda.

1. Pilih tab **Uji**.

1. Pilih **Uji**. Anda akan melihat tanggapan berikut:  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/execution-results-secret.png)

### Variabel-variabel lingkungan
<a name="lambda-secrets-manager-env-vars"></a>

Ekstensi AWS Parameter dan Rahasia Lambda menggunakan pengaturan default berikut. Anda dapat mengganti pengaturan ini dengan membuat [variabel lingkungan](configuration-envvars.md#create-environment-variables) yang sesuai. Untuk melihat pengaturan saat ini untuk suatu fungsi, setel `PARAMETERS_SECRETS_EXTENSION_LOG_LEVEL` ke`DEBUG`. Ekstensi akan mencatat informasi konfigurasinya ke CloudWatch Log pada awal setiap pemanggilan fungsi.


| Pengaturan | Nilai default | Nilai valid | Variabel lingkungan | Detail | 
| --- | --- | --- | --- | --- | 
| Port HTTP | 2773 | 1 - 65535 | PARAMETER\$1SECRETS\$1EXTENSION\$1HTTP\$1PORT | Port untuk server HTTP lokal | 
| Cache diaktifkan | BETUL | TRUE \$1 FALSE | PARAMETERS\$1SECRETS\$1EXTENSION\$1CACHE\$1ENABLED | Aktifkan atau nonaktifkan cache | 
| Ukuran cache | 1000 | 0 - 1000 | PARAMETER\$1SECRETS\$1EXTENSION\$1CACHE\$1SIZE | Setel ke 0 untuk menonaktifkan caching | 
| Secrets Manager TTL | 300 detik | 0 - 300 detik | SECRETS\$1MANAGER\$1TTL | Time-to-live untuk rahasia yang di-cache. Setel ke 0 untuk menonaktifkan caching. Variabel ini diabaikan jika nilai untuk PARAMETERS\$1SECRETS\$1EXTENSION\$1CACHE\$1SIZE adalah 0. | 
| Parameter Toko TTL | 300 detik | 0 - 300 detik | SSM\$1PARAMETER\$1STORE\$1TTL | Time-to-live untuk parameter cache. Setel ke 0 untuk menonaktifkan caching. Variabel ini diabaikan jika nilai untuk PARAMETERS\$1SECRETS\$1EXTENSION\$1CACHE\$1SIZE adalah 0. | 
| Tingkat log | INFO | DEBUG \$1 INFO \$1 PERINGATAN \$1 KESALAHAN \$1 TIDAK ADA | PARAMETER\$1SECRETS\$1EXTENSION\$1LOG\$1LEVEL | Tingkat detail yang dilaporkan dalam log untuk ekstensi | 
| Koneksi maks | 3 | 1 atau lebih | PARAMETER\$1SECRETS\$1EXTENSION\$1MAX\$1CONNECTIONS | Jumlah maksimum koneksi HTTP untuk permintaan ke Parameter Store atau Secrets Manager | 
| Batas waktu Secrets Manager | 0 (tidak ada batas waktu) | Semua bilangan bulat | SECRETS\$1MANAGER\$1TIMEOUT\$1MILLIS | Batas waktu untuk permintaan ke Secrets Manager (dalam milidetik) | 
| Batas waktu penyimpanan Parameter | 0 (tidak ada batas waktu) | Semua bilangan bulat | SSM\$1PARAMETER\$1STORE\$1TIMEOUT\$1MILLIS | Batas waktu untuk permintaan ke Parameter Store (dalam milidetik) | 

### Bekerja dengan rotasi rahasia
<a name="lambda-secrets-manager-rotation"></a>

Jika Anda sering memutar rahasia, durasi cache default 300 detik dapat menyebabkan fungsi Anda menggunakan rahasia yang sudah ketinggalan zaman. Anda memiliki dua opsi untuk memastikan fungsi Anda menggunakan nilai rahasia terbaru:
+ Kurangi cache TTL dengan mengatur variabel `SECRETS_MANAGER_TTL` lingkungan ke nilai yang lebih rendah (dalam hitungan detik). Misalnya, mengaturnya untuk `60` memastikan fungsi Anda tidak akan pernah menggunakan rahasia yang berumur lebih dari satu menit.
+ Gunakan label `AWSCURRENT` atau `AWSPREVIOUS` pementasan dalam permintaan rahasia Anda untuk memastikan Anda mendapatkan versi spesifik yang Anda inginkan:

  ```
  secretsmanager/get?secretId=YOUR_SECRET_NAME&versionStage=AWSCURRENT
  ```

Pilih pendekatan yang paling menyeimbangkan kebutuhan Anda akan kinerja dan kesegaran. TTL yang lebih rendah berarti panggilan yang lebih sering ke Secrets Manager tetapi memastikan Anda bekerja dengan nilai rahasia terbaru.

## Menggunakan utilitas parameter dari Powertools untuk AWS Lambda
<a name="lambda-secrets-manager-powertools-approach"></a>

Utilitas parameter dari Powertools untuk AWS Lambda menyediakan antarmuka terpadu untuk mengambil rahasia dari beberapa penyedia termasuk Secrets Manager, penyimpanan parameter, dan. AppConfig Ini menangani caching, transformasi, dan memberikan pengalaman pengembangan yang lebih terintegrasi dibandingkan dengan pendekatan ekstensi.

### Manfaat utilitas parameter
<a name="lambda-secrets-manager-powertools-benefits"></a>
+ **Beberapa penyedia** - Ambil parameter dari Secrets Manager, Parameter Store, dan AppConfig menggunakan antarmuka yang sama
+ **Transformasi bawaan** - Penguraian JSON otomatis, decoding base64, dan transformasi data lainnya
+ **Caching terintegrasi - Caching** yang dapat dikonfigurasi dengan dukungan TTL untuk mengurangi panggilan API
+ **Keamanan tipe** - Dukungan pengetikan yang kuat di TypeScript dan runtime lain yang didukung
+ **Penanganan kesalahan** - Logika coba ulang bawaan dan penanganan kesalahan

### Contoh kode
<a name="lambda-secrets-manager-powertools-examples"></a>

Contoh berikut menunjukkan cara mengambil rahasia menggunakan utilitas Parameter di runtime yang berbeda:

**Python**  
Untuk contoh lengkap dan petunjuk penyiapan, lihat [dokumentasi utilitas Parameter](https://docs.powertools.aws.dev/lambda/python/latest/utilities/parameters/).
Mengambil rahasia dari Secrets Manager dengan Powertools untuk utilitas AWS Lambda Parameter.  

```
from aws_lambda_powertools import Logger
from aws_lambda_powertools.utilities import parameters

logger = Logger()

def lambda_handler(event, context):
    try:
        # Get secret with caching (default TTL: 5 seconds)
        secret_value = parameters.get_secret("my-secret-name")
        
        # Get secret with custom TTL
        secret_with_ttl = parameters.get_secret("my-secret-name", max_age=300)
        
        # Get secret and transform JSON
        secret_json = parameters.get_secret("my-json-secret", transform="json")
        
        logger.info("Successfully retrieved secrets")
        
        return {
            'statusCode': 200,
            'body': 'Successfully retrieved secrets'
        }
        
    except Exception as e:
        logger.error(f"Error retrieving secret: {str(e)}")
        return {
            'statusCode': 500,
            'body': f'Error: {str(e)}'
        }
```

**TypeScript**  
Untuk contoh lengkap dan petunjuk penyiapan, lihat [dokumentasi utilitas Parameter](https://docs.aws.amazon.com/powertools/typescript/2.1.1/utilities/parameters/).
Mengambil rahasia dari Secrets Manager dengan Powertools untuk utilitas AWS Lambda Parameter.  

```
import { Logger } from '@aws-lambda-powertools/logger';
import { getSecret } from '@aws-lambda-powertools/parameters/secrets';
import type { Context } from 'aws-lambda';

const logger = new Logger();

export const handler = async (event: any, context: Context) => {
    try {
        // Get secret with caching (default TTL: 5 seconds)
        const secretValue = await getSecret('my-secret-name');
        
        // Get secret with custom TTL
        const secretWithTtl = await getSecret('my-secret-name', { maxAge: 300 });
        
        // Get secret and transform JSON
        const secretJson = await getSecret('my-json-secret', { transform: 'json' });
        
        logger.info('Successfully retrieved secrets');
        
        return {
            statusCode: 200,
            body: 'Successfully retrieved secrets'
        };
        
    } catch (error) {
        logger.error('Error retrieving secret', { error });
        return {
            statusCode: 500,
            body: `Error: ${error}`
        };
    }
};
```

**Java**  
Untuk contoh lengkap dan petunjuk penyiapan, lihat [dokumentasi utilitas Parameter](https://docs.powertools.aws.dev/lambda/java/latest/utilities/parameters/).
Mengambil rahasia dari Secrets Manager dengan Powertools untuk utilitas AWS Lambda Parameter.  

```
import software.amazon.lambda.powertools.logging.Logging;
import software.amazon.lambda.powertools.parameters.SecretsProvider;
import software.amazon.lambda.powertools.parameters.ParamManager;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class SecretHandler implements RequestHandler<Object, String> {
    
    private final SecretsProvider secretsProvider = ParamManager.getSecretsProvider();
    
    @Logging
    @Override
    public String handleRequest(Object input, Context context) {
        try {
            // Get secret with caching (default TTL: 5 seconds)
            String secretValue = secretsProvider.get("my-secret-name");
            
            // Get secret with custom TTL (300 seconds)
            String secretWithTtl = secretsProvider.withMaxAge(300).get("my-secret-name");
            
            // Get secret and transform JSON
            MySecret secretJson = secretsProvider.get("my-json-secret", MySecret.class);
            
            return "Successfully retrieved secrets";
            
        } catch (Exception e) {
            return "Error retrieving secret: " + e.getMessage();
        }
    }
    
    public static class MySecret {
        // Define your secret structure here
    }
}
```

**.NET**  
Untuk contoh lengkap dan petunjuk penyiapan, lihat [dokumentasi utilitas Parameter](https://docs.aws.amazon.com/powertools/typescript/latest/features/parameters/).
Mengambil rahasia dari Secrets Manager dengan Powertools untuk utilitas AWS Lambda Parameter.  

```
using AWS.Lambda.Powertools.Logging;
using AWS.Lambda.Powertools.Parameters;
using Amazon.Lambda.Core;

[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

public class Function
{
    private readonly ISecretsProvider _secretsProvider;
    
    public Function()
    {
        _secretsProvider = ParametersManager.SecretsProvider;
    }
    
    [Logging]
    public async Task<string> FunctionHandler(object input, ILambdaContext context)
    {
        try
        {
            // Get secret with caching (default TTL: 5 seconds)
            var secretValue = await _secretsProvider.GetAsync("my-secret-name");
            
            // Get secret with custom TTL
            var secretWithTtl = await _secretsProvider.WithMaxAge(TimeSpan.FromMinutes(5))
                .GetAsync("my-secret-name");
            
            // Get secret and transform JSON
            var secretJson = await _secretsProvider.GetAsync<MySecret>("my-json-secret");
            
            return "Successfully retrieved secrets";
        }
        catch (Exception e)
        {
            return $"Error retrieving secret: {e.Message}";
        }
    }
    
    public class MySecret
    {
        // Define your secret structure here
    }
}
```

### Pengaturan dan izin
<a name="lambda-secrets-manager-powertools-setup"></a>

Untuk menggunakan utilitas Parameter, Anda perlu:

1. Instal Powertools AWS Lambda untuk runtime Anda. Lihat perinciannya di [Powertools untuk AWS Lambda](powertools-for-lambda.md).

1. Tambahkan izin IAM yang diperlukan ke peran eksekusi fungsi Anda. Lihat [Mengelola izin di AWS Lambda](lambda-permissions.md) untuk detailnya.

1. Konfigurasikan pengaturan opsional apa pun melalui [variabel lingkungan](configuration-envvars.md).

Izin IAM yang diperlukan sama dengan pendekatan ekstensi. Utilitas akan secara otomatis menangani caching dan panggilan API ke Secrets Manager berdasarkan konfigurasi Anda.

# Menggunakan Lambda dengan Amazon SQS
<a name="with-sqs"></a>

**catatan**  
[Jika Anda ingin mengirim data ke target selain fungsi Lambda atau memperkaya data sebelum mengirimnya, lihat Amazon Pipes. EventBridge ](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-pipes.html)

Anda dapat menggunakan fungsi Lambda untuk memproses pesan dalam antrean Amazon Simple Queue Service (Amazon SQS). [Lambda mendukung antrian [standar dan antrian](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/standard-queues.html)[first-in, first-out (FIFO](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/FIFO-queues.html)) untuk pemetaan sumber acara.](invocation-eventsourcemapping.md) Anda juga dapat menggunakan mode yang disediakan untuk mengalokasikan sumber daya polling khusus untuk pemetaan sumber peristiwa Amazon SQS Anda. [Fungsi Lambda dan antrian Amazon SQS harus Wilayah AWS sama, meskipun bisa berbeda. Akun AWS](with-sqs-cross-account-example.md)

Saat memproses pesan Amazon SQS, Anda perlu menerapkan logika respons batch sebagian untuk mencegah pesan yang berhasil diproses dicoba ulang ketika beberapa pesan dalam batch gagal. [Utilitas Prosesor Batch](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/) dari Powertools untuk AWS Lambda menyederhanakan implementasi ini dengan secara otomatis menangani logika respons sebagian batch, mengurangi waktu pengembangan dan meningkatkan keandalan.

**Topics**
+ [

## Memahami perilaku polling dan batching untuk pemetaan sumber peristiwa Amazon SQS
](#sqs-polling-behavior)
+ [

## Menggunakan mode yang disediakan dengan pemetaan sumber peristiwa Amazon SQS
](#sqs-provisioned-mode)
+ [

## Mengonfigurasi mode yang disediakan untuk pemetaan sumber peristiwa Amazon SQS
](#sqs-configuring-provisioned-mode)
+ [

## Contoh acara pesan antrian standar
](#example-standard-queue-message-event)
+ [

## Contoh acara pesan antrian FIFO
](#sample-fifo-queues-message-event)
+ [

# Membuat dan mengonfigurasi pemetaan sumber peristiwa Amazon SQS
](services-sqs-configure.md)
+ [

# Mengkonfigurasi perilaku penskalaan untuk pemetaan sumber peristiwa SQS
](services-sqs-scaling.md)
+ [

# Menangani kesalahan untuk sumber peristiwa SQS di Lambda
](services-sqs-errorhandling.md)
+ [

# Parameter Lambda untuk pemetaan sumber peristiwa Amazon SQS
](services-sqs-parameters.md)
+ [

# Menggunakan pemfilteran peristiwa dengan sumber peristiwa Amazon SQS
](with-sqs-filtering.md)
+ [

# Tutorial: Menggunakan Lambda dengan Amazon SQS
](with-sqs-example.md)
+ [

# Tutorial: Menggunakan antrian Amazon SQS lintas akun sebagai sumber acara
](with-sqs-cross-account-example.md)

## Memahami perilaku polling dan batching untuk pemetaan sumber peristiwa Amazon SQS
<a name="sqs-polling-behavior"></a>

[Dengan pemetaan sumber peristiwa Amazon SQS, Lambda melakukan polling antrian dan memanggil fungsi Anda secara sinkron dengan suatu peristiwa.](invocation-sync.md) Setiap acara dapat berisi sekumpulan beberapa pesan dari antrian. Lambda menerima peristiwa ini satu batch pada satu waktu, dan memanggil fungsi Anda sekali untuk setiap batch. Ketika fungsi Anda berhasil memproses suatu batch, Lambda menghapus pesannya dari antrean.

[Saat Lambda menerima batch, pesan tetap berada dalam antrean tetapi disembunyikan selama batas waktu visibilitas antrian.](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) Jika fungsi Anda berhasil memproses semua pesan dalam batch, Lambda menghapus pesan dari antrian. Secara default, jika fungsi Anda mengalami kesalahan saat memproses batch, semua pesan dalam kumpulan tersebut akan terlihat lagi dalam antrian setelah batas waktu visibilitas berakhir. Untuk alasan ini, kode fungsi Anda harus dapat memproses pesan yang sama beberapa kali tanpa efek samping yang tidak diinginkan.

**Awas**  
Pemetaan sumber peristiwa Lambda memproses setiap peristiwa setidaknya sekali, dan pemrosesan duplikat catatan dapat terjadi. Untuk menghindari potensi masalah yang terkait dengan duplikat peristiwa, kami sangat menyarankan agar Anda membuat kode fungsi Anda idempoten. Untuk mempelajari lebih lanjut, lihat [Bagaimana cara membuat fungsi Lambda saya idempoten](https://repost.aws/knowledge-center/lambda-function-idempotent) di Pusat Pengetahuan. AWS 

Untuk mencegah Lambda memproses pesan beberapa kali, Anda dapat mengonfigurasi pemetaan sumber peristiwa untuk menyertakan [kegagalan item batch](services-sqs-errorhandling.md#services-sqs-batchfailurereporting) dalam respons fungsi, atau Anda dapat menggunakan [DeleteMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_DeleteMessage.html)API untuk menghapus pesan dari antrian karena fungsi Lambda berhasil memprosesnya.

Untuk informasi selengkapnya tentang parameter konfigurasi yang didukung Lambda untuk pemetaan sumber peristiwa SQS, lihat. [Membuat pemetaan sumber acara SQS](services-sqs-configure.md#events-sqs-eventsource)

## Menggunakan mode yang disediakan dengan pemetaan sumber peristiwa Amazon SQS
<a name="sqs-provisioned-mode"></a>

Untuk beban kerja di mana Anda perlu menyempurnakan throughput pemetaan sumber peristiwa, Anda dapat menggunakan mode yang disediakan. Dalam mode yang disediakan, Anda menentukan batas minimum dan maksimum untuk jumlah poller acara yang disediakan. Poller acara yang disediakan ini didedikasikan untuk pemetaan sumber acara Anda, dan dapat menangani lonjakan pesan yang tidak terduga melalui penskalaan otomatis responsif. Pemetaan sumber peristiwa Amazon SQS yang dikonfigurasi dengan Mode Tertentu menskalakan 3x lebih cepat (hingga 1.000 pemanggilan bersamaan per menit) dan mendukung konkurensi 16x lebih tinggi (hingga 20.000 pemanggilan bersamaan) daripada kemampuan pemetaan sumber peristiwa Amazon SQS default. Kami menyarankan Anda menggunakan mode yang disediakan untuk beban kerja berbasis peristiwa Amazon SQS yang memiliki persyaratan kinerja yang ketat, seperti perusahaan jasa keuangan yang memproses umpan data pasar, platform e-commerce yang memberikan rekomendasi yang dipersonalisasi secara real-time, dan perusahaan game yang mengelola interaksi pemain langsung. Menggunakan mode yang disediakan menimbulkan biaya tambahan. Untuk harga terperinci, lihat [AWS Lambda harga](https://aws.amazon.com/lambda/pricing/).

Setiap poller peristiwa dalam mode yang disediakan dapat menangani hingga 1 throughput, hingga 10 MB/s pemanggilan bersamaan, atau hingga 10 panggilan API polling Amazon SQS per detik. Rentang nilai yang diterima untuk jumlah minimum poller peristiwa (MinimumPollers) adalah antara 2 dan 200, dengan default 2. Rentang nilai yang diterima untuk jumlah maksimum poller acara (MaximumPollers) adalah antara 2 dan 2.000, dengan default 200. MaximumPollers harus lebih besar dari atau sama dengan MinimumPollers.

### Menentukan poller acara yang diperlukan
<a name="sqs-determining-event-pollers"></a>

Untuk memperkirakan jumlah poller peristiwa yang diperlukan untuk memastikan kinerja pemrosesan pesan yang optimal saat menggunakan mode yang disediakan untuk SQS ESM, kumpulkan metrik berikut untuk aplikasi Anda: peristiwa SQS puncak per detik yang memerlukan pemrosesan latensi rendah, ukuran payload peristiwa SQS rata-rata, durasi fungsi Lambda rata-rata, dan ukuran batch yang dikonfigurasi.

Pertama, Anda dapat memperkirakan jumlah peristiwa SQS per detik (EPS) yang didukung oleh poller acara untuk beban kerja Anda menggunakan rumus berikut:

```
EPS per event poller = 
        minimum(
            ceiling(1024 / average event size in KB),
            ceiling(10 / average function duration in seconds) * batch size, 
            min(100, 10 * batch size)
                )
```

Kemudian, Anda dapat menghitung jumlah poller minimum yang diperlukan menggunakan rumus di bawah ini. Perhitungan ini memastikan Anda menyediakan kapasitas yang cukup untuk menangani persyaratan lalu lintas puncak Anda.

```
Required event pollers = (Peak number of events per second in Queue) / EPS per event poller
```

Pertimbangkan beban kerja dengan ukuran batch default 10, ukuran acara rata-rata 3 KB, durasi fungsi rata-rata 100 ms, dan persyaratan untuk menangani 1.000 peristiwa per detik. Dalam skenario ini, setiap poller acara akan mendukung sekitar 100 peristiwa per detik (EPS). Oleh karena itu, Anda harus menetapkan poller minimum hingga 10 untuk menangani persyaratan lalu lintas puncak Anda secara memadai. Jika beban kerja Anda memiliki karakteristik yang sama tetapi dengan durasi fungsi rata-rata 1 detik, setiap poller hanya akan mendukung 10 EPS, mengharuskan Anda mengonfigurasi 100 poller minimum untuk mendukung 1.000 peristiwa per detik pada latensi rendah.

Sebaiknya gunakan ukuran batch default 10 atau lebih tinggi untuk memaksimalkan efisiensi poller acara mode yang disediakan. Ukuran batch yang lebih tinggi memungkinkan setiap poller memproses lebih banyak acara per pemanggilan, untuk meningkatkan throughput dan efisiensi biaya. Saat merencanakan kapasitas poller acara Anda, perhitungkan potensi lonjakan lalu lintas dan pertimbangkan untuk menetapkan nilai MinimumPollers Anda sedikit lebih tinggi dari minimum yang dihitung untuk menyediakan buffer. Selain itu, pantau karakteristik beban kerja Anda dari waktu ke waktu, karena perubahan ukuran pesan, durasi fungsi, atau pola lalu lintas mungkin memerlukan penyesuaian konfigurasi poller acara Anda untuk mempertahankan kinerja dan efisiensi biaya yang optimal. Untuk perencanaan kapasitas yang tepat, kami sarankan untuk menguji beban kerja spesifik Anda untuk menentukan EPS aktual yang dapat didorong oleh setiap poller peristiwa.

## Mengonfigurasi mode yang disediakan untuk pemetaan sumber peristiwa Amazon SQS
<a name="sqs-configuring-provisioned-mode"></a>

Anda dapat mengonfigurasi mode yang disediakan untuk pemetaan sumber peristiwa Amazon SQS menggunakan konsol atau API Lambda.

**Untuk mengonfigurasi mode yang disediakan untuk pemetaan sumber peristiwa Amazon SQS yang ada (konsol)**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi dengan pemetaan sumber peristiwa Amazon SQS yang ingin Anda konfigurasikan untuk mode yang disediakan.

1. Pilih **Konfigurasi**, lalu pilih **Pemicu.**

1. **Pilih pemetaan sumber peristiwa Amazon SQS yang ingin Anda konfigurasikan untuk mode yang disediakan, lalu pilih Edit.**

1. Di bawah **Konfigurasi pemetaan sumber peristiwa**, pilih **Konfigurasi mode yang disediakan**.
   + Untuk **poller acara Minimum**, masukkan nilai antara 2 dan 200. Jika Anda tidak menentukan nilai, Lambda memilih nilai default 2.
   + Untuk **poller acara Maksimum**, masukkan nilai antara 2 dan 2.000. Nilai ini harus lebih besar dari atau sama dengan nilai Anda untuk **poller acara Minimum**. Jika Anda tidak menentukan nilai, Lambda memilih nilai default 200.

1. Pilih **Simpan**.

Anda dapat mengonfigurasi mode yang disediakan secara terprogram menggunakan objek di. `ProvisionedPollerConfig` `EventSourceMappingConfiguration` Misalnya, perintah `UpdateEventSourceMapping` CLI berikut mengkonfigurasi `MinimumPollers` nilai 5, dan `MaximumPollers` nilai 100.

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --provisioned-poller-config '{"MinimumPollers": 5, "MaximumPollers": 100}'
```

Setelah mengonfigurasi mode yang disediakan, Anda dapat mengamati penggunaan poller peristiwa untuk beban kerja Anda dengan memantau metrik. `ProvisionedPollers` Untuk informasi selengkapnya, lihat Metrik pemetaan sumber peristiwa.

Untuk menonaktifkan mode yang disediakan dan kembali ke mode default (sesuai permintaan), Anda dapat menggunakan perintah CLI `UpdateEventSourceMapping` berikut:

```
aws lambda update-event-source-mapping \
    --uuid a1b2c3d4-5678-90ab-cdef-EXAMPLE11111 \
    --provisioned-poller-config '{}'
```

**catatan**  
Mode yang disediakan tidak dapat digunakan bersamaan dengan pengaturan konkurensi maksimum. Saat menggunakan mode yang disediakan, Anda mengontrol konkurensi maksimum melalui jumlah maksimum poller acara.

Untuk informasi selengkapnya tentang mengonfigurasi mode yang disediakan, lihat. [Membuat dan mengonfigurasi pemetaan sumber peristiwa Amazon SQS](services-sqs-configure.md)

## Contoh acara pesan antrian standar
<a name="example-standard-queue-message-event"></a>

**Example Kejadian pesan Amazon SQS (antrean standar)**  

```
{
    "Records": [
        {
            "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
            "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
            "body": "Test message.",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1545082649183",
                "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                "ApproximateFirstReceiveTimestamp": "1545082649185"
            },
            "messageAttributes": {
                "myAttribute": {
                    "stringValue": "myValue", 
                    "stringListValues": [], 
                    "binaryListValues": [], 
                    "dataType": "String"
                }
            },
            "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue",
            "awsRegion": "us-east-2"
        },
        {
            "messageId": "2e1424d4-f796-459a-8184-9c92662be6da",
            "receiptHandle": "AQEBzWwaftRI0KuVm4tP+/7q1rGgNqicHq...",
            "body": "Test message.",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1545082650636",
                "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                "ApproximateFirstReceiveTimestamp": "1545082650649"
            },
            "messageAttributes": {},
            "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:my-queue",
            "awsRegion": "us-east-2"
        }
    ]
}
```

Secara default, Lambda melakukan polling hingga 10 pesan dalam antrian sekaligus dan mengirimkan batch tersebut ke fungsi Anda. Untuk menghindari menjalankan fungsi dengan sejumlah kecil catatan, Anda dapat mengonfigurasi sumber peristiwa untuk menyangga catatan hingga 5 menit dengan mengonfigurasi jendela batch. Sebelum menjalankan fungsi, Lambda melanjutkan polling pesan dari antrian standar hingga jendela batch kedaluwarsa, kuota [ukuran payload pemanggilan tercapai, atau ukuran](gettingstarted-limits.md) batch maksimum yang dikonfigurasi tercapai.

Jika Anda menggunakan jendela batch dan antrian SQS Anda berisi lalu lintas yang sangat rendah, Lambda mungkin menunggu hingga 20 detik sebelum menjalankan fungsi Anda. Ini benar bahkan jika Anda mengatur jendela batch lebih rendah dari 20 detik. 

**catatan**  
Di Java, Anda mungkin mengalami kesalahan pointer null saat deserialisasi JSON. Ini bisa disebabkan oleh bagaimana kasus “Records” dan “EventSourcEarn” dikonversi oleh pemeta objek JSON.

## Contoh acara pesan antrian FIFO
<a name="sample-fifo-queues-message-event"></a>

Untuk antrean FIFO, rekaman berisi atribut tambahan yang terkait dengan deduplikasi dan pengurutan.

**Example Kejadian pesan Amazon SQS (antrean FIFO)**  

```
{
    "Records": [
        {
            "messageId": "11d6ee51-4cc7-4302-9e22-7cd8afdaadf5",
            "receiptHandle": "AQEBBX8nesZEXmkhsmZeyIE8iQAMig7qw...",
            "body": "Test message.",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "SentTimestamp": "1573251510774",
                "SequenceNumber": "18849496460467696128",
                "MessageGroupId": "1",
                "SenderId": "AIDAIO23YVJENQZJOL4VO",
                "MessageDeduplicationId": "1",
                "ApproximateFirstReceiveTimestamp": "1573251510774"
            },
            "messageAttributes": {},
            "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:us-east-2:123456789012:fifo.fifo",
            "awsRegion": "us-east-2"
        }
    ]
}
```

# Membuat dan mengonfigurasi pemetaan sumber peristiwa Amazon SQS
<a name="services-sqs-configure"></a>

Untuk memproses pesan Amazon SQS dengan Lambda, konfigurasikan antrian Anda dengan pengaturan yang sesuai, lalu buat pemetaan sumber peristiwa Lambda.

**Topics**
+ [

## Mengonfigurasi antrean untuk digunakan dengan Lambda
](#events-sqs-queueconfig)
+ [

## Menyiapkan izin peran eksekusi Lambda
](#events-sqs-permissions)
+ [

## Membuat pemetaan sumber acara SQS
](#events-sqs-eventsource)

## Mengonfigurasi antrean untuk digunakan dengan Lambda
<a name="events-sqs-queueconfig"></a>

Jika Anda belum memiliki antrean Amazon SQS yang ada, [buat](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-configure-create-queue.html) antrean untuk berfungsi sebagai sumber acara untuk fungsi Lambda Anda. [Fungsi Lambda dan antrian Amazon SQS harus Wilayah AWS sama, meskipun bisa berbeda. Akun AWS](with-sqs-cross-account-example.md)

Untuk memungkinkan waktu fungsi Anda memproses setiap kumpulan rekaman, atur [batas waktu visibilitas](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) antrian sumber menjadi setidaknya enam kali batas [waktu konfigurasi](configuration-timeout.md) pada fungsi Anda. Waktu tambahan memungkinkan Lambda untuk mencoba lagi jika fungsi Anda dibatasi saat memproses batch sebelumnya.

**catatan**  
Batas waktu fungsi Anda harus kurang dari atau sama dengan batas waktu visibilitas antrian. Lambda memvalidasi persyaratan ini saat Anda membuat atau memperbarui pemetaan sumber peristiwa dan akan menampilkan kesalahan jika batas waktu fungsi melebihi batas waktu visibilitas antrian.

Secara default, jika Lambda menemukan kesalahan di titik mana pun saat memproses batch, semua pesan dalam batch tersebut kembali ke antrian. Setelah [batas waktu visibilitas](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html), pesan menjadi terlihat oleh Lambda lagi. Anda dapat mengonfigurasi pemetaan sumber peristiwa untuk menggunakan [respons batch sebagian](services-sqs-errorhandling.md#services-sqs-batchfailurereporting) agar hanya mengembalikan pesan yang gagal kembali ke antrian. Selain itu, jika fungsi Anda gagal memproses pesan beberapa kali, Amazon SQS dapat mengirimkannya ke antrian huruf [mati](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html). Sebaiknya setel [kebijakan redrive](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-dead-letter-queues.html#policies-for-dead-letter-queues) antrian sumber Anda ke setidaknya 5. `maxReceiveCount` Ini memberi Lambda beberapa kesempatan untuk mencoba lagi sebelum mengirim pesan yang gagal langsung ke antrian surat mati.

## Menyiapkan izin peran eksekusi Lambda
<a name="events-sqs-permissions"></a>

Kebijakan [ AWSLambdaSQSQueueExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaSQSQueueExecutionRole.html) AWS terkelola mencakup izin yang perlu dibaca Lambda dari antrean Amazon SQS Anda. Anda dapat menambahkan kebijakan terkelola ini ke [peran eksekusi](lambda-intro-execution-role.md) fungsi Anda.

Secara opsional, jika Anda menggunakan antrean terenkripsi, Anda juga perlu menambahkan izin berikut ke peran eksekusi Anda:
+ [kms:Decrypt](https://docs.aws.amazon.com/kms/latest/APIReference/API_Decrypt.html)

## Membuat pemetaan sumber acara SQS
<a name="events-sqs-eventsource"></a>

Buat pemetaan sumber kejadian untuk memberi tahu Lambda agar mengirim item dari antrean Anda ke fungsi Lambda. Anda dapat membuat beberapa pemetaan sumber kejadian untuk memproses item dari beberapa antrean dengan satu fungsi. Ketika Lambda memanggil fungsi target, kejadian dapat berisi beberapa item, hingga *ukuran batch* maksimum yang dapat dikonfigurasi.

Untuk mengonfigurasi fungsi agar dibaca dari Amazon SQS, lampirkan kebijakan [ AWSLambdaSQSQueueExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaSQSQueueExecutionRole.html) AWS terkelola ke peran eksekusi Anda. Kemudian, buat pemetaan sumber peristiwa **SQS** dari konsol menggunakan langkah-langkah berikut.

**Untuk menambahkan izin dan membuat pemicu**

1. Buka [Halaman fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih nama sebuah fungsi.

1. Pilih tab **Konfigurasi**, lalu pilih **Izin**.

1. Di bawah **Nama peran**, pilih tautan ke peran eksekusi Anda. Tautan ini membuka peran di konsol IAM.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/execution-role.png)

1. Pilih **Tambahkan izin**, lalu pilih **Lampirkan kebijakan**.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/attach-policies.png)

1. Di bidang pencarian, masukkan`AWSLambdaSQSQueueExecutionRole`. Tambahkan kebijakan ini ke peran eksekusi Anda. Ini adalah kebijakan AWS terkelola yang berisi izin yang perlu dibaca fungsi Anda dari antrean Amazon SQS. Untuk informasi selengkapnya tentang kebijakan ini, lihat [ AWSLambdaSQSQueueExecutionRole](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AWSLambdaSQSQueueExecutionRole.html)di *Referensi Kebijakan AWS Terkelola*.

1. Kembali ke fungsi Anda di konsol Lambda. Di bagian **Gambaran umum fungsi**, pilih **Tambah pemicu**.  
![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/add-trigger.png)

1. Pilih jenis pemicu.

1. Konfigurasikan opsi yang diperlukan, lalu pilih **Tambah**.

Lambda mendukung opsi konfigurasi berikut untuk sumber peristiwa Amazon SQS:

**Antrian SQS**  
Antrian Amazon SQS untuk membaca catatan dari. [Fungsi Lambda dan antrian Amazon SQS harus Wilayah AWS sama, meskipun bisa berbeda. Akun AWS](with-sqs-cross-account-example.md)

**Aktifkan pemicu**  
Status pemetaan sumber acara. **Aktifkan pemicu** dipilih secara default.

**Ukuran batch**  
Jumlah maksimum catatan untuk dikirim ke fungsi di setiap batch. Untuk antrian standar, ini bisa mencapai 10.000 catatan. Untuk antrian FIFO, maksimum adalah 10. Untuk ukuran batch lebih dari 10, Anda juga harus mengatur batch window (`MaximumBatchingWindowInSeconds`) setidaknya 1 detik.  
Konfigurasikan [batas waktu fungsi](https://serverlessland.com/content/service/lambda/guides/aws-lambda-operator-guide/configurations#timeouts) Anda untuk memberikan waktu yang cukup untuk memproses seluruh kumpulan item. Jika item membutuhkan waktu lama untuk diproses, pilih ukuran batch yang lebih kecil. Ukuran batch yang besar dapat meningkatkan efisiensi beban kerja yang sangat cepat atau memiliki banyak overhead. Jika Anda mengonfigurasi [konkurensi cadangan](configuration-concurrency.md) pada fungsi Anda, setel minimal lima eksekusi bersamaan untuk mengurangi kemungkinan kesalahan pelambatan saat Lambda memanggil fungsi Anda.  
Lambda meneruskan semua catatan dalam batch ke fungsi dalam satu panggilan, selama ukuran total peristiwa tidak melebihi [kuota ukuran payload pemanggilan untuk pemanggilan](gettingstarted-limits.md) sinkron (6 MB). Baik Lambda dan Amazon SQS menghasilkan metadata untuk setiap catatan. Metadata tambahan ini dihitung terhadap ukuran muatan total dan dapat menyebabkan jumlah total catatan yang dikirim dalam batch menjadi lebih rendah dari ukuran batch yang dikonfigurasi. Bidang metadata yang dikirimkan Amazon SQS dapat bervariasi panjangnya. Untuk informasi selengkapnya tentang bidang metadata Amazon SQS, lihat dokumentasi operasi [ReceiveMessage](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/APIReference/API_ReceiveMessage.html)API di Referensi API Layanan *Antrian Sederhana Amazon*.

**Jendela batch**  
Jumlah waktu maksimum untuk mengumpulkan rekaman sebelum memanggil fungsi, dalam hitungan detik. Ini hanya berlaku untuk antrian standar.  
Jika Anda menggunakan jendela batch lebih dari 0 detik, Anda harus memperhitungkan peningkatan waktu pemrosesan dalam batas waktu [visibilitas](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-visibility-timeout.html) antrian Anda. Sebaiknya atur batas waktu visibilitas antrian Anda menjadi enam kali [batas waktu fungsi](configuration-timeout.md) Anda, ditambah nilai. `MaximumBatchingWindowInSeconds` Ini memungkinkan waktu untuk fungsi Lambda Anda memproses setiap batch peristiwa dan mencoba kembali jika terjadi kesalahan thrthrottling.  
Ketika pesan tersedia, Lambda mulai memproses pesan dalam batch. Lambda mulai memproses lima batch sekaligus dengan lima pemanggilan fungsi Anda secara bersamaan. Jika pesan masih tersedia, Lambda menambahkan hingga 300 pemanggilan fungsi secara bersamaan dalam satu menit, hingga maksimum 1.250 pemanggilan bersamaan. Saat menggunakan mode yang disediakan, setiap poller peristiwa dapat menangani hingga 1 throughput, hingga 10 MB/s pemanggilan bersamaan, atau hingga 10 panggilan API polling Amazon SQS per detik. Lambda menskalakan jumlah poller peristiwa antara minimum dan maksimum yang dikonfigurasi, dengan cepat menambahkan hingga 1.000 pemanggilan bersamaan per menit untuk menyediakan pemrosesan latensi rendah pada peristiwa Amazon SQS Anda. Anda mengontrol penskalaan dan konkurensi melalui pengaturan poller peristiwa minimum dan maksimum ini. Untuk mempelajari lebih lanjut tentang penskalaan fungsi dan konkurensi, lihat. [Memahami penskalaan fungsi Lambda](lambda-concurrency.md)  
Untuk memproses lebih banyak pesan, Anda dapat mengoptimalkan fungsi Lambda untuk throughput yang lebih tinggi. Untuk informasi selengkapnya, lihat [Memahami cara AWS Lambda menskalakan dengan antrian standar Amazon SQS](https://aws.amazon.com/blogs/compute/understanding-how-aws-lambda-scales-when-subscribed-to-amazon-sqs-queues/#:~:text=If there are more messages,messages from the SQS queue.).

**Kriteria filter**  
Tambahkan kriteria filter untuk mengontrol peristiwa yang dikirim Lambda ke fungsi Anda untuk diproses. Untuk informasi selengkapnya, lihat [Kontrol peristiwa mana yang dikirim Lambda ke fungsi Anda](invocation-eventfiltering.md).

**Konkurensi maksimum**  
Jumlah maksimum fungsi bersamaan yang dapat dipanggil sumber peristiwa. Tidak dapat digunakan dengan Mode Penyediaan diaktifkan. Untuk informasi selengkapnya, lihat [Mengkonfigurasi konkurensi maksimum untuk sumber peristiwa Amazon SQS](services-sqs-scaling.md#events-sqs-max-concurrency).

**Mode yang Disediakan**  
Saat diaktifkan, alokasikan sumber daya polling khusus untuk pemetaan sumber acara Anda. Anda dapat mengonfigurasi jumlah poller acara minimum (2-200) dan maksimum (2-2000). Setiap event poller dapat menangani hingga 1 MB/sec throughput, hingga 10 pemanggilan bersamaan, atau hingga 10 panggilan API polling Amazon SQS per detik.  
Catatan: Anda tidak dapat menggunakan Provisioned Mode dan Maximum concurrency bersama-sama. Saat Mode Penyediaan diaktifkan, gunakan pengaturan poller maksimum untuk mengontrol konkurensi.

# Mengkonfigurasi perilaku penskalaan untuk pemetaan sumber peristiwa SQS
<a name="services-sqs-scaling"></a>

Anda dapat mengontrol perilaku penskalaan pemetaan sumber peristiwa Amazon SQS baik melalui pengaturan konkurensi maksimum atau dengan mengaktifkan mode yang disediakan. Ini adalah opsi yang saling eksklusif.

Secara default, Lambda secara otomatis menskalakan poller acara berdasarkan volume pesan. Saat mengaktifkan mode yang disediakan, Anda mengalokasikan jumlah minimum dan maksimum sumber daya polling khusus yang tetap siap menangani pola lalu lintas yang diharapkan. Ini memungkinkan Anda mengoptimalkan kinerja pemetaan sumber acara dengan dua cara:
+ Mode standar (Default): Lambda secara otomatis mengelola penskalaan, dimulai dengan sejumlah kecil poller dan penskalaan naik atau turun berdasarkan beban kerja.
+ Mode yang disediakan: Anda mengonfigurasi sumber daya polling khusus dengan batas minimum dan maksimum, memungkinkan penskalaan 3 kali lebih cepat dan kapasitas pemrosesan hingga 16 kali lebih tinggi.

Untuk antrian standar, Lambda menggunakan polling [panjang untuk melakukan polling](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html#sqs-long-polling) antrian hingga menjadi aktif. Saat pesan tersedia, Lambda mulai memproses lima batch sekaligus dengan lima pemanggilan fungsi Anda secara bersamaan. Jika pesan masih tersedia, Lambda meningkatkan jumlah proses yang membaca batch hingga 300 pemanggilan bersamaan per menit. Jumlah maksimum pemanggilan yang dapat diproses oleh pemetaan sumber peristiwa secara bersamaan adalah 1.250. Ketika lalu lintas rendah, Lambda menskalakan kembali pemrosesan ke lima pemanggilan bersamaan, dan dapat mengoptimalkan sedikitnya 2 pemanggilan bersamaan untuk mengurangi panggilan Amazon SQS dan biaya terkait. Namun, pengoptimalan ini tidak tersedia saat Anda mengaktifkan pengaturan konkurensi maksimum.

Untuk antrean FIFO, Lambda mengirimkan pesan ke fungsi Anda sesuai urutan penerimaan. Saat Anda mengirimkan pesan ke antrean FIFO, Anda menentukan [ID grup pesan](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html). Amazon SQS memastikan bahwa pesan dalam grup yang sama dikirim ke Lambda secara berurutan. Saat Lambda membaca pesan Anda ke dalam batch, setiap batch mungkin berisi pesan dari lebih dari satu grup pesan, tetapi urutan pesan tetap terjaga. Jika fungsi Anda menampilkan kesalahan, fungsi akan mencoba semua percobaan ulang pada pesan yang terpengaruh sebelum Lambda menerima pesan tambahan dari grup yang sama.

Saat menggunakan mode yang disediakan, setiap poller peristiwa dapat menangani hingga 1 throughput, hingga 10 MB/sec pemanggilan bersamaan, atau hingga 10 panggilan API polling Amazon SQS per detik. Lambda menskalakan jumlah poller peristiwa antara minimum dan maksimum yang dikonfigurasi, dengan cepat menambahkan hingga 1.000 konkurensi per menit untuk menyediakan pemrosesan peristiwa Amazon SQS yang konsisten dan latensi rendah. Menggunakan mode yang disediakan menimbulkan biaya tambahan. Untuk harga terperinci, lihat [AWS Lambda harga](https://aws.amazon.com/lambda/pricing/). Setiap poller acara menggunakan [polling panjang](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-short-and-long-polling.html) ke antrean SQS Anda hingga 10 polling per detik, yang menimbulkan biaya permintaan SQS API. Lihat [harga Amazon SQS untuk detailnya](https://aws.amazon.com/sqs/pricing/ ). Anda mengontrol penskalaan dan konkurensi melalui pengaturan poller peristiwa minimum dan maksimum ini, daripada menggunakan pengaturan konkurensi maksimum, karena opsi ini tidak dapat digunakan bersama.

**catatan**  
Anda tidak dapat menggunakan pengaturan konkurensi maksimum dan mode yang disediakan secara bersamaan. Saat mode yang disediakan diaktifkan, Anda mengontrol penskalaan dan konkurensi pemetaan sumber peristiwa Amazon SQS melalui jumlah minimum dan maksimum poller peristiwa.

## Mengkonfigurasi konkurensi maksimum untuk sumber peristiwa Amazon SQS
<a name="events-sqs-max-concurrency"></a>

Anda dapat menggunakan setelan konkurensi maksimum untuk mengontrol perilaku penskalaan untuk sumber peristiwa SQS Anda. Perhatikan bahwa konkurensi maksimum tidak dapat digunakan dengan mode yang disediakan diaktifkan. Setelan konkurensi maksimum membatasi jumlah instance bersamaan dari fungsi yang dapat dipanggil oleh sumber peristiwa Amazon SQS. Konkurensi maksimum adalah pengaturan tingkat sumber acara. Jika Anda memiliki beberapa sumber peristiwa Amazon SQS yang dipetakan ke satu fungsi, setiap sumber peristiwa dapat memiliki setelan konkurensi maksimum yang terpisah. Anda dapat menggunakan konkurensi maksimum untuk mencegah satu antrian menggunakan semua [konkurensi cadangan fungsi atau sisa kuota konkurensi](configuration-concurrency.md) [akun](gettingstarted-limits.md). Tidak ada biaya untuk mengonfigurasi konkurensi maksimum pada sumber acara Amazon SQS.

Yang penting, konkurensi maksimum dan konkurensi cadangan adalah dua pengaturan independen. Jangan menetapkan konkurensi maksimum yang lebih tinggi dari konkurensi cadangan fungsi. Jika Anda mengonfigurasi konkurensi maksimum, pastikan konkurensi cadangan fungsi Anda lebih besar dari atau sama dengan total konkurensi maksimum untuk semua sumber peristiwa Amazon SQS pada fungsi tersebut. Jika tidak, Lambda dapat membatasi pesan Anda.

Jika kuota konkurensi akun Anda disetel ke nilai default 1.000, pemetaan sumber peristiwa Amazon SQS dapat menskalakan untuk memanggil instance fungsi hingga nilai ini, kecuali Anda menentukan konkurensi maksimum.

Jika Anda menerima peningkatan kuota konkurensi default akun Anda, Lambda mungkin tidak dapat menjalankan instance fungsi bersamaan hingga kuota baru Anda. Secara default, Lambda dapat menskalakan untuk menjalankan hingga 1.250 instance fungsi bersamaan untuk pemetaan sumber peristiwa Amazon SQS. Jika ini tidak cukup untuk kasus penggunaan Anda, hubungi AWS dukungan untuk mendiskusikan peningkatan konkurensi pemetaan sumber peristiwa Amazon SQS akun Anda.

**catatan**  
Untuk antrian FIFO, pemanggilan bersamaan dibatasi oleh jumlah [grup pesan IDs](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/using-messagegroupid-property.html) (`messageGroupId`) atau pengaturan konkurensi maksimum—mana yang lebih rendah. Misalnya, jika Anda memiliki enam grup pesan IDs dan konkurensi maksimum disetel ke 10, fungsi Anda dapat memiliki maksimal enam pemanggilan bersamaan.

Anda dapat mengonfigurasi konkurensi maksimum pada pemetaan sumber peristiwa Amazon SQS baru dan yang sudah ada.

**Konfigurasikan konkurensi maksimum menggunakan konsol Lambda**

1. Buka [Halaman fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih nama sebuah fungsi.

1. Di bawah **Ikhtisar fungsi**, pilih **SQS.** Ini membuka tab **Konfigurasi**.

1. **Pilih pemicu Amazon SQS dan pilih Edit.**

1. Untuk **Konkurensi maksimum**, masukkan angka antara 2 dan 1.000. Untuk mematikan konkurensi maksimum, biarkan kotak kosong.

1. Pilih **Simpan**.

**Konfigurasikan konkurensi maksimum menggunakan AWS Command Line Interface ()AWS CLI**  
Gunakan perintah [update-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-event-source-mapping.html) dengan opsi `--scaling-config`. Contoh:

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --scaling-config '{"MaximumConcurrency":5}'
```

Untuk mematikan konkurensi maksimum, masukkan nilai kosong untuk`--scaling-config`:

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --scaling-config "{}"
```

**Konfigurasikan konkurensi maksimum menggunakan API Lambda**  
Gunakan [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)atau [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)tindakan dengan [ScalingConfig](https://docs.aws.amazon.com/lambda/latest/api/API_ScalingConfig.html)objek.

# Menangani kesalahan untuk sumber peristiwa SQS di Lambda
<a name="services-sqs-errorhandling"></a>

Untuk menangani kesalahan yang terkait dengan sumber peristiwa SQS, Lambda secara otomatis menggunakan strategi coba lagi dengan strategi backoff. Anda juga dapat menyesuaikan perilaku penanganan kesalahan dengan mengonfigurasi pemetaan sumber peristiwa SQS Anda untuk mengembalikan respons batch [sebagian](#services-sqs-batchfailurereporting).

## Strategi backoff untuk pemanggilan yang gagal
<a name="services-sqs-backoff-strategy"></a>

Ketika pemanggilan gagal, Lambda mencoba lagi pemanggilan sambil menerapkan strategi backoff. Strategi backoff sedikit berbeda tergantung pada apakah Lambda mengalami kegagalan karena kesalahan dalam kode fungsi Anda, atau karena pelambatan.
+  Jika **kode fungsi** Anda menyebabkan kesalahan, Lambda akan berhenti memproses dan mencoba kembali pemanggilan. Sementara itu, Lambda secara bertahap mundur, mengurangi jumlah konkurensi yang dialokasikan ke pemetaan sumber peristiwa Amazon SQS Anda. Setelah batas waktu visibilitas antrian Anda habis, pesan akan muncul kembali dalam antrian. 
+ Jika pemanggilan gagal karena pelambatan, **Lambda** secara bertahap menghentikan percobaan ulang dengan mengurangi jumlah konkurensi yang dialokasikan ke pemetaan sumber peristiwa Amazon SQS Anda. Lambda terus mencoba lagi pesan hingga stempel waktu pesan melebihi batas waktu visibilitas antrian Anda, di mana Lambda menghapus pesan.

## Menerapkan tanggapan batch sebagian
<a name="services-sqs-batchfailurereporting"></a>

Saat fungsi Lambda Anda mengalami kesalahan saat memproses batch, semua pesan dalam kumpulan tersebut akan terlihat lagi dalam antrian secara default, termasuk pesan yang berhasil diproses Lambda. Akibatnya, fungsi Anda akhirnya dapat memproses pesan yang sama beberapa kali.

Untuk menghindari pemrosesan ulang pesan yang berhasil diproses dalam kumpulan yang gagal, Anda dapat mengonfigurasi pemetaan sumber peristiwa agar hanya pesan yang gagal terlihat lagi. Ini disebut respon batch paral. Untuk mengaktifkan respons batch sebagian, tentukan `ReportBatchItemFailures` [FunctionResponseTypes](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html#lambda-UpdateEventSourceMapping-request-FunctionResponseTypes)tindakan saat mengonfigurasi pemetaan sumber peristiwa Anda. Ini memungkinkan fungsi Anda mengembalikan sebagian keberhasilan, yang dapat membantu mengurangi jumlah percobaan ulang yang tidak perlu pada catatan.

**catatan**  
[Utilitas Prosesor Batch](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/) dari Powertools untuk AWS Lambda menangani semua logika respons batch paral secara otomatis. Utilitas ini menyederhanakan penerapan pola pemrosesan batch dan mengurangi kode khusus yang diperlukan untuk menangani kegagalan item batch dengan benar. Ini tersedia untuk Python, Java, TypeScript, dan .NET.

Saat `ReportBatchItemFailures` diaktifkan, Lambda tidak [mengurangi polling pesan saat pemanggilan](#services-sqs-backoff-strategy) fungsi gagal. Jika Anda mengharapkan beberapa pesan gagal—dan Anda tidak ingin kegagalan tersebut memengaruhi laju pemrosesan pesan—gunakan. `ReportBatchItemFailures`

**catatan**  
Ingatlah hal berikut saat menggunakan respons batch sebagian:  
Jika fungsi Anda melempar pengecualian, seluruh batch dianggap gagal total.
Jika Anda menggunakan fitur ini dengan antrian FIFO, fungsi Anda harus berhenti memproses pesan setelah kegagalan pertama dan mengembalikan semua pesan yang gagal dan belum diproses. `batchItemFailures` Ini membantu menjaga urutan pesan dalam antrian Anda.

**Untuk mengaktifkan pelaporan batch sebagian**

1. Tinjau [Praktik terbaik untuk mengimplementasikan respons batch sebagian](https://docs.aws.amazon.com/prescriptive-guidance/latest/lambda-event-filtering-partial-batch-responses-for-sqs/best-practices-partial-batch-responses.html).

1. Jalankan perintah berikut `ReportBatchItemFailures` untuk mengaktifkan fungsi Anda. Untuk mengambil UUID pemetaan sumber acara Anda, jalankan perintah. [list-event-source-mappings](https://docs.aws.amazon.com/cli/latest/reference/lambda/list-event-source-mappings.html) AWS CLI 

   ```
   aws lambda update-event-source-mapping \
   --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
   --function-response-types "ReportBatchItemFailures"
   ```

1. Perbarui kode fungsi Anda untuk menangkap semua pengecualian dan mengembalikan pesan yang gagal dalam respons `batchItemFailures` JSON. `batchItemFailures`Respons harus menyertakan daftar pesan IDs, sebagai nilai `itemIdentifier` JSON.

   Misalnya, Anda memiliki sekumpulan lima pesan, dengan pesan IDs `id1`,,`id2`, `id3``id4`, dan`id5`. Fungsi Anda berhasil memproses`id1`,`id3`, dan`id5`. Untuk membuat pesan `id2` dan `id4` terlihat lagi dalam antrian Anda, fungsi Anda harus mengembalikan respons berikut: 

   ```
   { 
     "batchItemFailures": [ 
           {
               "itemIdentifier": "id2"
           },
           {
               "itemIdentifier": "id4"
           }
       ]
   }
   ```

   Berikut adalah beberapa contoh kode fungsi yang mengembalikan daftar pesan gagal IDs dalam batch:

------
#### [ .NET ]

**SDK untuk .NET**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Melaporkan kegagalan item batch SQS dengan Lambda menggunakan.NET.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   using Amazon.Lambda.Core;
   using Amazon.Lambda.SQSEvents;
   
   // Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
   [assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
   namespace sqsSample;
   
   public class Function
   {
       public async Task<SQSBatchResponse> FunctionHandler(SQSEvent evnt, ILambdaContext context)
       {
           List<SQSBatchResponse.BatchItemFailure> batchItemFailures = new List<SQSBatchResponse.BatchItemFailure>();
           foreach(var message in evnt.Records)
           {
               try
               {
                   //process your message
                   await ProcessMessageAsync(message, context);
               }
               catch (System.Exception)
               {
                   //Add failed message identifier to the batchItemFailures list
                   batchItemFailures.Add(new SQSBatchResponse.BatchItemFailure{ItemIdentifier=message.MessageId}); 
               }
           }
           return new SQSBatchResponse(batchItemFailures);
       }
   
       private async Task ProcessMessageAsync(SQSEvent.SQSMessage message, ILambdaContext context)
       {
           if (String.IsNullOrEmpty(message.Body))
           {
               throw new Exception("No Body in SQS Message.");
           }
           context.Logger.LogInformation($"Processed message {message.Body}");
           // TODO: Do interesting work based on the new message
           await Task.CompletedTask;
       }
   }
   ```

------
#### [ Go ]

**SDK untuk Go V2**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Melaporkan kegagalan item batch SQS dengan Lambda menggunakan Go.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   package main
   
   import (
   	"context"
   	"fmt"
   	"github.com/aws/aws-lambda-go/events"
   	"github.com/aws/aws-lambda-go/lambda"
   )
   
   func handler(ctx context.Context, sqsEvent events.SQSEvent) (map[string]interface{}, error) {
   	batchItemFailures := []map[string]interface{}{}
   
   	for _, message := range sqsEvent.Records {
   		if len(message.Body) > 0 {
   			// Your message processing condition here
   			fmt.Printf("Successfully processed message: %s\n", message.Body)
   		} else {
   			// Message processing failed
   			fmt.Printf("Failed to process message %s\n", message.MessageId)
   			batchItemFailures = append(batchItemFailures, map[string]interface{}{"itemIdentifier": message.MessageId})
   		}
   	}
   
   	sqsBatchResponse := map[string]interface{}{
   		"batchItemFailures": batchItemFailures,
   	}
   	return sqsBatchResponse, nil
   }
   
   func main() {
   	lambda.Start(handler)
   }
   ```

------
#### [ Java ]

**SDK untuk Java 2.x**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Melaporkan kegagalan item batch SQS dengan Lambda menggunakan Java.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   import com.amazonaws.services.lambda.runtime.Context;
   import com.amazonaws.services.lambda.runtime.RequestHandler;
   import com.amazonaws.services.lambda.runtime.events.SQSEvent;
   import com.amazonaws.services.lambda.runtime.events.SQSBatchResponse;
    
   import java.util.ArrayList;
   import java.util.List;
    
   public class ProcessSQSMessageBatch implements RequestHandler<SQSEvent, SQSBatchResponse> {
       @Override
       public SQSBatchResponse handleRequest(SQSEvent sqsEvent, Context context) {
            List<SQSBatchResponse.BatchItemFailure> batchItemFailures = new ArrayList<SQSBatchResponse.BatchItemFailure>();
   
            for (SQSEvent.SQSMessage message : sqsEvent.getRecords()) {
                try {
                    //process your message
                } catch (Exception e) {
                    //Add failed message identifier to the batchItemFailures list
                    batchItemFailures.add(new SQSBatchResponse.BatchItemFailure(message.getMessageId()));
                }
            }
            return new SQSBatchResponse(batchItemFailures);
        }
   }
   ```

------
#### [ JavaScript ]

**SDK untuk JavaScript (v3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Melaporkan kegagalan item batch SQS dengan penggunaan JavaScript Lambda.  

   ```
   // Node.js 20.x Lambda runtime, AWS SDK for Javascript V3
   export const handler = async (event, context) => {
       const batchItemFailures = [];
       for (const record of event.Records) {
           try {
               await processMessageAsync(record, context);
           } catch (error) {
               batchItemFailures.push({ itemIdentifier: record.messageId });
           }
       }
       return { batchItemFailures };
   };
   
   async function processMessageAsync(record, context) {
       if (record.body && record.body.includes("error")) {
           throw new Error("There is an error in the SQS Message.");
       }
       console.log(`Processed message: ${record.body}`);
   }
   ```
Melaporkan kegagalan item batch SQS dengan penggunaan TypeScript Lambda.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   import { SQSEvent, SQSBatchResponse, Context, SQSBatchItemFailure, SQSRecord } from 'aws-lambda';
   
   export const handler = async (event: SQSEvent, context: Context): Promise<SQSBatchResponse> => {
       const batchItemFailures: SQSBatchItemFailure[] = [];
   
       for (const record of event.Records) {
           try {
               await processMessageAsync(record);
           } catch (error) {
               batchItemFailures.push({ itemIdentifier: record.messageId });
           }
       }
   
       return {batchItemFailures: batchItemFailures};
   };
   
   async function processMessageAsync(record: SQSRecord): Promise<void> {
       if (record.body && record.body.includes("error")) {
           throw new Error('There is an error in the SQS Message.');
       }
       console.log(`Processed message ${record.body}`);
   }
   ```

------
#### [ PHP ]

**SDK untuk PHP**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Melaporkan kegagalan item batch SQS dengan Lambda menggunakan PHP.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   <?php
   
   use Bref\Context\Context;
   use Bref\Event\Sqs\SqsEvent;
   use Bref\Event\Sqs\SqsHandler;
   use Bref\Logger\StderrLogger;
   
   require __DIR__ . '/vendor/autoload.php';
   
   class Handler extends SqsHandler
   {
       private StderrLogger $logger;
       public function __construct(StderrLogger $logger)
       {
           $this->logger = $logger;
       }
   
       /**
        * @throws JsonException
        * @throws \Bref\Event\InvalidLambdaEvent
        */
       public function handleSqs(SqsEvent $event, Context $context): void
       {
           $this->logger->info("Processing SQS records");
           $records = $event->getRecords();
   
           foreach ($records as $record) {
               try {
                   // Assuming the SQS message is in JSON format
                   $message = json_decode($record->getBody(), true);
                   $this->logger->info(json_encode($message));
                   // TODO: Implement your custom processing logic here
               } catch (Exception $e) {
                   $this->logger->error($e->getMessage());
                   // failed processing the record
                   $this->markAsFailed($record);
               }
           }
           $totalRecords = count($records);
           $this->logger->info("Successfully processed $totalRecords SQS records");
       }
   }
   
   $logger = new StderrLogger();
   return new Handler($logger);
   ```

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

**SDK untuk Python (Boto3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Melaporkan kegagalan item batch SQS dengan Lambda menggunakan Python.  

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   
   def lambda_handler(event, context):
       if event:
           batch_item_failures = []
           sqs_batch_response = {}
        
           for record in event["Records"]:
               try:
                   print(f"Processed message: {record['body']}")
               except Exception as e:
                   batch_item_failures.append({"itemIdentifier": record['messageId']})
           
           sqs_batch_response["batchItemFailures"] = batch_item_failures
           return sqs_batch_response
   ```

------
#### [ Ruby ]

**SDK untuk Ruby**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda-with-batch-item-handling). 
Melaporkan kegagalan item batch SQS dengan Lambda menggunakan Ruby.  

   ```
   # Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   # SPDX-License-Identifier: Apache-2.0
   require 'json'
   
   def lambda_handler(event:, context:)
     if event
       batch_item_failures = []
       sqs_batch_response = {}
   
       event["Records"].each do |record|
         begin
           # process message
         rescue StandardError => e
           batch_item_failures << {"itemIdentifier" => record['messageId']}
         end
       end
   
       sqs_batch_response["batchItemFailures"] = batch_item_failures
       return sqs_batch_response
     end
   end
   ```

------
#### [ Rust ]

**SDK for Rust**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/lambda-function-sqs-report-batch-item-failures). 
Melaporkan kegagalan item batch SQS dengan Lambda menggunakan Rust.  

   ```
   // Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
   // SPDX-License-Identifier: Apache-2.0
   use aws_lambda_events::{
       event::sqs::{SqsBatchResponse, SqsEvent},
       sqs::{BatchItemFailure, SqsMessage},
   };
   use lambda_runtime::{run, service_fn, Error, LambdaEvent};
   
   async fn process_record(_: &SqsMessage) -> Result<(), Error> {
       Err(Error::from("Error processing message"))
   }
   
   async fn function_handler(event: LambdaEvent<SqsEvent>) -> Result<SqsBatchResponse, Error> {
       let mut batch_item_failures = Vec::new();
       for record in event.payload.records {
           match process_record(&record).await {
               Ok(_) => (),
               Err(_) => batch_item_failures.push(BatchItemFailure {
                   item_identifier: record.message_id.unwrap(),
               }),
           }
       }
   
       Ok(SqsBatchResponse {
           batch_item_failures,
       })
   }
   
   #[tokio::main]
   async fn main() -> Result<(), Error> {
       run(service_fn(function_handler)).await
   }
   ```

------

Jika peristiwa gagal tidak kembali ke antrian, lihat [Bagaimana cara memecahkan masalah fungsi Lambda](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-sqs-report-batch-item-failures/) SQS? ReportBatchItemFailures di pusat AWS pengetahuan.

### Status berhasil dan gagal
<a name="sqs-batchfailurereporting-conditions"></a>

Lambda memperlakukan batch sebagai sukses total jika fungsi Anda mengembalikan salah satu dari berikut ini:
+ Daftar `batchItemFailures` kosong
+ Daftar `batchItemFailures` nol
+ `EventResponse` kosong
+ `EventResponse` nol

Lambda memperlakukan batch sebagai kegagalan total jika fungsi Anda mengembalikan salah satu dari berikut ini:
+ Respons JSON yang tidak valid
+ String `itemIdentifier` kosong
+ `itemIdentifier` nol
+ `itemIdentifier` dengan nama kunci yang buruk
+ `itemIdentifier`Nilai dengan ID pesan yang tidak ada

### CloudWatch metrik
<a name="sqs-batchfailurereporting-metrics"></a>

Untuk menentukan apakah fungsi Anda melaporkan kegagalan item batch dengan benar, Anda dapat memantau metrik `ApproximateAgeOfOldestMessage` Amazon SQS `NumberOfMessagesDeleted` dan Amazon di Amazon. CloudWatch
+ `NumberOfMessagesDeleted`melacak jumlah pesan yang dihapus dari antrian Anda. Jika ini turun ke 0, ini adalah tanda bahwa respons fungsi Anda tidak mengembalikan pesan yang gagal dengan benar.
+ `ApproximateAgeOfOldestMessage`melacak berapa lama pesan tertua telah tinggal di antrian Anda. Peningkatan tajam dalam metrik ini dapat menunjukkan bahwa fungsi Anda tidak mengembalikan pesan yang gagal dengan benar.

### Menggunakan Powertools untuk prosesor AWS Lambda batch
<a name="services-sqs-batchfailurereporting-powertools"></a>

Utilitas prosesor batch dari Powertools untuk AWS Lambda secara otomatis menangani logika respons batch paral, mengurangi kompleksitas penerapan pelaporan kegagalan batch. Berikut adalah contoh menggunakan prosesor batch:

**Python**  
Untuk contoh lengkap dan petunjuk penyiapan, lihat [dokumentasi prosesor batch](https://docs.powertools.aws.dev/lambda/python/latest/utilities/batch/).
Memproses pesan Amazon SQS dengan prosesor AWS Lambda batch.  

```
import json
from aws_lambda_powertools import Logger
from aws_lambda_powertools.utilities.batch import BatchProcessor, EventType, process_partial_response
from aws_lambda_powertools.utilities.data_classes import SQSEvent
from aws_lambda_powertools.utilities.typing import LambdaContext

processor = BatchProcessor(event_type=EventType.SQS)
logger = Logger()

def record_handler(record):
    logger.info(record)
    # Your business logic here
    # Raise an exception to mark this record as failed
    
def lambda_handler(event, context: LambdaContext):
    return process_partial_response(
        event=event, 
        record_handler=record_handler, 
        processor=processor,
        context=context
    )
```

**TypeScript**  
Untuk contoh lengkap dan petunjuk penyiapan, lihat [dokumentasi prosesor batch](https://docs.aws.amazon.com/powertools/typescript/latest/features/batch/).
Memproses pesan Amazon SQS dengan prosesor AWS Lambda batch.  

```
import { BatchProcessor, EventType, processPartialResponse } from '@aws-lambda-powertools/batch';
import { Logger } from '@aws-lambda-powertools/logger';
import type { SQSEvent, Context } from 'aws-lambda';

const processor = new BatchProcessor(EventType.SQS);
const logger = new Logger();

const recordHandler = async (record: any): Promise<void> => {
    logger.info('Processing record', { record });
    // Your business logic here
    // Throw an error to mark this record as failed
};

export const handler = async (event: SQSEvent, context: Context) => {
    return processPartialResponse(event, recordHandler, processor, {
        context,
    });
};
```

# Parameter Lambda untuk pemetaan sumber peristiwa Amazon SQS
<a name="services-sqs-parameters"></a>

Semua jenis sumber peristiwa Lambda berbagi operasi yang sama [CreateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_CreateEventSourceMapping.html)dan [UpdateEventSourceMapping](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateEventSourceMapping.html)API. Namun, hanya beberapa parameter yang berlaku untuk Amazon SQS.


| Parameter | Diperlukan | Default | Catatan | 
| --- | --- | --- | --- | 
|  BatchSize  |  T  |  10  |  Untuk antrian standar, maksimum 10.000. Untuk antrian FIFO, maksimum adalah 10.  | 
|  Diaktifkan  |  T  |  true  | none  | 
|  EventSourceArn  |  Y  | N/A |  ARN dari aliran data atau konsumen aliran  | 
|  FunctionName  |  Y  | N/A  | none  | 
|  FilterCriteria  |  T  |  N/A   |  [Kontrol peristiwa mana yang dikirim Lambda ke fungsi Anda](invocation-eventfiltering.md)  | 
|  FunctionResponseTypes  |  T  | N/A  |  Agar fungsi Anda melaporkan kegagalan tertentu dalam satu batch, sertakan nilainya `ReportBatchItemFailures``FunctionResponseTypes`. Untuk informasi selengkapnya, lihat [Menerapkan tanggapan batch sebagian](services-sqs-errorhandling.md#services-sqs-batchfailurereporting).  | 
|  MaximumBatchingWindowInSeconds  |  T  |  0  | Jendela batching tidak didukung untuk antrian FIFO | 
|  ProvisionedPollerConfig  |  T  |  N/A  |  Mengkonfigurasi jumlah minimum (2-200) dan maksimum (2-2000) poller acara khusus untuk pemetaan sumber peristiwa SQS. Setiap poller dapat menangani hingga 1 throughput dan 10 MB/sec pemanggilan bersamaan.  | 
|  ScalingConfig  |  T  |  N/A   |  [Mengkonfigurasi konkurensi maksimum untuk sumber peristiwa Amazon SQS](services-sqs-scaling.md#events-sqs-max-concurrency)  | 

# Menggunakan pemfilteran peristiwa dengan sumber peristiwa Amazon SQS
<a name="with-sqs-filtering"></a>

Anda dapat menggunakan pemfilteran peristiwa untuk mengontrol rekaman mana dari aliran atau antrian yang dikirim Lambda ke fungsi Anda. Untuk informasi umum tentang cara kerja penyaringan acara, lihat[Kontrol peristiwa mana yang dikirim Lambda ke fungsi Anda](invocation-eventfiltering.md).

Bagian ini berfokus pada pemfilteran acara untuk sumber acara Amazon SQS.

**catatan**  
Pemetaan sumber peristiwa Amazon SQS hanya mendukung pemfilteran pada kunci. `body`

**Topics**
+ [

## Dasar-dasar pemfilteran acara Amazon SQS
](#filtering-SQS)

## Dasar-dasar pemfilteran acara Amazon SQS
<a name="filtering-SQS"></a>

Misalkan antrian Amazon SQS Anda berisi pesan dalam format JSON berikut.

```
{
    "RecordNumber": 1234,
    "TimeStamp": "yyyy-mm-ddThh:mm:ss",
    "RequestCode": "AAAA"
}
```

Contoh catatan untuk antrian ini akan terlihat sebagai berikut.

```
{
    "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
    "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
    "body": "{\n "RecordNumber": 1234,\n "TimeStamp": "yyyy-mm-ddThh:mm:ss",\n "RequestCode": "AAAA"\n}",
    "attributes": {
        "ApproximateReceiveCount": "1",
        "SentTimestamp": "1545082649183",
        "SenderId": "AIDAIENQZJOLO23YVJ4VO",
        "ApproximateFirstReceiveTimestamp": "1545082649185"
        },
    "messageAttributes": {},
    "md5OfBody": "e4e68fb7bd0e697a0ae8f1bb342846b3",
    "eventSource": "aws:sqs",
    "eventSourceARN": "arn:aws:sqs:us-west-2:123456789012:my-queue",
    "awsRegion": "us-west-2"
}
```

Untuk memfilter berdasarkan konten pesan Amazon SQS Anda, gunakan `body` kunci dalam catatan pesan Amazon SQS. Misalkan Anda hanya ingin memproses catatan tersebut di mana pesan Amazon SQS Anda adalah “BBBB.” `RequestCode` `FilterCriteria`Objeknya adalah sebagai berikut.

```
{
    "Filters": [
        {
            "Pattern": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"
        }
    ]
}
```

Untuk kejelasan tambahan, berikut adalah nilai filter yang `Pattern` diperluas di JSON biasa. 

```
{
    "body": {
        "RequestCode": [ "BBBB" ]
        }
}
```

Anda dapat menambahkan filter menggunakan konsol, AWS CLI atau AWS SAM templat.

------
#### [ Console ]

Untuk menambahkan filter ini menggunakan konsol, ikuti instruksi [Melampirkan kriteria filter ke pemetaan sumber peristiwa (konsol)](invocation-eventfiltering.md#filtering-console) dan masukkan string berikut untuk **kriteria Filter**.

```
{ "body" : { "RequestCode" : [ "BBBB" ] } }
```

------
#### [ AWS CLI ]

Untuk membuat pemetaan sumber peristiwa baru dengan kriteria filter ini menggunakan AWS Command Line Interface (AWS CLI), jalankan perintah berikut.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"}]}'
```

Untuk menambahkan kriteria filter ini ke pemetaan sumber peristiwa yang ada, jalankan perintah berikut.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RequestCode\" : [ \"BBBB\" ] } }"}]}'
```

------
#### [ AWS SAM ]

Untuk menambahkan filter ini menggunakan AWS SAM, tambahkan cuplikan berikut ke template YAMB untuk sumber acara Anda.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "body" : { "RequestCode" : [ "BBBB" ] } }'
```

------

Misalkan Anda ingin fungsi Anda memproses hanya catatan yang `RecordNumber` lebih besar dari 9999. `FilterCriteria`Objeknya adalah sebagai berikut.

```
{
    "Filters": [
        {
            "Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"
        }
    ]
}
```

Untuk kejelasan tambahan, berikut adalah nilai filter yang `Pattern` diperluas di JSON biasa. 

```
{
    "body": {
        "RecordNumber": [
            {
                "numeric": [ ">", 9999 ]
            }
        ]
    }
}
```

Anda dapat menambahkan filter menggunakan konsol, AWS CLI atau AWS SAM templat.

------
#### [ Console ]

Untuk menambahkan filter ini menggunakan konsol, ikuti instruksi [Melampirkan kriteria filter ke pemetaan sumber peristiwa (konsol)](invocation-eventfiltering.md#filtering-console) dan masukkan string berikut untuk **kriteria Filter**.

```
{ "body" : { "RecordNumber" : [ { "numeric": [ ">", 9999 ] } ] } }
```

------
#### [ AWS CLI ]

Untuk membuat pemetaan sumber peristiwa baru dengan kriteria filter ini menggunakan AWS Command Line Interface (AWS CLI), jalankan perintah berikut.

```
aws lambda create-event-source-mapping \
    --function-name my-function \
    --event-source-arn arn:aws:sqs:us-east-2:123456789012:my-queue \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"}]}'
```

Untuk menambahkan kriteria filter ini ke pemetaan sumber peristiwa yang ada, jalankan perintah berikut.

```
aws lambda update-event-source-mapping \
    --uuid "a1b2c3d4-5678-90ab-cdef-11111EXAMPLE" \
    --filter-criteria '{"Filters": [{"Pattern": "{ \"body\" : { \"RecordNumber\" : [ { \"numeric\": [ \">\", 9999 ] } ] } }"}]}'
```

------
#### [ AWS SAM ]

Untuk menambahkan filter ini menggunakan AWS SAM, tambahkan cuplikan berikut ke template YAMB untuk sumber acara Anda.

```
FilterCriteria:
  Filters:
    - Pattern: '{ "body" : { "RecordNumber" : [ { "numeric": [ ">", 9999 ] } ] } }'
```

------

Untuk Amazon SQS, isi pesan dapat berupa string apa pun. Namun, ini bisa menjadi masalah jika Anda `FilterCriteria` `body` berharap berada dalam format JSON yang valid. Skenario sebaliknya juga benar—jika isi pesan yang masuk dalam format JSON tetapi kriteria filter Anda diharapkan menjadi string biasa, ini dapat `body` menyebabkan perilaku yang tidak diinginkan.

Untuk menghindari masalah ini, pastikan bahwa format isi dalam Anda `FilterCriteria` cocok dengan format yang diharapkan `body` dalam pesan yang Anda terima dari antrian Anda. Sebelum memfilter pesan Anda, Lambda secara otomatis mengevaluasi format badan pesan masuk dan pola filter Anda. `body` Jika ada ketidakcocokan, Lambda menjatuhkan pesan. Tabel berikut merangkum evaluasi ini:


| Format pesan `body` masuk | `body`Format pola filter | Tindakan yang dihasilkan | 
| --- | --- | --- | 
|  Tali polos  |  Tali polos  |  Filter Lambda berdasarkan kriteria filter Anda.  | 
|  Tali polos  |  Tidak ada pola filter untuk properti data  |  Filter Lambda (hanya pada properti metadata lainnya) berdasarkan kriteria filter Anda.  | 
|  Tali polos  |  JSON yang valid  |  Lambda menjatuhkan pesan.  | 
|  JSON yang valid  |  Tali polos  |  Lambda menjatuhkan pesan.  | 
|  JSON yang valid  |  Tidak ada pola filter untuk properti data  |  Filter Lambda (hanya pada properti metadata lainnya) berdasarkan kriteria filter Anda.  | 
|  JSON yang valid  |  JSON yang valid  |  Filter Lambda berdasarkan kriteria filter Anda.  | 

# Tutorial: Menggunakan Lambda dengan Amazon SQS
<a name="with-sqs-example"></a>

Dalam tutorial ini, Anda membuat fungsi Lambda yang menggunakan pesan dari antrian [Amazon Simple Queue Service (Amazon](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html) SQS). Fungsi Lambda berjalan setiap kali pesan baru ditambahkan ke antrian. Fungsi ini menulis pesan ke aliran Amazon CloudWatch Logs. Diagram berikut menunjukkan sumber daya AWS yang Anda gunakan untuk menyelesaikan tutorial.

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/sqs_tut_resources.png)


Untuk menyelesaikan tutorial ini, Anda melakukan langkah-langkah berikut:

1. Buat fungsi Lambda yang menulis pesan ke CloudWatch Log.

1. Membuat antrean Amazon SQS.

1. Buat pemetaan sumber acara Lambda. Pemetaan sumber peristiwa membaca antrian Amazon SQS dan memanggil fungsi Lambda Anda saat pesan baru ditambahkan.

1. Uji penyiapan dengan menambahkan pesan ke antrian Anda dan pantau hasilnya di CloudWatch Log.

## Prasyarat
<a name="with-sqs-prepare"></a>

### Instal AWS Command Line Interface
<a name="install_aws_cli"></a>

Jika Anda belum menginstal AWS Command Line Interface, ikuti langkah-langkah di [Menginstal atau memperbarui versi terbaru AWS CLI untuk menginstalnya](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

Tutorial ini membutuhkan terminal baris perintah atau shell untuk menjalankan perintah. Di Linux dan macOS, gunakan shell dan manajer paket pilihan Anda.

**catatan**  
Di Windows, beberapa perintah Bash CLI yang biasa Anda gunakan dengan Lambda (`zip`seperti) tidak didukung oleh terminal bawaan sistem operasi. Untuk mendapatkan versi terintegrasi Windows dari Ubuntu dan Bash, [instal Windows Subsystem untuk](https://docs.microsoft.com/en-us/windows/wsl/install-win10) Linux. 

## Buat peran eksekusi
<a name="with-sqs-create-execution-role"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/sqs_tut_steps1.png)


Peran [eksekusi adalah peran](lambda-intro-execution-role.md) AWS Identity and Access Management (IAM) yang memberikan izin fungsi Lambda untuk mengakses dan sumber daya. Layanan AWS Untuk mengizinkan fungsi Anda membaca item dari Amazon SQS, lampirkan kebijakan **AWSLambdaSQSQueueExecutionRole**izin.

**Untuk membuat peran eksekusi dan melampirkan kebijakan izin Amazon SQS**

1. Buka [halaman Peran](https://console.aws.amazon.com/iam/home#/roles) dari konsol IAM.

1. Pilih **Buat peran**.

1. Untuk **jenis entitas Tepercaya**, pilih **AWS layanan**.

1. Untuk **kasus penggunaan**, pilih **Lambda**.

1. Pilih **Berikutnya**.

1. Di kotak pencarian **Kebijakan izin**, masukkan**AWSLambdaSQSQueueExecutionRole**.

1. Pilih **AWSLambdaSQSQueueExecutionRole**kebijakan, lalu pilih **Berikutnya**.

1. Di bawah **Rincian peran****, untuk nama Peran****lambda-sqs-role**, masukkan, lalu pilih **Buat peran**.

Setelah pembuatan peran, catat Nama Sumber Daya Amazon (ARN) peran eksekusi Anda. Anda akan membutuhkannya di langkah selanjutnya.

## Buat fungsi
<a name="with-sqs-create-function"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/sqs_tut_steps2.png)


Buat fungsi Lambda yang memproses pesan Amazon SQS Anda. Kode fungsi mencatat isi pesan Amazon SQS ke CloudWatch Log.

Tutorial ini menggunakan runtime Node.js 24, tetapi kami juga menyediakan kode contoh dalam bahasa runtime lainnya. Anda dapat memilih tab di kotak berikut untuk melihat kode runtime yang Anda minati. JavaScript Kode yang akan Anda gunakan dalam langkah ini adalah pada contoh pertama yang ditunjukkan di **JavaScript**tab.

------
#### [ .NET ]

**SDK untuk .NET**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Mengkonsumsi acara SQS dengan Lambda menggunakan.NET.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
﻿using Amazon.Lambda.Core;
using Amazon.Lambda.SQSEvents;


// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace SqsIntegrationSampleCode
{
    public async Task FunctionHandler(SQSEvent evnt, ILambdaContext context)
    {
        foreach (var message in evnt.Records)
        {
            await ProcessMessageAsync(message, context);
        }

        context.Logger.LogInformation("done");
    }

    private async Task ProcessMessageAsync(SQSEvent.SQSMessage message, ILambdaContext context)
    {
        try
        {
            context.Logger.LogInformation($"Processed message {message.Body}");

            // TODO: Do interesting work based on the new message
            await Task.CompletedTask;
        }
        catch (Exception e)
        {
            //You can use Dead Letter Queue to handle failures. By configuring a Lambda DLQ.
            context.Logger.LogError($"An error occurred");
            throw;
        }

    }
}
```

------
#### [ Go ]

**SDK untuk Go V2**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Mengkonsumsi acara SQS dengan Lambda menggunakan Go.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package integration_sqs_to_lambda

import (
	"fmt"
	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(event events.SQSEvent) error {
	for _, record := range event.Records {
		err := processMessage(record)
		if err != nil {
			return err
		}
	}
	fmt.Println("done")
	return nil
}

func processMessage(record events.SQSMessage) error {
	fmt.Printf("Processed message %s\n", record.Body)
	// TODO: Do interesting work based on the new message
	return nil
}

func main() {
	lambda.Start(handler)
}
```

------
#### [ Java ]

**SDK untuk Java 2.x**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Mengkonsumsi acara SQS dengan Lambda menggunakan Java.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.SQSEvent;
import com.amazonaws.services.lambda.runtime.events.SQSEvent.SQSMessage;

public class Function implements RequestHandler<SQSEvent, Void> {
    @Override
    public Void handleRequest(SQSEvent sqsEvent, Context context) {
        for (SQSMessage msg : sqsEvent.getRecords()) {
            processMessage(msg, context);
        }
        context.getLogger().log("done");
        return null;
    }

    private void processMessage(SQSMessage msg, Context context) {
        try {
            context.getLogger().log("Processed message " + msg.getBody());

            // TODO: Do interesting work based on the new message

        } catch (Exception e) {
            context.getLogger().log("An error occurred");
            throw e;
        }

    }
}
```

------
#### [ JavaScript ]

**SDK untuk JavaScript (v3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/blob/main/integration-sqs-to-lambda). 
Mengkonsumsi acara SQS dengan JavaScript Lambda menggunakan.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
exports.handler = async (event, context) => {
  for (const message of event.Records) {
    await processMessageAsync(message);
  }
  console.info("done");
};

async function processMessageAsync(message) {
  try {
    console.log(`Processed message ${message.body}`);
    // TODO: Do interesting work based on the new message
    await Promise.resolve(1); //Placeholder for actual async work
  } catch (err) {
    console.error("An error occurred");
    throw err;
  }
}
```
Mengkonsumsi acara SQS dengan TypeScript Lambda menggunakan.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { SQSEvent, Context, SQSHandler, SQSRecord } from "aws-lambda";

export const functionHandler: SQSHandler = async (
  event: SQSEvent,
  context: Context
): Promise<void> => {
  for (const message of event.Records) {
    await processMessageAsync(message);
  }
  console.info("done");
};

async function processMessageAsync(message: SQSRecord): Promise<any> {
  try {
    console.log(`Processed message ${message.body}`);
    // TODO: Do interesting work based on the new message
    await Promise.resolve(1); //Placeholder for actual async work
  } catch (err) {
    console.error("An error occurred");
    throw err;
  }
}
```

------
#### [ PHP ]

**SDK untuk PHP**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Mengkonsumsi acara SQS dengan Lambda menggunakan PHP.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
<?php

# using bref/bref and bref/logger for simplicity

use Bref\Context\Context;
use Bref\Event\InvalidLambdaEvent;
use Bref\Event\Sqs\SqsEvent;
use Bref\Event\Sqs\SqsHandler;
use Bref\Logger\StderrLogger;

require __DIR__ . '/vendor/autoload.php';

class Handler extends SqsHandler
{
    private StderrLogger $logger;
    public function __construct(StderrLogger $logger)
    {
        $this->logger = $logger;
    }

    /**
     * @throws InvalidLambdaEvent
     */
    public function handleSqs(SqsEvent $event, Context $context): void
    {
        foreach ($event->getRecords() as $record) {
            $body = $record->getBody();
            // TODO: Do interesting work based on the new message
        }
    }
}

$logger = new StderrLogger();
return new Handler($logger);
```

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

**SDK untuk Python (Boto3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Mengkonsumsi acara SQS dengan Lambda menggunakan Python.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def lambda_handler(event, context):
    for message in event['Records']:
        process_message(message)
    print("done")

def process_message(message):
    try:
        print(f"Processed message {message['body']}")
        # TODO: Do interesting work based on the new message
    except Exception as err:
        print("An error occurred")
        raise err
```

------
#### [ Ruby ]

**SDK untuk Ruby**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Mengkonsumsi acara SQS dengan Lambda menggunakan Ruby.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def lambda_handler(event:, context:)
  event['Records'].each do |message|
    process_message(message)
  end
  puts "done"
end

def process_message(message)
  begin
    puts "Processed message #{message['body']}"
    # TODO: Do interesting work based on the new message
  rescue StandardError => err
    puts "An error occurred"
    raise err
  end
end
```

------
#### [ Rust ]

**SDK for Rust**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sqs-to-lambda). 
Mengkonsumsi acara SQS dengan Lambda menggunakan Rust.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
use aws_lambda_events::event::sqs::SqsEvent;
use lambda_runtime::{run, service_fn, Error, LambdaEvent};

async fn function_handler(event: LambdaEvent<SqsEvent>) -> Result<(), Error> {
    event.payload.records.iter().for_each(|record| {
        // process the record
        tracing::info!("Message body: {}", record.body.as_deref().unwrap_or_default())
    });

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        // disable printing the name of the module in every log line.
        .with_target(false)
        // disabling time is handy because CloudWatch will add the ingestion time.
        .without_time()
        .init();

    run(service_fn(function_handler)).await
}
```

------

**Untuk membuat fungsi Lambda Node.js**

1. Buat direktori untuk proyek, dan kemudian beralih ke direktori itu.

   ```
   mkdir sqs-tutorial
   cd sqs-tutorial
   ```

1. Salin JavaScript kode sampel ke file baru bernama`index.js`.

1. Buat paket penyebaran menggunakan `zip` perintah berikut.

   ```
   zip function.zip index.js
   ```

1. Buat fungsi Lambda menggunakan perintah [AWS CLI create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html). Untuk parameter `role`, masukkan ARN peran eksekusi yang Anda buat sebelumnya.
**catatan**  
Fungsi Lambda dan antrean Amazon SQS harus sama. Wilayah AWS

   ```
   aws lambda create-function --function-name ProcessSQSRecord \
   --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
   --role arn:aws:iam::111122223333:role/lambda-sqs-role
   ```

## Uji fungsi
<a name="with-sqs-create-test-function"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/sqs_tut_steps3.png)


Memanggil fungsi Lambda Anda secara manual menggunakan `invoke` AWS CLI perintah dan contoh peristiwa Amazon SQS.

**Untuk memanggil fungsi Lambda dengan contoh peristiwa**

1. Simpan JSON berikut sebagai file bernama`input.json`. JSON ini mensimulasikan peristiwa yang mungkin dikirimkan Amazon SQS ke fungsi Lambda Anda, yang berisi pesan aktual dari `"body"` antrian. Dalam contoh ini, pesannya adalah`"test"`.  
**Example Acara Amazon SQS**  

   Ini adalah acara pengujian—Anda tidak perlu mengubah pesan atau nomor akun.

   ```
   {
       "Records": [
           {
               "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
               "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
               "body": "test",
               "attributes": {
                   "ApproximateReceiveCount": "1",
                   "SentTimestamp": "1545082649183",
                   "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                   "ApproximateFirstReceiveTimestamp": "1545082649185"
               },
               "messageAttributes": {},
               "md5OfBody": "098f6bcd4621d373cade4e832627b4f6",
               "eventSource": "aws:sqs",
               "eventSourceARN": "arn:aws:sqs:us-east-1:111122223333:my-queue",
               "awsRegion": "us-east-1"
           }
       ]
   }
   ```

1. Jalankan AWS CLI perintah [pemanggilan berikut](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/invoke.html). Perintah ini mengembalikan CloudWatch log dalam respon. Untuk informasi selengkapnya tentang mendapatkan log kembali, lihat [Akses log dengan AWS CLI](monitoring-cloudwatchlogs-view.md#monitoring-cloudwatchlogs-cli).

   ```
   aws lambda invoke --function-name ProcessSQSRecord --payload file://input.json out --log-type Tail \
   --query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode
   ```

   **cli-binary-format**Opsi ini diperlukan jika Anda menggunakan AWS CLI versi 2. Untuk menjadikan ini pengaturan default, jalankan`aws configure set cli-binary-format raw-in-base64-out`. Untuk informasi selengkapnya, lihat [opsi baris perintah global yang AWS CLI didukung](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) di *Panduan AWS Command Line Interface Pengguna untuk Versi 2*.

1. Temukan `INFO` log di respons. Di sinilah fungsi Lambda mencatat badan pesan. Anda akan melihat log yang terlihat seperti ini:

   ```
   2023-09-11T22:45:04.271Z	348529ce-2211-4222-9099-59d07d837b60	INFO	Processed message test
   2023-09-11T22:45:04.288Z	348529ce-2211-4222-9099-59d07d837b60	INFO	done
   ```

## Buat antrean Amazon SQS
<a name="with-sqs-configure-sqs"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/sqs_tut_steps4.png)


Buat antrean Amazon SQS yang dapat digunakan oleh fungsi Lambda sebagai sumber kejadian. Fungsi Lambda dan antrean Amazon SQS harus sama. Wilayah AWS

**Untuk membuat antrean**

1. Buka [konsol Amazon SQS](https://console.aws.amazon.com/sqs).

1. Pilih **Buat antrean**.

1. Masukkan nama untuk antrian. Biarkan semua opsi lain di pengaturan default.

1. Pilih **Buat antrean**.

Setelah membuat antrian, catat ARN-nya. Anda memerlukan ini di langkah berikutnya ketika Anda mengasosiasikan antrean dengan fungsi Lambda Anda.

## Konfigurasikan sumber kejadian
<a name="with-sqs-attach-notification-configuration"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/sqs_tut_steps5.png)


[Hubungkan antrean Amazon SQS ke fungsi Lambda Anda dengan membuat pemetaan sumber peristiwa.](invocation-eventsourcemapping.md) Pemetaan sumber peristiwa membaca antrian Amazon SQS dan memanggil fungsi Lambda Anda saat pesan baru ditambahkan.

Untuk membuat pemetaan antara antrian Amazon SQS dan fungsi Lambda Anda, gunakan perintah. [create-event-source-mapping](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-event-source-mapping.html) AWS CLI Contoh:

```
aws lambda create-event-source-mapping --function-name ProcessSQSRecord  --batch-size 10 \
--event-source-arn arn:aws:sqs:us-east-1:111122223333:my-queue
```

Untuk mendapatkan daftar pemetaan sumber acara Anda, gunakan perintah. [list-event-source-mappings](https://awscli.amazonaws.com/v2/documentation/api/2.1.29/reference/lambda/list-event-source-mappings.html) Contoh:

```
aws lambda list-event-source-mappings --function-name ProcessSQSRecord
```

## Mengirim pesan pengujian
<a name="with-sqs-test-message"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/sqs_tut_steps6.png)


**Untuk mengirim pesan Amazon SQS ke fungsi Lambda**

1. Buka [konsol Amazon SQS](https://console.aws.amazon.com/sqs).

1. Pilih antrian yang Anda buat sebelumnya.

1. Pilih **Kirim dan terima pesan**.

1. Di bawah **Badan pesan**, masukkan pesan pengujian, seperti “ini adalah pesan pengujian.”

1. Pilih **Kirim pesan**.

Lambda melakukan polling antrian untuk pembaruan. Ketika ada pesan baru, Lambda memanggil fungsi Anda dengan data peristiwa baru ini dari antrian. Jika fungsi handler kembali tanpa pengecualian, Lambda menganggap pesan berhasil diproses dan mulai membaca pesan baru dalam antrian. Setelah berhasil memproses pesan, Lambda secara otomatis menghapusnya dari antrian. Jika handler melempar pengecualian, Lambda menganggap kumpulan pesan tidak berhasil diproses, dan Lambda memanggil fungsi dengan kumpulan pesan yang sama.

## Periksa CloudWatch log
<a name="with-sqs-check-logs"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/sqs_tut_steps7.png)


**Untuk mengonfirmasi bahwa fungsi tersebut memproses pesan**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih SQSRecord fungsi **Proses**.

1. Pilih **Monitor**.

1. Pilih **Lihat CloudWatch log**.

1. Di CloudWatch konsol, pilih **aliran Log** untuk fungsi tersebut.

1. Temukan `INFO` log. Di sinilah fungsi Lambda mencatat badan pesan. Anda akan melihat pesan yang Anda kirim dari antrian Amazon SQS. Contoh:

   ```
   2023-09-11T22:49:12.730Z b0c41e9c-0556-5a8b-af83-43e59efeec71 INFO Processed message this is a test message.
   ```

## Bersihkan sumber daya Anda
<a name="cleanup"></a>

Sekarang Anda dapat menghapus sumber daya yang Anda buat untuk tutorial ini, kecuali Anda ingin mempertahankannya. Dengan menghapus AWS sumber daya yang tidak lagi Anda gunakan, Anda mencegah tagihan yang tidak perlu ke Anda Akun AWS.

**Untuk menghapus peran eksekusi**

1. Buka [halaman Peran](https://console.aws.amazon.com/iam/home#/roles) dari konsol IAM.

1. Pilih peran eksekusi yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan nama peran di bidang input teks dan pilih **Hapus**.

**Untuk menghapus fungsi Lambda**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi yang Anda buat.

1. Pilih **Tindakan**, **Hapus**.

1. Ketik **confirm** kolom input teks dan pilih **Hapus**.

**Untuk menghapus antrean Amazon SQS**

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

1. Pilih antrean yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan **confirm** di bidang input teks.

1. Pilih **Hapus**.

# Tutorial: Menggunakan antrian Amazon SQS lintas akun sebagai sumber acara
<a name="with-sqs-cross-account-example"></a>

Dalam tutorial ini, Anda membuat fungsi Lambda yang menggunakan pesan dari antrian Amazon Simple Queue Service (Amazon SQS) di akun yang berbeda. AWS Tutorial ini melibatkan dua AWS **akun: Akun A** mengacu pada akun yang berisi fungsi Lambda Anda, dan **Akun B** mengacu pada akun yang berisi antrian Amazon SQS.

## Prasyarat
<a name="with-sqs-cross-account-prepare"></a>

### Instal AWS Command Line Interface
<a name="install_aws_cli"></a>

Jika Anda belum menginstal AWS Command Line Interface, ikuti langkah-langkah di [Menginstal atau memperbarui versi terbaru AWS CLI untuk menginstalnya](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

Tutorial ini membutuhkan terminal baris perintah atau shell untuk menjalankan perintah. Di Linux dan macOS, gunakan shell dan manajer paket pilihan Anda.

**catatan**  
Di Windows, beberapa perintah Bash CLI yang biasa Anda gunakan dengan Lambda (`zip`seperti) tidak didukung oleh terminal bawaan sistem operasi. Untuk mendapatkan versi terintegrasi Windows dari Ubuntu dan Bash, [instal Windows Subsystem untuk](https://docs.microsoft.com/en-us/windows/wsl/install-win10) Linux. 

## Buat peran eksekusi (Akun A)
<a name="with-sqs-cross-account-create-execution-role"></a>

Di **Akun A**, buat [peran eksekusi](lambda-intro-execution-role.md) yang memberikan izin fungsi Anda untuk mengakses AWS sumber daya yang diperlukan.

**Untuk membuat peran eksekusi**

1. Buka [halaman Peran](https://console.aws.amazon.com/iam/home#/roles) di konsol AWS Identity and Access Management (IAM).

1. Pilih **Buat peran**.

1. Buat peran dengan properti berikut.
   + **Entitas tepercaya** - **AWS Lambda**
   + **Izin** – **AWSLambdaSQSQueueExecutionRole**
   + **Nama peran** – **cross-account-lambda-sqs-role**

**AWSLambdaSQSQueueExecutionRole**Kebijakan ini memiliki izin yang diperlukan fungsi untuk membaca item dari Amazon SQS dan untuk menulis log ke Amazon CloudWatch Logs.

## Buat fungsi (Akun A)
<a name="with-sqs-cross-account-create-function"></a>

Di **Akun A**, buat fungsi Lambda yang memproses pesan Amazon SQS Anda. Fungsi Lambda dan antrean Amazon SQS harus sama. Wilayah AWS

Contoh kode Node.js berikut menulis setiap pesan ke log in CloudWatch Log.

**Example index.mjs**  

```
export const handler = async function(event, context) {
  event.Records.forEach(record => {
    const { body } = record;
    console.log(body);
  });
  return {};
}
```

**Untuk membuat fungsi**
**catatan**  
Mengikuti langkah-langkah ini menciptakan fungsi Node.js. Untuk bahasa lain, langkah-langkahnya serupa, tetapi beberapa detailnya berbeda.

1. Simpan contoh kode sebagai file bernama`index.mjs`.

1. Buat paket deployment.

   ```
   zip function.zip index.mjs
   ```

1. Buat fungsi menggunakan perintah `create-function` AWS Command Line Interface (AWS CLI). Ganti `arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role` dengan ARN dari peran eksekusi yang Anda buat sebelumnya.

   ```
   aws lambda create-function --function-name CrossAccountSQSExample \
   --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
   --role arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role
   ```

## Uji fungsi (Akun A)
<a name="with-sqs-cross-account-create-test-function"></a>

Di **Akun A**, uji fungsi Lambda Anda secara manual menggunakan `invoke` AWS CLI perintah dan contoh peristiwa Amazon SQS.

Jika handler kembali normal tanpa pengecualian, Lambda menganggap pesan berhasil diproses dan mulai membaca pesan baru dalam antrian. Setelah berhasil memproses pesan, Lambda secara otomatis menghapusnya dari antrian. Jika handler melempar pengecualian, Lambda menganggap kumpulan pesan tidak berhasil diproses, dan Lambda memanggil fungsi dengan kumpulan pesan yang sama.

1. Simpan JSON berikut sebagai file bernama`input.txt`.

   ```
   {
       "Records": [
           {
               "messageId": "059f36b4-87a3-44ab-83d2-661975830a7d",
               "receiptHandle": "AQEBwJnKyrHigUMZj6rYigCgxlaS3SLy0a...",
               "body": "test",
               "attributes": {
                   "ApproximateReceiveCount": "1",
                   "SentTimestamp": "1545082649183",
                   "SenderId": "AIDAIENQZJOLO23YVJ4VO",
                   "ApproximateFirstReceiveTimestamp": "1545082649185"
               },
               "messageAttributes": {},
               "md5OfBody": "098f6bcd4621d373cade4e832627b4f6",
               "eventSource": "aws:sqs",
               "eventSourceARN": "arn:aws:sqs:us-east-1:111122223333:example-queue",
               "awsRegion": "us-east-1"
           }
       ]
   }
   ```

   JSON sebelumnya mensimulasikan peristiwa yang mungkin dikirimkan Amazon SQS ke fungsi Lambda Anda, yang berisi pesan aktual dari antrian. `"body"`

1. Jalankan perintah `invoke` AWS CLI berikut.

   ```
   aws lambda invoke --function-name CrossAccountSQSExample \
   --cli-binary-format raw-in-base64-out \
   --payload file://input.txt outputfile.txt
   ```

   **cli-binary-format**Opsi ini diperlukan jika Anda menggunakan AWS CLI versi 2. Untuk menjadikan ini pengaturan default, jalankan`aws configure set cli-binary-format raw-in-base64-out`. Untuk informasi selengkapnya, lihat [opsi baris perintah global yang AWS CLI didukung](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list) di *Panduan AWS Command Line Interface Pengguna untuk Versi 2*.

1. Verifikasikan output dalam `outputfile.txt` file.

## Buat antrean Amazon SQS (Akun B)
<a name="with-sqs-cross-account-configure-sqs"></a>

Di **Akun B**, buat antrean Amazon SQS yang dapat digunakan oleh fungsi Lambda di **Akun A sebagai sumber** peristiwa. Fungsi Lambda dan antrean Amazon SQS harus sama. Wilayah AWS

**Untuk membuat antrean**

1. Buka [konsol Amazon SQS](https://console.aws.amazon.com/sqs).

1. Pilih **Buat antrean**.

1. Buat antrian dengan properti berikut.
   + **Tipe** - **Standar**
   + **Nama** – **LambdaCrossAccountQueue**
   + **Konfigurasi** - Pertahankan pengaturan default.
   + **Kebijakan akses** — Pilih **Lanjutan**. Tempel dalam kebijakan JSON berikut. Ganti nilai-nilai berikut:
     + `111122223333`: Akun AWS ID untuk **Akun A**
     + `444455556666`: Akun AWS ID untuk **Akun B**

------
#### [ JSON ]

****  

     ```
     {
         "Version":"2012-10-17",		 	 	 
         "Id": "Queue1_Policy_UUID",
         "Statement": [
             {
                 "Sid": "Queue1_AllActions",
                 "Effect": "Allow",
                 "Principal": {
                     "AWS": [
                         "arn:aws:iam::111122223333:role/cross-account-lambda-sqs-role"
                     ]
                 },
                 "Action": "sqs:*",
                 "Resource": "arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue"
             }
         ]
     }
     ```

------

     Kebijakan ini memberikan peran eksekusi Lambda **dalam izin Akun** A untuk menggunakan pesan dari antrean Amazon SQS ini.

1. Setelah membuat antrian, rekam Nama Sumber Daya Amazon (ARN). Anda memerlukan ini di langkah berikutnya ketika Anda mengasosiasikan antrean dengan fungsi Lambda Anda.

## Konfigurasikan sumber acara (Akun A)
<a name="with-sqs-cross-account-event-source"></a>

Di **Akun A**, buat pemetaan sumber peristiwa antara antrian Amazon SQS **di Akun** B dan fungsi Lambda Anda dengan menjalankan perintah berikut. `create-event-source-mapping` AWS CLI Ganti `arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue` dengan ARN antrean Amazon SQS yang Anda buat pada langkah sebelumnya.

```
aws lambda create-event-source-mapping --function-name CrossAccountSQSExample --batch-size 10 \
--event-source-arn arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue
```

Untuk mendapatkan daftar pemetaan sumber acara Anda, jalankan perintah berikut.

```
aws lambda list-event-source-mappings --function-name CrossAccountSQSExample \
--event-source-arn arn:aws:sqs:us-east-1:444455556666:LambdaCrossAccountQueue
```

## Uji penyiapan
<a name="with-sqs-final-integration-test-no-iam"></a>

Anda sekarang dapat menguji pengaturan sebagai berikut:

1. Di **Akun B**, buka konsol [Amazon SQS.](https://console.aws.amazon.com/sqs)

1. Pilih **LambdaCrossAccountQueue**, yang Anda buat sebelumnya.

1. Pilih **Kirim dan terima pesan**.

1. Di bawah **Badan pesan**, masukkan pesan pengujian.

1. Pilih **Kirim pesan**.

Fungsi Lambda Anda di **Akun A** harus menerima pesan. Lambda akan terus melakukan polling antrian untuk pembaruan. Ketika ada pesan baru, Lambda memanggil fungsi Anda dengan data peristiwa baru ini dari antrian. Fungsi Anda berjalan dan membuat log di Amazon CloudWatch. Anda dapat melihat log di [CloudWatch konsol](https://console.aws.amazon.com/cloudwatch).

## Bersihkan sumber daya Anda
<a name="cleanup"></a>

Sekarang Anda dapat menghapus sumber daya yang Anda buat untuk tutorial ini, kecuali Anda ingin mempertahankannya. Dengan menghapus AWS sumber daya yang tidak lagi Anda gunakan, Anda mencegah tagihan yang tidak perlu ke Anda Akun AWS.

Di **Akun A**, bersihkan peran eksekusi dan fungsi Lambda Anda.

**Untuk menghapus peran eksekusi**

1. Buka [halaman Peran](https://console.aws.amazon.com/iam/home#/roles) dari konsol IAM.

1. Pilih peran eksekusi yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan nama peran di bidang input teks dan pilih **Hapus**.

**Untuk menghapus fungsi Lambda**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi yang Anda buat.

1. Pilih **Tindakan**, **Hapus**.

1. Ketik **confirm** kolom input teks dan pilih **Hapus**.

Di **Akun B**, bersihkan antrian Amazon SQS.

**Untuk menghapus antrean Amazon SQS**

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

1. Pilih antrean yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan **confirm** di bidang input teks.

1. Pilih **Hapus**.

# Mengatur fungsi Lambda dengan Step Functions
<a name="with-step-functions"></a>

AWS Step Functions menyediakan orkestrasi alur kerja visual untuk mengoordinasikan fungsi Lambda dengan layanan lain. AWS Dengan integrasi asli ke 220\$1 AWS layanan dan infrastruktur tanpa pemeliharaan yang dikelola sepenuhnya, Step Functions sangat ideal ketika Anda membutuhkan desain alur kerja visual dan integrasi layanan yang dikelola sepenuhnya.

[Untuk orkestrasi menggunakan bahasa pemrograman standar dalam Lambda di mana logika alur kerja hidup bersama logika bisnis, pertimbangkan fungsi Lambda yang tahan lama.](durable-functions.md) Untuk bantuan memilih di antara opsi-opsi ini, lihat [Fungsi tahan lama atau Step Functions](durable-step-functions.md).

Misalnya, memproses pesanan mungkin memerlukan validasi detail pesanan, memeriksa tingkat inventaris, memproses pembayaran, dan membuat faktur. Tulis fungsi Lambda terpisah untuk setiap tugas dan gunakan Step Functions untuk mengelola alur kerja. Step Functions mengkoordinasikan aliran data antara fungsi Anda dan menangani kesalahan pada setiap langkah. Pemisahan ini membuat alur kerja Anda lebih mudah untuk divisualisasikan, dimodifikasi, dan dipelihara saat mereka tumbuh lebih kompleks.

## Kapan menggunakan Step Functions dengan Lambda
<a name="when-to-use-step-functions"></a>

Skenario berikut adalah contoh yang baik ketika Step Functions sangat cocok untuk mengatur aplikasi berbasis Lambda.
+ [Pemrosesan berurutan](#sequential-processing)
+ [Penanganan kesalahan yang kompleks](#complex-error-handling)
+ [Alur kerja bersyarat dan persetujuan manusia](#conditional-workflows-human-approvals)
+ [Pemrosesan paralel](#parallel-processing)

### Pemrosesan berurutan
<a name="sequential-processing"></a>

Pemrosesan sekuensial adalah ketika satu tugas harus diselesaikan sebelum tugas berikutnya dapat dimulai. Misalnya, dalam sistem pemrosesan pesanan, pemrosesan pembayaran tidak dapat dimulai sampai validasi pesanan selesai, dan pembuatan faktur harus menunggu konfirmasi pembayaran. Tulis fungsi Lambda terpisah untuk setiap tugas dan gunakan Step Functions untuk mengelola urutan dan menangani aliran data antar fungsi.

#### Contoh anti-pola
<a name="anti-pattern-sequential"></a>

Fungsi Lambda tunggal mengelola seluruh alur kerja pemrosesan pesanan dengan:
+ Memanggil fungsi Lambda lainnya secara berurutan
+ Mengurai dan memvalidasi tanggapan dari setiap fungsi
+ Menerapkan penanganan kesalahan dan logika pemulihan
+ Mengelola aliran data antar fungsi

#### Pendekatan yang direkomendasikan
<a name="recommended-sequential"></a>

Gunakan dua fungsi Lambda: satu untuk memvalidasi pesanan dan satu untuk memproses pembayaran. Step Functions mengkoordinasikan fungsi-fungsi ini dengan:
+ Menjalankan tugas dalam urutan yang benar
+ Melewati data antar fungsi
+ Menerapkan penanganan kesalahan pada setiap langkah
+ Menggunakan status [Pilihan](https://docs.aws.amazon.com/step-functions/latest/dg/state-choice.html) untuk memastikan hanya pesanan yang valid yang dilanjutkan ke pembayaran

**Example grafik alur kerja**  

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/sequential_workflow.png)


**catatan**  
**Alternatif kode pertama:** [Untuk pemrosesan berurutan dengan pos pemeriksaan berbasis kode dan coba lagi, lihat Lambda langkah fungsi tahan lama.](durable-basic-concepts.md)

### Penanganan kesalahan yang kompleks
<a name="complex-error-handling"></a>

Sementara Lambda menyediakan [kemampuan coba ulang untuk pemanggilan asinkron dan pemetaan sumber peristiwa, Step Functions menawarkan penanganan kesalahan](invocation-retries.md) yang lebih canggih untuk alur kerja yang kompleks. Anda dapat [mengonfigurasi percobaan ulang otomatis](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-error-handling.html#error-handling-retrying-after-an-error) dengan backoff eksponensial dan menetapkan kebijakan coba ulang yang berbeda untuk berbagai jenis kesalahan. Saat percobaan ulang habis, gunakan `Catch` untuk merutekan kesalahan ke status [fallback](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-error-handling.html#error-handling-fallback-states). Ini sangat berguna ketika Anda memerlukan penanganan kesalahan tingkat alur kerja yang mengoordinasikan beberapa fungsi dan layanan.

*Untuk mempelajari selengkapnya tentang penanganan kesalahan fungsi Lambda di mesin status, lihat [Menangani kesalahan](https://catalog.workshops.aws/stepfunctions/handling-errors) di Lokakarya. AWS Step Functions *

#### Contoh anti-pola
<a name="anti-pattern-error-handling"></a>

Satu fungsi Lambda menangani semua hal berikut:
+ Upaya untuk memanggil layanan pemrosesan pembayaran
+ Jika layanan pembayaran tidak tersedia, fungsi menunggu dan mencoba lagi nanti.
+ Menerapkan backoff eksponensial khusus untuk waktu tunggu
+ Setelah semua upaya gagal, catch error dan pilih flow lain

#### Pendekatan yang direkomendasikan
<a name="recommended-error-handling"></a>

Gunakan satu fungsi Lambda yang hanya berfokus pada pemrosesan pembayaran. Step Functions mengelola penanganan kesalahan dengan:
+ Secara otomatis [mencoba kembali tugas yang gagal dengan periode backoff yang dapat dikonfigurasi](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-error-handling.html#error-handling-retrying-after-an-error)
+ Menerapkan kebijakan coba ulang yang berbeda berdasarkan jenis kesalahan
+ Merutekan berbagai jenis kesalahan ke status fallback yang sesuai
+ Mempertahankan status dan riwayat penanganan kesalahan

**Example grafik alur kerja**  

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/error_handling_workflow.png)


**catatan**  
**Alternatif kode-pertama:** Fungsi tahan lama menyediakan penanganan kesalahan try-catch dengan strategi coba ulang yang dapat dikonfigurasi. Lihat [Penanganan kesalahan dalam fungsi tahan lama](durable-execution-sdk-retries.md).

### Alur kerja bersyarat dan persetujuan manusia
<a name="conditional-workflows-human-approvals"></a>

Gunakan [status Step Functions Choice](https://docs.aws.amazon.com/step-functions/latest/dg/state-choice.html) untuk merutekan alur kerja berdasarkan output fungsi dan [akhiran waitForTask Token](https://docs.aws.amazon.com/step-functions/latest/dg/connect-to-resource.html#connect-wait-token) untuk menjeda alur kerja untuk keputusan manusia. Misalnya, untuk memproses permintaan kenaikan batas kredit, gunakan fungsi Lambda untuk mengevaluasi faktor risiko. Kemudian, gunakan Step Functions untuk merutekan permintaan berisiko tinggi ke persetujuan manual dan permintaan berisiko rendah ke persetujuan otomatis.

*Untuk menerapkan contoh alur kerja yang menggunakan pola integrasi token tugas callback, lihat [Callback with Task Token](https://catalog.workshops.aws/stepfunctions/integrating-services/3-callback-token) di Workshop. AWS Step Functions * 

#### Contoh anti-pola
<a name="anti-pattern-conditional"></a>

Fungsi Lambda tunggal mengelola alur kerja persetujuan yang kompleks dengan:
+ Menerapkan logika bersyarat bersarang untuk mengevaluasi permintaan kredit
+ Memanggil fungsi persetujuan yang berbeda berdasarkan jumlah permintaan
+ Mengelola beberapa jalur persetujuan dan poin keputusan
+ Melacak status persetujuan yang tertunda
+ Menerapkan batas waktu dan logika notifikasi untuk persetujuan

#### Pendekatan yang direkomendasikan
<a name="recommended-conditional"></a>

Gunakan tiga fungsi Lambda: satu untuk mengevaluasi risiko setiap permintaan, satu untuk menyetujui permintaan berisiko rendah, dan satu untuk mengarahkan permintaan berisiko tinggi ke manajer untuk ditinjau. Step Functions mengelola alur kerja dengan:
+ Menggunakan status [Pilihan](https://docs.aws.amazon.com/step-functions/latest/dg/state-choice.html) untuk merutekan permintaan berdasarkan jumlah dan tingkat risiko
+ Menjeda eksekusi sambil menunggu persetujuan manusia
+ Mengelola batas waktu untuk persetujuan yang tertunda
+ Memberikan visibilitas ke status saat ini dari setiap permintaan

**Example grafik alur kerja**  

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/conditional_workflow.png)


**catatan**  
**Alternatif kode-pertama:** Fungsi tahan lama mendukung panggilan balik untuk alur kerja. human-in-the-loop Lihat [Callback dalam fungsi tahan lama](durable-execution-sdk.md).

### Pemrosesan paralel
<a name="parallel-processing"></a>

Step Functions menyediakan tiga cara untuk menangani pemrosesan paralel:
+ [Status Paralel](https://docs.aws.amazon.com/step-functions/latest/dg/state-parallel.html) mengeksekusi beberapa cabang alur kerja Anda secara bersamaan. Gunakan ini saat Anda perlu menjalankan fungsi yang berbeda secara paralel, seperti membuat thumbnail saat mengekstrak metadata gambar.
+ [Status Peta Inline](https://docs.aws.amazon.com/step-functions/latest/dg/state-map-inline.html) memproses array data dengan hingga 40 iterasi bersamaan. Gunakan ini untuk kumpulan data kecil hingga menengah di mana Anda perlu melakukan operasi yang sama pada setiap item.
+ [Status Peta Terdistribusi](https://docs.aws.amazon.com/step-functions/latest/dg/state-map-distributed.html) menangani pemrosesan paralel skala besar dengan hingga 10.000 eksekusi bersamaan, mendukung array JSON dan sumber data Amazon Simple Storage Service (Amazon S3). Gunakan ini saat memproses kumpulan data besar atau saat Anda membutuhkan konkurensi yang lebih tinggi.

#### Contoh anti-pola
<a name="anti-pattern-parallel"></a>

Fungsi Lambda tunggal mencoba mengelola pemrosesan paralel dengan:
+ Secara bersamaan menjalankan beberapa fungsi pemrosesan gambar
+ Menerapkan logika eksekusi parallel kustom
+ Mengelola batas waktu dan penanganan kesalahan untuk setiap tugas paralel
+ Mengumpulkan dan menggabungkan hasil dari semua fungsi

#### Pendekatan yang direkomendasikan
<a name="recommended-parallel"></a>

Gunakan tiga fungsi Lambda: satu untuk membuat gambar mini, satu untuk menambahkan tanda air, dan satu untuk mengekstrak metadata. Step Functions mengelola fungsi-fungsi ini dengan:
+ Menjalankan semua fungsi secara bersamaan menggunakan status [Paralel](https://docs.aws.amazon.com/step-functions/latest/dg/state-parallel.html)
+ Mengumpulkan hasil dari setiap fungsi ke dalam array yang diurutkan
+ Mengelola batas waktu dan penanganan kesalahan di semua eksekusi paralel
+ Melanjutkan hanya ketika semua cabang paralel selesai

**Example grafik alur kerja**  

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/parallel_workflow.png)


**catatan**  
**Alternatif kode-pertama: Penyediaan** `parallel()` dan `map()` pengoperasian fungsi yang tahan lama. Lihat [Eksekusi paralel](durable-execution-sdk.md).

## Kapan tidak menggunakan Step Functions dengan Lambda
<a name="when-not-to-use"></a>

Tidak semua aplikasi berbasis Lambda mendapat manfaat dari penggunaan Step Functions. Pertimbangkan skenario ini saat memilih arsitektur aplikasi Anda.
+ [Aplikasi sederhana](#simple-applications)
+ [Pemrosesan data yang kompleks](#complex-data-processing)
+ [Beban kerja intensif CPU](#cpu-intensive)

### Aplikasi sederhana
<a name="simple-applications"></a>

**catatan**  
Untuk alur kerja yang tidak memerlukan desain visual atau integrasi layanan ekstensif, [fungsi Lambda yang tahan lama](durable-functions.md) mungkin merupakan alternatif yang lebih sederhana yang menjaga logika alur kerja dalam kode di dalam Lambda.

Untuk aplikasi yang tidak memerlukan orkestrasi kompleks, menggunakan Step Functions mungkin menambah kompleksitas yang tidak perlu. Misalnya, jika Anda hanya memproses pesan dari antrean Amazon SQS atau menanggapi peristiwa EventBridge Amazon, Anda dapat mengonfigurasi layanan ini untuk menjalankan fungsi Lambda Anda secara langsung. Demikian pula, jika aplikasi Anda hanya terdiri dari satu atau dua fungsi Lambda dengan penanganan kesalahan langsung, pemanggilan Lambda langsung atau arsitektur berbasis peristiwa mungkin lebih mudah untuk diterapkan dan dipelihara.

### Pemrosesan data yang kompleks
<a name="complex-data-processing"></a>

Anda dapat menggunakan status [Peta Terdistribusi](https://docs.aws.amazon.com/step-functions/latest/dg/state-map-distributed.html) Step Functions untuk memproses kumpulan data Amazon S3 besar secara bersamaan dengan fungsi Lambda. Ini efektif untuk banyak beban kerja paralel skala besar, termasuk memproses data semi-terstruktur seperti file JSON atau CSV. Namun, untuk transformasi data yang lebih kompleks atau analitik lanjutan, pertimbangkan alternatif ini:
+ **Pipa transformasi data**: Digunakan AWS Glue untuk pekerjaan ETL yang memproses data terstruktur atau semi-terstruktur dari berbagai sumber. AWS Glue sangat berguna ketika Anda membutuhkan katalog data bawaan dan kemampuan manajemen skema.
+ **Analisis data:** [Gunakan EMR Amazon untuk analitik data skala petabyte, terutama saat Anda membutuhkan alat Apache Hadoop ekosistem atau untuk beban kerja pembelajaran mesin yang melebihi batas memori Lambda.](configuration-memory.md)

### Beban kerja intensif CPU
<a name="cpu-intensive"></a>

Meskipun Step Functions dapat mengatur tugas intensif CPU, fungsi Lambda mungkin tidak cocok untuk beban kerja ini karena sumber daya CPU-nya yang terbatas. Untuk operasi komputasi intensif dalam alur kerja Anda, pertimbangkan alternatif ini:
+ **Orkestrasi kontainer: Gunakan** Step Functions untuk mengelola tugas Amazon Elastic Container Service (Amazon ECS) untuk sumber daya komputasi yang lebih konsisten dan terukur.
+ **Pemrosesan Batch:** Integrasikan AWS Batch dengan Step Functions untuk mengelola pekerjaan batch intensif komputasi yang memerlukan penggunaan CPU berkelanjutan.

# Memanggil fungsi Lambda dengan acara batch Amazon S3
<a name="services-s3-batch"></a>

Anda dapat menggunakan operasi batch Amazon S3 untuk memanggil fungsi Lambda pada serangkaian besar objek Amazon S3. Amazon S3 melacak kemajuan operasi batch, mengirimkan pemberitahuan, dan menyimpan laporan penyelesaian yang menunjukkan status setiap tindakan. 

Untuk menjalankan operasi batch, Anda membuat [pekerjaan operasi batch](https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops-operations.html) Amazon S3. Saat Anda membuat pekerjaan, Anda memberikan manifest (daftar objek) dan mengonfigurasi tindakan yang akan dilakukan pada objek tersebut. 

Saat pekerjaan batch dimulai, Amazon S3 memanggil fungsi Lambda [secara sinkron](invocation-sync.md) untuk setiap objek dalam manifest. Parameter kejadian mencakup nama bucket dan objek. 

**Contoh berikut menunjukkan peristiwa yang dikirimkan Amazon S3 ke fungsi Lambda untuk objek yang diberi nama **customerImage1.jpg** di bucket amzn-s3-demo-bucket.**

**Example Kejadian permintaan batch Amazon S3**  

```
{
"invocationSchemaVersion": "1.0",
    "invocationId": "YXNkbGZqYWRmaiBhc2RmdW9hZHNmZGpmaGFzbGtkaGZza2RmaAo",
    "job": {
        "id": "f3cc4f60-61f6-4a2b-8a21-d07600c373ce"
    },
    "tasks": [
        {
            "taskId": "dGFza2lkZ29lc2hlcmUK",
            "s3Key": "customerImage1.jpg",
            "s3VersionId": "1",
            "s3BucketArn": "arn:aws:s3:::amzn-s3-demo-bucket"
        }
    ]  
}
```

Fungsi Lambda Anda harus mengembalikan objek JSON yang bidang seperti yang ditunjukkan dalam contoh berikut. Anda dapat menyalin `invocationId` dan `taskId` dari parameter kejadian. Anda dapat mengembalikan string di `resultString`. Amazon S3 menyimpan nilai `resultString` dalam laporan penyelesaian. 

**Example Respons permintaan batch Amazon S3**  

```
{
  "invocationSchemaVersion": "1.0",
  "treatMissingKeysAs" : "PermanentFailure",
  "invocationId" : "YXNkbGZqYWRmaiBhc2RmdW9hZHNmZGpmaGFzbGtkaGZza2RmaAo",
  "results": [
    {
      "taskId": "dGFza2lkZ29lc2hlcmUK",
      "resultCode": "Succeeded",
      "resultString": "[\"Alice\", \"Bob\"]"
    }
  ]
}
```

## Memanggil fungsi Lambda dari operasi batch Amazon S3
<a name="invoking"></a>

Anda dapat memanggil fungsi Lambda dengan ARN fungsi yang tidak terkualifikasi atau terkualifikasi. Jika Anda ingin menggunakan versi fungsi yang sama untuk seluruh pekerjaan batch, konfigurasikan versi fungsi tertentu di parameter `FunctionARN` saat membuat pekerjaan Anda. Jika Anda mengonfigurasi sebuah alias atau pengualifikasi \$1LATEST, pekerjaan batch segera mulai memanggil versi baru dari fungsi tersebut jika alias atau \$1LATEST diperbarui selama pelaksanaan pekerjaan. 

Perhatikan bahwa Anda tidak dapat menggunakan kembali fungsi berbasis kejadian Amazon S3 yang sudah ada untuk operasi batch. Ini karena operasi batch Amazon S3 mengirimkan parameter kejadian yang berbeda ke fungsi Lambda dan mengharapkan pesan pengembalian dengan struktur JSON yang spesifik.

Di [kebijakan berbasis sumber daya](access-control-resource-based.md) yang Anda buat untuk pekerjaan batch Amazon S3, pastikan Anda menetapkan izin untuk pekerjaan tersebut untuk memanggil fungsi Lambda Anda.

Di [peran eksekusi](https://docs.aws.amazon.com/AmazonS3/latest/userguide/batch-ops-iam-role-policies.html) untuk fungsi tersebut, tetapkan kebijakan kepercayaan bagi Amazon S3 untuk mengambil peran tersebut saat menjalankan fungsi Anda.

Jika fungsi Anda menggunakan AWS SDK untuk mengelola resource Amazon S3, Anda perlu menambahkan izin Amazon S3 dalam peran eksekusi. 

Saat pekerjaan berjalan, Amazon S3 memulai beberapa instans fungsi untuk memproses objek Amazon S3 secara paralel, hingga mencapai [batas konkurensi](lambda-concurrency.md) fungsi. Amazon S3 membatasi peningkatan instans awal guna menghindari biaya berlebih untuk pekerjaan kecil. 

Jika fungsi Lambda mengembalikan kode respons `TemporaryFailure`, Amazon S3 akan mengulangi operasi. 

Untuk informasi lebih lanjut tentang operasi batch Amazon S3, lihat [Melakukan operasi batch](https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops.html) dalam *Panduan Developer Amazon S3*. 

Untuk contoh cara menggunakan fungsi Lambda di operasi batch Amazon S3, lihat [Memanggil fungsi Lambda dari operasi batch Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/batch-ops-invoke-lambda.html) dalam *Panduan Developer Amazon S3*. 

# Memanggil fungsi Lambda dengan notifikasi Amazon SNS
<a name="with-sns"></a>

Anda dapat menggunakan fungsi Lambda untuk memproses notifikasi Amazon Simple Notification Service (Amazon SNS). Amazon SNS mendukung fungsi Lambda sebagai target untuk pesan yang dikirim ke topik. Anda dapat melanggankan fungsi Anda ke topik di akun yang sama atau di akun AWS lainnya. Untuk panduan terperinci, lihat. [Tutorial: Menggunakan AWS Lambda dengan Amazon Simple Notification Service](with-sns-example.md)

Lambda mendukung pemicu SNS untuk topik SNS standar saja. Topik FIFO tidak didukung.

Lambda memproses pesan SNS secara asinkron dengan mengantri pesan dan menangani percobaan ulang. Jika Amazon SNS tidak dapat mencapai Lambda atau pesan ditolak, Amazon SNS melakukan percobaan ulang dengan interval yang diperpanjang selama beberapa jam. Untuk detailnya, lihat [Keandalan](https://aws.amazon.com/sns/faqs/#Reliability) di Amazon SNS FAQs.

**Awas**  
Pemanggilan asinkron Lambda memproses setiap peristiwa setidaknya sekali, dan pemrosesan duplikat catatan dapat terjadi. Untuk menghindari potensi masalah yang terkait dengan duplikat peristiwa, kami sangat menyarankan agar Anda membuat kode fungsi Anda idempoten. Untuk mempelajari lebih lanjut, lihat [Bagaimana cara membuat fungsi Lambda saya idempoten](https://repost.aws/knowledge-center/lambda-function-idempotent) di Pusat Pengetahuan. AWS 

## Utilitas idempotensi dari Powertools untuk Lambda AWS
<a name="services-sns-powertools-idempotency"></a>

Utilitas idempotency dari Powertools untuk Lambda membuat fungsi AWS Lambda Anda idempoten. Ini tersedia untuk Python,, Java TypeScript, dan .NET. [https://docs.powertools.aws.dev/lambda/dotnet/utilities/idempotency/](https://docs.powertools.aws.dev/lambda/dotnet/utilities/idempotency/)

**Topics**
+ [

## Utilitas idempotensi dari Powertools untuk Lambda AWS
](#services-sns-powertools-idempotency)
+ [

## Menambahkan pemicu topik Amazon SNS untuk fungsi Lambda menggunakan konsol
](#sns-trigger-console)
+ [

## Menambahkan pemicu topik Amazon SNS secara manual untuk fungsi Lambda
](#sns-trigger-manual)
+ [

## Contoh bentuk acara SNS
](#sns-sample-event)
+ [

# Tutorial: Menggunakan AWS Lambda dengan Amazon Simple Notification Service
](with-sns-example.md)

## Menambahkan pemicu topik Amazon SNS untuk fungsi Lambda menggunakan konsol
<a name="sns-trigger-console"></a>

Untuk menambahkan topik SNS sebagai pemicu fungsi Lambda, cara termudah adalah dengan menggunakan konsol Lambda. Saat Anda menambahkan pemicu melalui konsol, Lambda secara otomatis mengatur izin dan langganan yang diperlukan untuk mulai menerima acara dari topik SNS.

**Untuk menambahkan topik SNS sebagai pemicu fungsi Lambda (konsol)**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih nama fungsi yang ingin Anda tambahkan pemicunya.

1. Pilih **Konfigurasi**, lalu pilih **Pemicu.**

1. Pilih **Tambahkan pemicu**.

1. **Di bawah **konfigurasi Trigger**, di menu tarik-turun, pilih SNS.**

1. Untuk **topik SNS**, pilih topik SNS untuk berlangganan.

## Menambahkan pemicu topik Amazon SNS secara manual untuk fungsi Lambda
<a name="sns-trigger-manual"></a>

Untuk mengatur pemicu SNS untuk fungsi Lambda secara manual, Anda harus menyelesaikan langkah-langkah berikut:
+ Tentukan kebijakan berbasis sumber daya untuk fungsi Anda agar SNS dapat memanggilnya.
+ Berlangganan fungsi Lambda Anda ke topik Amazon SNS.
**catatan**  
Jika topik SNS dan fungsi Lambda Anda berada di akun AWS yang berbeda, Anda juga perlu memberikan izin tambahan untuk mengizinkan langganan lintas akun ke topik SNS. Untuk informasi selengkapnya, lihat [Memberikan izin lintas akun untuk langganan Amazon SNS](with-sns-example.md#with-sns-subscription-grant-permission).

Anda dapat menggunakan AWS Command Line Interface (AWS CLI) untuk menyelesaikan kedua langkah ini. Pertama, untuk menentukan kebijakan berbasis sumber daya untuk fungsi Lambda yang memungkinkan pemanggilan SNS, gunakan perintah berikut. AWS CLI Pastikan untuk mengganti nilai `--function-name` dengan nama fungsi Lambda Anda, dan nilai `--source-arn` dengan ARN topik SNS Anda.

```
aws lambda add-permission --function-name example-function \
    --source-arn arn:aws:sns:us-east-1:123456789012:sns-topic-for-lambda \
    --statement-id function-with-sns --action "lambda:InvokeFunction" \
    --principal sns.amazonaws.com
```

Untuk berlangganan fungsi Anda ke topik SNS, gunakan AWS CLI perintah berikut. Ganti nilai `--topic-arn` dengan ARN topik SNS Anda, dan nilai `--notification-endpoint` ARN dengan fungsi Lambda Anda.

```
aws sns subscribe --protocol lambda \
    --region us-east-1 \
    --topic-arn arn:aws:sns:us-east-1:123456789012:sns-topic-for-lambda \
    --notification-endpoint arn:aws:lambda:us-east-1:123456789012:function:example-function
```

## Contoh bentuk acara SNS
<a name="sns-sample-event"></a>

Amazon SNS memanggil fungsi Anda [secara asinkron](invocation-async.md) dengan kejadian yang berisi pesan dan metadata.

**Example Kejadian pesan Amazon SNS**  

```
{
  "Records": [
    {
      "EventVersion": "1.0",
      "EventSubscriptionArn": "arn:aws:sns:us-east-1:123456789012:sns-lambda:21be56ed-a058-49f5-8c98-aedd2564c486",
      "EventSource": "aws:sns",
      "Sns": {
        "SignatureVersion": "1",
        "Timestamp": "2019-01-02T12:45:07.000Z",
        "Signature": "tcc6faL2yUC6dgZdmrwh1Y4cGa/ebXEkAi6RibDsvpi+tE/1+82j...65r==",
        "SigningCertURL": "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-ac565b8b1a6c5d002d285f9598aa1d9b.pem",
        "MessageId": "95df01b4-ee98-5cb9-9903-4c221d41eb5e",
        "Message": "Hello from SNS!",
        "MessageAttributes": {
          "Test": {
            "Type": "String",
            "Value": "TestString"
          },
          "TestBinary": {
            "Type": "Binary",
            "Value": "TestBinary"
          }
        },
        "Type": "Notification",
        "UnsubscribeUrl": "https://sns.us-east-1.amazonaws.com/?Action=Unsubscribe&amp;SubscriptionArn=arn:aws:sns:us-east-1:123456789012:test-lambda:21be56ed-a058-49f5-8c98-aedd2564c486",
        "TopicArn":"arn:aws:sns:us-east-1:123456789012:sns-lambda",
        "Subject": "TestInvoke"
      }
    }
  ]
}
```

# Tutorial: Menggunakan AWS Lambda dengan Amazon Simple Notification Service
<a name="with-sns-example"></a>

Dalam tutorial ini, Anda menggunakan fungsi Lambda dalam satu Akun AWS untuk berlangganan topik Amazon Simple Notification Service (Amazon SNS) secara terpisah. Akun AWS Saat memublikasikan pesan ke topik Amazon SNS, fungsi Lambda akan membaca konten pesan dan mengeluarkannya ke Amazon Logs. CloudWatch Untuk menyelesaikan tutorial ini, Anda menggunakan AWS Command Line Interface (AWS CLI).

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-sns-tutorial/sns_tut_resources.png)


Untuk menyelesaikan tutorial ini, Anda melakukan langkah-langkah berikut:
+ Di **akun A**, buat topik Amazon SNS.
+ Di **akun B**, buat fungsi Lambda yang akan membaca pesan dari topik.
+ Di **akun B**, buat langganan ke topik.
+ Publikasikan pesan ke topik Amazon SNS di **akun A** dan konfirmasikan bahwa fungsi Lambda di **akun B** mengeluarkannya ke Log. CloudWatch 

Dengan menyelesaikan langkah-langkah ini, Anda akan belajar cara mengonfigurasi topik Amazon SNS untuk menjalankan fungsi Lambda. Anda juga akan belajar cara membuat kebijakan AWS Identity and Access Management (IAM) yang memberikan izin untuk sumber daya di sumber lain Akun AWS untuk memanggil Lambda.

Dalam tutorial, Anda menggunakan dua terpisah Akun AWS. AWS CLI Perintah mengilustrasikan hal ini dengan menggunakan dua profil bernama yang disebut `accountA` dan`accountB`, masing-masing dikonfigurasi untuk digunakan dengan yang berbeda Akun AWS. Untuk mempelajari cara mengonfigurasi penggunaan profil yang berbeda, lihat [Pengaturan file konfigurasi dan kredensi](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html) di *Panduan AWS Command Line Interface Pengguna untuk Versi 2*. AWS CLI Pastikan untuk mengonfigurasi default yang sama Wilayah AWS untuk kedua profil.

Jika AWS CLI profil yang Anda buat untuk keduanya Akun AWS menggunakan nama yang berbeda, atau jika Anda menggunakan profil default dan satu profil bernama, ubah AWS CLI perintah dalam langkah-langkah berikut sesuai kebutuhan.

## Prasyarat
<a name="with-sns-prereqs"></a>

### Instal AWS Command Line Interface
<a name="install_aws_cli"></a>

Jika Anda belum menginstal AWS Command Line Interface, ikuti langkah-langkah di [Menginstal atau memperbarui versi terbaru AWS CLI untuk menginstalnya](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html).

Tutorial ini membutuhkan terminal baris perintah atau shell untuk menjalankan perintah. Di Linux dan macOS, gunakan shell dan manajer paket pilihan Anda.

**catatan**  
Di Windows, beberapa perintah Bash CLI yang biasa Anda gunakan dengan Lambda (`zip`seperti) tidak didukung oleh terminal bawaan sistem operasi. Untuk mendapatkan versi terintegrasi Windows dari Ubuntu dan Bash, [instal Windows Subsystem untuk](https://docs.microsoft.com/en-us/windows/wsl/install-win10) Linux. 

## Buat topik Amazon SNS (akun A)
<a name="with-sns-create-topic"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_1.png)


**Untuk membuat topik**
+ Di **akun A**, buat topik standar Amazon SNS menggunakan perintah berikut AWS CLI .

  ```
  aws sns create-topic --name sns-topic-for-lambda --profile accountA
  ```

  Anda akan melihat output seperti yang berikut ini.

  ```
  {
      "TopicArn": "arn:aws:sns:us-west-2:123456789012:sns-topic-for-lambda"
  }
  ```

  Catat Nama Sumber Daya Amazon (ARN) topik Anda. Anda akan membutuhkannya nanti dalam tutorial ketika Anda menambahkan izin ke fungsi Lambda Anda untuk berlangganan topik.

## Buat peran eksekusi fungsi (akun B)
<a name="with-sns-example-create-iam-role"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_2.png)


Peran eksekusi adalah peran IAM yang memberikan izin fungsi Lambda untuk mengakses dan sumber daya. Layanan AWS Sebelum membuat fungsi di **akun B**, Anda membuat peran yang memberikan izin dasar fungsi untuk menulis CloudWatch log ke Log. Kami akan menambahkan izin untuk membaca dari topik Amazon SNS Anda di langkah selanjutnya.

**Untuk membuat peran eksekusi**

1. Di **akun B** buka [halaman peran](https://console.aws.amazon.com/iam/home#/roles) di konsol IAM.

1. Pilih **Buat peran**.

1. Untuk **jenis entitas Tepercaya**, pilih **AWS layanan**.

1. Untuk **kasus penggunaan**, pilih **Lambda**.

1. Pilih **Berikutnya**.

1. Tambahkan kebijakan izin dasar ke peran dengan melakukan hal berikut:

   1. Di kotak pencarian **Kebijakan izin**, masukkan**AWSLambdaBasicExecutionRole**.

   1. Pilih **Berikutnya**.

1. Selesaikan pembuatan peran dengan melakukan hal berikut:

   1. Di bawah **Detail peran**, masukkan **lambda-sns-role** **nama Peran**.

   1. Pilih **Buat peran**.

## Buat fungsi Lambda (akun B)
<a name="with-sns-example-create-test-function"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_3.png)


Buat fungsi Lambda yang memproses pesan Amazon SNS Anda. Kode fungsi mencatat isi pesan dari setiap catatan ke Amazon CloudWatch Logs.

Tutorial ini menggunakan runtime Node.js 24, tetapi kami juga menyediakan kode contoh dalam bahasa runtime lainnya. Anda dapat memilih tab di kotak berikut untuk melihat kode runtime yang Anda minati. JavaScript Kode yang akan Anda gunakan dalam langkah ini adalah pada contoh pertama yang ditunjukkan di **JavaScript**tab.

------
#### [ .NET ]

**SDK untuk .NET**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Mengkonsumsi acara SNS dengan Lambda menggunakan.NET.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
using Amazon.Lambda.Core;
using Amazon.Lambda.SNSEvents;


// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace SnsIntegration;

public class Function
{
    public async Task FunctionHandler(SNSEvent evnt, ILambdaContext context)
    {
        foreach (var record in evnt.Records)
        {
            await ProcessRecordAsync(record, context);
        }
        context.Logger.LogInformation("done");
    }

    private async Task ProcessRecordAsync(SNSEvent.SNSRecord record, ILambdaContext context)
    {
        try
        {
            context.Logger.LogInformation($"Processed record {record.Sns.Message}");

            // TODO: Do interesting work based on the new message
            await Task.CompletedTask;
        }
        catch (Exception e)
        {
            //You can use Dead Letter Queue to handle failures. By configuring a Lambda DLQ.
            context.Logger.LogError($"An error occurred");
            throw;
        }
    }
}
```

------
#### [ Go ]

**SDK untuk Go V2**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Mengkonsumsi acara SNS dengan Lambda menggunakan Go.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package main

import (
	"context"
	"fmt"

	"github.com/aws/aws-lambda-go/events"
	"github.com/aws/aws-lambda-go/lambda"
)

func handler(ctx context.Context, snsEvent events.SNSEvent) {
	for _, record := range snsEvent.Records {
		processMessage(record)
	}
	fmt.Println("done")
}

func processMessage(record events.SNSEventRecord) {
	message := record.SNS.Message
	fmt.Printf("Processed message: %s\n", message)
	// TODO: Process your record here
}

func main() {
	lambda.Start(handler)
}
```

------
#### [ Java ]

**SDK untuk Java 2.x**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Mengkonsumsi acara SNS dengan Lambda menggunakan Java.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
package example;

import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.LambdaLogger;
import com.amazonaws.services.lambda.runtime.RequestHandler;
import com.amazonaws.services.lambda.runtime.events.SNSEvent;
import com.amazonaws.services.lambda.runtime.events.SNSEvent.SNSRecord;


import java.util.Iterator;
import java.util.List;

public class SNSEventHandler implements RequestHandler<SNSEvent, Boolean> {
    LambdaLogger logger;

    @Override
    public Boolean handleRequest(SNSEvent event, Context context) {
        logger = context.getLogger();
        List<SNSRecord> records = event.getRecords();
        if (!records.isEmpty()) {
            Iterator<SNSRecord> recordsIter = records.iterator();
            while (recordsIter.hasNext()) {
                processRecord(recordsIter.next());
            }
        }
        return Boolean.TRUE;
    }

    public void processRecord(SNSRecord record) {
        try {
            String message = record.getSNS().getMessage();
            logger.log("message: " + message);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

}
```

------
#### [ JavaScript ]

**SDK untuk JavaScript (v3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/blob/main/integration-sns-to-lambda). 
Mengkonsumsi acara SNS dengan JavaScript Lambda menggunakan.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
exports.handler = async (event, context) => {
  for (const record of event.Records) {
    await processMessageAsync(record);
  }
  console.info("done");
};

async function processMessageAsync(record) {
  try {
    const message = JSON.stringify(record.Sns.Message);
    console.log(`Processed message ${message}`);
    await Promise.resolve(1); //Placeholder for actual async work
  } catch (err) {
    console.error("An error occurred");
    throw err;
  }
}
```
Mengkonsumsi acara SNS dengan TypeScript Lambda menggunakan.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
import { SNSEvent, Context, SNSHandler, SNSEventRecord } from "aws-lambda";

export const functionHandler: SNSHandler = async (
  event: SNSEvent,
  context: Context
): Promise<void> => {
  for (const record of event.Records) {
    await processMessageAsync(record);
  }
  console.info("done");
};

async function processMessageAsync(record: SNSEventRecord): Promise<any> {
  try {
    const message: string = JSON.stringify(record.Sns.Message);
    console.log(`Processed message ${message}`);
    await Promise.resolve(1); //Placeholder for actual async work
  } catch (err) {
    console.error("An error occurred");
    throw err;
  }
}
```

------
#### [ PHP ]

**SDK untuk PHP**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Mengkonsumsi acara SNS dengan Lambda menggunakan PHP.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
<?php

/* 
Since native PHP support for AWS Lambda is not available, we are utilizing Bref's PHP functions runtime for AWS Lambda.
For more information on Bref's PHP runtime for Lambda, refer to: https://bref.sh/docs/runtimes/function

Another approach would be to create a custom runtime. 
A practical example can be found here: https://aws.amazon.com/blogs/apn/aws-lambda-custom-runtime-for-php-a-practical-example/
*/

// Additional composer packages may be required when using Bref or any other PHP functions runtime.
// require __DIR__ . '/vendor/autoload.php';

use Bref\Context\Context;
use Bref\Event\Sns\SnsEvent;
use Bref\Event\Sns\SnsHandler;

class Handler extends SnsHandler
{
    public function handleSns(SnsEvent $event, Context $context): void
    {
        foreach ($event->getRecords() as $record) {
            $message = $record->getMessage();

            // TODO: Implement your custom processing logic here
            // Any exception thrown will be logged and the invocation will be marked as failed

            echo "Processed Message: $message" . PHP_EOL;
        }
    }
}

return new Handler();
```

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

**SDK untuk Python (Boto3)**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Mengkonsumsi acara SNS dengan Lambda menggunakan Python.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def lambda_handler(event, context):
    for record in event['Records']:
        process_message(record)
    print("done")

def process_message(record):
    try:
        message = record['Sns']['Message']
        print(f"Processed message {message}")
        # TODO; Process your record here
        
    except Exception as e:
        print("An error occurred")
        raise e
```

------
#### [ Ruby ]

**SDK untuk Ruby**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Mengkonsumsi acara SNS dengan Lambda menggunakan Ruby.  

```
# Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
# SPDX-License-Identifier: Apache-2.0
def lambda_handler(event:, context:)
  event['Records'].map { |record| process_message(record) }
end

def process_message(record)
  message = record['Sns']['Message']
  puts("Processing message: #{message}")
rescue StandardError => e
  puts("Error processing message: #{e}")
  raise
end
```

------
#### [ Rust ]

**SDK for Rust**  
 Ada lebih banyak tentang GitHub. Temukan contoh lengkapnya dan pelajari cara mengatur dan menjalankannya di repositori [contoh Nirserver](https://github.com/aws-samples/serverless-snippets/tree/main/integration-sns-to-lambda). 
Mengkonsumsi acara SNS dengan Lambda menggunakan Rust.  

```
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0
use aws_lambda_events::event::sns::SnsEvent;
use aws_lambda_events::sns::SnsRecord;
use lambda_runtime::{run, service_fn, Error, LambdaEvent};
use tracing::info;

// Built with the following dependencies:
//  aws_lambda_events = { version = "0.10.0", default-features = false, features = ["sns"] }
//  lambda_runtime = "0.8.1"
//  tokio = { version = "1", features = ["macros"] }
//  tracing = { version = "0.1", features = ["log"] }
//  tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt"] }

async fn function_handler(event: LambdaEvent<SnsEvent>) -> Result<(), Error> {
    for event in event.payload.records {
        process_record(&event)?;
    }
    
    Ok(())
}

fn process_record(record: &SnsRecord) -> Result<(), Error> {
    info!("Processing SNS Message: {}", record.sns.message);

    // Implement your record handling code here.

    Ok(())
}

#[tokio::main]
async fn main() -> Result<(), Error> {
    tracing_subscriber::fmt()
        .with_max_level(tracing::Level::INFO)
        .with_target(false)
        .without_time()
        .init();

    run(service_fn(function_handler)).await
}
```

------

**Untuk membuat fungsi**

1. Buat direktori untuk proyek, dan kemudian beralih ke direktori itu.

   ```
   mkdir sns-tutorial
   cd sns-tutorial
   ```

1. Salin JavaScript kode sampel ke file baru bernama`index.js`.

1. Buat paket penyebaran menggunakan `zip` perintah berikut.

   ```
   zip function.zip index.js
   ```

1. Jalankan AWS CLI perintah berikut untuk membuat fungsi Lambda Anda di **akun** B.

   ```
   aws lambda create-function --function-name Function-With-SNS \
       --zip-file fileb://function.zip --handler index.handler --runtime nodejs24.x \
       --role arn:aws:iam::<AccountB_ID>:role/lambda-sns-role  \
       --timeout 60 --profile accountB
   ```

   Anda akan melihat output seperti yang berikut ini.

   ```
   {
       "FunctionName": "Function-With-SNS",
       "FunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:Function-With-SNS",
       "Runtime": "nodejs24.x",
       "Role": "arn:aws:iam::123456789012:role/lambda_basic_role",
       "Handler": "index.handler",
       ...
       "RuntimeVersionConfig": {
           "RuntimeVersionArn": "arn:aws:lambda:us-west-2::runtime:7d5f06b69c951da8a48b926ce280a9daf2e8bb1a74fc4a2672580c787d608206"
       }
   }
   ```

1. Rekam Nama Sumber Daya Amazon (ARN) dari fungsi Anda. Anda akan membutuhkannya nanti di tutorial saat Anda menambahkan izin untuk mengizinkan Amazon SNS menjalankan fungsi Anda.

## Tambahkan izin ke fungsi (akun B)
<a name="with-sns-create-function-permissions"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_4.png)


[Agar Amazon SNS dapat menjalankan fungsi Anda, Anda harus memberinya izin dalam pernyataan tentang kebijakan berbasis sumber daya.](access-control-resource-based.md) Anda menambahkan pernyataan ini menggunakan AWS CLI `add-permission` perintah.

**Untuk memberikan izin Amazon SNS untuk menjalankan fungsi Anda**
+ Di **akun B**, jalankan AWS CLI perintah berikut menggunakan ARN untuk topik Amazon SNS yang Anda rekam sebelumnya.

  ```
  aws lambda add-permission --function-name Function-With-SNS \
      --source-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \
      --statement-id function-with-sns --action "lambda:InvokeFunction" \
      --principal sns.amazonaws.com --profile accountB
  ```

  Anda akan melihat output seperti yang berikut ini.

  ```
  {
      "Statement": "{\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":
        \"arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda\"}},
        \"Action\":[\"lambda:InvokeFunction\"],
        \"Resource\":\"arn:aws:lambda:us-east-1:<AccountB_ID>:function:Function-With-SNS\",
        \"Effect\":\"Allow\",\"Principal\":{\"Service\":\"sns.amazonaws.com\"},
        \"Sid\":\"function-with-sns\"}"
  }
  ```

**catatan**  
Jika akun dengan topik Amazon SNS di-host dalam [opt-in Wilayah AWS](https://docs.aws.amazon.com/accounts/latest/reference/manage-acct-regions.html), Anda harus menentukan wilayah di prinsipal. Misalnya, jika Anda bekerja dengan topik Amazon SNS di wilayah Asia Pasifik (Hong Kong), Anda harus menentukan `sns.ap-east-1.amazonaws.com` bukan `sns.amazonaws.com` untuk prinsipal. 

## Berikan izin lintas akun untuk langganan Amazon SNS (akun A)
<a name="with-sns-subscription-grant-permission"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_5.png)


Agar fungsi Lambda Anda di **akun B** berlangganan topik Amazon SNS yang Anda buat **di akun** A, Anda harus memberikan izin kepada **akun B untuk** berlangganan topik Anda. Anda memberikan izin ini menggunakan AWS CLI `add-permission` perintah. 

**Untuk memberikan izin kepada akun B untuk berlangganan topik**
+ Di **akun A**, jalankan AWS CLI perintah berikut. Gunakan ARN untuk topik Amazon SNS yang Anda rekam sebelumnya.

  ```
  aws sns add-permission --label lambda-access --aws-account-id <AccountB_ID> \
      --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \  
      --action-name Subscribe ListSubscriptionsByTopic --profile accountA
  ```

## Buat langganan (akun B)
<a name="with-sns-create-subscription"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_6.png)


**Di **akun B**, Anda sekarang berlangganan fungsi Lambda Anda ke topik Amazon SNS yang Anda buat di awal tutorial di akun A.** **Saat pesan dikirim ke topik ini (`sns-topic-for-lambda`), Amazon SNS akan memanggil fungsi Lambda Anda di akun B. `Function-With-SNS`** 

**Untuk membuat langganan**
+ Di **akun B**, jalankan AWS CLI perintah berikut. Gunakan wilayah default tempat Anda membuat topik dan ARNs untuk topik dan fungsi Lambda Anda.

  ```
  aws sns subscribe --protocol lambda \
      --region us-east-1 \
      --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \
      --notification-endpoint arn:aws:lambda:us-east-1:<AccountB_ID>:function:Function-With-SNS \
      --profile accountB
  ```

  Anda akan melihat output seperti yang berikut ini.

  ```
  {
      "SubscriptionArn": "arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda:5d906xxxx-7c8x-45dx-a9dx-0484e31c98xx"
  }
  ```

## Publikasikan pesan ke topik (akun A dan akun B)
<a name="with-sns-publish-message"></a>

![\[\]](http://docs.aws.amazon.com/id_id/lambda/latest/dg/images/services-sns-tutorial/sns_tut_steps_7.png)


Sekarang fungsi Lambda Anda di **akun B** berlangganan topik Amazon SNS Anda di **akun A**, saatnya untuk menguji penyiapan Anda dengan menerbitkan pesan ke topik Anda. Untuk mengonfirmasi bahwa Amazon SNS telah memanggil fungsi Lambda Anda, Anda menggunakan CloudWatch Log untuk melihat output fungsi Anda.

**Untuk memublikasikan pesan ke topik Anda dan melihat output fungsi Anda**

1. Masukkan `Hello World` ke dalam file teks dan simpan sebagai`message.txt`.

1. Dari direktori yang sama tempat Anda menyimpan file teks Anda, jalankan AWS CLI perintah berikut di **akun A**. Gunakan ARN untuk topik Anda sendiri.

   ```
   aws sns publish --message file://message.txt --subject Test \
       --topic-arn arn:aws:sns:us-east-1:<AccountA_ID>:sns-topic-for-lambda \
       --profile accountA
   ```

   Ini akan mengembalikan ID pesan dengan pengidentifikasi unik, yang menunjukkan bahwa Amazon SNS telah menerima pesan tersebut. Amazon SNS kemudian mencoba mengirimkan pesan ke pelanggan topik. Untuk mengonfirmasi bahwa Amazon SNS telah memanggil fungsi Lambda Anda, gunakan CloudWatch Log untuk melihat output fungsi Anda:

1. Di **akun B**, buka halaman [Grup log](https://console.aws.amazon.com/cloudwatch/home#logsV2:log-groups) di CloudWatch konsol Amazon.

1. Pilih grup log untuk fungsi Anda (`/aws/lambda/Function-With-SNS`).

1. Pilih aliran log terbaru.

1. Jika fungsi Anda dipanggil dengan benar, Anda akan melihat output yang mirip dengan berikut yang menunjukkan konten pesan yang Anda terbitkan ke topik Anda.

   ```
   2023-07-31T21:42:51.250Z c1cba6b8-ade9-4380-aa32-d1a225da0e48 INFO Processed message Hello World
   2023-07-31T21:42:51.250Z c1cba6b8-ade9-4380-aa32-d1a225da0e48 INFO done
   ```

## Bersihkan sumber daya Anda
<a name="cleanup"></a>

Sekarang Anda dapat menghapus sumber daya yang Anda buat untuk tutorial ini, kecuali Anda ingin mempertahankannya. Dengan menghapus AWS sumber daya yang tidak lagi Anda gunakan, Anda mencegah tagihan yang tidak perlu ke Anda Akun AWS.

Di **Akun A**, bersihkan topik Amazon SNS Anda.

**Untuk menghapus topik Amazon SNS**

1. Buka [halaman Topik](https://console.aws.amazon.com//sns/home#topics:) di konsol Amazon SNS.

1. Pilih topik yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan **delete me** di bidang input teks.

1. Pilih **Hapus**.

Di **Akun B**, bersihkan peran eksekusi, fungsi Lambda, dan langganan Amazon SNS.

**Untuk menghapus peran eksekusi**

1. Buka [halaman Peran](https://console.aws.amazon.com/iam/home#/roles) dari konsol IAM.

1. Pilih peran eksekusi yang Anda buat.

1. Pilih **Hapus**.

1. Masukkan nama peran di bidang input teks dan pilih **Hapus**.

**Untuk menghapus fungsi Lambda**

1. Buka [halaman Fungsi](https://console.aws.amazon.com/lambda/home#/functions) di konsol Lambda.

1. Pilih fungsi yang Anda buat.

1. Pilih **Tindakan**, **Hapus**.

1. Ketik **confirm** kolom input teks dan pilih **Hapus**.

**Untuk menghapus langganan Amazon SNS**

1. Buka [halaman Langganan](https://console.aws.amazon.com//sns/home#subscriptions:) di konsol Amazon SNS.

1. Pilih langganan yang Anda buat.

1. Pilih **Delete**, **Delete**.