

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

# Jalankan pembacaan paralel objek S3 dengan menggunakan Python dalam suatu fungsi AWS Lambda
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function"></a>

*Eduardo Bortoluzzi, Amazon Web Services*

## Ringkasan
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-summary"></a>

Anda dapat menggunakan pola ini untuk mengambil dan meringkas daftar dokumen dari Amazon Simple Storage Service (Amazon S3) bucket secara real time. Pola ini memberikan contoh kode ke objek baca paralel dari bucket S3 di Amazon Web Services ()AWS. Pola ini menampilkan cara menjalankan tugas I/O terikat secara efisien dengan AWS Lambda fungsi menggunakan Python.

Sebuah perusahaan keuangan menggunakan pola ini dalam solusi interaktif untuk secara manual menyetujui atau menolak transaksi keuangan yang berkorelasi secara real time. Dokumen transaksi keuangan disimpan dalam ember S3 yang terkait dengan pasar. Operator memilih daftar dokumen dari bucket S3, menganalisis nilai total transaksi yang dihitung oleh solusi, dan memutuskan untuk menyetujui atau menolak batch yang dipilih.

Tugas terikat I/O mendukung banyak utas. Dalam contoh kode ini, [concurrent.futures. ThreadPoolExecutor](https://docs.python.org/3.13/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor)digunakan dengan maksimal 30 utas simultan, meskipun fungsi Lambda mendukung hingga 1.024 utas (dengan salah satu utas tersebut menjadi proses utama Anda). Batas ini karena terlalu banyak utas menciptakan masalah latensi karena peralihan konteks dan pemanfaatan sumber daya komputasi. Anda juga perlu meningkatkan koneksi pool maksimum `botocore` sehingga semua thread dapat melakukan download objek S3 secara bersamaan.

Kode contoh menggunakan satu objek 8,3 KB, dengan data JSON, dalam ember S3. Objek dibaca beberapa kali. Setelah fungsi Lambda membaca objek, data JSON diterjemahkan ke objek Python. Pada bulan Desember 2024, hasil setelah menjalankan contoh ini adalah 1.000 pembacaan diproses dalam 2,3 detik dan 10.000 pembacaan diproses dalam 27 detik menggunakan fungsi Lambda yang dikonfigurasi dengan memori 2.304 MB. AWS Lambda mendukung konfigurasi memori dari 128 MB menjadi 10.240 MB (10 GB), meskipun meningkatkan Lambdamemory melebihi 2.304 MB tidak membantu mengurangi waktu untuk menjalankan tugas terikat I/O khusus ini.

Alat [AWS Lambda Power Tuning](https://github.com/alexcasalboni/aws-lambda-power-tuning) digunakan untuk menguji konfigurasi memori Lambda yang berbeda dan memverifikasi rasio performance-to-cost terbaik untuk tugas tersebut. Untuk hasil tes, lihat bagian [Informasi tambahan](#run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-additional).

## Prasyarat dan batasan
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-prereqs"></a>

**Prasyarat**
+ Aktif Akun AWS
+ Kemahiran dengan pengembangan Python

**Batasan**
+ Fungsi Lambda dapat memiliki paling banyak [1.024 proses eksekusi](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#function-configuration-deployment-and-execution) atau utas.
+ Baru Akun AWS memiliki batas memori Lambda 3.008 MB. Sesuaikan alat AWS Lambda Power Tuning yang sesuai. Untuk informasi selengkapnya, lihat bagian [Pemecahan Masalah](#run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-troubleshooting).
+ Amazon S3 memiliki batas [5.500 GET/HEAD permintaan per detik per](https://docs.aws.amazon.com/AmazonS3/latest/userguide/optimizing-performance.html) awalan yang dipartisi.

**Versi produk**
+ Python 3.9 atau yang lebih baru
+ AWS Cloud Development Kit (AWS CDK) v2
+ AWS Command Line Interface (AWS CLI) versi 2
+ AWS Lambda Power Tuning 4.3.6 (opsional)

## Arsitektur
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-architecture"></a>

**Tumpukan teknologi target**
+ AWS Lambda
+ Amazon S3
+ AWS Step Functions (jika AWS Lambda Power Tuning digunakan)

**Arsitektur target**

Diagram berikut menunjukkan fungsi Lambda yang membaca objek dari bucket S3 secara paralel. Diagram juga memiliki alur kerja Step Functions untuk alat AWS Lambda Power Tuning untuk menyempurnakan memori fungsi Lambda. Penyetelan halus ini membantu mencapai keseimbangan yang baik antara biaya dan kinerja.

![\[Diagram yang menampilkan fungsi Lambda, bucket S3, dan AWS Step Functions.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/828696e2-6df7-4536-9205-951c99449f4e.png)


**Otomatisasi dan skala**

Fungsi Lambda berskala cepat saat diperlukan. Untuk menghindari kesalahan 503 Slow Down dari Amazon S3 selama permintaan tinggi, kami sarankan untuk membatasi penskalaan.

## Alat
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-tools"></a>

**Layanan AWS**
+ [AWS Cloud Development Kit (AWS CDK) v2](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html) adalah kerangka pengembangan perangkat lunak yang membantu Anda menentukan dan menyediakan AWS Cloud infrastruktur dalam kode. Infrastruktur contoh dibuat untuk digunakan. AWS CDK
+ [AWS Command Line InterfaceAWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)adalah alat open source yang membantu Anda berinteraksi Layanan AWS melalui perintah di shell baris perintah Anda. Dalam pola ini, AWS CLI versi 2 digunakan untuk mengunggah contoh file JSON.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html)adalah 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 Storage Service Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/Welcome.html) adalah layanan penyimpanan objek berbasis cloud yang membantu Anda menyimpan, melindungi, dan mengambil sejumlah data.
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/latest/dg/welcome.html)adalah layanan orkestrasi tanpa server yang membantu Anda menggabungkan fungsi AWS Lambda dan layanan AWS lainnya untuk membangun aplikasi yang penting bagi bisnis.

**Alat-alat lainnya**
+ [Python adalah bahasa](https://www.python.org/) pemrograman komputer tujuan umum. [Penggunaan kembali thread idle worker](https://docs.python.org/3.8/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor) diperkenalkan di Python versi 3.8, dan kode fungsi Lambda dalam pola ini dibuat untuk Python versi 3.9 dan yang lebih baru.

**Repositori kode**

Kode untuk pola ini tersedia di [aws-lambda-parallel-download](https://github.com/aws-samples/aws-lambda-parallel-download) GitHub repositori.

## Praktik terbaik
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-best-practices"></a>
+  AWS CDK Konstruksi ini bergantung pada izin Akun AWS pengguna Anda untuk menerapkan infrastruktur. [Jika Anda berencana menggunakan AWS CDK Pipelines atau penerapan lintas akun, lihat Stack synthesizer.](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping.html#bootstrapping-synthesizers)
+ Aplikasi contoh ini tidak mengaktifkan log akses di bucket S3. Ini adalah praktik terbaik untuk mengaktifkan log akses dalam kode produksi.

## Epik
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-epics"></a>

### Mempersiapkan lingkungan pengembangan
<a name="prepare-the-development-environment"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Periksa versi yang diinstal Python. | Kode ini telah diuji secara khusus pada Python 3.9 dan Python 3.13, dan harus bekerja pada semua versi di antara rilis ini. Untuk memeriksa versi Python Anda, jalankan `python3 -V` di terminal Anda, dan instal versi yang lebih baru jika diperlukan.Untuk memverifikasi bahwa modul yang diperlukan diinstal, jalankan`python3 -c "import pip, venv"`. Tidak ada pesan kesalahan berarti modul diinstal dengan benar dan Anda siap untuk menjalankan contoh ini.  | Arsitek awan | 
| Instal AWS CDK. | Untuk menginstal AWS CDK jika belum diinstal, ikuti petunjuk di [Memulai dengan AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html). Untuk mengonfirmasi bahwa AWS CDK versi yang diinstal adalah 2.0 atau yang lebih baru, jalankan`cdk –version`. | Arsitek awan | 
| Bootstrap lingkungan Anda. | Untuk bootstrap lingkungan Anda, jika belum dilakukan, ikuti instruksi di [Bootstrap lingkungan Anda untuk digunakan dengan AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/bootstrapping-env.html). | Arsitek awan | 

### Kloning repositori contoh
<a name="clone-the-example-repository"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Kloning repositori. | Untuk mengkloning versi terbaru dari repositori, jalankan perintah berikut:<pre>git clone --depth 1 --branch v1.2.0 \<br />git@github.com:aws-samples/aws-lambda-parallel-download.git</pre> | Arsitek awan | 
| Ubah direktori kerja ke repositori kloning. | Jalankan perintah berikut:<pre>cd aws-lambda-parallel-download</pre> | Arsitek awan | 
| Buat lingkungan virtual Python. | Untuk membuat lingkungan virtual Python, jalankan perintah berikut:<pre>python3 -m venv .venv</pre> | Arsitek awan | 
| Aktifkan lingkungan virtual. | Untuk mengaktifkan lingkungan virtual, jalankan perintah berikut:<pre>source .venv/bin/activate</pre> | Arsitek awan | 
| Instal dependensi. | Untuk menginstal dependensi Python, jalankan perintah: `pip`<pre>pip install -r requirements.txt</pre> | Arsitek awan | 
| Jelajahi kodenya. | (Opsional) Contoh kode yang mengunduh objek dari bucket S3 ada di`resources/parallel.py`.Kode infrastruktur ada di `parallel_download` folder. | Arsitek awan | 

### Terapkan dan uji aplikasi
<a name="deploy-and-test-the-app"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Terapkan aplikasi. | Jalankan `cdk deploy`.Tuliskan AWS CDK outputnya:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function.html) | Arsitek awan | 
| Unggah contoh file JSON. | Repositori berisi contoh file JSON sekitar 9 KB. Untuk mengunggah file ke bucket S3 dari tumpukan yang dibuat, jalankan perintah berikut:<pre>aws s3 cp sample.json s3://<ParallelDownloadStack.SampleS3BucketName></pre>Ganti `<ParallelDownloadStack.SampleS3BucketName>` dengan nilai yang sesuai dari AWS CDK output. | Arsitek awan | 
| Jalankan aplikasi. | Untuk menjalankan aplikasi, lakukan hal berikut:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function.html) | Arsitek awan | 
| Tambahkan jumlah unduhan. | (Opsional) Untuk menjalankan 1.500 get panggilan objek, gunakan JSON berikut di **Event JSON parameter**: `Test`<pre>{"repeat": 1500, "objectKey": "sample.json"}</pre> | Arsitek awan | 

### Opsional: Jalankan AWS Lambda Power Tuning
<a name="optional-run-lamlong-power-tuning"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Jalankan alat AWS Lambda Power Tuning. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function.html)Di akhir proses, hasilnya akan berada di tab **input dan output Eksekusi**. | Arsitek awan | 
| Lihat hasil AWS Lambda Power Tuning dalam grafik. | Pada tab **Input dan output eksekusi**, salin tautan `visualization` properti, dan tempel di tab browser baru. | Arsitek awan | 

### Bersihkan
<a name="clean-up"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Hapus objek dari ember S3. | Sebelum Anda menghancurkan sumber daya yang digunakan, Anda menghapus semua objek dari bucket S3:<pre>aws s3 rm s3://<ParallelDownloadStack.SampleS3BucketName> \<br />--recursive</pre>Ingatlah untuk mengganti `<ParallelDownloadStack.SampleS3BucketName>` dengan nilai dari AWS CDK output. | Arsitek awan | 
| Hancurkan sumber daya. | Untuk menghancurkan semua sumber daya yang dibuat untuk pilot ini, jalankan perintah berikut:<pre>cdk destroy</pre> | Arsitek awan | 

## Pemecahan masalah
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-troubleshooting"></a>


| Isu | Solusi | 
| --- | --- | 
| `'MemorySize' value failed to satisfy constraint: Member must have value less than or equal to 3008` | Untuk akun baru, Anda mungkin tidak dapat mengonfigurasi lebih dari 3.008 MB di fungsi Lambda Anda. Untuk menguji menggunakan AWS Lambda Power Tuning, tambahkan properti berikut pada input JSON saat Anda memulai eksekusi Step Functions:<pre>"powerValues": [<br />    512,<br />    1024,<br />    1536,<br />    2048,<br />    2560,<br />    3008<br />  ]</pre> | 

## Sumber daya terkait
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-resources"></a>
+ [Python — concurrent.futures. ThreadPoolExecutor](https://docs.python.org/3/library/concurrent.futures.html#concurrent.futures.ThreadPoolExecutor)
+ [Kuota Lambda - Konfigurasi fungsi, penerapan, dan eksekusi](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-limits.html#function-configuration-deployment-and-execution)
+ [Bekerja dengan AWS CDK in Python](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-python.html)
+ [Fungsi pembuatan profil dengan AWS Lambda Power Tuning](https://docs.aws.amazon.com/lambda/latest/operatorguide/profile-functions.html)

## Informasi tambahan
<a name="run-parallel-reads-of-s3-objects-by-using-python-in-an-aws-lambda-function-additional"></a>

**Kode**

Cuplikan kode berikut melakukan pemrosesan I/O paralel:

```
with ThreadPoolExecutor(max_workers=MAX_WORKERS) as executor:
  for result in executor.map(a_function, (the_arguments)):
    ...
```

`ThreadPoolExecutor`Menggunakan kembali utas saat tersedia.

**Pengujian dan hasil**

Tes ini dilakukan pada Desember 2024.

Tes pertama memproses 2.500 pembacaan objek, dengan hasil sebagai berikut.

![\[Waktu doa turun dan biaya doa meningkat seiring dengan meningkatnya memori.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/f6743412-1e52-4c4c-a51c-ac0f75b3b998.png)


Mulai dari 3.009 MB, tingkat waktu pemrosesan tetap hampir sama untuk setiap peningkatan memori, tetapi biaya meningkat seiring dengan meningkatnya ukuran memori.

Tes lain menyelidiki kisaran antara 1.536 MB dan 3.072 MB memori, menggunakan nilai yang kelipatan 256 MB dan memproses 10.000 pembacaan objek, dengan hasil sebagai berikut.

![\[Penurunan perbedaan antara penurunan waktu doa dan kenaikan biaya doa.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/c75d4443-74d8-4b93-9b4d-b2640869381e.png)


 performance-to-costRasio terbaik adalah dengan konfigurasi Lambda memori 2.304 MB.

Sebagai perbandingan, proses sekuensial 2.500 pembacaan objek membutuhkan waktu 47 detik. Proses paralel menggunakan konfigurasi Lambda 2.304 MB membutuhkan waktu 7 detik, yaitu 85 persen lebih sedikit.

![\[Bagan yang menunjukkan penurunan waktu saat beralih dari pemrosesan sekuensial ke paralel.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/b46e9b16-9842-4291-adfa-3ef012b89aec/images/f3dcc44d-ac20-4b75-897d-1d71f0d59781.png)
