Menggunakan Lambda dengan Amazon MQ - AWS Lambda

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

Menggunakan Lambda dengan Amazon MQ

Amazon MQ adalah layanan broker pesan terkelola untuk Apache ActiveMQ dan RabbitMQ. 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 daya Lambda yang membaca pesan dari broker Anda dan memanggil fungsi secara serempak.

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 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. Untuk ActiveMQ, layanan Lambda membatasi jumlah lingkungan eksekusi bersamaan menjadi lima. Untuk RabbitMQ, jumlah lingkungan eksekusi bersamaan dibatasi hingga 1. 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, hubungi AWS Support.

  • 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 Plugin yang didukung. SimpleAuthentication Untuk RabbitMQ, hanya mekanisme otentikasi PLAIN 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.

  • 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 dari Kuota di Amazon MQ dalam Panduan Developer Amazon MQ.

  • Konektivitas – Anda dapat membuat broker di virtual private cloud (VPC) publik atau privat. Untuk VPC pribadi, fungsi Lambda Anda memerlukan akses ke VPC untuk menerima pesan. Untuk informasi lebih lanjut, lihat Konfigurasi jaringan dalam topik 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 di situs web Apache ActiveMQ, dan Host Virtual 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 MQ Kelinci di Panduan Pengembang Amazon MQ.

  • Protokol — Protokol yang didukung bergantung pada jenis integrasi Amazon MQ.

    • Untuk integrasi ActiveMQ, Lambda menggunakan pesan menggunakan protokol /Java Message Service (JMS) OpenWire. Tidak ada protokol lain yang didukung untuk mengkonsumsi pesan. Dalam protokol JMS, hanya TextMessage dan BytesMessage yang didukung. Lambda juga mendukung properti kustom JMS. Untuk informasi lebih lanjut tentang OpenWire protokol, lihat OpenWiredi 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.

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 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.

Grup konsumen Lambda

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.

Grup konsumen mengambil pesan sebagai BLOB byte, base64-mengkodekannya menjadi 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.

contoh Acara rekam Amazon MQ
ActiveMQ
{ "eventSource": "aws:mq", "eventSourceArn": "arn:aws:mq:us-west-2:111122223333:broker:test:b-9bcfa592-423a-4942-879d-eb284b418fc8", "messages": [ { "messageID": "ID:b-9bcfa592-423a-4942-879d-eb284b418fc8-1.mq.us-west-2.amazonaws.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-west-2.amazonaws.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" } } ] }
RabbitMQ
{ "eventSource": "aws:rmq", "eventSourceArn": "arn:aws:mq:us-west-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==" } ] } }
catatan

Dalam contoh RabbitMQ, pizzaQueue adalah nama antrian RabbitMQ, dan / merupakan nama host virtual. Saat menerima pesan, sumber acara mencantumkan pesan di bawahpizzaQueue::/.

Izin peran eksekusi

Untuk membaca rekaman dari broker Amazon MQ, fungsi Lambda Anda memerlukan izin berikut yang ditambahkan ke peran eksekusi:

catatan

Saat menggunakan kunci terkelola pelanggan yang terenkripsi, tambahkan juga izin kms:Decrypt.

Konfigurasi jaringan

Untuk memberi Lambda akses penuh ke broker Anda 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.

Secara default, saat Anda membuat broker Amazon MQ, PubliclyAccessible bendera disetel ke false. Agar broker Anda menerima alamat IP publik, Anda harus mengatur PubliclyAccessible bendera ke true.

Praktik terbaik untuk menggunakan Amazon MQ dengan Lambda adalah dengan menggunakan titik akhir AWS PrivateLink VPC dan memberikan akses fungsi Lambda Anda ke VPC broker Anda. Terapkan titik akhir untuk Lambda, dan, hanya untuk ActiveMQ, titik akhir untuk (). AWS Security Token Service AWS STS Jika broker Anda menggunakan otentikasi, gunakan juga titik akhir untuk. AWS Secrets Manager Untuk mempelajari selengkapnya, lihat Bekerja dengan VPC endpoint.

Atau, konfigurasikan gateway NAT di setiap subnet publik di VPC yang berisi broker Amazon MQ Anda. Untuk informasi selengkapnya, lihat Aktifkan akses internet untuk fungsi Lambda yang terhubung dengan VPC.

Saat Anda membuat pemetaan sumber acara untuk broker Amazon MQ, Lambda memeriksa apakah Antarmuka Jaringan Elastis (ENI) sudah ada untuk subnet dan grup keamanan VPC broker Anda. Jika Lambda menemukan ENI yang ada, ia mencoba untuk menggunakannya kembali. Jika tidak, Lambda membuat ENI baru untuk terhubung ke sumber acara dan menjalankan fungsi Anda.

catatan

Fungsi Lambda selalu berjalan di dalam VPC yang dimiliki oleh layanan Lambda. VPC ini dikelola secara otomatis oleh layanan dan tidak terlihat oleh pelanggan. Anda juga dapat menghubungkan fungsi Anda ke VPC Amazon. Dalam kedua kasus tersebut, konfigurasi VPC fungsi Anda tidak memengaruhi pemetaan sumber peristiwa. Hanya konfigurasi VPC sumber acara yang menentukan bagaimana Lambda terhubung ke sumber acara Anda.

Aturan grup keamanan VPC

Konfigurasikan grup keamanan untuk VPC Amazon yang berisi klaster Anda dengan aturan berikut (minimal):

  • Aturan masuk - Izinkan semua lalu lintas di port broker untuk grup keamanan yang ditentukan untuk sumber acara Anda dari dalam grup keamanannya sendiri. ActiveMQ menggunakan port 61617 secara default dan RabbitMQ menggunakan port 5671 secara default.

  • Aturan keluar - Izinkan semua lalu lintas di port 443 untuk semua tujuan. Izinkan semua lalu lintas di port broker untuk dalam grup keamanannya sendiri. ActiveMQ menggunakan port 61617 secara default dan RabbitMQ menggunakan port 5671 secara default.

  • Jika Anda menggunakan titik akhir VPC alih-alih gateway NAT, grup keamanan yang terkait dengan titik akhir VPC harus mengizinkan semua lalu lintas masuk pada port 443 dari grup keamanan sumber peristiwa.

Bekerja dengan VPC endpoint

Saat Anda menggunakan titik akhir VPC, panggilan API untuk menjalankan fungsi Anda dirutekan melalui titik akhir ini menggunakan ENI. Prinsipal layanan Lambda perlu memanggil lambda:InvokeFunction fungsi apa pun yang menggunakan ENI tersebut. Selain itu, untuk ActiveMQ, kepala layanan Lambda perlu sts:AssumeRole memanggil peran yang menggunakan ENIS.

Secara default, titik akhir VPC memiliki kebijakan IAM yang terbuka. Praktik terbaik adalah membatasi kebijakan ini untuk hanya mengizinkan prinsipal tertentu 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 prinsip layanan Lambda untuk memanggil dan, untuk ActiveMQ,. lambda:InvokeFunction sts:AssumeRole Membatasi kebijakan titik akhir VPC Anda untuk hanya mengizinkan panggilan API yang berasal dari organisasi Anda mencegah pemetaan sumber peristiwa berfungsi dengan baik.

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

contoh Kebijakan titik akhir VPC - AWS STS titik akhir (hanya ActiveMQ)
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Resource": "*" } ] }
contoh Kebijakan titik akhir VPC - Titik akhir Lambda
{ "Statement": [ { "Action": "lambda:InvokeFunction", "Effect": "Allow", "Principal": { "Service": [ "lambda.amazonaws.com" ] }, "Resource": "*" } ] }

Jika broker Amazon MQ Anda menggunakan otentikasi, Anda juga dapat membatasi kebijakan titik akhir VPC untuk titik akhir Secrets Manager. Untuk memanggil Secrets Manager API, Lambda menggunakan peran fungsi Anda, bukan kepala layanan Lambda. Contoh berikut menunjukkan kebijakan titik akhir Secrets Manager.

contoh Kebijakan titik akhir VPC - Titik akhir Secrets Manager
{ "Statement": [ { "Action": "secretsmanager:GetSecretValue", "Effect": "Allow", "Principal": { "AWS": [ "customer_function_execution_role_arn" ] }, "Resource": "customer_secret_arn" } ] }

Tambahkan izin dan buat pemetaan sumber acara

Buat pemetaan sumber kejadian 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 menambahkan izin dan membuat pemicu
  1. Buka Halaman fungsi di konsol Lambda.

  2. Pilih nama sebuah fungsi.

  3. Pilih tab Konfigurasi, lalu pilih Izin.

  4. Di bawah Nama peran, pilih tautan ke peran eksekusi Anda. Tautan ini membuka peran di konsol IAM.

    Tautan ke peran eksekusi
  5. Pilih Tambahkan izin, lalu pilih Buat kebijakan sebaris.

    Buat kebijakan inline di konsol IAM
  6. Di editor Kebijakan, pilih JSON. Masukkan kebijakan berikut. Fungsi Anda memerlukan izin ini untuk membaca dari broker Amazon MQ.

    { "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

  7. Pilih Selanjutnya. Masukkan nama kebijakan, lalu pilih Buat kebijakan.

  8. Kembali ke fungsi Anda di konsol Lambda. Di bagian Gambaran umum fungsi, pilih Tambah pemicu.

    Bagian ikhtisar fungsi dari konsol Lambda
  9. Pilih jenis pemicu MQ.

  10. 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.

Perbarui pemetaan sumber acara

Gunakan update-event-source-mapping perintah untuk memperbarui pemetaan sumber peristiwa. Contoh perintah berikut memperbarui pemetaan sumber kejadian agar memiliki ukuran batch sebesar 2.

aws lambda update-event-source-mapping \ --uuid 91eaeb7e-c976-1234-9451-8709db01f137 \ --batch-size 2

Anda akan melihat output berikut:

{ "UUID": "91eaeb7e-c976-1234-9451-8709db01f137", "BatchSize": 2, "EventSourceArn": "arn:aws:mq:us-east-1:123456789012:broker:ExampleMQBroker:b-b4d492ef-bdc3-45e3-a781-cd1a3102ecca", "FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:MQ-Example-Function", "LastModified": 1601928393.531, "LastProcessingResult": "No records processed", "State": "Updating", "StateTransitionReason": "USER_INITIATED" }

Lambda memperbarui pengaturan ini secara asinkron. Output tidak akan mencerminkan perubahan sampai proses ini selesai. Untuk melihat status sumber daya Anda saat ini, gunakan perintah get-event-source-mapping.

aws lambda get-event-source-mapping \ --uuid 91eaeb7e-c976-4939-9451-8709db01f137

Anda akan melihat output berikut:

{ "UUID": "91eaeb7e-c976-4939-9451-8709db01f137", "BatchSize": 2, "EventSourceArn": "arn:aws:mq:us-east-1:123456789012:broker:ExampleMQBroker:b-b4d492ef-bdc3-45e3-a781-cd1a3102ecca", "FunctionArn": "arn:aws:lambda:us-east-1:123456789012:function:MQ-Example-Function", "LastModified": 1601928393.531, "LastProcessingResult": "No records processed", "State": "Enabled", "StateTransitionReason": "USER_INITIATED" }

Kesalahan pemetaan sumber kejadian

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 di situs web Apache ActiveMQ dan Panduan Keandalan di situs web RabbitMQ.

catatan

Lambda tidak mendukung kebijakan pengiriman ulang khusus. Sebagai gantinya, Lambda menggunakan kebijakan dengan nilai default dari halaman Kebijakan Pengiriman Ulang di situs web Apache ActiveMQ, dengan disetel ke 6. maximumRedeliveries

Parameter konfigurasi Amazon MQ dan RabbitMQ

Semua jenis sumber peristiwa Lambda berbagi operasi yang sama CreateEventSourceMappingdan UpdateEventSourceMappingAPI. Namun, hanya beberapa parameter yang berlaku untuk Amazon MQ dan RabbitMQ.

Parameter sumber peristiwa yang berlaku untuk Amazon MQ dan RabbitMQ
Parameter Diperlukan Default Catatan

BatchSize

T

100

Maksimum: 10.000.

Diaktifkan

T

true

FunctionName

T

FilterCriteria

T

Pemfilteran acara Lambda

MaximumBatchingWindowInDetik

T

500 ms

Perilaku batching

Antrean

T

Nama antrean tujuan broker Amazon MQ yang akan digunakan.

SourceAccessKonfigurasi

T

Untuk ActiveMQ, kredensi BASIC_AUTH. Untuk RabbitMQ, dapat berisi kredensyal BASIC_AUTH dan informasi VIRTUAL_HOST.