

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

# Struktur proyek Python dalam arsitektur heksagonal menggunakan AWS Lambda
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda"></a>

*Furkan Oruc, Dominik Goby, Darius Kunce, dan Michal Ploski, Amazon Web Services*

## Ringkasan
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-summary"></a>

Pola ini menunjukkan bagaimana menyusun proyek Python dalam arsitektur heksagonal dengan menggunakan AWS Lambda. Pola ini menggunakan AWS Cloud Development Kit (AWS CDK) sebagai alat infrastruktur sebagai kode (IAc), Amazon API Gateway sebagai REST API, dan Amazon DynamoDB sebagai lapisan persistensi. Arsitektur heksagonal mengikuti prinsip-prinsip desain berbasis domain. Dalam arsitektur heksagonal, perangkat lunak terdiri dari tiga komponen: domain, port, dan adaptor. *Untuk informasi rinci tentang arsitektur heksagonal dan manfaatnya, lihat panduan [Membangun arsitektur heksagonal](https://docs.aws.amazon.com/prescriptive-guidance/latest/hexagonal-architectures/) di AWS.*

## Prasyarat dan batasan
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-prereqs"></a>

**Prasyarat**
+ Akun AWS yang aktif
+ Pengalaman dalam Python
+ Keakraban dengan AWS Lambda, AWS CDK, Amazon API Gateway, dan DynamoDB
+  GitHub Akun (lihat [instruksi untuk mendaftar](https://docs.github.com/en/get-started/signing-up-for-github/signing-up-for-a-new-github-account))
+ Git (lihat [petunjuk instalasi](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git))
+ Editor kode untuk membuat perubahan dan mendorong kode Anda ke GitHub (misalnya, [Visual Studio Code](https://code.visualstudio.com/) atau [JetBrains PyCharm](https://www.jetbrains.com/pycharm/))
+ Docker diinstal, dan daemon Docker aktif dan berjalan

**Versi produk**
+ Git versi 2.24.3 atau yang lebih baru
+ Python versi 3.7 atau yang lebih baru
+ AWS CDK v2
+ Puisi versi 1.1.13 atau yang lebih baru
+ AWS Lambda Powertools untuk Python versi 1.25.6 atau yang lebih baru
+ pytest versi 7.1.1 atau yang lebih baru
+ Moto versi 3.1.9 atau yang lebih baru
+ pydantic versi 1.9.0 atau yang lebih baru
+ Boto3 versi 1.22.4 atau yang lebih baru
+ mypy-boto3-dynamodb versi 1.24.0 atau yang lebih baru

## Arsitektur
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-architecture"></a>

**Tumpukan teknologi target**

Tumpukan teknologi target terdiri dari layanan Python yang menggunakan API Gateway, Lambda, dan DynamoDB. Layanan ini menggunakan adaptor DynamoDB untuk mempertahankan data. Ini menyediakan fungsi yang menggunakan Lambda sebagai titik masuk. Layanan ini menggunakan Amazon API Gateway untuk mengekspos REST API. API menggunakan AWS Identity and Access Management (IAM) untuk [otentikasi klien.](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html)

**Arsitektur target**

Untuk mengilustrasikan implementasi, pola ini menerapkan arsitektur target tanpa server. Klien dapat mengirim permintaan ke titik akhir API Gateway. API Gateway meneruskan permintaan ke fungsi Lambda target yang mengimplementasikan pola arsitektur heksagonal. Fungsi Lambda melakukan operasi create, read, update, and delete (CRUD) pada tabel DynamoDB.


| 
| 
| Pola ini diuji di lingkungan PoC. Anda harus melakukan tinjauan keamanan untuk mengidentifikasi model ancaman dan membuat basis kode yang aman sebelum Anda menerapkan arsitektur apa pun ke lingkungan produksi.  | 
| --- |

![\[Arsitektur target untuk penataan proyek Python dalam arsitektur heksagonal\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/25bd7169-ea5e-4a21-a865-c91c30a3c0da/images/de0d4f0d-ad19-43ec-bd10-676b25477b64.png)


API mendukung lima operasi pada entitas produk:
+ `GET /products`mengembalikan semua produk. 
+ `POST /products`menciptakan produk baru. 
+ `GET /products/{id}`mengembalikan produk tertentu.
+ `PUT /products/{id}`memperbarui produk tertentu. 
+ `DELETE /products/{id}`menghapus produk tertentu.

Anda dapat menggunakan struktur folder berikut untuk mengatur proyek Anda untuk mengikuti pola arsitektur heksagonal:  

```
app/  # application code
|--- adapters/  # implementation of the ports defined in the domain
     |--- tests/  # adapter unit tests
|--- entrypoints/  # primary adapters, entry points
     |--- api/  # api entry point
          |--- model/  # api model
          |--- tests/  # end to end api tests
|--- domain/  # domain to implement business logic using hexagonal architecture
     |--- command_handlers/  # handlers used to execute commands on the domain
     |--- commands/  # commands on the domain
     |--- events/  # events triggered via the domain
     |--- exceptions/  # exceptions defined on the domain
     |--- model/  # domain model
     |--- ports/  # abstractions used for external communication
     |--- tests/  # domain tests
|--- libraries/  # List of 3rd party libraries used by the Lambda function
infra/  # infrastructure code
simple-crud-app.py  # AWS CDK v2 app
```

## Alat
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-tools"></a>

**Layanan AWS**
+ [Amazon API Gateway](https://aws.amazon.com/api-gateway/) adalah layanan yang dikelola sepenuhnya yang memudahkan pengembang untuk membuat, menerbitkan, memelihara, memantau, dan mengamankan APIs pada skala apa pun.
+ [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) adalah database NoSQL bernilai kunci yang dikelola sepenuhnya, tanpa server, yang dirancang untuk menjalankan aplikasi berkinerja tinggi pada skala apa pun.
+ [AWS Lambda](https://aws.amazon.com/lambda/) adalah layanan komputasi tanpa server dan berbasis peristiwa yang memungkinkan Anda menjalankan kode untuk hampir semua jenis aplikasi atau layanan backend tanpa menyediakan atau mengelola server. Anda dapat meluncurkan fungsi Lambda dari lebih dari 200 layanan AWS dan aplikasi perangkat lunak sebagai layanan (SaaS), dan hanya membayar untuk apa yang Anda gunakan.

**Alat**
+ [Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git) digunakan sebagai sistem kontrol versi untuk pengembangan kode dalam pola ini.
+ [Python](https://www.python.org/) digunakan sebagai bahasa pemrograman untuk pola ini. Python menyediakan struktur data tingkat tinggi dan pendekatan untuk pemrograman berorientasi objek. AWS Lambda menyediakan runtime Python bawaan yang menyederhanakan pengoperasian layanan Python.
+ [Visual Studio Code](https://code.visualstudio.com/) digunakan sebagai IDE untuk pengembangan dan pengujian untuk pola ini. Anda dapat menggunakan IDE apa pun yang mendukung pengembangan Python (misalnya, [PyCharm](https://www.jetbrains.com/pycharm/)).
+ [AWS Cloud Development Kit (AWS CDK](https://aws.amazon.com/cdk/)) adalah kerangka kerja pengembangan perangkat lunak open-source yang memungkinkan Anda menentukan sumber daya aplikasi cloud Anda dengan menggunakan bahasa pemrograman yang sudah dikenal. Pola ini menggunakan CDK untuk menulis dan menyebarkan infrastruktur cloud sebagai kode.
+ [Puisi](https://python-poetry.org/) digunakan untuk mengelola dependensi dalam pola.
+ [Docker](https://www.docker.com/) digunakan oleh AWS CDK untuk membangun paket dan lapisan Lambda.

**Kode**

Kode untuk pola ini tersedia di repositori sampel arsitektur [heksagonal GitHub Lambda](https://github.com/aws-samples/lambda-hexagonal-architecture-sample).

## Praktik terbaik
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-best-practices"></a>

Untuk menggunakan pola ini dalam lingkungan produksi, ikuti praktik terbaik berikut:
+ Gunakan kunci terkelola pelanggan di AWS Key Management Service (AWS KMS) untuk mengenkripsi grup [log Amazon dan tabel CloudWatch Amazon](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/encrypt-log-data-kms.html) [DynamoDB](https://docs.aws.amazon.com/kms/latest/developerguide/services-dynamodb.html).
+ Konfigurasikan [AWS WAF untuk Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-control-access-aws-waf.html) agar hanya mengizinkan akses dari jaringan organisasi Anda.
+ Pertimbangkan opsi lain untuk otorisasi API Gateway jika IAM tidak memenuhi kebutuhan Anda. Misalnya, Anda dapat menggunakan [kumpulan pengguna Amazon Cognito](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-integrate-with-cognito.html) atau otorisasi [API Gateway Lambda](https://docs.aws.amazon.com/apigateway/latest/developerguide/apigateway-use-lambda-authorizer.html).
+ Gunakan backup [DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/BackupRestore.html).
+ Konfigurasikan fungsi Lambda dengan [penyebaran virtual private cloud (VPC) untuk menjaga lalu lintas](https://docs.aws.amazon.com/lambda/latest/dg/configuration-vpc.html) jaringan di dalam cloud.
+ Perbarui konfigurasi asal yang diizinkan untuk [preflight cross-origin resource sharing (CORS)](https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS) untuk membatasi akses ke domain asal yang meminta saja.
+ Gunakan [cdk-nag untuk memeriksa](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/check-aws-cdk-applications-or-cloudformation-templates-for-best-practices-by-using-cdk-nag-rule-packs.html) kode AWS CDK untuk praktik terbaik keamanan.
+ Pertimbangkan untuk menggunakan alat pemindaian kode untuk menemukan masalah keamanan umum dalam kode. Misalnya, [Bandit](https://bandit.readthedocs.io/en/latest/) adalah alat yang dirancang untuk menemukan masalah keamanan umum dalam kode Python. [Pip-Audit](https://pypi.org/project/pip-audit/) memindai lingkungan Python untuk paket yang memiliki kerentanan yang diketahui.

Pola ini menggunakan [AWS X-Ray](https://aws.amazon.com/xray/?nc1=h_ls) untuk melacak permintaan melalui titik masuk, domain, dan adaptor aplikasi. AWS X-Ray membantu pengembang mengidentifikasi kemacetan dan menentukan latensi tinggi untuk meningkatkan kinerja aplikasi.

## Epik
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-epics"></a>

### Inisialisasi proyek
<a name="initialize-the-project"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat repositori Anda sendiri. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Pengembang aplikasi | 
| Instal dependensi. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Pengembang aplikasi | 
| Konfigurasikan IDE Anda. | Kami merekomendasikan Visual Studio Code, tetapi Anda dapat menggunakan IDE pilihan Anda yang mendukung Python. Langkah-langkah berikut adalah untuk Visual Studio Code.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Pengembang aplikasi | 
| Jalankan pengujian unit, opsi 1: Gunakan Kode Visual Studio. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Pengembang aplikasi | 
| Jalankan pengujian unit, opsi 2: Gunakan perintah shell. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Pengembang aplikasi | 

### Menyebarkan dan menguji aplikasi
<a name="deploy-and-test-the-application"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Minta kredensi sementara. | Untuk memiliki kredensi AWS di shell saat Anda menjalankan`cdk deploy`, buat kredensil sementara dengan menggunakan AWS IAM Identity Center (penerus AWS Single Sign-On). Untuk petunjuknya, lihat posting blog [Cara mengambil kredensi jangka pendek untuk penggunaan CLI dengan AWS](https://aws.amazon.com/blogs/security/aws-single-sign-on-now-enables-command-line-interface-access-for-aws-accounts-using-corporate-credentials/) IAM Identity Center. | Pengembang aplikasi, AWS DevOps | 
| Men-deploy aplikasi. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Pengembang aplikasi, AWS DevOps | 
| Uji API, opsi 1: Gunakan konsol. | Gunakan [konsol API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-test-method.html) untuk menguji API. Untuk informasi selengkapnya tentang operasi dan request/response pesan API, lihat [bagian penggunaan API dari file readme](https://github.com/aws-samples/lambda-hexagonal-architecture-sample/blob/main/README.md#api-usage) di GitHub repositori. | Pengembang aplikasi, AWS DevOps | 
| Uji API, opsi 2: Gunakan Tukang Pos. | Jika Anda ingin menggunakan alat seperti [Tukang Pos](https://www.postman.com/):[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Pengembang aplikasi, AWS DevOps | 

### Kembangkan layanan
<a name="develop-the-service"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Tulis tes unit untuk domain bisnis. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Pengembang aplikasi | 
| Menerapkan perintah dan penangan perintah. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Pengembang aplikasi | 
| Tulis tes integrasi untuk adaptor sekunder. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Pengembang aplikasi | 
| Menerapkan adaptor sekunder. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Pengembang aplikasi | 
| Tulis end-to-end tes. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Pengembang aplikasi | 
| Menerapkan adaptor utama. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.html) | Pengembang aplikasi | 

## Sumber daya terkait
<a name="structure-a-python-project-in-hexagonal-architecture-using-aws-lambda-resources"></a>

**Panduan APG**
+ [Membangun arsitektur heksagonal di AWS](https://docs.aws.amazon.com/prescriptive-guidance/latest/hexagonal-architectures/)

**Referensi AWS**
+ [Dokumentasi AWS Lambda](https://docs.aws.amazon.com/lambda/)
+ [Dokumentasi AWS CDK](https://docs.aws.amazon.com/cdk/)
  + [Aplikasi AWS CDK pertama Anda](https://docs.aws.amazon.com/cdk/v2/guide/hello_world.html)
+ [Dokumentasi API Gateway](https://docs.aws.amazon.com/apigateway/)
  + [Kontrol akses ke API dengan izin IAM](https://docs.aws.amazon.com/apigateway/latest/developerguide/permissions.html)
  + [Menggunakan konsol API Gateway untuk menguji metode REST API](https://docs.aws.amazon.com/apigateway/latest/developerguide/how-to-test-method.html)
+ [Dokumentasi Amazon DynamoDB](https://docs.aws.amazon.com/dynamodb/)

**Alat**
+ [Situs git-scm.com](https://git-scm.com/)
+ [Instalasi Git](https://git-scm.com/book/en/v2/Getting-Started-Installing-Git)
+ [Membuat GitHub repositori baru](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-new-repository)
+ [Situs web Python](https://www.python.org/)
+ [AWS Lambda Powertools untuk Python](https://docs.powertools.aws.dev/lambda/python/latest/)
+ [Situs Postman](https://www.postman.com/)
+ [Pustaka objek tiruan Python](https://docs.python.org/3/library/unittest.mock.html)
+ [Situs web puisi](https://python-poetry.org/)

**IDEs**
+ [Situs Visual Studio Code](https://code.visualstudio.com/)
+ [PyCharm situs web](https://www.jetbrains.com/pycharm/)