Memproses peristiwa secara asinkron dengan Amazon API Gateway dan Amazon DynamoDB Streams - AWS Prescriptive Guidance

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

Memproses peristiwa secara asinkron dengan Amazon API Gateway dan Amazon DynamoDB Streams

Andrea Meroni, Mariem Kthiri, Nadim Majed, Alessandro Trisolini, dan Michael Wallner, Amazon Web Services

Ringkasan

Amazon API Gateway adalah layanan terkelola penuh yang dapat digunakan pengembang untuk membuat, menerbitkan, memelihara, memantau, dan mengamankan APIs pada skala apa pun. Ini menangani tugas yang terlibat dalam menerima dan memproses hingga ratusan ribu panggilan API bersamaan.

Kuota layanan penting API Gateway adalah batas waktu integrasi. Batas waktu adalah waktu maksimum di mana layanan backend harus mengembalikan respons sebelum REST API mengembalikan kesalahan. Batas keras 29 detik umumnya dapat diterima untuk beban kerja sinkron. Namun, batas itu merupakan tantangan bagi pengembang yang ingin menggunakan API Gateway dengan beban kerja asinkron.

Pola ini menunjukkan contoh arsitektur untuk memproses peristiwa secara asinkron menggunakan API Gateway, Amazon DynamoDB Streams, dan. AWS Lambda Arsitektur mendukung menjalankan tugas pemrosesan paralel dengan parameter input yang sama, dan menggunakan REST API dasar sebagai antarmuka. Dalam contoh ini, menggunakan Lambda sebagai backend membatasi durasi pekerjaan hingga 15 menit. Anda dapat menghindari batas ini dengan menggunakan layanan alternatif untuk memproses peristiwa yang masuk (misalnya, AWS Fargate).

Projen digunakan untuk mengatur lingkungan pengembangan lokal dan untuk menyebarkan arsitektur contoh ke target Akun AWS, dalam kombinasi dengan AWS Cloud Development Kit (AWS CDK) Toolkit, Docker dan Node.js. Projen secara otomatis menyiapkan lingkungan virtual Python dengan pra-komit dan alat yang digunakan untuk jaminan kualitas kode, pemindaian keamanan, dan pengujian unit. Untuk informasi selengkapnya, lihat bagian Alat.

Prasyarat dan batasan

Prasyarat

Keterbatasan

  • Jumlah maksimum pembaca yang disarankan untuk DynamoDB Streams adalah dua untuk menghindari pelambatan.

  • Runtime maksimum suatu pekerjaan dibatasi oleh runtime maksimum untuk fungsi Lambda (15 menit).

  • Jumlah maksimum permintaan pekerjaan bersamaan dibatasi oleh konkurensi yang dicadangkan dari fungsi Lambda.

Arsitektur

Arsitektur

Diagram berikut menunjukkan interaksi API pekerjaan dengan DynamoDB Streams dan fungsi Lambda pemrosesan peristiwa dan penanganan kesalahan, dengan peristiwa yang disimpan dalam arsip peristiwa Amazon. EventBridge

Diagram arsitektur dan proses, dengan langkah-langkah yang tercantum setelah diagram.

Alur kerja tipikal mencakup langkah-langkah berikut:

  1. Anda mengautentikasi terhadap AWS Identity and Access Management (IAM) dan mendapatkan kredensi keamanan.

  2. Anda mengirim POST permintaan HTTP ke titik akhir API /jobs lowongan, yang menentukan parameter pekerjaan di badan permintaan.

  3. API pekerjaan mengembalikan respons HTTP yang berisi pengenal pekerjaan kepada Anda.

  4. API pekerjaan menempatkan parameter pekerjaan di tabel jobs_table Amazon DynamoDB.

  5. Tabel jobs_table DynamoDB aliran DynamoDB memanggil fungsi Lambda pemrosesan peristiwa.

  6. Fungsi Lambda pemrosesan peristiwa memproses peristiwa dan kemudian menempatkan hasil pekerjaan di tabel DynamoDB. jobs_table Untuk membantu memastikan hasil yang konsisten, fungsi pemrosesan peristiwa menerapkan mekanisme penguncian yang optimis.

  7. Anda mengirim GET permintaan HTTP ke titik akhir API /jobs/{jobId} pekerjaan, dengan pengenal pekerjaan dari langkah 3 sebagai. {jobId}

  8. API pekerjaan menanyakan tabel jobs_table DynamoDB untuk mengambil hasil pekerjaan.

  9. API pekerjaan mengembalikan respons HTTP yang berisi hasil pekerjaan.

  10. Jika pemrosesan peristiwa gagal, pemetaan sumber fungsi pemrosesan peristiwa akan mengirimkan peristiwa ke topik Simple Notification Service Amazon (Amazon SNS) yang menangani kesalahan.

  11. Topik SNS penanganan kesalahan secara asinkron mendorong acara ke fungsi penanganan kesalahan.

  12. Fungsi penanganan kesalahan menempatkan parameter pekerjaan dalam tabel jobs_table DynamoDB.

    Anda dapat mengambil parameter pekerjaan dengan mengirimkan GET permintaan HTTP ke titik akhir API /jobs/{jobId} lowongan.

  13. Jika penanganan kesalahan gagal, fungsi penanganan kesalahan akan mengirimkan acara ke arsip Amazon EventBridge .

    Anda dapat memutar ulang acara yang diarsipkan dengan menggunakan. EventBridge

Alat

Layanan AWS

  • AWS Cloud Development Kit (AWS CDK)adalah kerangka kerja pengembangan perangkat lunak yang membantu Anda menentukan dan menyediakan infrastruktur AWS Cloud dalam kode.

  • Amazon DynamoDB adalah layanan database NoSQL yang dikelola sepenuhnya yang menyediakan kinerja yang cepat, dapat diprediksi, dan terukur.

  • Amazon EventBridge adalah layanan bus acara tanpa server yang membantu Anda menghubungkan aplikasi Anda dengan data waktu nyata dari berbagai sumber. Misalnya, fungsi AWS Lambda, titik akhir pemanggilan HTTP menggunakan tujuan API, atau bus acara di akun AWS lainnya.

  • AWS Lambdaadalah layanan komputasi yang membantu Anda menjalankan kode tanpa perlu menyediakan atau mengelola server. Ini menjalankan kode Anda hanya bila diperlukan dan skala secara otomatis, jadi Anda hanya membayar untuk waktu komputasi yang Anda gunakan.

  • Amazon Simple Notification Service (Amazon SNS) membantu Anda mengoordinasikan dan mengelola pertukaran pesan antara penayang dan klien, termasuk server web dan alamat email.

Alat lainnya

  • autopep8 secara otomatis memformat kode Python berdasarkan panduan gaya Proposal Peningkatan Python (PEP) 8.

  • Bandit memindai kode Python untuk menemukan masalah keamanan umum.

  • Commitizen adalah pemeriksa dan generator komit Git. CHANGELOG

  • cfn-lint adalah linter AWS CloudFormation

  • Checkov adalah alat analisis kode statis yang memeriksa infrastruktur sebagai kode (IAc) untuk kesalahan konfigurasi keamanan dan kepatuhan.

  • jq adalah alat baris perintah untuk mengurai JSON.

  • Postman adalah platform API.

  • pre-commit adalah manajer Git Hooks.

  • Projen adalah generator proyek.

  • pytest adalah kerangka kerja Python untuk menulis tes kecil yang dapat dibaca.

Repositori kode

Contoh kode arsitektur ini dapat ditemukan di GitHub Asynchronous Processing with API Gateway dan DynamoDB Streams repositori.

Praktik terbaik

  • Contoh arsitektur ini tidak termasuk pemantauan infrastruktur yang diterapkan. Jika kasus penggunaan Anda memerlukan pemantauan, evaluasi penambahan Konstruksi Pemantauan CDK atau solusi pemantauan lainnya.

  • Contoh arsitektur ini menggunakan izin IAM untuk mengontrol akses ke API pekerjaan. Siapa pun yang berwenang untuk berasumsi JobsAPIInvokeRole akan dapat memanggil API pekerjaan. Dengan demikian, mekanisme kontrol akses adalah biner. Jika kasus penggunaan Anda memerlukan model otorisasi yang lebih kompleks, evaluasi menggunakan mekanisme kontrol akses yang berbeda.

  • Saat pengguna mengirim POST permintaan HTTP ke titik akhir API /jobs jobs, data input divalidasi pada dua tingkatan yang berbeda:

    • API Gateway bertanggung jawab atas validasi permintaan pertama.

    • Fungsi pemrosesan acara melakukan permintaan kedua.

      Tidak ada validasi yang dilakukan saat pengguna melakukan GET permintaan HTTP ke titik akhir API /jobs/{jobId} lowongan. Jika kasus penggunaan Anda memerlukan validasi input tambahan dan tingkat keamanan yang lebih tinggi, evaluasi penggunaan AWS WAF untuk melindungi API Anda.

  • Untuk menghindari pembatasan, dokumentasi DynamoDB Streams mencegah pengguna membaca dengan lebih dari dua konsumen dari pecahan aliran yang sama. Untuk meningkatkan jumlah konsumen, sebaiknya gunakan Amazon Kinesis Data Streams.

  • Penguncian optimis telah digunakan dalam contoh ini untuk memastikan pembaruan item yang konsisten dalam tabel jobs_table DynamoDB. Bergantung pada persyaratan kasus penggunaan, Anda mungkin perlu menerapkan mekanisme penguncian yang lebih andal, seperti penguncian pesimis.

Epik

TugasDeskripsiKeterampilan yang dibutuhkan

Kloning repositori.

Untuk mengkloning repositori secara lokal, jalankan perintah berikut:

git clone https://github.com/aws-samples/asynchronous-event-processing-api-gateway-dynamodb-streams-cdk.git
DevOps insinyur

Siapkan proyek.

Ubah direktori ke root repositori, dan atur lingkungan virtual Python dan semua alat dengan menggunakan Projen:

cd asynchronous-event-processing-api-gateway-api-gateway-dynamodb-streams-cdk npx projen
DevOps insinyur

Pasang kait pra-komit.

Untuk memasang kait pra-komit, lakukan hal berikut:

  1. Aktifkan lingkungan virtual Python:

    source .env/bin/activate
  2. Pasang kait pra-komit:

    pre-commit install pre-commit install --hook-type commit-msg
DevOps insinyur
TugasDeskripsiKeterampilan yang dibutuhkan

Bootstrap AWS CDK.

Untuk bootstrap AWS CDKdi Anda Akun AWS, jalankan perintah berikut:

AWS_PROFILE=$YOUR_AWS_PROFILE npx projen bootstrap
AWS DevOps

Menyebarkan contoh arsitektur.

Untuk menerapkan arsitektur contoh di Anda Akun AWS, jalankan perintah berikut:

AWS_PROFILE=$YOUR_AWS_PROFILE npx projen deploy
AWS DevOps
TugasDeskripsiKeterampilan yang dibutuhkan

Instal prasyarat tes.

Instal di workstation Anda AWS Command Line Interface (AWS CLI), Postman, dan jq.

Menggunakan Postman untuk menguji arsitektur contoh ini disarankan tetapi tidak wajib. Jika Anda memilih alat pengujian API alternatif, pastikan alat tersebut mendukung autentikasi AWS Signature Version 4, dan lihat titik akhir API terbuka yang dapat diperiksa dengan mengekspor REST API.

DevOps insinyur

AsumsikanJobsAPIInvokeRole.

Asumsikan JobsAPIInvokeRole yang dicetak sebagai output dari deploy perintah:

CREDENTIALS=$(AWS_PROFILE=$<YOUR_AWS_PROFILE> aws sts assume-role \ --no-cli-pager \ --role-arn $<JOBS_API_INVOKE_ROLE_ARN> \ --role-session-name JobsAPIInvoke) export AWS_ACCESS_KEY_ID=$(cat $CREDENTIALS | jq ‘.Credentials’’.AccessKeyId’) export AWS_SECRET_ACCESS_KEY=$(cat $CREDENTIALS | jq ‘.Credentials’’.SecretAccessKey’) export AWS_SESSION_TOKEN==$(cat $CREDENTIALS | jq ‘.Credentials’’.SessionToken’)
AWS DevOps

Konfigurasikan Tukang Pos.

  • Untuk mengimpor koleksi Postman yang disertakan dalam repositori, ikuti petunjuk dalam dokumentasi Tukang Pos.

  • Atur JobsAPI variabel dengan nilai-nilai berikut:

    • accessKey- Nilai Credentials.AccessKeyId atribut dari assume-role perintah.

    • baseUrl- Nilai JobsApiJobsAPIEndpoint output dari deploy perintah, tanpa garis miring.

    • regionNilai di Wilayah AWS mana Anda menggunakan arsitektur contoh.

    • seconds- Nilai parameter input untuk pekerjaan contoh. Itu harus bilangan bulat positif.

    • secretKey- Nilai Credentials.SecretAccessKey atribut dari assume-role perintah.

    • sessionToken- Nilai Credentials.SessionToken atribut dari assume-role perintah.

AWS DevOps

Uji contoh arsitektur.

Untuk menguji arsitektur contoh, kirim permintaan ke API pekerjaan. Untuk informasi lebih lanjut, lihat dokumentasi Tukang Pos.

DevOps insinyur

Pemecahan Masalah

IsuSolusi

Penghancuran dan pemindahan arsitektur contoh berikutnya gagal karena grup CloudWatch log Amazon Logs /aws/apigateway/JobsAPIAccessLogs sudah ada.

  1. Jika perlu, ekspor data log Anda ke Amazon Simple Storage Service (Amazon S3).

  2. Hapus grup CloudWatch log Log/aws/apigateway/JobsAPIAccessLogs.

  3. Menerapkan ulang contoh arsitektur.

Sumber daya terkait