

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

# Modernisasi
<a name="modernization-pattern-list"></a>

**Topics**
+ [Secara otomatis mengarsipkan item ke Amazon S3 menggunakan DynamoDB TTL](automatically-archive-items-to-amazon-s3-using-dynamodb-ttl.md)
+ [Membangun arsitektur tanpa server multi-tenant di Amazon Service OpenSearch](build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.md)
+ [Menerapkan aplikasi multi-stack menggunakan AWS CDK dengan TypeScript](deploy-multiple-stack-applications-using-aws-cdk-with-typescript.md)
+ [Otomatiskan penerapan aplikasi bersarang menggunakan AWS SAM](automate-deployment-of-nested-applications-using-aws-sam.md)
+ [Menerapkan isolasi penyewa SaaS untuk Amazon S3 dengan menggunakan mesin penjual otomatis token AWS Lambda](implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine.md)
+ [Menerapkan pola saga tanpa server dengan menggunakan AWS Step Functions](implement-the-serverless-saga-pattern-by-using-aws-step-functions.md)
+ [Mengelola aplikasi kontainer lokal dengan menyiapkan Amazon ECS Anywhere dengan AWS CDK](manage-on-premises-container-applications-by-setting-up-amazon-ecs-anywhere-with-the-aws-cdk.md)
+ [Memodernisasi aplikasi Formulir Web ASP.NET di AWS](modernize-asp-net-web-forms-applications-on-aws.md)
+ [Orientasi penyewa dalam arsitektur SaaS untuk model silo menggunakan C\$1 dan AWS CDK](tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk.md)
+ [Menguraikan monolit menjadi layanan mikro dengan menggunakan CQRS dan sumber acara](decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.md)
+ [Lebih banyak pola](modernization-more-patterns-pattern-list.md)

# Secara otomatis mengarsipkan item ke Amazon S3 menggunakan DynamoDB TTL
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl"></a>

*Tabby Ward, Amazon Web Services*

## Ringkasan
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-summary"></a>

Pola ini menyediakan langkah-langkah untuk menghapus data lama dari tabel Amazon DynamoDB dan mengarsipkannya ke bucket Amazon Simple Storage Service (Amazon S3) di Amazon Web Services (AWS) tanpa harus mengelola armada server. 

Pola ini menggunakan Amazon DynamoDB Time to Live (TTL) untuk secara otomatis menghapus item lama dan Amazon DynamoDB Streams untuk menangkap item kedaluwarsa TTL. Kemudian menghubungkan DynamoDB Streams ke AWS Lambda, yang menjalankan kode tanpa menyediakan atau mengelola server apa pun. 

Saat item baru ditambahkan ke aliran DynamoDB, fungsi Lambda dimulai dan menulis data ke aliran pengiriman Amazon Data Firehose. Firehose menyediakan solusi sederhana dan terkelola sepenuhnya untuk memuat data sebagai arsip ke Amazon S3.

DynamoDB sering digunakan untuk menyimpan data time series, seperti data klik-aliran halaman web atau data Internet of Things (IoT) dari sensor dan perangkat yang terhubung. Daripada menghapus item yang jarang diakses, banyak pelanggan ingin mengarsipkannya untuk tujuan audit. TTL menyederhanakan pengarsipan ini dengan secara otomatis menghapus item berdasarkan atribut timestamp. 

Item yang dihapus oleh TTL dapat diidentifikasi di DynamoDB Streams, yang menangkap urutan modifikasi tingkat item yang diurutkan waktu dan menyimpan urutan dalam log hingga 24 jam. Data ini dapat dikonsumsi oleh fungsi Lambda dan diarsipkan dalam bucket Amazon S3 untuk mengurangi biaya penyimpanan. [Untuk mengurangi biaya lebih lanjut, [aturan siklus hidup Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html) dapat dibuat untuk mentransisikan data secara otomatis (segera setelah dibuat) ke kelas penyimpanan dengan biaya terendah.](https://aws.amazon.com/s3/storage-classes/)

## Prasyarat dan batasan
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-prereqs"></a>

**Prasyarat**
+ Akun AWS yang aktif.
+ [AWS Command Line Interface (AWS CLI) 1.7 atau](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html) yang lebih baru, diinstal dan dikonfigurasi di macOS, Linux, atau Windows.
+ [Python 3.7](https://www.python.org/downloads/release/python-370/) atau yang lebih baru.
+ [Boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html), diinstal dan dikonfigurasi. Jika Boto3 belum diinstal, jalankan `python -m pip install boto3` perintah untuk menginstalnya.

## Arsitektur
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-architecture"></a>

**Tumpukan teknologi**
+ Amazon DynamoDB
+ Amazon DynamoDB Streams
+ Amazon Data Firehose
+ AWS Lambda
+ Amazon S3

![\[Proses empat langkah dari DynamoDB ke bucket S3.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9dbc833f-cf3c-4574-8f09-d0b81134fe41/images/50d9da65-5398-4a99-bc8f-58afc80e9d7b.png)


1. Item dihapus oleh TTL.

1. Pemicu aliran DynamoDB memanggil fungsi prosesor aliran Lambda.

1. Fungsi Lambda menempatkan catatan dalam aliran pengiriman Firehose dalam format batch.

1. Catatan data diarsipkan dalam bucket S3.

## Alat
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-tools"></a>
+ [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) — AWS Command Line Interface (AWS CLI) Command Line Interface (AWS CLI) adalah alat terpadu untuk mengelola layanan AWS Anda.
+ [Amazon DynamoDB - Amazon](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) DynamoDB adalah database nilai kunci dan dokumen yang memberikan kinerja milidetik satu digit pada skala apa pun.
+ [Amazon DynamoDB Time to Live (TTL) -](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html) Amazon DynamoDB TTL membantu Anda menentukan stempel waktu per item untuk menentukan kapan item tidak lagi diperlukan.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Types_Amazon_DynamoDB_Streams.html) Streams - Amazon DynamoDB Streams menangkap urutan modifikasi tingkat item yang diurutkan waktu di tabel DynamoDB apa pun dan menyimpan informasi ini dalam log hingga 24 jam.
+ [Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html) — Amazon Data Firehose adalah cara termudah untuk memuat data streaming secara andal ke dalam data lake, penyimpanan data, dan layanan analitik.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) — AWS Lambda menjalankan kode tanpa perlu menyediakan atau mengelola server. Anda hanya membayar untuk waktu komputasi yang Anda konsumsi.
+ [Amazon S3 — Amazon Simple Storage](https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html) Service (Amazon S3) Simple Storage Service (Amazon S3) adalah layanan penyimpanan objek yang menawarkan skalabilitas, ketersediaan data, keamanan, dan kinerja terdepan di industri.

**Kode**

Kode untuk pola ini tersedia di [item GitHub Arsip ke S3 menggunakan repositori DynamoDB TTL](https://github.com/aws-samples/automatically-archive-items-to-s3-using-dynamodb-ttl).

## Epik
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-epics"></a>

### Siapkan tabel DynamoDB, TTL, dan aliran DynamoDB
<a name="set-up-a-dynamodb-table-ttl-and-a-dynamodb-stream"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat tabel DynamoDB. | Gunakan AWS CLI untuk membuat tabel di DynamoDB yang disebut. `Reservation` Pilih unit kapasitas baca acak (RCU) dan unit kapasitas tulis (WCU), dan berikan tabel Anda dua atribut: `ReservationID` dan. `ReservationDate` <pre>aws dynamodb create-table \<br />--table-name Reservation \<br />--attribute-definitions AttributeName=ReservationID,AttributeType=S AttributeName=ReservationDate,AttributeType=N \<br />--key-schema AttributeName=ReservationID,KeyType=HASH AttributeName=ReservationDate,KeyType=RANGE \<br />--provisioned-throughput ReadCapacityUnits=100,WriteCapacityUnits=100 </pre>`ReservationDate`adalah stempel waktu epoch yang akan digunakan untuk menyalakan TTL. | Arsitek cloud, Pengembang aplikasi | 
| Nyalakan DynamoDB TTL. | Gunakan AWS CLI untuk mengaktifkan DynamoDB TTL untuk atribut. `ReservationDate`<pre>aws dynamodb update-time-to-live \<br />--table-name Reservation\<br />  --time-to-live-specification Enabled=true,AttributeName=ReservationDate</pre> | Arsitek cloud, Pengembang aplikasi | 
| Nyalakan aliran DynamoDB. | Gunakan AWS CLI untuk mengaktifkan aliran DynamoDB untuk `Reservation` tabel dengan menggunakan jenis aliran. `NEW_AND_OLD_IMAGES` <pre>aws dynamodb update-table \<br />--table-name Reservation \<br />  --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES</pre>Aliran ini akan berisi catatan untuk item baru, item yang diperbarui, item yang dihapus, dan item yang dihapus oleh TTL. Catatan untuk item yang dihapus oleh TTL berisi atribut metadata tambahan untuk membedakannya dari item yang dihapus secara manual. `userIdentity`Bidang untuk penghapusan TTL menunjukkan bahwa layanan DynamoDB melakukan tindakan penghapusan. Dalam pola ini, hanya item yang dihapus oleh TTL yang diarsipkan, tetapi Anda hanya dapat mengarsipkan catatan di mana `eventName` ada `REMOVE` dan `userIdentity` berisi `principalId` sama dengan. `dynamodb.amazonaws.com` | Arsitek cloud, Pengembang aplikasi | 

### Buat dan konfigurasikan bucket S3
<a name="create-and-configure-an-s3-bucket"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat ember S3. | Gunakan AWS CLI untuk membuat bucket S3 tujuan di Wilayah AWS Anda, ganti `us-east-1` dengan Region dan amzn-s3- demo-destination-bucket dengan nama bucket Anda. <pre>aws s3api create-bucket \<br />--bucket amzn-s3-demo-destination-bucket \<br />--region us-east-1</pre>Pastikan nama bucket S3 Anda unik secara global, karena namespace dibagikan oleh semua akun AWS. | Arsitek cloud, Pengembang aplikasi | 
| Buat kebijakan siklus hidup 30 hari untuk bucket S3. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/automatically-archive-items-to-amazon-s3-using-dynamodb-ttl.html) | Arsitek cloud, Pengembang aplikasi | 

### Membuat aliran pengiriman Firehose
<a name="create-a-akf-delivery-stream"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat dan konfigurasikan aliran pengiriman Firehose. | Unduh dan edit contoh `CreateFireHoseToS3.py` kode dari GitHub repositori. Kode ini ditulis dengan Python dan menunjukkan cara membuat aliran pengiriman Firehose dan peran AWS Identity and Access Management (IAM). Peran IAM akan memiliki kebijakan yang dapat digunakan oleh Firehose untuk menulis ke bucket S3 tujuan.Untuk menjalankan skrip, gunakan argumen perintah dan baris perintah berikut.Argumen 1=`<Your_S3_bucket_ARN>`, yang merupakan Amazon Resource Name (ARN) untuk bucket yang Anda buat sebelumnyaArgumen 2= Nama Firehose Anda (Pilot ini `firehose_to_s3_stream` menggunakan.)Argumen 3= Nama peran IAM Anda (Pilot ini menggunakan`firehose_to_s3`.)<pre>python CreateFireHoseToS3.py <Your_S3_Bucket_ARN> firehose_to_s3_stream firehose_to_s3</pre>Jika peran IAM yang ditentukan tidak ada, skrip akan membuat peran asumsi dengan kebijakan hubungan tepercaya, serta kebijakan yang memberikan izin Amazon S3 yang memadai. Untuk contoh kebijakan ini, lihat bagian *Informasi tambahan*. | Arsitek cloud, Pengembang aplikasi | 
| Verifikasi aliran pengiriman Firehose. | Jelaskan aliran pengiriman Firehose dengan menggunakan AWS CLI untuk memverifikasi bahwa aliran pengiriman berhasil dibuat.<pre>aws firehose describe-delivery-stream --delivery-stream-name firehose_to_s3_stream </pre> | Arsitek cloud, Pengembang aplikasi | 

### Buat fungsi Lambda untuk memproses aliran pengiriman Firehose
<a name="create-a-lambda-function-to-process-the-akf-delivery-stream"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat kebijakan kepercayaan untuk fungsi Lambda. | Buat file kebijakan kepercayaan dengan informasi berikut.<pre> {<br />     "Version": "2012-10-17",		 	 	 <br />     "Statement": [<br />      {<br />          "Effect": "Allow",<br />          "Principal": {<br />              "Service": "lambda.amazonaws.com"<br />           },<br />           "Action": "sts:AssumeRole"<br />      }<br />    ]<br />  } </pre>Ini memberi izin fungsi Anda untuk mengakses sumber daya AWS. | Arsitek cloud, Pengembang aplikasi | 
| Buat peran eksekusi untuk fungsi Lambda. | Untuk membuat peran eksekusi, jalankan kode berikut.<pre>aws iam create-role --role-name lambda-ex --assume-role-policy-document file://TrustPolicy.json</pre> | Arsitek cloud, Pengembang aplikasi | 
| Tambahkan izin ke peran. | Untuk menambahkan izin ke peran, gunakan `attach-policy-to-role` perintah.<pre>aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole<br />aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole<br />aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/AmazonKinesisFirehoseFullAccess<br />aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/IAMFullAccess </pre> | Arsitek cloud, Pengembang aplikasi | 
| Buat fungsi Lambda. | Kompres `LambdaStreamProcessor.py` file dari repositori kode dengan menjalankan perintah berikut.<pre>zip function.zip LambdaStreamProcessor.py</pre>Saat Anda membuat fungsi Lambda, Anda akan memerlukan peran eksekusi Lambda ARN. Untuk mendapatkan ARN, jalankan kode berikut.<pre>aws iam get-role \<br />--role-name lambda-ex </pre>Untuk membuat fungsi Lambda, jalankan kode berikut.<pre># Review the environment variables and replace them with your values.<br /><br />aws lambda create-function --function-name LambdaStreamProcessor \<br />--zip-file fileb://function.zip --handler LambdaStreamProcessor.handler --runtime python3.8 \<br />--role {Your Lamda Execution Role ARN}\<br />  --environment Variables="{firehose_name=firehose_to_s3_stream,bucket_arn = <Your_S3_bucket_ARN>,iam_role_name = firehose_to_s3, batch_size=400}"</pre> | Arsitek cloud, Pengembang aplikasi | 
| Konfigurasikan pemicu fungsi Lambda. | Gunakan AWS CLI untuk mengonfigurasi pemicu (DynamoDB Streams), yang memanggil fungsi Lambda. Ukuran batch 400 adalah untuk menghindari masalah konkurensi Lambda.<pre>aws lambda create-event-source-mapping --function-name LambdaStreamProcessor \<br />--batch-size 400 --starting-position LATEST \<br />--event-source-arn <Your Latest Stream ARN From DynamoDB Console></pre> | Arsitek cloud, Pengembang aplikasi | 

### Uji fungsionalitasnya
<a name="test-the-functionality"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Tambahkan item dengan cap waktu kedaluwarsa ke tabel Reservasi. | Untuk menguji fungsionalitas, tambahkan item dengan stempel waktu epoch kedaluwarsa ke tabel. `Reservation` TTL akan secara otomatis menghapus item berdasarkan stempel waktu. Fungsi Lambda dimulai pada aktivitas DynamoDB Stream, dan memfilter acara untuk mengidentifikasi aktivitas atau item yang dihapus. `REMOVE` Kemudian menempatkan catatan dalam aliran pengiriman Firehose dalam format batch.Aliran pengiriman Firehose mentransfer item ke bucket S3 tujuan dengan awalan. `firehosetos3example/year=current year/month=current month/ day=current day/hour=current hour/`Untuk mengoptimalkan pengambilan data, konfigurasikan Amazon S3 dengan `ErrorOutputPrefix` dan `Prefix` yang dirinci di *bagian Informasi tambahan*. | Arsitek awan  | 

### Bersihkan sumber daya
<a name="clean-up-the-resources"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Hapus semua sumber daya. | Hapus semua sumber daya untuk memastikan bahwa Anda tidak dikenakan biaya untuk layanan apa pun yang tidak Anda gunakan.   | Arsitek cloud, Pengembang aplikasi | 

## Sumber daya terkait
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-resources"></a>
+ [Mengelola siklus hidup penyimpanan](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html)
+ [Kelas Penyimpanan Amazon S3](https://aws.amazon.com/s3/storage-classes/)
+ [Dokumentasi AWS SDK untuk Python (Boto3)](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html)

## Informasi tambahan
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-additional"></a>

**Membuat dan mengonfigurasi aliran pengiriman Firehose — Contoh kebijakan**

*Dokumen contoh kebijakan hubungan tepercaya Firehose*

```
firehose_assume_role = {
        'Version': '2012-10-17',
        'Statement': [
            {
                'Sid': '',
                'Effect': 'Allow',
                'Principal': {
                    'Service': 'firehose.amazonaws.com'
                },
                'Action': 'sts:AssumeRole'
            }
        ]
    }
```

*Contoh kebijakan izin S3*

```
s3_access = {
        "Version": "2012-10-17",		 	 	 
        "Statement": [
            {
                "Sid": "",
                "Effect": "Allow",
                "Action": [
                    "s3:AbortMultipartUpload",
                    "s3:GetBucketLocation",
                    "s3:GetObject",
                    "s3:ListBucket",
                    "s3:ListBucketMultipartUploads",
                    "s3:PutObject"
                ],
                "Resource": [
                    "{your s3_bucket ARN}/*",
                    "{Your s3 bucket ARN}"
                ]
            }
        ]
    }
```

**Uji fungsionalitas - konfigurasi Amazon S3**

Konfigurasi Amazon S3 dengan yang berikut ini `Prefix` dan `ErrorOutputPrefix` dipilih untuk mengoptimalkan pengambilan data. 

*prefix*

```
firehosetos3example/year=! {timestamp: yyyy}/month=! {timestamp:MM}/day=! {timestamp:dd}/hour=!{timestamp:HH}/
```

Firehose pertama kali membuat folder dasar yang disebut `firehosetos3example` langsung di bawah bucket S3. Kemudian mengevaluasi ekspresi`!{timestamp:yyyy}`,,`!{timestamp:MM}`, dan `!{timestamp:HH}` ke tahun`!{timestamp:dd}`, bulan, hari, dan jam menggunakan [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)format Java.

Misalnya, perkiraan timestamp kedatangan 1604683577 dalam waktu zaman Unix mengevaluasi,,, dan. `year=2020` `month=11` `day=06` `hour=05` Oleh karena itu, lokasi di Amazon S3, tempat catatan data dikirimkan, dievaluasi. `firehosetos3example/year=2020/month=11/day=06/hour=05/`

*ErrorOutputPrefix*

```
firehosetos3erroroutputbase/!{firehose:random-string}/!{firehose:error-output-type}/!{timestamp:yyyy/MM/dd}/
```

`ErrorOutputPrefix`Hasilnya dalam folder dasar yang dipanggil `firehosetos3erroroutputbase` langsung di bawah bucket S3. Ekspresi `!{firehose:random-string}` mengevaluasi ke string acak 11 karakter seperti. `ztWxkdg3Thg` Lokasi untuk objek Amazon S3 tempat catatan gagal dikirimkan dapat dievaluasi. `firehosetos3erroroutputbase/ztWxkdg3Thg/processing-failed/2020/11/06/`

# Membangun arsitektur tanpa server multi-tenant di Amazon Service OpenSearch
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service"></a>

*Tabby Ward dan Nisha Gambhir, Amazon Web Services*

## Ringkasan
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-summary"></a>

Amazon OpenSearch Service adalah layanan terkelola yang memudahkan penerapan, pengoperasian, dan skala Elasticsearch, yang merupakan mesin pencari dan analitik sumber terbuka yang populer. OpenSearch Layanan menyediakan pencarian teks gratis serta konsumsi dan dasbor mendekati waktu nyata untuk streaming data seperti log dan metrik. 

Penyedia perangkat lunak sebagai layanan (SaaS) sering menggunakan OpenSearch Layanan untuk mengatasi berbagai kasus penggunaan, seperti mendapatkan wawasan pelanggan dengan cara yang terukur dan aman sekaligus mengurangi kompleksitas dan waktu henti.

Menggunakan OpenSearch Layanan di lingkungan multi-penyewa memperkenalkan serangkaian pertimbangan yang memengaruhi partisi, isolasi, penyebaran, dan pengelolaan solusi SaaS Anda. Penyedia SaaS harus mempertimbangkan cara menskalakan cluster Elasticsearch mereka secara efektif dengan beban kerja yang terus berubah. Mereka juga perlu mempertimbangkan bagaimana kondisi tetangga yang berjenjang dan bising dapat memengaruhi model partisi mereka.

Pola ini meninjau model yang digunakan untuk mewakili dan mengisolasi data penyewa dengan konstruksi Elasticsearch. Selain itu, pola berfokus pada arsitektur referensi tanpa server sederhana sebagai contoh untuk menunjukkan pengindeksan dan pencarian menggunakan OpenSearch Layanan di lingkungan multi-penyewa. Ini mengimplementasikan model partisi data pool, yang berbagi indeks yang sama di antara semua penyewa sambil mempertahankan isolasi data penyewa. Pola ini menggunakan AWS layanan berikut: Amazon API Gateway, AWS Lambda, Amazon Simple Storage Service (Amazon S3), dan Service. OpenSearch 

Untuk informasi selengkapnya tentang model kumpulan dan model partisi data lainnya, lihat bagian [Informasi tambahan](#build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-additional).

## Prasyarat dan batasan
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-prereqs"></a>

**Prasyarat**
+ Aktif Akun AWS
+ [AWS Command Line Interface (AWS CLI) versi 2.x](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html), diinstal dan dikonfigurasi di macOS, Linux, atau Windows
+ [Python versi 3.9](https://www.python.org/downloads/release/python-3921/)
+ [pip3](https://pip.pypa.io/en/stable/) — Kode sumber Python disediakan sebagai file.zip untuk digunakan dalam fungsi Lambda. Jika Anda ingin menggunakan kode secara lokal atau menyesuaikannya, ikuti langkah-langkah berikut untuk mengembangkan dan mengkompilasi ulang kode sumber:

  1. Hasilkan `requirements.txt` file dengan menjalankan perintah berikut di direktori yang sama dengan skrip Python: `pip3 freeze > requirements.txt`

  1. Instal dependensi: `pip3 install -r requirements.txt`

**Batasan**
+ Kode ini berjalan dengan Python, dan saat ini tidak mendukung bahasa pemrograman lainnya. 
+ Aplikasi sampel tidak menyertakan dukungan AWS Cross-region atau Disaster Recovery (DR). 
+ Pola ini dimaksudkan untuk tujuan demonstrasi saja. Ini tidak dimaksudkan untuk digunakan dalam lingkungan produksi.

## Arsitektur
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-architecture"></a>

Diagram berikut menggambarkan arsitektur tingkat tinggi dari pola ini. Arsitekturnya meliputi:
+ Lambda untuk mengindeks dan menanyakan konten 
+ OpenSearch Layanan untuk melakukan pencarian 
+ API Gateway untuk menyediakan interaksi API dengan pengguna
+ Amazon S3 untuk menyimpan data mentah (tidak diindeks)
+ Amazon CloudWatch untuk memantau log
+ AWS Identity and Access Management (IAM) untuk membuat peran dan kebijakan penyewa

![\[Arsitektur tanpa server multi-tenant tingkat tinggi.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/1a8501e7-0776-4aca-aed3-28e3ada1d15d.png)


**Otomatisasi dan skala**

Untuk kesederhanaan, pola menggunakan AWS CLI untuk menyediakan infrastruktur dan untuk menyebarkan kode sampel. Anda dapat membuat CloudFormation template atau AWS Cloud Development Kit (AWS CDK) skrip untuk mengotomatiskan pola.

## Alat
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-tools"></a>

**Layanan AWS**
+ [AWS CLI](https://aws.amazon.com/cli/)adalah alat terpadu untuk mengelola Layanan AWS dan sumber daya dengan menggunakan perintah di shell baris perintah Anda.
+ [Lambda](https://aws.amazon.com/lambda/) adalah layanan komputasi yang memungkinkan Anda menjalankan kode tanpa menyediakan atau mengelola server. Lambda menjalankan kode Anda hanya saat diperlukan dan menskalakan secara otomatis, dari beberapa permintaan per hari hingga ribuan per detik.
+ [API Gateway](https://aws.amazon.com/api-gateway/) adalah Layanan AWS untuk membuat, menerbitkan, memelihara, memantau, dan mengamankan REST, HTTP, dan WebSocket APIs pada skala apa pun.
+ [Amazon S3](https://aws.amazon.com/s3/) adalah layanan penyimpanan objek yang memungkinkan Anda menyimpan dan mengambil sejumlah informasi kapan saja, dari mana saja di web.
+ [OpenSearch Layanan adalah layanan](https://aws.amazon.com/opensearch-service/) yang dikelola sepenuhnya yang memudahkan Anda untuk menerapkan, mengamankan, dan menjalankan Elasticsearch dengan biaya efektif dalam skala besar.

**Kode**

Lampiran menyediakan file sampel untuk pola ini. Ini termasuk:
+ `index_lambda_package.zip`— Fungsi Lambda untuk mengindeks data di OpenSearch Layanan dengan menggunakan model pool.
+ `search_lambda_package.zip`— Fungsi Lambda untuk mencari data di OpenSearch Layanan.
+ `Tenant-1-data`— Sampel data mentah (tidak diindeks) untuk Penyewa - 1.
+ `Tenant-2-data`— Sampel data mentah (tidak diindeks) untuk Penyewa-2.

**penting**  
Cerita dalam pola ini mencakup contoh AWS CLI perintah yang diformat untuk Unix, Linux, dan macOS. Untuk Windows, ganti karakter kelanjutan backslash (\$1) Unix di akhir setiap baris dengan tanda sisipan (^).

**catatan**  
Dalam AWS CLI perintah, ganti semua nilai dalam kurung sudut (<>) dengan nilai yang benar.

## Epik
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-epics"></a>

### Buat dan konfigurasikan bucket S3
<a name="create-and-configure-an-s3-bucket"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat ember S3. | Buat ember S3 di. Wilayah AWS Bucket ini akan menyimpan data penyewa yang tidak diindeks untuk aplikasi sampel. Pastikan nama bucket S3 unik secara global, karena namespace dibagikan oleh semua orang. Akun AWSUntuk membuat bucket S3, Anda dapat menggunakan perintah AWS CLI [create-bucket](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/create-bucket.html) sebagai berikut:<pre>aws s3api create-bucket \<br />  --bucket <tenantrawdata> \<br />  --region <your-AWS-Region></pre>di `tenantrawdata` mana nama bucket S3. (Anda dapat menggunakan nama unik apa pun yang mengikuti [pedoman penamaan bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/bucketnamingrules.html).) | Arsitek cloud, Administrator Cloud | 

### Membuat dan mengkonfigurasi cluster Elasticsearch
<a name="create-and-configure-an-elasticsearch-cluster"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat domain OpenSearch Layanan. | Jalankan AWS CLI [create-elasticsearch-domain](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/es/create-elasticsearch-domain.html)perintah untuk membuat domain OpenSearch Layanan:<pre>aws es create-elasticsearch-domain \<br />  --domain-name vpc-cli-example \<br />  --elasticsearch-version 7.10 \<br />  --elasticsearch-cluster-config InstanceType=t3.medium.elasticsearch,InstanceCount=1 \<br />  --ebs-options EBSEnabled=true,VolumeType=gp2,VolumeSize=10 \<br />  --domain-endpoint-options "{\"EnforceHTTPS\": true}" \<br />  --encryption-at-rest-options "{\"Enabled\": true}" \<br />  --node-to-node-encryption-options "{\"Enabled\": true}" \<br />  --advanced-security-options "{\"Enabled\": true, \"InternalUserDatabaseEnabled\": true, \<br />    \"MasterUserOptions\": {\"MasterUserName\": \"KibanaUser\", \<br />    \"MasterUserPassword\": \"NewKibanaPassword@123\"}}" \<br />  --vpc-options "{\"SubnetIds\": [\"<subnet-id>\"], \"SecurityGroupIds\": [\"<sg-id>\"]}" \<br />  --access-policies "{\"Version\": \"2012-10-17\", \"Statement\": [ { \"Effect\": \"Allow\", \ <br />    \"Principal\": {\"AWS\": \"*\" }, \"Action\":\"es:*\", \<br />    \"Resource\": \"arn:aws:es:<region>:<account-id>:domain\/vpc-cli-example\/*\" } ] }"</pre>Jumlah instans diatur ke 1 karena domain adalah untuk tujuan pengujian. Anda perlu mengaktifkan kontrol akses berbutir halus dengan menggunakan `advanced-security-options` parameter, karena detailnya tidak dapat diubah setelah domain dibuat. Perintah ini membuat nama pengguna master (`KibanaUser`) dan kata sandi yang dapat Anda gunakan untuk masuk ke konsol Kibana.Karena domain merupakan bagian dari virtual private cloud (VPC), Anda harus memastikan bahwa Anda dapat menjangkau instance Elasticsearch dengan menentukan kebijakan akses yang akan digunakan.Untuk informasi selengkapnya, lihat [Meluncurkan domain OpenSearch Layanan Amazon Anda dalam VPC](https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-vpc.html) dalam AWS dokumentasi. | Arsitek cloud, Administrator Cloud | 
| Siapkan host benteng. | Siapkan instans Windows Amazon Elastic Compute Cloud (Amazon EC2) sebagai host bastion untuk mengakses konsol Kibana. Grup keamanan Elasticsearch harus mengizinkan lalu lintas dari grup EC2 keamanan Amazon. Untuk petunjuk, lihat posting blog [Mengontrol Akses Jaringan ke EC2 Instans Menggunakan Server Bastion.](https://aws.amazon.com/blogs/security/controlling-network-access-to-ec2-instances-using-a-bastion-server/)Ketika host bastion telah disiapkan, dan Anda memiliki grup keamanan yang terkait dengan instance yang tersedia, gunakan AWS CLI [authorize-security-group-ingress](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/authorize-security-group-ingress.html)perintah untuk menambahkan izin ke grup keamanan Elasticsearch untuk mengizinkan port 443 dari grup keamanan Amazon EC2 (bastion host).<pre>aws ec2 authorize-security-group-ingress \<br />  --group-id <SecurityGroupIdfElasticSearch> \ <br />  --protocol tcp \<br />  --port 443 \<br />  --source-group <SecurityGroupIdfBashionHostEC2></pre> | Arsitek cloud, Administrator Cloud | 

### Buat dan konfigurasikan fungsi indeks Lambda
<a name="create-and-configure-the-lam-index-function"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat peran eksekusi Lambda. | Jalankan perintah AWS CLI [create-role](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-role.html) untuk memberikan akses dan sumber daya fungsi indeks Lambda: Layanan AWS <pre>aws iam create-role \<br />  --role-name index-lambda-role \<br />  --assume-role-policy-document file://lambda_assume_role.json</pre>di mana `lambda_assume_role.json` adalah dokumen JSON yang memberikan `AssumeRole` izin ke fungsi Lambda, sebagai berikut:<pre>{<br />     "Version": "2012-10-17",		 	 	 <br />     "Statement": [<br />         {<br />             "Effect": "Allow",<br />             "Principal": {<br />                 "Service": "lambda.amazonaws.com"<br />               },<br />             "Action": "sts:AssumeRole"<br />         }<br />     ]<br /> }</pre> | Arsitek cloud, Administrator Cloud | 
| Lampirkan kebijakan terkelola ke peran Lambda. | Jalankan AWS CLI [attach-role-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html)perintah untuk melampirkan kebijakan terkelola ke peran yang dibuat pada langkah sebelumnya. Kedua kebijakan ini memberikan izin peran untuk membuat elastic network interface dan menulis log ke CloudWatch Log.<pre>aws iam attach-role-policy \<br />  --role-name index-lambda-role \<br />  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole<br /><br />aws iam attach-role-policy \<br />  --role-name index-lambda-role \<br />  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole </pre> | Arsitek cloud, Administrator Cloud | 
| Buat kebijakan untuk memberikan izin fungsi indeks Lambda untuk membaca objek S3. | Jalankan perintah AWS CLI [create-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html) untuk `s3:GetObject` memberikan izin fungsi indeks Lambda untuk membaca objek di bucket S3:<pre>aws iam create-policy \<br />  --policy-name s3-permission-policy \<br />  --policy-document file://s3-policy.json</pre>File tersebut `s3-policy.json` adalah dokumen JSON yang ditunjukkan di bawah ini yang memberikan `s3:GetObject` izin untuk memungkinkan akses baca ke objek S3. Jika Anda menggunakan nama yang berbeda saat membuat bucket S3, berikan nama bucket yang benar di `Resource ` bagian ini:<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />           "Effect": "Allow",<br />           "Action": "s3:GetObject",<br />           "Resource": "arn:aws:s3:::<tenantrawdata>/*"<br />        }<br />    ]<br />}</pre> | Arsitek cloud, Administrator Cloud | 
| Lampirkan kebijakan izin Amazon S3 ke peran eksekusi Lambda. | Jalankan AWS CLI [attach-role-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html)perintah untuk melampirkan kebijakan izin Amazon S3 yang Anda buat di langkah sebelumnya ke peran eksekusi Lambda:<pre>aws iam attach-role-policy \<br />  --role-name index-lambda-role \<br />  --policy-arn <PolicyARN></pre>di `PolicyARN` mana Nama Sumber Daya Amazon (ARN) dari kebijakan izin Amazon S3. Anda bisa mendapatkan nilai ini dari output dari perintah sebelumnya. | Arsitek cloud, Administrator Cloud | 
| Buat fungsi indeks Lambda. | Jalankan perintah AWS CLI [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) untuk membuat fungsi indeks Lambda, yang akan mengakses Service: OpenSearch <pre>aws lambda create-function \<br />  --function-name index-lambda-function \<br />  --zip-file fileb://index_lambda_package.zip \<br />  --handler lambda_index.lambda_handler \<br />  --runtime python3.9 \<br />  --role "arn:aws:iam::account-id:role/index-lambda-role" \<br />  --timeout 30 \<br />  --vpc-config "{\"SubnetIds\": [\"<subnet-id1\>", \"<subnet-id2>\"], \<br />    \"SecurityGroupIds\": [\"<sg-1>\"]}"</pre> | Arsitek cloud, Administrator Cloud | 
| Izinkan Amazon S3 memanggil fungsi indeks Lambda. | Jalankan perintah AWS CLI [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) untuk memberi Amazon S3 izin untuk memanggil fungsi indeks Lambda:<pre>aws lambda add-permission \<br />  --function-name index-lambda-function \<br />  --statement-id s3-permissions \<br />  --action lambda:InvokeFunction \<br />  --principal s3.amazonaws.com \<br />  --source-arn "arn:aws:s3:::<tenantrawdata>" \<br />  --source-account "<account-id>" </pre> | Arsitek cloud, Administrator Cloud | 
| Tambahkan pemicu Lambda untuk acara Amazon S3. | Jalankan AWS CLI [put-bucket-notification-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3api/put-bucket-notification-configuration.html)perintah untuk mengirim notifikasi ke fungsi indeks Lambda saat peristiwa Amazon `ObjectCreated` S3 terdeteksi. Fungsi indeks berjalan setiap kali objek diunggah ke bucket S3. <pre>aws s3api put-bucket-notification-configuration \<br />  --bucket <tenantrawdata> \<br />  --notification-configuration file://s3-trigger.json</pre>File tersebut `s3-trigger.json` adalah dokumen JSON di folder saat ini yang menambahkan kebijakan sumber daya ke fungsi Lambda saat peristiwa Amazon `ObjectCreated` S3 terjadi. | Arsitek cloud, Administrator Cloud | 

### Buat dan konfigurasikan fungsi pencarian Lambda
<a name="create-and-configure-the-lam-search-function"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat peran eksekusi Lambda. | Jalankan perintah AWS CLI [create-role](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-role.html) untuk memberikan akses dan sumber daya fungsi pencarian Lambda: Layanan AWS <pre>aws iam create-role \<br />  --role-name search-lambda-role \<br />  --assume-role-policy-document file://lambda_assume_role.json</pre>di mana `lambda_assume_role.json` adalah dokumen JSON di folder saat ini yang memberikan `AssumeRole` izin ke fungsi Lambda, sebagai berikut:<pre>{<br />     "Version": "2012-10-17",		 	 	 <br />     "Statement": [<br />         {<br />             "Effect": "Allow",<br />             "Principal": {<br />                 "Service": "lambda.amazonaws.com"<br />               },<br />             "Action": "sts:AssumeRole"<br />         }<br />     ]<br /> }</pre> | Arsitek cloud, Administrator Cloud | 
| Lampirkan kebijakan terkelola ke peran Lambda. | Jalankan AWS CLI [attach-role-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html)perintah untuk melampirkan kebijakan terkelola ke peran yang dibuat pada langkah sebelumnya. Kedua kebijakan ini memberikan izin peran untuk membuat elastic network interface dan menulis log ke CloudWatch Log.<pre>aws iam attach-role-policy \<br />  --role-name search-lambda-role \<br />  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole<br /><br />aws iam attach-role-policy \<br />  --role-name search-lambda-role \<br />  --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole </pre> | Arsitek cloud, Administrator Cloud | 
| Buat fungsi pencarian Lambda. | Jalankan perintah AWS CLI [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) untuk membuat fungsi pencarian Lambda, yang akan mengakses Service: OpenSearch <pre>aws lambda create-function \<br />  --function-name search-lambda-function \<br />  --zip-file fileb://search_lambda_package.zip \<br />  --handler lambda_search.lambda_handler \<br />  --runtime python3.9 \<br />  --role "arn:aws:iam::account-id:role/search-lambda-role" \<br />  --timeout 30 \<br />  --vpc-config "{\"SubnetIds\": [\"<subnet-id1\>", \"<subnet-id2>\"], \<br />    \"SecurityGroupIds\": [\"<sg-1>\"]}"</pre> | Arsitek cloud, Administrator Cloud | 

### Buat dan konfigurasikan peran penyewa
<a name="create-and-configure-tenant-roles"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat peran IAM penyewa. | Jalankan perintah AWS CLI [create-role](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-role.html) untuk membuat dua peran penyewa yang akan digunakan untuk menguji fungsionalitas pencarian:<pre>aws iam create-role \<br />  --role-name Tenant-1-role \<br />  --assume-role-policy-document file://assume-role-policy.json</pre><pre>aws iam create-role \<br />  --role-name Tenant-2-role \<br />  --assume-role-policy-document file://assume-role-policy.json</pre>File tersebut `assume-role-policy.json` adalah dokumen JSON di folder saat ini yang memberikan `AssumeRole` izin untuk peran eksekusi Lambda:<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Effect": "Allow",<br />            "Principal": {<br />                 "AWS": "<Lambda execution role for index function>",<br />                 "AWS": "<Lambda execution role for search function>"<br />             },<br />            "Action": "sts:AssumeRole"<br />        }<br />    ]<br />}</pre> | Arsitek cloud, Administrator Cloud | 
| Buat kebijakan IAM penyewa. | Jalankan perintah AWS CLI [create-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html) untuk membuat kebijakan penyewa yang memberikan akses ke operasi Elasticsearch:<pre>aws iam create-policy \<br />  --policy-name tenant-policy \<br />  --policy-document file://policy.json</pre>File tersebut `policy.json` adalah dokumen JSON di folder saat ini yang memberikan izin di Elasticsearch:<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Effect": "Allow",<br />            "Action": [<br />                "es:ESHttpDelete",<br />                "es:ESHttpGet",<br />                "es:ESHttpHead",<br />                "es:ESHttpPost",<br />                "es:ESHttpPut",<br />                "es:ESHttpPatch"<br />            ],<br />            "Resource": [<br />                "<ARN of Elasticsearch domain created earlier>"<br />            ]<br />        }<br />    ]<br />}</pre> | Arsitek cloud, Administrator Cloud | 
| Lampirkan kebijakan IAM penyewa ke peran penyewa. | Jalankan AWS CLI [attach-role-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html)perintah untuk melampirkan kebijakan IAM penyewa ke dua peran penyewa yang Anda buat di langkah sebelumnya:<pre>aws iam attach-role-policy \<br />  --policy-arn arn:aws:iam::account-id:policy/tenant-policy \<br />  --role-name Tenant-1-role<br /><br />aws iam attach-role-policy \<br />  --policy-arn arn:aws:iam::account-id:policy/tenant-policy \<br />  --role-name Tenant-2-role</pre>Kebijakan ARN berasal dari output dari langkah sebelumnya. | Arsitek cloud, Administrator Cloud | 
| Buat kebijakan IAM untuk memberikan izin Lambda untuk mengambil peran. | Jalankan perintah AWS CLI [create-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html) untuk membuat kebijakan bagi Lambda untuk mengambil peran penyewa:<pre>aws iam create-policy \<br />  --policy-name assume-tenant-role-policy \<br />  --policy-document file://lambda_policy.json</pre>File tersebut `lambda_policy.json` adalah dokumen JSON di folder saat ini yang memberikan izin untuk: `AssumeRole`<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />       {<br />            "Effect": "Allow",<br />            "Action":  "sts:AssumeRole",<br />            "Resource": "<ARN of tenant role created earlier>"<br />       }<br />    ]<br />}</pre>Untuk`Resource`, Anda dapat menggunakan karakter wildcard untuk menghindari pembuatan kebijakan baru untuk setiap penyewa. | Arsitek cloud, Administrator Cloud | 
| Buat kebijakan IAM untuk memberikan izin peran indeks Lambda untuk mengakses Amazon S3. | Jalankan perintah AWS CLI [create-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/create-policy.html) untuk memberikan izin peran indeks Lambda untuk mengakses objek di bucket S3:<pre>aws iam create-policy \<br />  --policy-name s3-permission-policy \<br />  --policy-document file://s3_lambda_policy.json</pre>File tersebut `s3_lambda_policy.json` adalah dokumen kebijakan JSON berikut di folder saat ini:<pre>{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Effect": "Allow",<br />            "Action": "s3:GetObject",<br />            "Resource": "arn:aws:s3:::tenantrawdata/*"<br />        }<br />    ]<br />}</pre> | Arsitek cloud, Administrator Cloud | 
| Lampirkan kebijakan ke peran eksekusi Lambda. | Jalankan AWS CLI [attach-role-policy](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/iam/attach-role-policy.html)perintah untuk melampirkan kebijakan yang dibuat pada langkah sebelumnya ke indeks Lambda dan peran eksekusi pencarian yang Anda buat sebelumnya:<pre>aws iam attach-role-policy \<br />  --policy-arn arn:aws:iam::account-id:policy/assume-tenant-role-policy \<br />  --role-name index-lambda-role<br /><br />aws iam attach-role-policy \<br />  --policy-arn arn:aws:iam::account-id:policy/assume-tenant-role-policy \<br />  --role-name search-lambda-role<br /><br />aws iam attach-role-policy \<br />  --policy-arn arn:aws:iam::account-id:policy/s3-permission-policy \<br />  --role-name index-lambda-role</pre>Kebijakan ARN berasal dari output dari langkah sebelumnya. | Arsitek cloud, Administrator Cloud | 

### Membuat dan mengonfigurasi API penelusuran
<a name="create-and-configure-a-search-api"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat REST API di API Gateway. | Jalankan AWS CLI [create-rest-api](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/apigateway/create-rest-api.html)perintah untuk membuat sumber daya REST API:<pre>aws apigateway create-rest-api \<br />  --name Test-Api \<br />  --endpoint-configuration "{ \"types\": [\"REGIONAL\"] }"</pre>Untuk jenis konfigurasi titik akhir, Anda dapat menentukan `EDGE` alih-alih `REGIONAL` menggunakan lokasi tepi, bukan lokasi tertentu Wilayah AWS.Perhatikan nilai `id` bidang dari output perintah. Ini adalah ID API yang akan Anda gunakan dalam perintah berikutnya. | Arsitek cloud, Administrator Cloud | 
| Buat sumber daya untuk API pencarian. | Sumber daya API pencarian memulai fungsi pencarian Lambda dengan nama sumber daya. `search` (Anda tidak perlu membuat API untuk fungsi indeks Lambda, karena ini berjalan secara otomatis saat objek diunggah ke bucket S3.)[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html) | Arsitek cloud, Administrator Cloud | 
| Buat metode GET untuk API pencarian. | Jalankan perintah AWS CLI [put-method](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/apigateway/put-method.html) untuk membuat `GET ` metode untuk API pencarian:<pre>aws apigateway put-method \<br />  --rest-api-id <API-ID> \<br />  --resource-id <ID from the previous command output> \<br />  --http-method GET \<br />  --authorization-type "NONE" \<br />  --no-api-key-required</pre>Untuk`resource-id`, tentukan ID dari output `create-resource` perintah. | Arsitek cloud, Administrator Cloud | 
| Buat respons metode untuk API penelusuran. | Jalankan AWS CLI [put-method-response](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/apigateway/put-method-response.html)perintah untuk menambahkan respons metode untuk API pencarian:<pre>aws apigateway put-method-response \<br />  --rest-api-id <API-ID> \<br />  --resource-id  <ID from the create-resource command output> \<br />  --http-method GET \<br />  --status-code 200 \<br />  --response-models "{\"application/json\": \"Empty\"}"</pre>Untuk`resource-id`, tentukan ID dari output dari `create-resource` perintah sebelumnya. | Arsitek cloud, Administrator Cloud | 
| Siapkan integrasi Lambda proxy untuk API pencarian. | Jalankan perintah AWS CLI [put-integration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/apigateway/put-integration.html) untuk mengatur integrasi dengan fungsi pencarian Lambda:<pre>aws apigateway put-integration \<br />  --rest-api-id <API-ID> \<br />  --resource-id  <ID from the create-resource command output> \<br />  --http-method GET \<br />  --type AWS_PROXY \<br />  --integration-http-method GET \<br />  --uri arn:aws:apigateway:region:lambda:path/2015-03-31/functions/arn:aws:lambda:<region>:<account-id>:function:<function-name>/invocations</pre>Untuk`resource-id`, tentukan ID dari `create-resource` perintah sebelumnya. | Arsitek cloud, Administrator Cloud | 
| Berikan izin API Gateway untuk memanggil fungsi pencarian Lambda. | Jalankan perintah AWS CLI [add-permission](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/add-permission.html) untuk memberikan izin API Gateway untuk menggunakan fungsi pencarian:<pre>aws lambda add-permission \<br />  --function-name <function-name> \<br />  --statement-id apigateway-get \<br />  --action lambda:InvokeFunction \<br />  --principal apigateway.amazonaws.com \<br />  --source-arn "arn:aws:execute-api:<region>:<account-id>:api-id/*/GET/search</pre>Ubah `source-arn` jalur jika Anda menggunakan nama sumber daya API yang berbeda, bukan`search`. | Arsitek cloud, Administrator Cloud | 
| Terapkan API pencarian. | Jalankan perintah AWS CLI [create-deployment](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/apigateway/create-deployment.html) untuk membuat sumber daya panggung bernama: `dev`<pre>aws apigateway create-deployment \<br />  --rest-api-id <API-ID> \<br />  --stage-name dev</pre>Jika Anda memperbarui API, Anda dapat menggunakan AWS CLI perintah yang sama untuk menerapkannya kembali ke tahap yang sama. | Arsitek cloud, Administrator Cloud | 

### Buat dan konfigurasikan peran Kibana
<a name="create-and-configure-kibana-roles"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Masuk ke konsol Kibana. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html) | Arsitek cloud, Administrator Cloud | 
| Buat dan konfigurasikan peran Kibana. | Untuk memberikan isolasi data dan memastikan bahwa satu penyewa tidak dapat mengambil data penyewa lain, Anda perlu menggunakan keamanan dokumen, yang memungkinkan penyewa untuk mengakses hanya dokumen yang berisi ID penyewa mereka.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html) | Arsitek cloud, Administrator Cloud | 
| Memetakan pengguna ke peran. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html)Kami menyarankan Anda mengotomatiskan pembuatan peran penyewa dan Kibana pada saat orientasi penyewa. | Arsitek cloud, Administrator Cloud | 
| Buat indeks data penyewa. | Di panel navigasi, di bawah **Manajemen**, pilih **Alat Pengembang**, lalu jalankan perintah berikut. Perintah ini membuat `tenant-data` indeks untuk menentukan pemetaan untuk `TenantId` properti.<pre>PUT /tenant-data<br />{<br />  "mappings": {<br />    "properties": {<br />      "TenantId": { "type": "keyword"}<br />    }<br />  }<br />}</pre> | Arsitek cloud, Administrator Cloud | 

### Buat titik akhir VPC untuk Amazon S3 dan AWS STS
<a name="create-vpc-endpoints-for-s3-and-sts"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat titik akhir VPC untuk Amazon S3. | Jalankan AWS CLI [create-vpc-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/create-vpc-endpoint.html)perintah untuk membuat titik akhir VPC untuk Amazon S3. Titik akhir memungkinkan fungsi indeks Lambda di VPC untuk mengakses Amazon S3.<pre>aws ec2 create-vpc-endpoint \<br />  --vpc-id <VPC-ID> \<br />  --service-name com.amazonaws.us-east-1.s3 \<br />  --route-table-ids <route-table-ID></pre>Untuk`vpc-id`, tentukan VPC yang Anda gunakan untuk fungsi indeks Lambda. Untuk`service-name`, gunakan URL yang benar untuk titik akhir Amazon S3. Untuk`route-table-ids`, tentukan tabel rute yang terkait dengan titik akhir VPC. | Arsitek cloud, Administrator Cloud | 
| Buat titik akhir VPC untuk. AWS STS | Jalankan AWS CLI [create-vpc-endpoint](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ec2/create-vpc-endpoint.html)perintah untuk membuat titik akhir VPC untuk AWS Security Token Service ().AWS STS Titik akhir memungkinkan indeks Lambda dan fungsi pencarian di VPC untuk mengakses. AWS STS Fungsi digunakan AWS STS ketika mereka mengambil peran IAM.<pre>aws ec2 create-vpc-endpoint \<br />  --vpc-id <VPC-ID> \<br />  --vpc-endpoint-type Interface \<br />  --service-name com.amazonaws.us-east-1.sts \<br />  --subnet-id <subnet-ID> \<br />  --security-group-id <security-group-ID></pre>Untuk`vpc-id`, tentukan VPC yang Anda gunakan untuk indeks Lambda dan fungsi pencarian. Untuk`subnet-id`, berikan subnet di mana titik akhir ini harus dibuat. Untuk`security-group-id`, tentukan grup keamanan untuk mengaitkan titik akhir ini dengan. (Ini bisa sama dengan kelompok keamanan yang digunakan Lambda.) | Arsitek cloud, Administrator Cloud | 

### Uji multi-tenancy dan isolasi data
<a name="test-multi-tenancy-and-data-isolation"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Perbarui file Python untuk fungsi indeks dan pencarian. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html)Anda bisa mendapatkan titik akhir Elasticsearch dari tab **Ikhtisar** konsol Layanan. OpenSearch Ini memiliki format`<AWS-Region>.es.amazonaws.com`. | Arsitek cloud, Pengembang aplikasi | 
| Perbarui kode Lambda. | Gunakan AWS CLI [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html)perintah untuk memperbarui kode Lambda dengan perubahan yang Anda buat pada file Python:<pre>aws lambda update-function-code \<br />  --function-name index-lambda-function \<br />  --zip-file fileb://index_lambda_package.zip<br /><br />aws lambda update-function-code \<br />  --function-name search-lambda-function \<br />  --zip-file fileb://search_lambda_package.zip</pre> | Arsitek cloud, Pengembang aplikasi | 
| Unggah data mentah ke bucket S3. | Gunakan perintah AWS CLI [cp](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/s3/cp.html) untuk mengunggah data objek Tenant-1 dan Tenant-2 ke `tenantrawdata` bucket (tentukan nama bucket S3 yang Anda buat untuk tujuan ini):<pre>aws s3 cp tenant-1-data s3://tenantrawdata<br />aws s3 cp tenant-2-data s3://tenantrawdata</pre>Bucket S3 diatur untuk menjalankan fungsi indeks Lambda setiap kali data diunggah sehingga dokumen diindeks di Elasticsearch. | Arsitek cloud, Administrator Cloud | 
| Cari data dari konsol Kibana. | Di konsol Kibana, jalankan kueri berikut:<pre>GET tenant-data/_search</pre>Kueri ini menampilkan semua dokumen yang diindeks di Elasticsearch. Dalam hal ini, Anda akan melihat dua dokumen terpisah untuk Tenant-1 dan Tenant-2. | Arsitek cloud, Administrator Cloud | 
| Uji API pencarian dari API Gateway. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service.html)Untuk ilustrasi layar, lihat bagian [Informasi tambahan](#build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-additional). | Arsitek cloud, Pengembang aplikasi | 
| Pembersihan sumber daya  | Bersihkan semua sumber daya yang Anda buat untuk mencegah biaya tambahan ke akun Anda. | AWS DevOps, arsitek Cloud, Administrator Cloud | 

## Sumber daya terkait
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-resources"></a>
+ [AWS SDK for Python (Boto)](https://aws.amazon.com/sdk-for-python/)
+ [AWS Lambda dokumentasi](https://docs.aws.amazon.com/lambda/)
+ [Dokumentasi API Gateway](https://docs.aws.amazon.com/apigateway/)
+ [Dokumentasi Amazon S3](https://docs.aws.amazon.com/s3/)
+ [Dokumentasi OpenSearch Layanan Amazon](https://docs.aws.amazon.com/elasticsearch-service/)
  + [Kontrol akses berbutir halus di Layanan Amazon OpenSearch ](https://docs.amazonaws.cn/en_us/elasticsearch-service/latest/developerguide/fgac.html)
  + [Membuat aplikasi pencarian dengan Amazon OpenSearch Service](https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/search-example.html)
  + [Meluncurkan domain OpenSearch Layanan Amazon Anda dalam VPC](https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/es-vpc.html)

## Informasi tambahan
<a name="build-a-multi-tenant-serverless-architecture-in-amazon-opensearch-service-additional"></a>

**Model partisi data**

Ada tiga model partisi data umum yang digunakan dalam sistem multi-tenant: silo, pool, dan hybrid. Model yang Anda pilih tergantung pada kepatuhan, tetangga yang bising, operasi, dan kebutuhan isolasi lingkungan Anda.

*Model silo*

Dalam model silo, setiap data penyewa disimpan di area penyimpanan yang berbeda di mana tidak ada percampuran data penyewa. Anda dapat menggunakan dua pendekatan untuk mengimplementasikan model silo dengan OpenSearch Layanan: domain per penyewa dan indeks per penyewa.
+ **Domain per penyewa** — Anda dapat menggunakan domain OpenSearch Layanan terpisah (identik dengan cluster Elasticsearch) per penyewa. Menempatkan setiap penyewa di domainnya sendiri memberikan semua manfaat yang terkait dengan memiliki data dalam konstruksi mandiri. Namun, pendekatan ini memperkenalkan tantangan manajemen dan kelincahan. Sifatnya yang terdistribusi membuat lebih sulit untuk mengumpulkan dan menilai kesehatan operasional dan aktivitas penyewa. Ini adalah opsi mahal yang mengharuskan setiap domain OpenSearch Layanan memiliki tiga node master dan dua node data untuk beban kerja produksi seminimal mungkin.

![\[Domain per model silo penyewa untuk arsitektur tanpa server multi-tenant.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/c2195f82-e5ed-40bb-b76a-3b0210bf1254.png)


 
+ **Indeks per penyewa** — Anda dapat menempatkan data penyewa dalam indeks terpisah dalam kluster Layanan. OpenSearch Dengan pendekatan ini, Anda menggunakan pengenal penyewa saat membuat dan memberi nama indeks, dengan mengawali pengenal penyewa ke nama indeks. Pendekatan indeks per penyewa membantu Anda mencapai tujuan silo Anda tanpa memperkenalkan cluster yang benar-benar terpisah untuk setiap penyewa. Namun, Anda mungkin mengalami tekanan memori jika jumlah indeks bertambah, karena pendekatan ini membutuhkan lebih banyak pecahan, dan node master harus menangani lebih banyak alokasi dan penyeimbangan kembali.

![\[Indeks per model silo penyewa untuk arsitektur tanpa server multi-tenant.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/354a9463-25bb-422b-84de-d4875a7c8ea2.png)


 

**Isolasi dalam model silo** — Dalam model silo, Anda menggunakan kebijakan IAM untuk mengisolasi domain atau indeks yang menyimpan data setiap penyewa. Kebijakan ini mencegah satu penyewa mengakses data penyewa lain. Untuk menerapkan model isolasi silo, Anda dapat membuat kebijakan berbasis sumber daya yang mengontrol akses ke sumber daya penyewa Anda. Ini sering merupakan kebijakan akses domain yang menentukan tindakan mana yang dapat dilakukan prinsipal pada sub-sumber daya domain, termasuk indeks Elasticsearch dan. APIs Dengan kebijakan berbasis identitas IAM, Anda dapat menentukan tindakan yang *diizinkan* atau *ditolak* pada domain, indeks, atau dalam Layanan. APIs OpenSearch `Action`Elemen kebijakan IAM menjelaskan tindakan atau tindakan spesifik yang diizinkan atau ditolak oleh kebijakan, dan `Principal ` elemen tersebut menentukan akun, pengguna, atau peran yang terpengaruh.

Kebijakan contoh berikut memberikan akses penuh Penyewa-1 (seperti yang ditentukan oleh`es:*`) ke sub-sumber daya pada domain saja. `tenant-1` Bagian tambahan `/*` dalam `Resource` elemen menunjukkan bahwa kebijakan ini berlaku untuk sub-sumber daya domain, bukan untuk domain itu sendiri. Ketika kebijakan ini berlaku, penyewa tidak diizinkan untuk membuat domain baru atau mengubah setelan pada domain yang sudah ada.

```
{
   "Version": "2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": {
            "AWS": "arn:aws:iam::<aws-account-id>:user/Tenant-1"
         },
         "Action": "es:*",
         "Resource": "arn:aws:es:<Region>:<account-id>:domain/tenant-1/*"
      }
   ]
}
```

Untuk mengimplementasikan model silo penyewa per indeks, Anda perlu memodifikasi kebijakan sampel ini untuk lebih membatasi Penyewa-1 ke indeks atau indeks yang ditentukan, dengan menentukan nama indeks. Kebijakan sampel berikut membatasi Penyewa-1 ke indeks. `tenant-index-1` 

```
{
   "Version": "2012-10-17",		 	 	 
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": {
            "AWS": "arn:aws:iam::123456789012:user/Tenant-1"
         },
         "Action": "es:*",
         "Resource": "arn:aws:es:<Region>:<account-id>:domain/test-domain/tenant-index-1/*"
      }
   ]
}
```

*Model kolam*

Dalam model pool, semua data penyewa disimpan dalam indeks dalam domain yang sama. Pengenal penyewa disertakan dalam data (dokumen) dan digunakan sebagai kunci partisi, sehingga Anda dapat menentukan data mana yang menjadi milik penyewa mana. Model ini mengurangi overhead manajemen. Mengoperasikan dan mengelola indeks gabungan lebih mudah dan lebih efisien daripada mengelola beberapa indeks. Namun, karena data penyewa bercampur dalam indeks yang sama, Anda kehilangan isolasi penyewa alami yang disediakan oleh model silo. Pendekatan ini mungkin juga menurunkan kinerja karena efek tetangga yang bising.

![\[Model kolam untuk arsitektur tanpa server multi-tenant.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/c2c3bb0f-6ccd-47a7-ab67-e7f3f8c7f289.png)


 

**Isolasi penyewa dalam model kolam** — Secara umum, isolasi penyewa menantang untuk diterapkan dalam model kolam renang. Mekanisme IAM yang digunakan dengan model silo tidak memungkinkan Anda untuk menggambarkan isolasi berdasarkan ID penyewa yang disimpan dalam dokumen Anda.

Pendekatan alternatif adalah dengan menggunakan dukungan [kontrol akses halus](https://docs.aws.amazon.com/elasticsearch-service/latest/developerguide/fgac.html) (FGAC) yang disediakan oleh Open Distro untuk Elasticsearch. FGAC memungkinkan Anda mengontrol izin pada tingkat indeks, dokumen, atau bidang. Dengan setiap permintaan, FGAC mengevaluasi kredensi pengguna dan mengautentikasi pengguna atau menolak akses. Jika FGAC mengautentikasi pengguna, FGAC mengambil semua peran yang dipetakan ke pengguna tersebut dan menggunakan set lengkap izin untuk menentukan cara menangani permintaan. 

Untuk mencapai isolasi yang diperlukan dalam model gabungan, Anda dapat menggunakan [keamanan tingkat dokumen](https://opendistro.github.io/for-elasticsearch-docs/docs/security/access-control/document-level-security/), yang memungkinkan Anda membatasi peran pada subset dokumen dalam indeks. Peran contoh berikut membatasi kueri ke Penyewa-1. Dengan menerapkan peran ini ke Penyewa-1, Anda dapat mencapai isolasi yang diperlukan. 

```
{
   "bool": {
     "must": {
       "match": {
         "tenantId": "Tenant-1"
       }
     }
   }
 }
```

*Model hibrida*

Model hibrida menggunakan kombinasi model silo dan kolam renang di lingkungan yang sama untuk menawarkan pengalaman unik untuk setiap tingkat penyewa (seperti tingkatan gratis, standar, dan premium). Setiap tingkatan mengikuti profil keamanan yang sama yang digunakan dalam model pool.

 

![\[Model hybrid untuk arsitektur tanpa server multi-tenant.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/e7def98a-38ef-435a-9881-7e95ae4d4940.png)


**Isolasi penyewa dalam model hybrid** — Dalam model hybrid, Anda mengikuti profil keamanan yang sama seperti pada model pool, di mana menggunakan model keamanan FGAC pada tingkat dokumen menyediakan isolasi penyewa. Meskipun strategi ini menyederhanakan manajemen cluster dan menawarkan kelincahan, ini memperumit aspek lain dari arsitektur. Misalnya, kode Anda memerlukan kompleksitas tambahan untuk menentukan model mana yang terkait dengan setiap penyewa. Anda juga harus memastikan bahwa kueri penyewa tunggal tidak memenuhi seluruh domain dan menurunkan pengalaman untuk penyewa lain. 

**Pengujian di API Gateway**

*Jendela uji untuk kueri Penyewa-1*

![\[Jendela uji untuk kueri Penyewa-1.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/a6757d3f-977a-4ecc-90cb-83ab7f1c3588.png)


*Jendela uji untuk kueri Penyewa-2*

 

![\[Jendela uji untuk kueri Penyewa-2.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/750196bb-03f6-4b6e-92cd-eb7141602547/images/31bfd656-33ca-4750-b6e6-da4d703c2071.png)


## Lampiran
<a name="attachments-750196bb-03f6-4b6e-92cd-eb7141602547"></a>

[Untuk mengakses konten tambahan yang terkait dengan dokumen ini, unzip file berikut: attachment.zip](samples/p-attach/750196bb-03f6-4b6e-92cd-eb7141602547/attachments/attachment.zip)

# Menerapkan aplikasi multi-stack menggunakan AWS CDK dengan TypeScript
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript"></a>

*Dr. Rahul Sharad Gaikwad, Amazon Web Services*

## Ringkasan
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-summary"></a>

Pola ini menyediakan step-by-step pendekatan untuk penerapan aplikasi di Amazon Web Services (AWS) menggunakan AWS Cloud Development Kit (AWS CDK) dengan. TypeScript Sebagai contoh, pola tersebut menyebarkan aplikasi analitik real-time tanpa server.

Pola membangun dan menyebarkan aplikasi tumpukan bersarang. CloudFormation Tumpukan AWS induk memanggil tumpukan turunan, atau bersarang,.  Setiap tumpukan anak membangun dan menerapkan sumber daya AWS yang ditentukan dalam tumpukan. CloudFormation AWS CDK Toolkit, perintah antarmuka baris perintah (CLI)`cdk`, adalah antarmuka utama untuk tumpukan. CloudFormation 

## Prasyarat dan batasan
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-prereqs"></a>

**Prasyarat**
+ Akun AWS yang aktif
+ Virtual Private Cloud (VPC) dan subnet yang ada
+ AWS CDK Toolkit diinstal dan dikonfigurasi
+ Seorang pengguna dengan izin administrator dan satu set kunci akses.
+ Node.js
+ Antarmuka Baris Perintah AWS (AWS CLI)

**Batasan**
+ Karena AWS CDK menggunakan AWS CloudFormation, aplikasi AWS CDK tunduk pada kuota CloudFormation layanan. Untuk informasi selengkapnya, lihat [ CloudFormation kuota AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html).

**Versi produk**

Pola ini telah dibangun dan diuji menggunakan alat dan versi berikut.
+ Perangkat AWS CDK 1.83.0
+ Node.js 14.13.0
+ npm 7.0.14

Pola tersebut harus berfungsi dengan versi AWS CDK atau npm apa pun. Perhatikan bahwa Node.js versi 13.0.0 hingga 13.6.0 tidak kompatibel dengan AWS CDK.

## Arsitektur
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-architecture"></a>

**Tumpukan teknologi target**
+ Konsol AWS Amplify
+ Amazon API Gateway
+ AWS CDK
+ Amazon CloudFront
+ Amazon Cognito
+ Amazon DynamoDB
+ Amazon Data Firehose
+ Amazon Kinesis Data Streams
+ AWS Lambda
+ Amazon Simple Storage Service (Amazon S3)

**Arsitektur target**

Diagram berikut menunjukkan penerapan aplikasi multi-tumpukan menggunakan AWS CDK dengan. TypeScript

![\[Arsitektur tumpukan di VPC, dengan tumpukan induk dan dua tumpukan anak yang berisi sumber daya.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/0ac29a11-1362-4084-92ed-6b85205763ca/images/8f92e86a-aa3d-4f8a-9b11-b92c52a7226c.png)


 

Diagram berikut menunjukkan arsitektur contoh aplikasi real-time tanpa server.

![\[Arsitektur aplikasi di Wilayah.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/0ac29a11-1362-4084-92ed-6b85205763ca/images/2df00faf-f871-4aec-9655-19ba2eb14cf8.png)


 

## Alat
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-tools"></a>

**Alat**
+ [AWS Amplify Console](https://docs.aws.amazon.com/amplify/latest/userguide/welcome.html) adalah pusat kendali untuk penerapan web dan aplikasi seluler fullstack di AWS. Hosting Konsol Amplify menyediakan alur kerja berbasis git untuk hosting aplikasi web nirserver fullstack dengan deployment kontinu. UI Admin adalah antarmuka visual untuk pengembang web dan seluler frontend untuk membuat dan mengelola backend aplikasi di luar konsol AWS.
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) adalah layanan AWS untuk membuat, menerbitkan, memelihara, memantau, dan mengamankan REST, HTTP, dan WebSocket APIs pada skala apa pun.
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) adalah kerangka kerja pengembangan perangkat lunak yang membantu Anda menentukan dan menyediakan infrastruktur AWS Cloud dalam kode.
+ [AWS CDK Toolkit adalah kit](https://docs.aws.amazon.com/cdk/latest/guide/cli.html) pengembangan cloud baris perintah yang membantu Anda berinteraksi dengan aplikasi AWS CDK Anda. Perintah `cdk` CLI adalah alat utama untuk berinteraksi dengan aplikasi AWS CDK Anda. Ini menjalankan aplikasi Anda, menginterogasi model aplikasi yang Anda tentukan, dan memproduksi serta menerapkan CloudFormation template AWS yang dihasilkan oleh AWS CDK.
+ [Amazon CloudFront](https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/Introduction.html) adalah layanan web yang mempercepat distribusi konten web statis dan dinamis, seperti.html, .css, .js, dan file gambar. CloudFront mengirimkan konten Anda melalui jaringan pusat data di seluruh dunia yang disebut lokasi tepi untuk latensi yang lebih rendah dan peningkatan kinerja.
+ [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) menyediakan otentikasi, otorisasi, dan manajemen pengguna untuk web dan aplikasi seluler Anda. Pengguna Anda dapat masuk secara langsung atau melalui pihak ketiga.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) adalah layanan database NoSQL yang dikelola sepenuhnya yang memberikan kinerja yang cepat dan dapat diprediksi dengan skalabilitas yang mulus.
+ [Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html) adalah layanan yang dikelola sepenuhnya untuk mengirimkan [data streaming](https://aws.amazon.com/streaming-data/) real-time ke tujuan seperti Amazon S3, Amazon Redshift, OpenSearch Amazon Service, Splunk, dan titik akhir HTTP kustom atau titik akhir HTTP apa pun yang dimiliki oleh penyedia layanan pihak ketiga yang didukung.
+ [Amazon Kinesis Data](https://docs.aws.amazon.com/streams/latest/dev/introduction.html) Streams adalah layanan untuk mengumpulkan dan memproses aliran besar catatan data secara real time.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) adalah layanan komputasi yang mendukung menjalankan kode tanpa menyediakan atau mengelola server. Lambda menjalankan kode Anda hanya saat diperlukan dan menskalakan secara otomatis, dari beberapa permintaan per hari hingga ribuan per detik. Anda hanya membayar untuk waktu komputasi yang Anda gunakan—tidak ada biaya saat kode Anda tidak berjalan.
+ [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.

**Kode**

Kode untuk pola ini terlampir.

## Epik
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-epics"></a>

### Instal AWS CDK Toolkit
<a name="install-aws-cdk-toolkit"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Instal AWS CDK Toolkit. | Untuk menginstal AWS CDK Toolkit secara global, jalankan perintah berikut.`npm install -g aws-cdk` | DevOps | 
| Verifikasi versinya. | Untuk memverifikasi versi AWS CDK Toolkit, jalankan perintah berikut. `cdk --version` | DevOps | 

### Mengatur kredensi AWS
<a name="set-up-aws-credentials"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Siapkan kredensil. | Untuk mengatur kredensil, jalankan `aws configure` perintah dan ikuti petunjuknya.<pre>$aws configure<br />AWS Access Key ID [None]: <br />AWS Secret Access Key [None]: your_secret_access_key<br />Default region name [None]:<br />Default output format [None]:</pre> | DevOps | 

### Unduh kode proyek
<a name="download-the-project-code"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Unduh kode proyek terlampir. | Untuk informasi selengkapnya tentang direktori dan struktur file, lihat bagian *Informasi tambahan*. | DevOps | 

### Bootstrap lingkungan AWS CDK
<a name="bootstrap-the-aws-cdk-environment"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Bootstrap lingkungan. | Untuk menerapkan CloudFormation template AWS ke akun dan Wilayah AWS yang ingin Anda gunakan, jalankan perintah berikut.`cdk bootstrap <account>/<Region>`Untuk informasi selengkapnya, lihat [dokumentasi AWS](https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html). | DevOps | 

### Membangun dan menyebarkan proyek
<a name="build-and-deploy-the-project"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Bangun proyek. | Untuk membangun kode proyek, jalankan `npm run build` perintah. | DevOps | 
| Deploy proyek. | Untuk menyebarkan kode proyek, jalankan `cdk deploy` perintah. |  | 

### Verifikasi output
<a name="verify-outputs"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Verifikasi pembuatan tumpukan. | Di AWS Management Console, pilih **CloudFormation**. Di tumpukan untuk proyek, verifikasi bahwa tumpukan induk dan dua tumpukan anak telah dibuat. | DevOps | 

### Uji aplikasi
<a name="test-the-application"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Kirim data ke Kinesis Data Streams. | Konfigurasikan Akun AWS Anda untuk mengirim data ke Kinesis Data Streams menggunakan Amazon Kinesis Data Generator (KDG). Untuk informasi selengkapnya, lihat [Amazon Kinesis Data Generator](https://awslabs.github.io/amazon-kinesis-data-generator/web/help.html). | DevOps | 
| Buat pengguna Amazon Cognito. | [Untuk membuat pengguna Amazon Cognito, unduh templat cognito-setup.json CloudFormation dari bagian Buat Pengguna *Amazon Cognito di halaman bantuan Kinesis Data Generator*.](https://awslabs.github.io/amazon-kinesis-data-generator/web/help.html) **Mulai template, lalu masukkan Nama Pengguna dan Kata Sandi Amazon **Cognito** Anda.**Tab **Output** mencantumkan URL Kinesis Data Generator. | DevOps | 
| Masuk ke Kinesis Data Generator | Untuk masuk ke KDG, gunakan kredenal Amazon Cognito yang Anda berikan dan URL Kinesis Data Generator. | DevOps | 
| Uji aplikasi. | Di KDG, di **Rekam template**, **Template 1**, tempel kode uji dari bagian *Informasi tambahan*, dan pilih **Kirim** data. | DevOps | 
| Uji API Gateway. | Setelah data tertelan, uji API Gateway dengan menggunakan `GET` metode untuk mengambil data. | DevOps | 

## Sumber daya terkait
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-resources"></a>

**Referensi**
+ [AWS Cloud Development Kit](https://aws.amazon.com/cdk/)
+ [AWS CDK aktif GitHub](https://github.com/aws/aws-cdk)
+ [Bekerja dengan tumpukan bersarang](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-cfn-nested-stacks.html)
+ [Contoh contoh AWS - Analisis real-time tanpa server](https://github.com/aws-samples/serverless-realtime-analytics)

## Informasi tambahan
<a name="deploy-multiple-stack-applications-using-aws-cdk-with-typescript-additional"></a>

**Direktori dan detail file**

Pola ini mengatur tiga tumpukan berikut.
+ `parent-cdk-stack.ts`— Tumpukan ini bertindak sebagai tumpukan induk dan memanggil dua aplikasi anak sebagai tumpukan bersarang. 
+ `real-time-analytics-poc-stack.ts`— Tumpukan bersarang ini berisi infrastruktur dan kode aplikasi.
+ `real-time-analytics-web-stack.ts`— Tumpukan bersarang ini hanya berisi kode aplikasi web statis.

*File penting dan fungsinya*
+ `bin/real-time-analytics-poc.ts`— Titik masuk aplikasi AWS CDK. Ini memuat semua tumpukan yang didefinisikan di bawah`lib/`.
+ `lib/real-time-analytics-poc-stack.ts`— Definisi stack (`real-time-analytics-poc`) aplikasi AWS CDK.
+ `lib/real-time-analytics-web-stack.ts`— Definisi stack (`real-time-analytics-web-stack`) aplikasi AWS CDK.
+ `lib/parent-cdk-stack.ts`— Definisi stack (`parent-cdk`) aplikasi AWS CDK.
+ `package.json`— manifes modul npm, yang mencakup nama aplikasi, versi, dan dependensi.
+ `package-lock.json`— Dipelihara oleh npm.
+ `cdk.json`— Toolkit untuk menjalankan aplikasi.
+ `tsconfig.json`- TypeScript Konfigurasi proyek.
+ `.gitignore`— Daftar file yang harus dikecualikan Git dari kontrol sumber.
+ `node_modules`— Dipelihara oleh npm; termasuk dependensi proyek.

Bagian kode berikut di tumpukan induk memanggil aplikasi turunan sebagai tumpukan AWS CDK bersarang.

```
import * as cdk from '@aws-cdk/core';
import { Construct, Stack, StackProps } from '@aws-cdk/core';
import { RealTimeAnalyticsPocStack } from './real-time-analytics-poc-stack';
import { RealTimeAnalyticsWebStack } from './real-time-analytics-web-stack';


export class CdkParentStack extends Stack {
  constructor(scope: Construct, id: string, props?: StackProps) {
    super(scope, id, props);


    new RealTimeAnalyticsPocStack(this, 'RealTimeAnalyticsPocStack');
    new RealTimeAnalyticsWebStack(this, 'RealTimeAnalyticsWebStack');
  }
}
```

**Kode untuk pengujian**

```
session={{date.now('YYYYMMDD')}}|sequence={{date.now('x')}}|reception={{date.now('x')}}|instrument={{random.number(9)}}|l={{random.number(20)}}|price_0={{random.number({"min":10000, "max":30000})}}|price_1={{random.number({"min":10000, "max":30000})}}|price_2={{random.number({"min":10000, "max":30000})}}|price_3={{random.number({"min":10000, "max":30000})}}|price_4={{random.number({"min":10000, "max":30000})}}|price_5={{random.number({"min":10000, "max":30000})}}|price_6={{random.number({"min":10000, "max":30000})}}|price_7={{random.number({"min":10000, "max":30000})}}|price_8={{random.number({"min":10000, "max":30000})}}|
```

**Menguji API Gateway**

Di konsol API Gateway, uji API Gateway dengan menggunakan `GET` metode ini. 

![\[Konsol API Gateway dengan GET dipilih di bawah OPTIONS.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/0ac29a11-1362-4084-92ed-6b85205763ca/images/452e5b8f-6d61-401d-8484-e5a436cb6f1b.png)


 

## Lampiran
<a name="attachments-0ac29a11-1362-4084-92ed-6b85205763ca"></a>

[Untuk mengakses konten tambahan yang terkait dengan dokumen ini, unzip file berikut: attachment.zip](samples/p-attach/0ac29a11-1362-4084-92ed-6b85205763ca/attachments/attachment.zip)

# Otomatiskan penerapan aplikasi bersarang menggunakan AWS SAM
<a name="automate-deployment-of-nested-applications-using-aws-sam"></a>

*Dr. Rahul Sharad Gaikwad, Ishwar Chathaiwale, Dmitry Gulin, dan Tabby Ward, Amazon Web Services*

## Ringkasan
<a name="automate-deployment-of-nested-applications-using-aws-sam-summary"></a>

Di Amazon Web Services (AWS), AWS Serverless Application Model (AWS SAM) adalah kerangka kerja sumber terbuka yang menyediakan sintaks singkatan untuk mengekspresikan APIs fungsi, database, dan pemetaan sumber peristiwa. Dengan hanya beberapa baris untuk setiap sumber daya, Anda dapat menentukan aplikasi yang Anda inginkan dan memodelkannya dengan menggunakan YAMAL. Selama penerapan, SAM mengubah dan memperluas sintaks SAM menjadi sintaks CloudFormation AWS yang dapat Anda gunakan untuk membangun aplikasi tanpa server lebih cepat.

AWS SAM menyederhanakan pengembangan, penerapan, dan pengelolaan aplikasi tanpa server di platform AWS. Ini menyediakan kerangka kerja standar, penyebaran yang lebih cepat, kemampuan pengujian lokal, manajemen sumber daya, Integrasi tanpa batas dengan Alat Pengembangan, dan komunitas yang mendukung. Fitur-fitur ini menjadikannya alat yang berharga untuk membangun aplikasi tanpa server secara efisien dan efektif.

Pola ini menggunakan template AWS SAM untuk mengotomatiskan penerapan aplikasi bersarang. Aplikasi bersarang adalah aplikasi dalam aplikasi lain. Aplikasi induk memanggil aplikasi anak mereka. Ini adalah komponen yang digabungkan secara longgar dari arsitektur tanpa server. 

Menggunakan aplikasi bersarang, Anda dapat dengan cepat membangun arsitektur tanpa server yang sangat canggih dengan menggunakan kembali layanan atau komponen yang ditulis dan dipelihara secara independen tetapi disusun menggunakan AWS SAM dan Serverless Application Repository. Aplikasi bersarang membantu Anda membangun aplikasi yang lebih kuat, menghindari pekerjaan duplikat, dan memastikan konsistensi dan praktik terbaik di seluruh tim dan organisasi Anda. Untuk mendemonstrasikan aplikasi bersarang, pola tersebut menerapkan contoh aplikasi keranjang belanja [tanpa server AWS](https://github.com/aws-samples/aws-sam-nested-stack-sample).

## Prasyarat dan batasan
<a name="automate-deployment-of-nested-applications-using-aws-sam-prereqs"></a>

**Prasyarat**
+ Akun AWS yang aktif
+ Virtual Private Cloud (VPC) dan subnet
+ Lingkungan pengembangan terintegrasi seperti Visual Studio Code (untuk informasi selengkapnya, lihat [Alat untuk Dibangun di AWS](https://aws.amazon.com/getting-started/tools-sdks/#IDE_and_IDE_Toolkits))
+ Pustaka roda Python diinstal menggunakan pip install wheel, jika belum diinstal

**Batasan**
+ Jumlah maksimum aplikasi yang dapat di-nest dalam aplikasi nirserver adalah 200.
+ Jumlah maksimum parameter untuk aplikasi bersarang dapat memiliki 60.

**Versi produk**
+ Solusi ini dibangun di atas antarmuka baris perintah AWS SAM (AWS SAM CLI) versi 1.21.1, tetapi arsitektur ini harus bekerja dengan versi AWS SAM CLI yang lebih baru.

## Arsitektur
<a name="automate-deployment-of-nested-applications-using-aws-sam-architecture"></a>

**Tumpukan teknologi target**
+ Amazon API Gateway
+ AWS SAM
+ Amazon Cognito
+ Amazon DynamoDB
+ AWS Lambda
+ Antrean Amazon Simple Queue Service (Amazon SQS)

**Arsitektur target**

Diagram berikut menunjukkan bagaimana permintaan pengguna dibuat ke layanan belanja dengan menelepon APIs. Permintaan pengguna, termasuk semua informasi yang diperlukan, dikirim ke Amazon API Gateway dan otorisasi Amazon Cognito, yang melakukan mekanisme otentikasi dan otorisasi untuk. APIs

Ketika item ditambahkan, dihapus, atau diperbarui di DynamoDB, peristiwa dimasukkan ke DynamoDB Streams, yang pada gilirannya memulai fungsi Lambda. Untuk menghindari penghapusan langsung item lama sebagai bagian dari alur kerja sinkron, pesan dimasukkan ke antrian SQS, yang memulai fungsi pekerja untuk menghapus pesan.

![\[Operasi POST dan PUT dari API Gateway ke fungsi Lambda ke DynamoDB dan Layanan Produk.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/218adecc-b5b8-4193-9012-b5d584e2e128/images/5b454bae-5fd4-405d-a37d-6bafc3fcf889.png)


Dalam pengaturan solusi ini, AWS SAM CLI berfungsi sebagai antarmuka untuk tumpukan CloudFormation AWS. Template AWS SAM secara otomatis menyebarkan aplikasi bersarang. Template SAM induk memanggil template anak, dan CloudFormation tumpukan induk menyebarkan tumpukan anak. Setiap tumpukan anak membangun sumber daya AWS yang ditentukan dalam CloudFormation templat AWS SAM.

![\[Proses empat langkah menggunakan AWS SAM CLI dengan induk dan tiga CloudFormation tumpukan anak.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/218adecc-b5b8-4193-9012-b5d584e2e128/images/5828026e-72ad-4a3f-a5f2-bffac0f13e42.png)


1. Bangun dan gunakan tumpukan.

1.  CloudFormation Tumpukan Auth berisi Amazon Cognito.

1.  CloudFormation Tumpukan Produk berisi fungsi Lambda dan Amazon API Gateway

1.  CloudFormation Tumpukan Belanja berisi fungsi Lambda, Amazon API Gateway, antrean SQS, dan database Amazon DynamoDB.

## Alat
<a name="automate-deployment-of-nested-applications-using-aws-sam-tools"></a>

**Alat**
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) membantu Anda membuat, menerbitkan, memelihara, memantau, dan mengamankan REST, HTTP, dan WebSocket APIs dalam skala apa pun.
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) membantu Anda menyiapkan sumber daya AWS, menyediakannya dengan cepat dan konsisten, serta mengelolanya sepanjang siklus hidupnya di seluruh akun dan Wilayah AWS.
+ [Amazon Cognito](https://docs.aws.amazon.com/cognito/latest/developerguide/what-is-amazon-cognito.html) menyediakan otentikasi, otorisasi, dan manajemen pengguna untuk aplikasi web dan seluler.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) adalah layanan database NoSQL yang dikelola sepenuhnya yang menyediakan kinerja yang cepat, dapat diprediksi, dan terukur.
+ [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.
+ [AWS Serverless Application Model (AWS SAM) adalah kerangka kerja sumber terbuka yang membantu Anda membangun aplikasi](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/what-is-sam.html) tanpa server di AWS Cloud.
+ [Amazon Simple Queue Service (Amazon Simple Queue Service](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)) menyediakan antrian host yang aman, tahan lama, dan tersedia yang membantu Anda mengintegrasikan dan memisahkan sistem dan komponen perangkat lunak terdistribusi.

**Kode**

Kode untuk pola ini tersedia di repositori GitHub [AWS SAM Nested Stack Sample](https://github.com/aws-samples/aws-sam-nested-stack-sample).

## Epik
<a name="automate-deployment-of-nested-applications-using-aws-sam-epics"></a>

### Instal AWS SAM CLI
<a name="install-aws-sam-cli"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Instal AWS SAM CLI. | Untuk menginstal AWS SAM CLI, lihat instruksi dalam dokumentasi [AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html). | DevOps insinyur | 
| Siapkan kredensil AWS. | Untuk menetapkan kredensi AWS sehingga AWS SAM CLI dapat melakukan panggilan ke layanan AWS atas nama Anda, jalankan `aws configure` perintah dan ikuti petunjuknya.<pre>$aws configure<br />AWS Access Key ID [None]: <your_access_key_id><br />AWS Secret Access Key [None]: your_secret_access_key<br />Default region name [None]:<br />Default output format [None]:</pre>Untuk informasi selengkapnya tentang menyiapkan kredensil Anda, lihat [Otentikasi dan](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-authentication.html) akses kredensil.  | DevOps insinyur | 

### Inisialisasi proyek AWS SAM
<a name="initialize-the-aws-sam-project"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Kloning repositori kode AWS SAM. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/automate-deployment-of-nested-applications-using-aws-sam.html) | DevOps insinyur | 
| Menyebarkan template untuk menginisialisasi proyek. | Untuk menginisialisasi proyek, jalankan `SAM init` perintah. Ketika diminta untuk memilih sumber template, pilih`Custom Template Location`. | DevOps insinyur | 

### Kompilasi dan buat kode template SAM
<a name="compile-and-build-the-sam-template-code"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Tinjau template aplikasi AWS SAM. | Tinjau template untuk aplikasi bersarang. Contoh ini menggunakan template aplikasi bersarang berikut:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/automate-deployment-of-nested-applications-using-aws-sam.html) | DevOps insinyur | 
| Tinjau template induk. | Tinjau template yang akan memanggil template aplikasi bersarang. Dalam contoh ini, template induk adalah`template.yml`. Semua aplikasi terpisah bersarang di template `template.yml` induk tunggal. | DevOps insinyur | 
| Kompilasi dan buat kode template AWS SAM.  | Menggunakan AWS SAM CLI, jalankan perintah berikut.<pre>sam build</pre> | DevOps insinyur | 

### Terapkan template AWS SAM
<a name="deploy-the-aws-sam-template"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Menyebarkan aplikasi. | Untuk meluncurkan kode template SAM yang membuat CloudFormation tumpukan aplikasi bersarang dan menyebarkan kode di lingkungan AWS, jalankan perintah berikut.<pre>sam deploy --guided --stack-name shopping-cart-nested-stack --capabilities CAPABILITY_IAM CAPABILITY_AUTO_EXPAND</pre>Perintah akan meminta dengan beberapa pertanyaan. Jawab semua pertanyaan dengan`y`. | DevOps insinyur | 

### Verifikasi penyebaran
<a name="verify-the-deployment"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Verifikasi tumpukan. | Untuk meninjau CloudFormation tumpukan AWS dan sumber daya AWS yang ditentukan dalam templat AWS SAM, lakukan hal berikut:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/automate-deployment-of-nested-applications-using-aws-sam.html) | DevOps insinyur | 

## Sumber daya terkait
<a name="automate-deployment-of-nested-applications-using-aws-sam-resources"></a>

**Referensi**
+ [AWS Model Aplikasi Tanpa Server (AWS SAM)](https://aws.amazon.com/serverless/sam/#:~:text=The%20AWS%20Serverless%20Application%20Model,and%20model%20it%20using%20YAML.)
+ [AWS SAM aktif GitHub](https://github.com/aws/serverless-application-model)
+ [Serverless Shopping Cart Microservice (aplikasi contoh AWS)](https://github.com/aws-samples/aws-serverless-shopping-cart)

**Tutorial dan video**
+ [Membangun Aplikasi Tanpa Server](https://youtu.be/Hv3YrP8G4ag)
+ [AWS Online Tech Talks: Pembuatan dan Penerapan Aplikasi Tanpa Server dengan AWS SAM](https://youtu.be/1NU7vyJw9LU)

## Informasi tambahan
<a name="automate-deployment-of-nested-applications-using-aws-sam-additional"></a>

Setelah semua kode ada, contoh memiliki struktur direktori berikut:
+ [sam\$1stacks](https://docs.aws.amazon.com/lambda/latest/dg/chapter-layers.html) — Folder ini berisi layer. `shared.py` Lapisan adalah arsip file yang berisi pustaka, runtime kustom, atau dependensi lainnya. Dengan lapisan, Anda dapat menggunakan pustaka dalam fungsi Anda tanpa perlu memasukkannya ke dalam paket penerapan.
+ *product-mock-service*— Folder ini berisi semua fungsi dan file Lambda terkait produk.
+ *shopping-cart-service*- Folder ini berisi semua fungsi dan file Lambda terkait belanja.

# Menerapkan isolasi penyewa SaaS untuk Amazon S3 dengan menggunakan mesin penjual otomatis token AWS Lambda
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine"></a>

*Tabby Ward, Thomas Davis, dan Sravan Periyathambi, Amazon Web Services*

## Ringkasan
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-summary"></a>

Aplikasi SaaS multitenant harus menerapkan sistem untuk memastikan bahwa isolasi penyewa dipertahankan. Saat menyimpan data penyewa pada AWS sumber daya yang sama—seperti saat beberapa penyewa menyimpan data dalam ember Amazon Simple Storage Service (Amazon S3) S3—Anda harus memastikan bahwa akses lintas penyewa tidak dapat terjadi. Token vending machine (TVMs) adalah salah satu cara untuk menyediakan isolasi data penyewa. Mesin-mesin ini menyediakan mekanisme untuk mendapatkan token sambil mengabstraksi kompleksitas bagaimana token ini dihasilkan. Pengembang dapat menggunakan TVM tanpa memiliki pengetahuan rinci tentang bagaimana menghasilkan token.

Pola ini mengimplementasikan TVM dengan menggunakan. AWS Lambda TVM menghasilkan token yang terdiri dari kredenal layanan token keamanan sementara (STS) yang membatasi akses ke data penyewa SaaS tunggal dalam bucket S3.

TVMs, dan kode yang disediakan dengan pola ini, biasanya digunakan dengan klaim yang berasal dari JSON Web Tokens (JWTs) untuk mengaitkan permintaan AWS sumber daya dengan kebijakan cakupan penyewa (IAM AWS Identity and Access Management ). Anda dapat menggunakan kode dalam pola ini sebagai dasar untuk mengimplementasikan aplikasi SaaS yang menghasilkan kredensi STS sementara cakupan berdasarkan klaim yang diberikan dalam token JWT.

## Prasyarat dan batasan
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-prereqs"></a>

**Prasyarat**
+ Aktif Akun AWS.
+ AWS Command Line Interface (AWS CLI) [versi 1.19.0 atau yang lebih baru](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html), diinstal dan dikonfigurasi di macOS, Linux, atau Windows. Atau, Anda dapat menggunakan AWS CLI [versi 2.1 atau yang lebih baru](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html).

**Batasan**
+ Kode ini berjalan di Java dan saat ini tidak mendukung bahasa pemrograman lainnya. 
+ Aplikasi sampel tidak menyertakan dukungan AWS Cross-region atau disaster recovery (DR). 
+ Pola ini menunjukkan bagaimana TVM Lambda untuk aplikasi SaaS dapat menyediakan akses penyewa cakupan. Pola ini tidak dimaksudkan untuk digunakan di lingkungan produksi tanpa pengujian keamanan tambahan sebagai bagian dari aplikasi atau kasus penggunaan spesifik Anda.

## Arsitektur
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-architecture"></a>

**Tumpukan teknologi target**
+ AWS Lambda
+ Amazon S3
+ IAM
+ AWS Security Token Service (AWS STS)

**Arsitektur target**

![\[Menghasilkan token untuk mendapatkan kredensi STS sementara untuk mengakses data dalam bucket S3.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/97a34c8e-d04e-40b6-acbf-1baa176d22a9/images/14d0508a-703b-4229-85e6-c5094de7fe01.png)


 

## Alat
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-tools"></a>

**Layanan AWS**
+ [AWS Command Line Interface (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) adalah alat sumber terbuka yang membantu Anda berinteraksi Layanan AWS melalui perintah di shell baris perintah Anda.
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) membantu Anda mengelola akses ke AWS sumber daya dengan aman dengan mengontrol siapa yang diautentikasi dan diberi wewenang untuk menggunakannya.
+ [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.
+ [AWS Security Token Service (AWS STS)](https://docs.aws.amazon.com/STS/latest/APIReference/welcome.html) membantu Anda meminta kredensil hak istimewa terbatas sementara untuk pengguna.
+ [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.

**Kode**

Kode sumber untuk pola ini tersedia sebagai lampiran dan termasuk file-file berikut:
+ `s3UploadSample.jar`menyediakan kode sumber untuk fungsi Lambda yang mengunggah dokumen JSON ke bucket S3.
+ `tvm-layer.zip`menyediakan pustaka Java yang dapat digunakan kembali yang memasok token (kredensi sementara STS) untuk fungsi Lambda untuk mengakses bucket S3 dan mengunggah dokumen JSON.
+ `token-vending-machine-sample-app.zip`menyediakan kode sumber yang digunakan untuk membuat artefak dan instruksi kompilasi ini.

Untuk menggunakan file-file ini, ikuti instruksi di bagian selanjutnya.

## Epik
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-epics"></a>

### Tentukan nilai variabel
<a name="determine-variable-values"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Tentukan nilai variabel. | Implementasi pola ini mencakup beberapa nama variabel yang harus digunakan secara konsisten. Tentukan nilai yang harus digunakan untuk setiap variabel, dan berikan nilai itu ketika diminta dalam langkah selanjutnya.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine.html) | Administrator awan | 

### Buat Bucket S3
<a name="create-an-s3-bucket"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat bucket S3 untuk aplikasi sampel. | Gunakan AWS CLI perintah berikut untuk membuat bucket S3. Berikan `<sample-app-bucket-name>`**** nilai dalam cuplikan kode:<pre>aws s3api create-bucket --bucket <sample-app-bucket-name></pre>Aplikasi sampel Lambda mengunggah file JSON ke bucket ini. | Administrator awan | 

### Buat peran dan kebijakan IAM TVM
<a name="create-the-iam-tvm-role-and-policy"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat peran TVM. | Gunakan salah satu AWS CLI perintah berikut untuk membuat peran IAM. Berikan `<sample-tvm-role-name>`**** nilai dalam perintah.Untuk shell macOS atau Linux:<pre>aws iam create-role \<br />--role-name <sample-tvm-role-name> \<br />--assume-role-policy-document '{<br />    "Version": "2012-10-17",		 	 	 <br />    "Statement": [<br />        {<br />            "Effect": "Allow",<br />            "Action": [<br />                "sts:AssumeRole"<br />            ],<br />            "Principal": {<br />                "Service": [<br />                    "lambda.amazonaws.com"<br />                ]<br />            },<br />            "Condition": {<br />                "StringEquals": {<br />                    "aws:SourceAccount": "<AWS Account ID>"<br />                }<br />            }<br />        }<br />    ]<br />}'</pre>Untuk baris perintah Windows:<pre>aws iam create-role ^<br />--role-name <sample-tvm-role-name> ^<br />--assume-role-policy-document "{\"Version\": \"2012-10-17\", \"Statement\": [{\"Effect\": \"Allow\", \"Action\": [\"sts:AssumeRole\"], \"Principal\": {\"Service\": [\"lambda.amazonaws.com\"]}, \"Condition\": {\"StringEquals\": {\"aws:SourceAccount\": \"<AWS Account ID>\"}}}]}"</pre>Contoh aplikasi Lambda mengasumsikan peran ini saat aplikasi dipanggil. Kemampuan untuk mengambil peran aplikasi dengan kebijakan cakupan memberikan izin kode yang lebih luas untuk mengakses bucket S3. | Administrator awan | 
| Buat kebijakan peran TVM sebaris. | Gunakan salah satu AWS CLI perintah berikut untuk membuat kebijakan IAM. Berikan`<sample-tvm-role-name>`, **`<AWS Account ID>`**, dan `<sample-app-role-name>` nilai dalam perintah.Untuk shell macOS atau Linux:<pre>aws iam put-role-policy \<br />--role-name <sample-tvm-role-name> \<br />--policy-name assume-app-role \<br />--policy-document '{<br />    "Version": "2012-10-17",		 	 	  <br />    "Statement": [<br />        {<br />            "Effect": "Allow", <br />            "Action": "sts:AssumeRole", <br />            "Resource": "arn:aws:iam::<AWS Account ID>:role/<sample-app-role-name>"<br />        }<br />    ]}'</pre>Untuk baris perintah Windows:<pre>aws iam put-role-policy ^<br />--role-name <sample-tvm-role-name> ^<br />--policy-name assume-app-role ^<br />--policy-document "{\"Version\": \"2012-10-17\", \"Statement\": [{\"Effect\": \"Allow\", \"Action\": \"sts:AssumeRole\", \"Resource\": \"arn:aws:iam::<AWS Account ID>:role/<sample-app-role-name>\"}]}"</pre>Kebijakan ini melekat pada peran TVM. Ini memberi kode kemampuan untuk mengambil peran aplikasi, yang memiliki izin yang lebih luas untuk mengakses bucket S3. | Administrator awan | 
| Lampirkan kebijakan Lambda yang dikelola. | Gunakan AWS CLI perintah berikut untuk melampirkan kebijakan `AWSLambdaBasicExecutionRole` IAM. Berikan `<sample-tvm-role-name>` nilai dalam perintah:<pre>aws iam attach-role-policy \<br />--role-name <sample-tvm-role-name> \<br />--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole</pre>Untuk baris perintah Windows:<pre>aws iam attach-role-policy ^<br />--role-name <sample-tvm-role-name> ^<br />--policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole</pre>Kebijakan terkelola ini dilampirkan pada peran TVM untuk mengizinkan Lambda mengirim log ke Amazon. CloudWatch | Administrator awan | 

### Buat peran dan kebijakan aplikasi IAM
<a name="create-the-iam-application-role-and-policy"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat peran aplikasi. | Gunakan salah satu AWS CLI perintah berikut untuk membuat peran IAM. Berikan`<sample-app-role-name>`,`<AWS Account ID>`, dan `<sample-tvm-role-name>` nilai dalam perintah.Untuk shell macOS atau Linux:<pre>aws iam create-role \<br />--role-name <sample-app-role-name> \<br />--assume-role-policy-document '{<br />    "Version": "2012-10-17",		 	 	  <br />    "Statement": [<br />        {<br />            "Effect": <br />            "Allow",<br />            "Principal": {<br />                "AWS": "arn:aws:iam::<AWS Account ID>:role/<sample-tvm-role-name>"<br />            },<br />            "Action": "sts:AssumeRole"<br />        }<br />    ]}'</pre>Untuk baris perintah Windows:<pre>aws iam create-role ^<br />--role-name <sample-app-role-name> ^<br />--assume-role-policy-document "{\"Version\": \"2012-10-17\", \"Statement\": [{\"Effect\": \"Allow\",\"Principal\": {\"AWS\": \"arn:aws:iam::<AWS Account ID>:role/<sample-tvm-role-name>\"},\"Action\": \"sts:AssumeRole\"}]}"</pre>Aplikasi sampel Lambda mengasumsikan peran ini dengan kebijakan cakupan untuk mendapatkan akses berbasis penyewa ke bucket S3. | Administrator awan | 
| Buat kebijakan peran aplikasi inline. | Gunakan salah satu AWS CLI mmands berikut untuk membuat kebijakan IAM. Berikan `<sample-app-role-name>` dan `<sample-app-bucket-name>`**** nilai dalam perintah.Untuk shell macOS atau Linux:<pre>aws iam put-role-policy \<br />--role-name <sample-app-role-name> \<br />--policy-name s3-bucket-access \<br />--policy-document '{<br />    "Version": "2012-10-17",		 	 	  <br />    "Statement": [<br />        {<br />            "Effect": "Allow", <br />            "Action": [<br />                "s3:PutObject", <br />                "s3:GetObject", <br />                "s3:DeleteObject"<br />            ], <br />            "Resource": "arn:aws:s3:::<sample-app-bucket-name>/*"<br />        }, <br />        {<br />            "Effect": "Allow", <br />            "Action": ["s3:ListBucket"], <br />            "Resource": "arn:aws:s3:::<sample-app-bucket-name>"<br />        }<br />    ]}'</pre>Untuk baris perintah Windows:<pre>aws iam put-role-policy ^<br />--role-name <sample-app-role-name> ^<br />--policy-name s3-bucket-access ^<br />--policy-document "{\"Version\": \"2012-10-17\", \"Statement\": [{\"Effect\": \"Allow\", \"Action\": [\"s3:PutObject\", \"s3:GetObject\", \"s3:DeleteObject\"], \"Resource\": \"arn:aws:s3:::<sample-app-bucket-name>/*\"}, {\"Effect\": \"Allow\", \"Action\": [\"s3:ListBucket\"], \"Resource\": \"arn:aws:s3:::<sample-app-bucket-name>\"}]}"</pre>Kebijakan ini dilampirkan pada peran aplikasi. Ini menyediakan akses luas ke objek di bucket S3. Saat aplikasi sampel mengasumsikan peran tersebut, izin ini akan dicakup oleh penyewa tertentu dengan kebijakan TVM yang dihasilkan secara dinamis. | Administrator awan | 

### Buat aplikasi sampel Lambda dengan TVM
<a name="create-the-lam-sample-application-with-tvm"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Unduh file sumber yang dikompilasi. | Unduh `tvm-layer.zip`**** file `s3UploadSample.jar` dan, yang disertakan sebagai lampiran. Kode sumber yang digunakan untuk membuat artefak dan instusi kompilasi ini disediakan di. `token-vending-machine-sample-app.zip` | Administrator awan | 
| Buat layer Lambda. | Gunakan AWS CLI perintah berikut untuk membuat layer Lambda, yang membuat TVM dapat diakses oleh Lambda. Jika Anda tidak menjalankan perintah ini dari lokasi di mana Anda mengunduh` tvm-layer.zip`, berikan jalur yang benar ke `tvm-layer.zip` dalam `--zip-file` parameter. <pre>aws lambda publish-layer-version \<br />--layer-name sample-token-vending-machine \<br />--compatible-runtimes java11 \<br />--zip-file fileb://tvm-layer.zip</pre>Untuk baris perintah Windows:<pre>aws lambda publish-layer-version ^<br />--layer-name sample-token-vending-machine ^<br />--compatible-runtimes java11 ^<br />--zip-file fileb://tvm-layer.zip</pre>Perintah ini membuat lapisan Lambda yang berisi pustaka TVM yang dapat digunakan kembali. | Administrator cloud, Pengembang aplikasi | 
| Buat fungsi Lambda. | Gunakan AWS CLI perintah berikut untuk membuat fungsi Lambda. Berikan`<sample-app-function-name>`,`<AWS Account ID>`,`<AWS Region>`,`<sample-tvm-role-name>`,`<sample-app-bucket-name>`, dan `<sample-app-role-name>` nilai dalam perintah. Jika Anda tidak menjalankan perintah ini dari lokasi di mana Anda mengunduh`s3UploadSample.jar`, berikan jalur yang benar ke `s3UploadSample.jar` dalam `--zip-file` parameter. <pre>aws lambda create-function \<br />--function-name <sample-app-function-name>  \<br />--timeout 30 \<br />--memory-size 256 \<br />--runtime java11 \<br />--role arn:aws:iam::<AWS Account ID>:role/<sample-tvm-role-name> \<br />--handler com.amazon.aws.s3UploadSample.App \<br />--zip-file fileb://s3UploadSample.jar \<br />--layers arn:aws:lambda:<AWS Region>:<AWS Account ID>:layer:sample-token-vending-machine:1 \<br />--environment "Variables={S3_BUCKET=<sample-app-bucket-name>,<br />ROLE=arn:aws:iam::<AWS Account ID>:role/<sample-app-role-name>}"</pre>Untuk baris perintah Windows:<pre>aws lambda create-function ^<br />--function-name <sample-app-function-name>  ^<br />--timeout 30 ^<br />--memory-size 256 ^<br />--runtime java11 ^<br />--role arn:aws:iam::<AWS Account ID>:role/<sample-tvm-role-name> ^<br />--handler com.amazon.aws.s3UploadSample.App ^<br />--zip-file fileb://s3UploadSample.jar ^<br />--layers arn:aws:lambda:<AWS Region>:<AWS Account ID>:layer:sample-token-vending-machine:1 ^<br />--environment "Variables={S3_BUCKET=<sample-app-bucket-name>,ROLE=arn:aws:iam::<AWS Account ID>:role/<sample-app-role-name>}"</pre>Perintah ini menciptakan fungsi Lambda dengan kode aplikasi sampel dan lapisan TVM terpasang. Ini juga menetapkan dua variabel lingkungan: `S3_BUCKET` dan`ROLE`. Aplikasi sampel menggunakan variabel-variabel ini untuk menentukan peran yang akan diasumsikan dan bucket S3 untuk mengunggah dokumen JSON. | Administrator cloud, Pengembang aplikasi | 

### Uji aplikasi sampel dan TVM
<a name="test-the-sample-application-and-tvm"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Memanggil aplikasi sampel Lambda. | Gunakan salah satu AWS CLI perintah berikut untuk memulai aplikasi sampel Lambda dengan muatan yang diharapkan. Berikan `<sample-app-function-name>` dan `<sample-tenant-name>` nilai dalam perintah.Untuk shell macOS dan Linux:<pre>aws lambda invoke \<br />--function <sample-app-function-name> \<br />--invocation-type RequestResponse \<br />--payload '{"tenant": "<sample-tenant-name>"}' \<br />--cli-binary-format raw-in-base64-out response.json</pre>Untuk baris perintah Windows:<pre>aws lambda invoke ^<br />--function <sample-app-function-name> ^<br />--invocation-type RequestResponse ^<br />--payload "{\"tenant\": \"<sample-tenant-name>\"}" ^<br />--cli-binary-format raw-in-base64-out response.json</pre>Perintah ini memanggil fungsi Lambda dan mengembalikan hasilnya dalam dokumen. `response.json` Pada banyak sistem berbasis Unix, Anda dapat mengubah `response.json` `/dev/stdout` untuk menampilkan hasil langsung ke shell Anda tanpa membuat file lain. Mengubah `<sample-tenant-name>` nilai dalam pemanggilan berikutnya dari fungsi Lambda ini mengubah lokasi dokumen JSON dan izin yang diberikan token. | Administrator cloud, Pengembang aplikasi | 
| Lihat bucket S3 untuk melihat objek yang dibuat. | Jelajahi bucket S3 (`<sample-app-bucket-name>`) yang Anda buat sebelumnya. Bucket ini berisi awalan objek S3 dengan nilai. `<sample-tenant-name>` Di bawah awalan itu, Anda akan menemukan dokumen JSON bernama dengan UUID. Memanggil aplikasi sampel beberapa kali menambahkan lebih banyak dokumen JSON. | Administrator awan | 
| Lihat log untuk aplikasi sampel di CloudWatch Log. | Lihat log yang terkait dengan fungsi Lambda yang dinamai `<sample-app-function-name>` di CloudWatch Log. Untuk petunjuk, lihat [Mengirim log fungsi Lambda ke CloudWatch Log dalam dokumentasi](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-cloudwatchlogs.html) Lambda. Anda dapat melihat kebijakan cakupan penyewa yang dihasilkan oleh TVM di log ini. Kebijakan cakupan penyewa ini memberikan izin untuk aplikasi sampel ke Amazon S3,, dan **PutObject**GetObject**DeleteObject**ListBucket******** APIs, tetapi hanya untuk awalan objek yang terkait dengannya. `<sample-tenant-name>` Dalam pemanggilan aplikasi sampel berikutnya, jika Anda mengubah`<sample-tenant-name>`, TVM memperbarui kebijakan cakupan agar sesuai dengan penyewa yang disediakan dalam muatan pemanggilan. Kebijakan yang dihasilkan secara dinamis ini menunjukkan bagaimana akses cakupan penyewa dapat dipertahankan dengan TVM di aplikasi SaaS. Fungsionalitas TVM disediakan dalam lapisan Lambda sehingga dapat dilampirkan ke fungsi Lambda lain yang digunakan oleh aplikasi tanpa harus mereplikasi kode.Untuk ilustrasi kebijakan yang dihasilkan secara dinamis, lihat bagian [Informasi tambahan](#implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-additional). | Administrator awan | 

## Sumber daya terkait
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-resources"></a>
+ [Mengisolasi Penyewa dengan Kebijakan IAM yang Dihasilkan Secara Dinamis](https://aws.amazon.com/blogs/apn/isolating-saas-tenants-with-dynamically-generated-iam-policies/) (posting blog)
+ [Menerapkan Kebijakan Isolasi yang Dihasilkan Secara Dinamis di Lingkungan SaaS](https://aws.amazon.com/blogs/apn/applying-dynamically-generated-isolation-policies-in-saas-environments/) (posting blog)
+ [SaaS di AWS](https://aws.amazon.com/saas/)

## Informasi tambahan
<a name="implement-saas-tenant-isolation-for-amazon-s3-by-using-an-aws-lambda-token-vending-machine-additional"></a>

Log berikut menunjukkan kebijakan yang dihasilkan secara dinamis yang dihasilkan oleh kode TVM dalam pola ini. Dalam tangkapan layar ini, `<sample-app-bucket-name>` adalah `DOC-EXAMPLE-BUCKET` dan yang `<sample-tenant-name>` ada`test-tenant-1`. Kredensi STS yang dikembalikan oleh kebijakan cakupan ini tidak dapat melakukan tindakan apa pun pada objek di bucket S3 kecuali untuk objek yang terkait dengan awalan key objek. `test-tenant-1`

![\[Log menunjukkan kebijakan yang dihasilkan secara dinamis yang dihasilkan oleh kode TVM.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/97a34c8e-d04e-40b6-acbf-1baa176d22a9/images/d4776ebe-fb8f-41ac-b8c5-b4f97a821c8c.png)


## Lampiran
<a name="attachments-97a34c8e-d04e-40b6-acbf-1baa176d22a9"></a>

[Untuk mengakses konten tambahan yang terkait dengan dokumen ini, unzip file berikut: attachment.zip](samples/p-attach/97a34c8e-d04e-40b6-acbf-1baa176d22a9/attachments/attachment.zip)

# Menerapkan pola saga tanpa server dengan menggunakan AWS Step Functions
<a name="implement-the-serverless-saga-pattern-by-using-aws-step-functions"></a>

*Tabby Ward, Joe Kern, dan Rohan Mehta, Amazon Web Services*

## Ringkasan
<a name="implement-the-serverless-saga-pattern-by-using-aws-step-functions-summary"></a>

Dalam arsitektur layanan mikro, tujuan utamanya adalah membangun komponen terpisah dan independen untuk mempromosikan kelincahan, fleksibilitas, dan waktu yang lebih cepat untuk memasarkan aplikasi Anda. Sebagai hasil dari decoupling, setiap komponen microservice memiliki lapisan persistensi datanya sendiri. Dalam arsitektur terdistribusi, transaksi bisnis dapat menjangkau beberapa layanan mikro. Karena layanan mikro ini tidak dapat menggunakan transaksi atomisitas, konsistensi, isolasi, daya tahan (ACID) tunggal, Anda mungkin berakhir dengan transaksi sebagian. Dalam hal ini, diperlukan beberapa logika kontrol untuk membatalkan transaksi yang telah diproses. Pola saga terdistribusi biasanya digunakan untuk tujuan ini. 

Pola saga adalah pola manajemen kegagalan yang membantu membangun konsistensi dalam aplikasi terdistribusi dan mengkoordinasikan transaksi antara beberapa layanan mikro untuk menjaga konsistensi data. Ketika Anda menggunakan pola saga, setiap layanan yang melakukan transaksi menerbitkan peristiwa yang memicu layanan berikutnya untuk melakukan transaksi berikutnya dalam rantai. Ini berlanjut sampai transaksi terakhir dalam rantai selesai. Jika transaksi bisnis gagal, saga mengatur serangkaian transaksi kompensasi yang membatalkan perubahan yang dilakukan oleh transaksi sebelumnya.

Pola ini menunjukkan cara mengotomatiskan penyiapan dan penerapan aplikasi sampel (yang menangani reservasi perjalanan) dengan teknologi tanpa server seperti AWS Step Functions, AWS Lambda, dan Amazon DynamoDB. Aplikasi sampel juga menggunakan Amazon API Gateway dan Amazon Simple Notification Service (Amazon SNS) untuk mengimplementasikan koordinator eksekusi saga. Pola ini dapat diterapkan dengan kerangka infrastruktur sebagai kode (IAc) seperti AWS Cloud Development Kit (AWS CDK), AWS Serverless Application Model (AWS SAM), atau Terraform.

## Prasyarat dan batasan
<a name="implement-the-serverless-saga-pattern-by-using-aws-step-functions-prereqs"></a>

**Prasyarat**
+ Akun AWS yang aktif.
+ Izin untuk membuat CloudFormation tumpukan AWS. Untuk informasi selengkapnya, lihat [Mengontrol akses](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html) dalam CloudFormation dokumentasi.
+ Kerangka kerja IAC pilihan Anda (AWS CDK, AWS SAM, atau Terraform) dikonfigurasi dengan akun AWS Anda sehingga Anda dapat menggunakan kerangka kerja CLI untuk menyebarkan aplikasi.
+ NodeJS, digunakan untuk membangun aplikasi dan menjalankannya secara lokal. 
+ Editor kode pilihan Anda (seperti Visual Studio Code, Sublime, atau Atom).

**Versi produk**
+ [NodeJS versi 14](https://nodejs.org/en/download/)
+ [AWS CDK versi 2.37.1](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_install)
+ [AWS SAM versi 1.71.0](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/install-sam-cli.html)
+ [Terraform versi 1.3.7](https://developer.hashicorp.com/terraform/tutorials/aws-get-started/install-cli)

**Batasan**

Sumber acara adalah cara alami untuk menerapkan pola orkestrasi saga dalam arsitektur layanan mikro di mana semua komponen digabungkan secara longgar dan tidak memiliki pengetahuan langsung satu sama lain. Jika transaksi Anda melibatkan sejumlah kecil langkah (tiga hingga lima), pola saga mungkin sangat cocok. Namun kompleksitas meningkat dengan jumlah layanan mikro dan jumlah langkah. 

Pengujian dan debugging dapat menjadi sulit ketika Anda menggunakan desain ini, karena Anda harus menjalankan semua layanan untuk mensimulasikan pola transaksi.

## Arsitektur
<a name="implement-the-serverless-saga-pattern-by-using-aws-step-functions-architecture"></a>

**Arsitektur target**

Arsitektur yang diusulkan menggunakan AWS Step Functions untuk membangun pola saga untuk memesan penerbangan, memesan penyewaan mobil, dan memproses pembayaran untuk liburan.

Diagram alur kerja berikut menggambarkan aliran khas sistem reservasi perjalanan. Alur kerja terdiri dari pemesanan perjalanan udara (” ReserveFlight “), memesan mobil (” ReserveCarRental “), memproses pembayaran (” ProcessPayment “), konfirmasi reservasi penerbangan (” ConfirmFlight “), dan konfirmasi penyewaan mobil (” ConfirmCarRental “) diikuti dengan pemberitahuan keberhasilan ketika langkah-langkah ini selesai. Namun, jika sistem menemukan kesalahan dalam menjalankan salah satu transaksi ini, itu mulai gagal mundur. Misalnya, kesalahan dengan pemrosesan pembayaran (” ProcessPayment “) memicu pengembalian uang (” RefundPayment “), yang kemudian memicu pembatalan mobil sewaan dan penerbangan (” CancelRentalReservation "dan" CancelFlightReservation “), yang mengakhiri seluruh transaksi dengan pesan kegagalan.

Pola ini menyebarkan fungsi Lambda terpisah untuk setiap tugas yang disorot dalam diagram serta tiga tabel DynamoDB untuk penerbangan, penyewaan mobil, dan pembayaran. Setiap fungsi Lambda membuat, memperbarui, atau menghapus baris di tabel DynamoDB masing-masing, tergantung pada apakah transaksi dikonfirmasi atau digulung kembali. Pola ini menggunakan Amazon SNS untuk mengirim pesan teks (SMS) ke pelanggan, memberi tahu mereka tentang transaksi yang gagal atau berhasil. 

![\[Alur kerja untuk sistem reservasi perjalanan berdasarkan pola saga.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/fec0789c-d9b1-4d80-b179-dd9a7ecbec07/images/daad3e8e-6e6b-41c2-95c1-ca79d53ead64.png)


 

**Otomatisasi dan skala**

Anda dapat membuat konfigurasi untuk arsitektur ini dengan menggunakan salah satu kerangka kerja IAc. Gunakan salah satu tautan berikut untuk IAc pilihan Anda.
+ [Terapkan dengan AWS CDK](https://serverlessland.com/workflows/saga-pattern-cdk)
+ [Terapkan dengan AWS SAM](https://serverlessland.com/workflows/saga-pattern-sam)
+ [Terapkan dengan Terraform](https://serverlessland.com/workflows/saga-pattern-tf)

## Alat
<a name="implement-the-serverless-saga-pattern-by-using-aws-step-functions-tools"></a>

**Layanan AWS**
+ [AWS Step Functions](https://aws.amazon.com/step-functions/) adalah layanan orkestrasi tanpa server yang memungkinkan Anda menggabungkan fungsi AWS Lambda dan layanan AWS lainnya untuk membangun aplikasi yang penting bagi bisnis. Melalui konsol grafis Step Functions, Anda melihat alur kerja aplikasi Anda sebagai serangkaian langkah berbasis peristiwa.
+ [Amazon DynamoDB](https://aws.amazon.com/dynamodb/) adalah layanan database NoSQL yang dikelola sepenuhnya yang memberikan kinerja yang cepat dan dapat diprediksi dengan skalabilitas yang mulus. Anda dapat menggunakan DynamoDB untuk membuat tabel basis data yang dapat menyimpan dan mengambil data dalam jumlah berapa pun, dan melayani tingkat lalu lintas permintaan apapun.
+ [AWS Lambda](https://aws.amazon.com/lambda/) adalah layanan komputasi yang memungkinkan Anda menjalankan kode tanpa menyediakan atau mengelola server. Lambda menjalankan kode Anda hanya saat diperlukan dan menskalakan secara otomatis, dari beberapa permintaan per hari hingga ribuan per detik.
+ [Amazon API Gateway](https://aws.amazon.com/api-gateway/) adalah layanan AWS untuk membuat, menerbitkan, memelihara, memantau, dan mengamankan REST, HTTP, dan WebSocket APIs pada skala apa pun.
+ [Amazon Simple Notification Service (Amazon SNS](https://aws.amazon.com/sns/)) adalah layanan terkelola yang menyediakan pengiriman pesan dari penerbit ke pelanggan.
+ [AWS Cloud Development Kit (AWS CDK)](https://aws.amazon.com/cdk/) adalah kerangka kerja pengembangan perangkat lunak untuk mendefinisikan sumber daya aplikasi cloud Anda dengan menggunakan bahasa pemrograman yang sudah dikenal seperti TypeScript,, JavaScript Python, Java, dan C\$1/Net.
+ [AWS Serverless Application Model (AWS SAM) adalah kerangka kerja sumber terbuka untuk membangun aplikasi](https://aws.amazon.com/serverless/sam/) tanpa server. Ini menyediakan sintaks singkatan untuk mengekspresikan fungsi, database APIs, dan pemetaan sumber peristiwa. 

**Kode**

Kode untuk contoh aplikasi yang menunjukkan pola saga, termasuk template IAC (AWS CDK, AWS SAM, atau Terraform), fungsi Lambda, dan tabel DynamoDB dapat ditemukan di tautan berikut. Ikuti instruksi dalam epik pertama untuk menginstal ini.
+ [Terapkan dengan AWS CDK](https://serverlessland.com/workflows/saga-pattern-cdk)
+ [Terapkan dengan AWS SAM](https://serverlessland.com/workflows/saga-pattern-sam)
+ [Terapkan dengan Terraform](https://serverlessland.com/workflows/saga-pattern-tf)

## Epik
<a name="implement-the-serverless-saga-pattern-by-using-aws-step-functions-epics"></a>

### Instal paket, kompilasi, dan bangun
<a name="install-packages-compile-and-build"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Instal paket NPM. | Buat direktori baru, arahkan ke direktori itu di terminal, dan kloning GitHub repositori pilihan Anda dari bagian *Kode* sebelumnya dalam pola ini.Di folder root yang memiliki `package.json` file, jalankan perintah berikut untuk mengunduh dan menginstal semua paket Node Package Manager (NPM):<pre>npm install</pre> | Pengembang, arsitek Cloud | 
| Kompilasi skrip. | Di folder root, jalankan perintah berikut untuk menginstruksikan TypeScript transpiler untuk membuat semua file yang diperlukan JavaScript :<pre>npm run build</pre> | Pengembang, arsitek Cloud | 
| Perhatikan perubahan dan kompilasi ulang. | Di folder root, jalankan perintah berikut di jendela terminal terpisah untuk melihat perubahan kode, dan kompilasi kode ketika mendeteksi perubahan:<pre>npm run watch</pre> | Pengembang, arsitek Cloud | 
| Jalankan pengujian unit (hanya AWS CDK).  | Jika Anda menggunakan AWS CDK, di folder root, jalankan perintah berikut untuk melakukan pengujian unit Jest:<pre>npm run test</pre> | Pengembang, arsitek Cloud | 

### Menerapkan sumber daya ke akun AWS target
<a name="deploy-resources-to-the-target-aws-account"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Terapkan tumpukan demo ke AWS. | Aplikasi ini AWS Region-agnostik. [Jika Anda menggunakan profil, Anda harus mendeklarasikan Region secara eksplisit di [profil AWS Command Line Interface (AWS CLI) Command Line Interface (AWS CLI) atau melalui variabel lingkungan AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html).](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html)Di folder root, jalankan perintah berikut untuk membuat perakitan penerapan dan menerapkannya ke akun AWS default dan Wilayah.AWS CDK:<pre>cdk bootstrap<br />cdk deploy</pre>AWS SAM:<pre>sam build<br />sam deploy --guided</pre>Terraform:<pre>terraform init<br />terraform apply</pre>Langkah ini mungkin memakan waktu beberapa menit untuk menyelesaikannya. Perintah ini menggunakan kredensyal default yang dikonfigurasi untuk AWS CLI.Perhatikan URL API Gateway yang ditampilkan di konsol setelah penerapan selesai. Anda akan memerlukan informasi ini untuk menguji alur eksekusi saga. | Pengembang, arsitek Cloud | 
| Bandingkan tumpukan yang diterapkan dengan status saat ini. | Di folder root, jalankan perintah berikut untuk membandingkan tumpukan yang diterapkan dengan status saat ini setelah membuat perubahan pada kode sumber:AWS CDK:<pre>cdk diff</pre>AWS SAM:<pre>sam deploy</pre>Terraform:<pre>terraform plan</pre> | Pengembang, arsitek Cloud | 

### Uji alur eksekusi
<a name="test-the-execution-flow"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Uji alur eksekusi saga. | Arahkan ke URL API Gateway yang Anda catat di langkah sebelumnya, saat Anda menerapkan tumpukan. URL ini memicu mesin status untuk memulai. Untuk informasi selengkapnya tentang cara memanipulasi aliran mesin status dengan meneruskan parameter URL yang berbeda, lihat bagian [Informasi tambahan](#implement-the-serverless-saga-pattern-by-using-aws-step-functions-additional).Untuk melihat hasilnya, masuk ke AWS Management Console dan navigasikan ke konsol Step Functions. Di sini, Anda dapat melihat setiap langkah dari mesin saga state. Anda juga dapat melihat tabel DynamoDB untuk melihat catatan yang disisipkan, diperbarui, atau dihapus. Jika Anda sering menyegarkan layar, Anda dapat melihat perubahan status transaksi dari `pending` ke`confirmed`. Anda dapat berlangganan topik SNS dengan memperbarui kode dalam `stateMachine.ts` file dengan nomor ponsel Anda untuk menerima pesan SMS setelah reservasi berhasil atau gagal. Untuk informasi selengkapnya, lihat *Amazon SNS* di bagian [Informasi tambahan](#implement-the-serverless-saga-pattern-by-using-aws-step-functions-additional). | Pengembang, arsitek Cloud | 

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


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Pembersihan sumber daya  | Untuk membersihkan sumber daya yang digunakan untuk aplikasi ini, Anda dapat menggunakan salah satu perintah berikut.AWS CDK:<pre>cdk destroy</pre>AWS SAM:<pre>sam delete</pre>Terraform:<pre>terraform destroy</pre> | Pengembang aplikasi, arsitek Cloud | 

## Sumber daya terkait
<a name="implement-the-serverless-saga-pattern-by-using-aws-step-functions-resources"></a>

**Makalah teknis**
+ [Menerapkan Layanan Mikro di AWS](https://docs.aws.amazon.com/pdfs/whitepapers/latest/microservices-on-aws/microservices-on-aws.pdf)
+ [Lensa Aplikasi Tanpa Server](https://docs.aws.amazon.com/wellarchitected/latest/serverless-applications-lens/welcome.html)

**Dokumentasi layanan AWS**
+ [Memulai dengan AWS CDK](https://docs.aws.amazon.com/cdk/latest/guide/getting_started.html)
+ [Memulai AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started.html)
+ [AWS Step Functions](https://docs.aws.amazon.com/step-functions/)
+ [Amazon DynamoDB](https://docs.aws.amazon.com/dynamodb/)
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/)
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/)
+ [Amazon SNS](https://docs.aws.amazon.com/sns/)

**Tutorial**
+ [Lokakarya Langsung untuk Komputasi Tanpa Server](https://aws.amazon.com/serverless-workshops/)

## Informasi tambahan
<a name="implement-the-serverless-saga-pattern-by-using-aws-step-functions-additional"></a>

**Kode**

Untuk tujuan pengujian, pola ini menerapkan API Gateway dan fungsi Lambda pengujian yang memicu mesin status Step Functions. Dengan Step Functions, Anda dapat mengontrol fungsionalitas sistem reservasi perjalanan dengan meneruskan `run_type` parameter untuk meniru kegagalan di “ReserveFlightReserveCarRental,” “ProcessPayment,” “ConfirmFlight,” dan “ConfirmCarRental.”

Fungsi `saga` Lambda (`sagaLambda.ts`) mengambil input dari parameter kueri di URL API Gateway, membuat objek JSON berikut, dan meneruskannya ke Step Functions untuk dieksekusi:

```
let input = {
"trip_id": tripID, //  value taken from query parameter, default is AWS request ID
"depart_city": "Detroit",
"depart_time": "2021-07-07T06:00:00.000Z",
"arrive_city": "Frankfurt",
"arrive_time": "2021-07-09T08:00:00.000Z",
"rental": "BMW",
"rental_from": "2021-07-09T00:00:00.000Z",
"rental_to": "2021-07-17T00:00:00.000Z",
"run_type": runType // value taken from query parameter, default is "success"
};
```

Anda dapat bereksperimen dengan aliran yang berbeda dari mesin status Step Functions dengan meneruskan parameter URL berikut:
+ **Eksekusi Berhasil** ─ https://\$1api gateway url\$1
+ **Penerbangan Cadangan Gagal** ─ https://\$1api gateway url\$1? **RunType= failFlightsReservation**
+ **Konfirmasikan Penerbangan Gagal** ─ https://\$1api gateway url\$1? **RunType= failFlightsConfirmation**
+ **Cadangan Sewa Mobil Gagal** ─ https://\$1api gateway url\$1? **RunType= failCarRental Reservasi**
+ **Konfirmasikan Gagal Sewa Mobil** ─ https://\$1api gateway url\$1? **RunType= Konfirmasi failCarRental**
+ **Proses Pembayaran Gagal** ─ https://\$1api gateway url\$1? **runType=Kegagalan pembayaran**
+ **Lulus ID Perjalanan** ─ https://\$1api gateway url\$1? **tripid=** \$1secara default, ID trip akan menjadi ID permintaan AWS\$1

**Template IAc**

Repositori tertaut menyertakan templat IAC yang dapat Anda gunakan untuk membuat seluruh contoh aplikasi reservasi perjalanan.
+ [Terapkan dengan AWS CDK](https://serverlessland.com/workflows/saga-pattern-cdk)
+ [Terapkan dengan AWS SAM](https://serverlessland.com/workflows/saga-pattern-sam)
+ [Terapkan dengan Terraform](https://serverlessland.com/workflows/saga-pattern-tf)

**Tabel DynamoDB**

Berikut adalah model data untuk penerbangan, penyewaan mobil, dan tabel pembayaran.

```
Flight Data Model:
 var params = {
      TableName: process.env.TABLE_NAME,
      Item: {
        'pk' : {S: event.trip_id},
        'sk' : {S: flightReservationID},
        'trip_id' : {S: event.trip_id},
        'id': {S: flightReservationID},
        'depart_city' : {S: event.depart_city},
        'depart_time': {S: event.depart_time},
        'arrive_city': {S: event.arrive_city},
        'arrive_time': {S: event.arrive_time},
        'transaction_status': {S: 'pending'}
      }
    };

Car Rental Data Model:
var params = {
      TableName: process.env.TABLE_NAME,
      Item: {
        'pk' : {S: event.trip_id},
        'sk' : {S: carRentalReservationID},
        'trip_id' : {S: event.trip_id},
        'id': {S: carRentalReservationID},
        'rental': {S: event.rental},
        'rental_from': {S: event.rental_from},
        'rental_to': {S: event.rental_to},
        'transaction_status': {S: 'pending'}
      }
    };

Payment Data Model:
var params = {
      TableName: process.env.TABLE_NAME,
      Item: {
        'pk' : {S: event.trip_id},
        'sk' : {S: paymentID},
        'trip_id' : {S: event.trip_id},
        'id': {S: paymentID},
        'amount': {S: "750.00"}, // hard coded for simplicity as implementing any monetary transaction functionality is beyond the scope of this pattern
        'currency': {S: "USD"},
        'transaction_status': {S: "confirmed"}
      }
    };
```

**Fungsi Lambda**

Fungsi-fungsi berikut akan dibuat untuk mendukung aliran dan eksekusi mesin state di Step Functions:
+ **Reserve Flights**: Menyisipkan catatan ke dalam tabel DynamoDB Flights dengan `pending` jumlah, `transaction_status` untuk memesan penerbangan.
+ **Konfirmasi Penerbangan**: Memperbarui catatan di tabel DynamoDB Flights, untuk `transaction_status` disetel `confirmed` ke, untuk mengonfirmasi penerbangan.
+ **Batalkan Reservasi Penerbangan**: Menghapus catatan dari tabel DynamoDB Flights, untuk membatalkan penerbangan yang tertunda.
+ **Reserve Car Rentals**: Menyisipkan catatan ke dalam tabel CarRentals DynamoDB dengan, untuk `transaction_status` memesan `pending` sewa mobil.
+ **Konfirmasikan Penyewaan Mobil**: Memperbarui catatan di tabel CarRentals DynamoDB, untuk `transaction_status` mengatur ke, `confirmed` untuk mengkonfirmasi sewa mobil.
+ **Batalkan Reservasi Penyewaan Mobil:** Menghapus catatan dari tabel CarRentals DynamoDB, untuk membatalkan sewa mobil yang tertunda.
+ **Proses Pembayaran**: Menyisipkan catatan ke dalam tabel Pembayaran DynamoDB untuk pembayaran.
+ **Batalkan Pembayaran**: Menghapus catatan dari tabel Pembayaran DynamoDB untuk pembayaran.

**Amazon SNS**

Aplikasi sampel membuat topik dan langganan berikut untuk mengirim pesan SMS dan memberi tahu pelanggan tentang pemesanan yang berhasil atau gagal. Jika Anda ingin menerima pesan teks saat menguji aplikasi sampel, perbarui langganan SMS dengan nomor telepon Anda yang valid di file definisi mesin negara.

Cuplikan AWS CDK (tambahkan nomor telepon di baris kedua dari kode berikut):

```
const topic = new  sns.Topic(this, 'Topic');
topic.addSubscription(new subscriptions.SmsSubscription('+11111111111'));
const snsNotificationFailure = new tasks.SnsPublish(this ,'SendingSMSFailure', {
topic:topic,
integrationPattern: sfn.IntegrationPattern.REQUEST_RESPONSE,
message: sfn.TaskInput.fromText('Your Travel Reservation Failed'),
});
 
const snsNotificationSuccess = new tasks.SnsPublish(this ,'SendingSMSSuccess', {
topic:topic,
integrationPattern: sfn.IntegrationPattern.REQUEST_RESPONSE,
message: sfn.TaskInput.fromText('Your Travel Reservation is Successful'),
});
```

Cuplikan AWS SAM (ganti `+1111111111` string dengan nomor telepon Anda yang valid):

```
  StateMachineTopic11111111111:
    Type: 'AWS::SNS::Subscription'
    Properties:
      Protocol: sms
      TopicArn:
        Ref: StateMachineTopic
      Endpoint: '+11111111111'
    Metadata:
      'aws:sam:path': SamServerlessSagaStack/StateMachine/Topic/+11111111111/Resource
```

Cuplikan Terraform (ganti `+111111111` string dengan nomor telepon Anda yang valid):

```
resource "aws_sns_topic_subscription" "sms-target" {
  topic_arn = aws_sns_topic.topic.arn
  protocol  = "sms"
  endpoint  = "+11111111111"
}
```

**Reservasi yang berhasil**

Alur berikut menggambarkan reservasi yang berhasil dengan “ReserveFlight,” “ReserveCarRental,” dan "ProcessPayment" diikuti oleh "ConfirmFlight" dan "ConfirmCarRental.” Pelanggan diberitahu tentang pemesanan yang berhasil melalui pesan SMS yang dikirim ke pelanggan topik SNS.

![\[Contoh reservasi yang berhasil diimplementasikan oleh Step Functions dengan menggunakan pola saga.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/fec0789c-d9b1-4d80-b179-dd9a7ecbec07/images/f58c894e-7721-4bc7-8f7d-29f23faa5dc1.png)


**Reservasi gagal**

Aliran ini adalah contoh kegagalan dalam pola saga. Jika, setelah memesan penerbangan dan penyewaan mobil, ProcessPayment "" gagal, langkah-langkah dibatalkan dalam urutan terbalik.  Reservasi dirilis, dan pelanggan diberitahu tentang kegagalan melalui pesan SMS yang dikirim ke pelanggan topik SNS.

![\[Contoh reservasi gagal yang diimplementasikan oleh Step Functions dengan menggunakan pola saga.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/fec0789c-d9b1-4d80-b179-dd9a7ecbec07/images/7c64d326-be27-42c3-b03f-d677efedb9a7.png)


# Mengelola aplikasi kontainer lokal dengan menyiapkan Amazon ECS Anywhere dengan AWS CDK
<a name="manage-on-premises-container-applications-by-setting-up-amazon-ecs-anywhere-with-the-aws-cdk"></a>

*Dr. Rahul Sharad Gaikwad, Amazon Web Services*

## Ringkasan
<a name="manage-on-premises-container-applications-by-setting-up-amazon-ecs-anywhere-with-the-aws-cdk-summary"></a>

[Amazon ECS](https://aws.amazon.com/ecs/anywhere/) Anywhere adalah perpanjangan dari Amazon Elastic Container Service (Amazon ECS). Anda dapat menggunakan ECS Anywhere untuk menerapkan tugas Amazon ECS asli di lingkungan lokal atau yang dikelola pelanggan. Fitur ini membantu mengurangi biaya dan mengurangi orkestrasi dan operasi kontainer lokal yang kompleks. Anda dapat menggunakan ECS Anywhere untuk menyebarkan dan menjalankan aplikasi kontainer di lingkungan lokal dan cloud. Ini menghilangkan kebutuhan tim Anda untuk mempelajari beberapa domain dan keahlian, atau untuk mengelola perangkat lunak yang kompleks sendiri.

Pola ini menunjukkan langkah-langkah untuk menyiapkan ECS Anywhere dengan menggunakan tumpukan [AWS Cloud Development Kit (AWS CDK)](https://aws.amazon.com/cdk/).

## Prasyarat dan batasan
<a name="manage-on-premises-container-applications-by-setting-up-amazon-ecs-anywhere-with-the-aws-cdk-prereqs"></a>

**Prasyarat**
+ Akun AWS aktif.
+ AWS Command Line Interface (AWS CLI), diinstal dan dikonfigurasi. (Lihat [Menginstal, memperbarui, dan menghapus instalan AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) dalam dokumentasi AWS CLI.) 
+ AWS CDK Toolkit, diinstal dan dikonfigurasi. (Lihat [AWS CDK Toolkit](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) dalam dokumentasi AWS CDK, dan ikuti petunjuk untuk menginstal versi 2 secara global.)
+ Manajer paket node (npm), diinstal dan dikonfigurasi untuk AWS CDK di. TypeScript (Lihat [Mengunduh dan menginstal Node.js dan npm](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) di dokumentasi npm.)

**Batasan**
+ Untuk batasan dan pertimbangan, lihat [Instans eksternal (Amazon ECS Anywhere) di dokumentasi Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/ecs-anywhere.html#ecs-anywhere-considerations).

**Versi produk**
+ AWS CDK Toolkit versi 2
+ npm versi 7.20.3 atau yang lebih baru
+ Node.js versi 16.6.1 atau yang lebih baru

## Arsitektur
<a name="manage-on-premises-container-applications-by-setting-up-amazon-ecs-anywhere-with-the-aws-cdk-architecture"></a>

**Tumpukan teknologi target**
+ AWS CloudFormation
+ AWS CDK
+ Amazon ECS Anywhere
+ AWS Identity and Access Management (IAM)

**Arsitektur target**

Diagram berikut menggambarkan arsitektur sistem tingkat tinggi pengaturan ECS Anywhere menggunakan AWS CDK dengan TypeScript, seperti yang diterapkan oleh pola ini.

1. Saat Anda menerapkan tumpukan AWS CDK, itu membuat CloudFormation tumpukan di AWS.

1.  CloudFormation Stack menyediakan kluster Amazon ECS dan sumber daya AWS terkait.

1. Untuk mendaftarkan instans eksternal dengan kluster Amazon ECS, Anda harus menginstal AWS Systems Manager Agent (Agen SSM) di mesin virtual (VM) dan mendaftarkan VM sebagai instans terkelola AWS Systems Manager. 

1. Anda juga harus menginstal agen penampung Amazon ECS dan Docker di VM Anda untuk mendaftarkannya sebagai instance eksternal dengan cluster Amazon ECS.

1. Ketika instans eksternal terdaftar dan dikonfigurasi dengan cluster Amazon ECS, instans dapat menjalankan beberapa kontainer di VM Anda, yang terdaftar sebagai instance eksternal.

![\[Pengaturan ECS Anywhere menggunakan AWS CDK dengan. TypeScript\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/3ed63c00-40e7-4831-bb9d-63049c3490aa/images/ff7dc774-830d-4b9f-8262-7314afe7a033.png)


 

**Otomatisasi dan skala**

[GitHub Repositori](https://github.com/aws-samples/amazon-ecs-anywhere-cdk-samples/) yang disediakan dengan pola ini menggunakan AWS CDK sebagai alat infrastruktur sebagai kode (IAc) untuk membuat konfigurasi untuk arsitektur ini. AWS CDK membantu Anda mengatur sumber daya dan menyiapkan ECS Anywhere.

## Alat
<a name="manage-on-premises-container-applications-by-setting-up-amazon-ecs-anywhere-with-the-aws-cdk-tools"></a>
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/latest/guide/home.html) adalah kerangka kerja pengembangan perangkat lunak yang membantu Anda menentukan dan menyediakan infrastruktur AWS Cloud dalam kode.
+ [AWS Command Line Interface (AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)) adalah alat sumber terbuka yang membantu Anda berinteraksi dengan layanan AWS melalui perintah di shell baris perintah Anda.

**Kode**

Kode sumber untuk pola ini tersedia di GitHub, di repositori Sampel [CDK Amazon ECS Anywhere](https://github.com/aws-samples/amazon-ecs-anywhere-cdk-samples). Untuk mengkloning dan menggunakan repositori, ikuti instruksi di bagian selanjutnya.

## Epik
<a name="manage-on-premises-container-applications-by-setting-up-amazon-ecs-anywhere-with-the-aws-cdk-epics"></a>

### Verifikasi konfigurasi AWS CDK
<a name="verify-aws-cdk-configuration"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Verifikasi versi AWS CDK. | Verifikasi versi AWS CDK Toolkit dengan menjalankan perintah berikut:<pre>cdk --version</pre>Pola ini membutuhkan AWS CDK versi 2. Jika Anda memiliki AWS CDK versi sebelumnya, ikuti petunjuk dalam [dokumentasi AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) untuk memperbaruinya. | DevOps insinyur | 
| Siapkan kredensil AWS. | Untuk mengatur kredensil, jalankan `aws configure` perintah dan ikuti petunjuknya:<pre>$aws configure<br />AWS Access Key ID [None]: <your-access-key-ID><br />AWS Secret Access Key [None]: <your-secret-access-key><br />Default region name [None]: <your-Region-name><br />Default output format [None]:</pre> | DevOps insinyur | 

### Bootstrap lingkungan AWS CDK
<a name="bootstrap-the-aws-cdk-environment"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Kloning repositori kode AWS CDK. | Kloning repositori GitHub kode untuk pola ini dengan menggunakan perintah:<pre>git clone https://github.com/aws-samples/amazon-ecs-anywhere-cdk-samples.git</pre> | DevOps insinyur | 
| Bootstrap lingkungan. | Untuk menerapkan CloudFormation template AWS ke akun dan Wilayah AWS yang ingin Anda gunakan, jalankan perintah berikut:<pre>cdk bootstrap <account-number>/<Region></pre>Untuk informasi selengkapnya, lihat [Bootstrapping di dokumentasi](https://docs.aws.amazon.com/cdk/latest/guide/bootstrapping.html) AWS CDK. | DevOps insinyur | 

### Membangun dan menyebarkan proyek
<a name="build-and-deploy-the-project"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Instal dependensi paket dan kompilasi TypeScript file. | Instal dependensi paket dan kompilasi TypeScript file dengan menjalankan perintah berikut:<pre>$cd amazon-ecs-anywhere-cdk-samples<br />$npm install<br />$npm fund </pre>Perintah ini menginstal semua paket dari repositori sampel. Jika Anda mendapatkan kesalahan tentang paket yang hilang, gunakan salah satu perintah berikut:<pre>$npm ci   </pre>— atau —<pre>$npm install -g @aws-cdk/<package_name></pre>Untuk informasi selengkapnya, lihat [npm ci](https://docs.npmjs.com/cli/v7/commands/npm-ci) dan [npm install](https://docs.npmjs.com/cli/v7/commands/npm-install) di dokumentasi npm. | DevOps insinyur | 
| Bangun proyek. | Untuk membangun kode proyek, jalankan perintah:<pre>npm run build</pre>Untuk informasi selengkapnya tentang membangun dan menerapkan project, lihat [aplikasi AWS CDK pertama Anda di dokumentasi](https://docs.aws.amazon.com/cdk/latest/guide/hello_world.html#:~:text=the%20third%20parameter.-,Synthesize%20an%20AWS%20CloudFormation%20template,-Synthesize%20an%20AWS) AWS CDK. | DevOps insinyur | 
| Deploy proyek. | Untuk menyebarkan kode proyek, jalankan perintah:<pre>cdk deploy</pre> | DevOps insinyur | 
| Verifikasi pembuatan dan output tumpukan. | Buka CloudFormation konsol AWS di [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/),**** dan pilih tumpukan. `EcsAnywhereStack` Tab **Output** menunjukkan perintah untuk dijalankan di VM eksternal Anda. | DevOps insinyur | 

### Menyiapkan mesin lokal
<a name="set-up-an-on-premises-machine"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Siapkan VM Anda dengan menggunakan Vagrant. | Untuk tujuan demonstrasi, Anda dapat menggunakan [HashiCorp Vagrant](https://www.vagrantup.com/) untuk membuat VM. Vagrant adalah utilitas open-source untuk membangun dan memelihara lingkungan pengembangan perangkat lunak virtual portabel. Buat Vagrant VM dengan menjalankan `vagrant up` perintah dari direktori root tempat Vagrantfile ditempatkan. Untuk informasi lebih lanjut, lihat [dokumentasi Vagrant](https://www.vagrantup.com/docs/cli/up). | DevOps insinyur | 
| Daftarkan VM Anda sebagai instance eksternal. | 1. Masuk ke Vagrant VM dengan menggunakan perintah. `vagrant ssh` Untuk informasi lebih lanjut, lihat [dokumentasi Vagrant](https://www.vagrantup.com/docs/cli/ssh).2. Buat kode aktivasi dan ID yang dapat Anda gunakan untuk mendaftarkan VM Anda dengan AWS Systems Manager dan untuk mengaktifkan instans eksternal Anda. Output dari perintah ini termasuk `ActivationId` dan `ActivationCode` nilai: <pre>aws ssm create-activation --iam-role EcsAnywhereInstanceRole | tee ssm-activation.json</pre>3. Ekspor ID aktivasi dan nilai kode:<pre>export ACTIVATION_ID=<activation-ID><br />export ACTIVATION_CODE=<activation-code></pre>4. Unduh skrip penginstalan ke server lokal atau VM Anda:<pre>curl -o "ecs-anywhere-install.sh" "https://amazon-ecs-agent.s3.amazonaws.com/ecs-anywhere-install-latest.sh" && sudo chmod +x ecs-anywhere-install.sh</pre>5. Jalankan skrip penginstalan di server lokal atau VM Anda:<pre>sudo ./ecs-anywhere-install.sh \<br />    --cluster test-ecs-anywhere \<br />     --activation-id $ACTIVATION_ID \<br />     --activation-code $ACTIVATION_CODE \<br />    --region <Region></pre>Untuk informasi selengkapnya tentang menyiapkan dan mendaftarkan VM Anda, lihat [Mendaftarkan instans eksternal ke klaster](https://docs.amazonaws.cn/en_us/AmazonECS/latest/developerguide/ecs-anywhere-registration.html) di dokumentasi Amazon ECS. | DevOps insinyur | 
| Verifikasi status ECS Anywhere dan VM eksternal. | Untuk memverifikasi apakah kotak virtual Anda terhubung ke bidang kontrol Amazon ECS dan berjalan, gunakan perintah berikut:<pre>aws ssm describe-instance-information<br />aws ecs list-container-instances --cluster $CLUSTER_NAME</pre> | DevOps insinyur | 

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


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Bersihkan dan hapus sumber daya. | Setelah Anda menelusuri pola ini, Anda harus menghapus sumber daya yang Anda buat untuk menghindari biaya lebih lanjut. Untuk membersihkan, jalankan perintah:<pre>cdk destroy</pre> | DevOps insinyur | 

## Sumber daya terkait
<a name="manage-on-premises-container-applications-by-setting-up-amazon-ecs-anywhere-with-the-aws-cdk-resources"></a>
+ [Dokumentasi Amazon ECS Anywhere](https://aws.amazon.com/ecs/anywhere/) 
+ [Demo Amazon ECS Anywhere](https://www.youtube.com/watch?v=-eud6yUXsJM)
+ [Sampel Workshop Amazon ECS Anywhere](https://github.com/aws-samples/aws-ecs-anywhere-workshop-samples)

# Memodernisasi aplikasi Formulir Web ASP.NET di AWS
<a name="modernize-asp-net-web-forms-applications-on-aws"></a>

*Vijai Anand Ramalingam dan Sreelaxmi Pai, Amazon Web Services*

## Ringkasan
<a name="modernize-asp-net-web-forms-applications-on-aws-summary"></a>

Pola ini menjelaskan langkah-langkah untuk memodernisasi aplikasi ASP.NET Web Forms lama dan monolit dengan mem-porting ke ASP.NET Core di AWS.

Porting aplikasi ASP.NET Web Forms ke ASP.NET Core membantu Anda memanfaatkan kinerja, penghematan biaya, dan ekosistem Linux yang kuat. Namun, ini bisa menjadi upaya manual yang signifikan. Dalam pola ini, aplikasi lama dimodernisasi secara bertahap dengan menggunakan pendekatan bertahap, dan kemudian dikemas di AWS Cloud.

Pertimbangkan aplikasi monolit warisan untuk keranjang belanja. Mari kita asumsikan bahwa itu dibuat sebagai aplikasi ASP.NET Web Forms dan terdiri dari halaman.aspx dengan file code-behind (). `aspx.cs` Proses modernisasi terdiri dari langkah-langkah berikut:

1. Pecahkan monolit menjadi layanan mikro dengan menggunakan pola dekomposisi yang sesuai. Untuk informasi selengkapnya, lihat panduan [Menguraikan monolit menjadi layanan mikro](https://docs.aws.amazon.com/prescriptive-guidance/latest/modernization-decomposing-monoliths/) di situs web AWS Prescriptive Guidance.

1. Port aplikasi ASP.NET Web Forms (.NET Framework) lama Anda ke ASP.NET Core di.NET 5 atau yang lebih baru. Dalam pola ini, Anda menggunakan Porting Assistant untuk.NET untuk memindai aplikasi ASP.NET Web Forms Anda dan mengidentifikasi ketidakcocokan dengan ASP.NET Core. Ini mengurangi upaya porting manual.

1. Kembangkan kembali layer UI Formulir Web dengan menggunakan React. Pola ini tidak mencakup pembangunan kembali UI. Untuk petunjuk, lihat [Membuat Aplikasi React Baru](https://reactjs.org/docs/create-a-new-react-app.html) di dokumentasi React.

1. Kembangkan kembali file kode di belakang Formulir Web (antarmuka bisnis) sebagai API web ASP.NET Core. Pola ini menggunakan NDepend laporan untuk membantu mengidentifikasi file dan dependensi yang diperlukan.

1. Tingkatkan shared/common proyek, seperti Logika Bisnis dan Akses Data, dalam aplikasi lama Anda ke .NET 5 atau yang lebih baru dengan menggunakan Porting Assistant untuk.NET. 

1. Tambahkan layanan AWS untuk melengkapi aplikasi Anda. Misalnya, Anda dapat menggunakan [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) untuk memantau, menyimpan, dan mengakses log aplikasi Anda, dan [AWS Systems Manager](https://aws.amazon.com/systems-manager/) untuk menyimpan setelan aplikasi Anda.

1. Kontainerisasi aplikasi ASP.NET Core yang dimodernisasi. Pola ini membuat file Docker yang menargetkan Linux di Visual Studio dan menggunakan Docker Desktop untuk mengujinya secara lokal. Langkah ini mengasumsikan bahwa aplikasi lama Anda sudah berjalan di instans Windows Amazon Elastic Compute Cloud (Amazon) lokal atau Amazon EC2. Untuk informasi selengkapnya, lihat pola [Menjalankan container ASP.NET Core API Docker pada instance Amazon EC2 Linux](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html).

1. Terapkan aplikasi inti ASP.NET yang dimodernisasi ke Amazon Elastic Container Service (Amazon ECS). Pola ini tidak mencakup langkah penerapan. Untuk petunjuk, lihat [Amazon ECS Workshop](https://ecsworkshop.com/).

**catatan**  
Pola ini tidak mencakup pengembangan UI, modernisasi database, atau langkah penerapan kontainer.

## Prasyarat dan batasan
<a name="modernize-asp-net-web-forms-applications-on-aws-prereqs"></a>

**Prasyarat**
+ [Visual Studio](https://visualstudio.microsoft.com/downloads/) atau [Visual Studio Code](https://code.visualstudio.com/download), diunduh dan diinstal.
+ Akses ke akun AWS menggunakan AWS Management Console dan AWS Command Line Interface (AWS CLI) versi 2. (Lihat [petunjuk untuk mengonfigurasi AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html).)
+ AWS Toolkit for Visual Studio ([lihat petunjuk penyiapan](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/setup.html)).
+ Docker Desktop, [diunduh](https://www.docker.com/products/docker-desktop) dan diinstal.
+ .NET SDK, [diunduh](https://download.visualstudio.microsoft.com/download/pr/4263dc3b-dc67-4f11-8d46-cc0ae86a232e/66782bbd04c53651f730b2e30a873f18/dotnet-sdk-5.0.203-win-x64.exe) dan diinstal.
+ NDepend alat, [diunduh](https://www.ndepend.com/download) dan diinstal. Untuk menginstal NDepend ekstensi untuk Visual Studio, jalankan `NDepend.VisualStudioExtension.Installer` ([lihat instruksi](https://www.ndepend.com/docs/getting-started-with-ndepend#Part1)). Anda dapat memilih Visual Studio 2019 atau 2022, tergantung pada kebutuhan Anda. 
+ Porting Assistant untuk.NET, [diunduh](https://aws.amazon.com/porting-assistant-dotnet/) dan diinstal.

## Arsitektur
<a name="modernize-asp-net-web-forms-applications-on-aws-architecture"></a>

**Memodernisasi aplikasi keranjang belanja**

Diagram berikut menggambarkan proses modernisasi untuk aplikasi keranjang belanja ASP.NET warisan.

![\[Memodernisasi aplikasi keranjang belanja lama\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/36cda8e6-f2cb-4f1a-b37f-fa3045cc5ba1/images/4367e259-9bb3-4eb6-a54d-1c1e2dece7d4.png)


**Arsitektur target**

Diagram berikut menggambarkan arsitektur aplikasi keranjang belanja modern di AWS. Web ASP.NET Core APIs dikerahkan ke cluster Amazon ECS. Layanan pencatatan dan konfigurasi disediakan oleh Amazon CloudWatch Logs dan AWS Systems Manager.

![\[Arsitektur target untuk aplikasi Formulir Web ASP.NET di AWS\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/36cda8e6-f2cb-4f1a-b37f-fa3045cc5ba1/images/ed6d65ec-0dc9-43ab-ac07-1f172e089399.png)


## Alat
<a name="modernize-asp-net-web-forms-applications-on-aws-tools"></a>

**Layanan AWS**
+ [Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) — Amazon Elastic Container Service (Amazon ECS) adalah layanan manajemen kontainer yang sangat skalabel dan cepat untuk menjalankan, menghentikan, dan mengelola kontainer di klaster. Anda dapat menjalankan tugas dan layanan Anda pada infrastruktur tanpa server yang dikelola oleh AWS Fargate. Atau, untuk kontrol lebih besar atas infrastruktur Anda, Anda dapat menjalankan tugas dan layanan Anda pada sekelompok EC2 instance yang Anda kelola.
+ [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) — Amazon CloudWatch Logs memusatkan log dari semua sistem, aplikasi, dan layanan AWS yang Anda gunakan. Anda dapat melihat dan memantau log, mencari kode atau pola kesalahan tertentu, memfilternya berdasarkan bidang tertentu, atau mengarsipkannya dengan aman untuk analisis masa depan.
+ [AWS Systems Manager](https://docs.aws.amazon.com/systems-manager/latest/userguide/what-is-systems-manager.html) ─ AWS Systems Manager adalah layanan AWS yang dapat Anda gunakan untuk melihat dan mengontrol infrastruktur di AWS. Menggunakan konsol Systems Manager, Anda dapat melihat data operasional dari beberapa layanan AWS dan mengotomatiskan tugas operasional di seluruh sumber daya AWS Anda. Systems Manager membantu Anda menjaga keamanan dan kepatuhan dengan memindai instans dan pelaporan terkelola Anda (atau mengambil tindakan korektif) pada setiap pelanggaran kebijakan yang terdeteksi.

**Alat**
+ [Visual Studio](https://visualstudio.microsoft.com/) atau [Visual Studio Code](https://code.visualstudio.com/) — Alat untuk membangun aplikasi.NET, web APIs, dan program lainnya.
+ [AWS Toolkit for Visual](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html) Studio — Ekstensi untuk Visual Studio yang membantu mengembangkan, men-debug, dan menyebarkan aplikasi.NET yang menggunakan layanan AWS.
+ [Docker Desktop](https://www.docker.com/products/docker-desktop) — Alat yang menyederhanakan pembuatan dan penerapan aplikasi kontainer.
+ [NDepend](https://www.ndepend.com/features/)— Analyzer yang memantau kode.NET untuk dependensi, masalah kualitas, dan perubahan kode.
+ [Porting Assistant for .NET](https://aws.amazon.com/porting-assistant-dotnet/) — Alat analisis yang memindai kode.NET untuk mengidentifikasi ketidakcocokan dengan.NET Core dan untuk memperkirakan upaya migrasi.

## Epik
<a name="modernize-asp-net-web-forms-applications-on-aws-epics"></a>

### Port aplikasi lama Anda ke .NET 5 atau versi yang lebih baru
<a name="port-your-legacy-application-to-net-5-or-later-version"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Tingkatkan aplikasi lawasan.NET Framework Anda ke .NET 5. | Anda dapat menggunakan Porting Assistant untuk.NET untuk mengonversi aplikasi ASP.NET Web Forms lama Anda ke .NET 5 atau yang lebih baru. Ikuti petunjuk di [Porting Assistant untuk dokumentasi .NET](https://docs.aws.amazon.com/portingassistant/latest/userguide/porting-assistant-getting-started.html). | Pengembang aplikasi | 
| Hasilkan NDepend laporan. | Saat Anda memodernisasi aplikasi Formulir Web ASP.NET Anda dengan menguraikannya menjadi layanan mikro, Anda mungkin tidak memerlukan semua file.cs dari aplikasi lama. Anda dapat menggunakan NDepend untuk membuat laporan untuk file code-behind (.cs) apa pun, untuk mendapatkan semua penelepon dan pemanggil. Laporan ini membantu Anda mengidentifikasi dan hanya menggunakan file yang diperlukan dalam layanan mikro Anda.Setelah Anda menginstal NDepend (lihat bagian [Prasyarat](#modernize-asp-net-web-forms-applications-on-aws-prereqs)), buka solusi (file.sln) untuk aplikasi lama Anda di Visual Studio dan ikuti langkah-langkah berikut:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/modernize-asp-net-web-forms-applications-on-aws.html)Proses ini menghasilkan laporan untuk file di belakang kode yang mencantumkan semua penelepon dan pemanggil. Untuk informasi selengkapnya tentang grafik ketergantungan, lihat [NDepend dokumentasi](https://www.ndepend.com/docs/visual-studio-dependency-graph). | Pengembang aplikasi | 
| Buat solusi.NET 5 baru. | Untuk membuat struktur.NET 5 (atau yang lebih baru) baru untuk web ASP.NET Core Anda yang dimodernisasi: APIs[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/modernize-asp-net-web-forms-applications-on-aws.html)Untuk informasi selengkapnya tentang membuat proyek dan solusi, lihat [dokumentasi Visual Studio](https://docs.microsoft.com/en-us/visualstudio/ide/creating-solutions-and-projects).Saat Anda membangun solusi dan memverifikasi fungsionalitas, Anda mungkin mengidentifikasi beberapa file tambahan yang akan ditambahkan ke solusi, selain file yang NDepend diidentifikasi. | Pengembang aplikasi | 

### Perbarui kode aplikasi Anda
<a name="update-your-application-code"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Implementasikan web APIs dengan ASP.NET Core. | *Mari kita asumsikan bahwa salah satu layanan mikro yang Anda identifikasi dalam aplikasi keranjang belanja monolit lama Anda adalah Produk.* Anda membuat proyek API web ASP.NET Core baru untuk *Produk* di epik sebelumnya. *Pada langkah ini, Anda mengidentifikasi dan memodernisasi semua formulir web (halaman.aspx) yang terkait dengan Produk.* Mari kita asumsikan bahwa *Produk* terdiri dari empat bentuk web, seperti yang diilustrasikan sebelumnya di bagian [Arsitektur](#modernize-asp-net-web-forms-applications-on-aws-architecture):[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/modernize-asp-net-web-forms-applications-on-aws.html)Anda harus menganalisis setiap formulir web, mengidentifikasi semua permintaan yang dikirim ke database untuk melakukan beberapa logika, dan mendapatkan tanggapan. Anda dapat mengimplementasikan setiap permintaan sebagai titik akhir API web. Mengingat bentuk webnya, *Produk* dapat memiliki titik akhir yang mungkin berikut:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/modernize-asp-net-web-forms-applications-on-aws.html)Seperti disebutkan sebelumnya, Anda juga dapat menggunakan kembali semua proyek lain yang Anda upgrade ke .NET 5, termasuk Logika Bisnis, Akses Data, dan shared/common proyek. | Pengembang aplikasi | 
| Konfigurasikan CloudWatch Log Amazon. | Anda dapat menggunakan [Amazon CloudWatch Logs](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/WhatIsCloudWatchLogs.html) untuk memantau, menyimpan, dan mengakses log aplikasi Anda. Anda dapat mencatat data ke Amazon CloudWatch Logs menggunakan AWS SDK. Anda juga dapat mengintegrasikan aplikasi.NET dengan CloudWatch Log dengan menggunakan framework logging .NET populer seperti [NLog](https://www.nuget.org/packages/AWS.Logger.NLog/), [Log4Net, dan [ASP.NET](https://www.nuget.org/packages/AWS.Logger.AspNetCore/)](https://www.nuget.org/packages/AWS.Logger.Log4net/) Core logging framework.Untuk informasi selengkapnya tentang langkah ini, lihat posting blog [Amazon CloudWatch Logs dan .NET Logging Frameworks](https://aws.amazon.com/blogs/developer/amazon-cloudwatch-logs-and-net-logging-frameworks/). | Pengembang aplikasi | 
| Konfigurasikan AWS Systems Manager Parameter Store. | Anda dapat menggunakan [AWS Systems Manager Parameter Store](https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-paramstore.html) untuk menyimpan setelan aplikasi seperti string koneksi secara terpisah dari kode aplikasi Anda. NuGet Paket [Amazon.Extensions.Configuration. SystemsManager](https://www.nuget.org/packages/Amazon.Extensions.Configuration.SystemsManager/)menyederhanakan cara aplikasi Anda memuat pengaturan ini dari AWS Systems Manager Parameter Store ke dalam sistem konfigurasi.NET Core. Untuk informasi selengkapnya tentang langkah ini, lihat posting blog [penyedia konfigurasi.NET Core untuk AWS Systems Manager](https://aws.amazon.com/blogs/developer/net-core-configuration-provider-for-aws-systems-manager/). | Pengembang aplikasi | 

### Tambahkan otentikasi dan otorisasi
<a name="add-authentication-and-authorization"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Gunakan cookie bersama untuk otentikasi. | Memodernisasi aplikasi monolit warisan adalah proses berulang dan membutuhkan monolit dan versi modernnya untuk hidup berdampingan. Anda dapat menggunakan cookie bersama untuk mencapai otentikasi tanpa batas antara kedua versi. Aplikasi ASP.NET lama terus memvalidasi kredensi pengguna dan mengeluarkan cookie sementara aplikasi ASP.NET Core yang dimodernisasi memvalidasi cookie. Untuk instruksi dan kode sampel, lihat [ GitHub proyek sampel](https://github.com/aws-samples/dotnet-share-auth-cookie-between-monolith-and-modernized-apps). | Pengembang aplikasi | 

### Bangun dan jalankan kontainer secara lokal
<a name="build-and-run-the-container-locally"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat gambar Docker dengan menggunakan Visual Studio. | Pada langkah ini, Anda membuat file Docker dengan menggunakan Visual Studio for .NET Core web API.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/modernize-asp-net-web-forms-applications-on-aws.html)Visual Studio membuat file Docker untuk proyek Anda. Untuk contoh file Docker, lihat [Visual Studio Container Tools for Docker](https://docs.microsoft.com/en-us/visualstudio/containers/overview) di situs web Microsoft. | Pengembang aplikasi | 
| Bangun dan jalankan wadah dengan menggunakan Docker Desktop. | Sekarang Anda dapat membangun, membuat dan menjalankan wadah di Docker Desktop.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/modernize-asp-net-web-forms-applications-on-aws.html) | Pengembang aplikasi | 

## Sumber daya terkait
<a name="modernize-asp-net-web-forms-applications-on-aws-resources"></a>
+ [Jalankan wadah API Docker web ASP.NET Core di instans Amazon EC2 Linux](https://docs.aws.amazon.com/prescriptive-guidance/latest/patterns/run-an-asp-net-core-web-api-docker-container-on-an-amazon-ec2-linux-instance.html) (AWS Prescriptive Guidance)
+ [Lokakarya Amazon ECS](https://ecsworkshop.com/)
+ [Lakukan blue/green penerapan ECS dengan menggunakan CodeDeploy AWS (dokumentasi CloudFormation AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/blue-green.html)) CloudFormation 
+ [Memulai dengan NDepend](https://www.ndepend.com/docs/getting-started-with-ndepend) (NDepend dokumentasi)
+ [Asisten Porting untuk .NET](https://aws.amazon.com/porting-assistant-dotnet/)

## Informasi tambahan
<a name="modernize-asp-net-web-forms-applications-on-aws-additional"></a>

Tabel berikut memberikan contoh proyek sampel untuk aplikasi keranjang belanja lama dan proyek yang setara dalam aplikasi ASP.NET Core Anda yang dimodernisasi.

**Solusi warisan:**


| 
| 
| Nama proyek | Template proyek | Kerangka target | 
| --- |--- |--- |
| Antarmuka Bisnis  | Perpustakaan Kelas  | .NET Framework  | 
| BusinessLogic  | Perpustakaan Kelas  | .NET Framework  | 
| WebApplication  | Aplikasi Web Kerangka ASP.NET  | .NET Framework  | 
| UnitTests  | NUnit Proyek Uji  | .NET Framework  | 
| Dibagikan -> Umum  | Perpustakaan Kelas  | .NET Framework  | 
| Bersama -> Kerangka  | Perpustakaan Kelas  | .NET Framework  | 

**Solusi baru:**


| 
| 
| Nama proyek | Template proyek | Kerangka target | 
| --- |--- |--- |
| BusinessLogic  | Perpustakaan Kelas  | .NET 5.0  | 
| <WebAPI>  | API Web Inti ASP.NET  | .NET 5.0  | 
| <WebAPI>. UnitTests  | NUnit 3 Proyek Uji  | .NET 5.0  | 
| Dibagikan -> Umum  | Perpustakaan Kelas  | .NET 5.0  | 
| Bersama -> Kerangka  | Perpustakaan Kelas  | .NET 5.0  | 

# Orientasi penyewa dalam arsitektur SaaS untuk model silo menggunakan C\$1 dan AWS CDK
<a name="tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk"></a>

*Tabby Ward, Susmitha Reddy Gankidi, dan Vijai Anand Ramalingam, Amazon Web Services*

## Ringkasan
<a name="tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk-summary"></a>

Aplikasi perangkat lunak sebagai layanan (SaaS) dapat dibangun dengan berbagai model arsitektur yang berbeda. *Model silo* mengacu pada arsitektur di mana penyewa disediakan sumber daya khusus.

Aplikasi SaaS mengandalkan model tanpa gesekan untuk memperkenalkan penyewa baru ke lingkungan mereka. Ini sering membutuhkan orkestrasi sejumlah komponen untuk berhasil menyediakan dan mengkonfigurasi semua elemen yang diperlukan untuk membuat penyewa baru. Proses ini, dalam arsitektur SaaS, disebut sebagai penyewa on-boarding. On-boarding harus sepenuhnya otomatis untuk setiap lingkungan SaaS dengan memanfaatkan infrastruktur sebagai kode dalam proses on-boarding Anda.

Pola ini memandu Anda melalui contoh pembuatan penyewa dan penyediaan infrastruktur dasar untuk penyewa di Amazon Web Services (AWS). Pola ini menggunakan C\$1 dan AWS Cloud Development Kit (AWS CDK).

Karena pola ini menciptakan alarm penagihan, sebaiknya gunakan tumpukan di US East (Virginia N.), atau us-east-1, Wilayah AWS. Untuk informasi selengkapnya, lihat [dokumentasi AWS](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/monitor_estimated_charges_with_cloudwatch.html).

## Prasyarat dan batasan
<a name="tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk-prereqs"></a>

**Prasyarat******
+ [Akun AWS](https://aws.amazon.com/account/) yang aktif.
+ Prinsipal AWS Identity and Access Management (IAM) dengan akses IAM yang memadai untuk membuat sumber daya AWS untuk pola ini. Untuk informasi selengkapnya, lihat [peran IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html).
+ [Instal Amazon Command Line Interface (AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)) dan [konfigurasikan AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html) untuk melakukan penerapan AWS CDK.
+ [Visual Studio 2022](https://visualstudio.microsoft.com/downloads/) diunduh dan diinstal atau [Visual Studio Code](https://code.visualstudio.com/download) diunduh dan diinstal.
+ [AWS Toolkit untuk penyiapan AWS Toolkit for Visual](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/setup.html) Studio.
+ [.NET Core 3.1 atau yang lebih baru](https://dotnet.microsoft.com/download/dotnet-core/3.1) (diperlukan untuk aplikasi CDK C\$1 AWS)
+ [Amazon.Lambda.Tools diinstal.](https://github.com/aws/aws-extensions-for-dotnet-cli#aws-lambda-amazonlambdatools)

**Keterbatasan******
+ AWS CDK menggunakan [AWS CloudFormation](https://aws.amazon.com/cloudformation/), sehingga aplikasi AWS CDK tunduk pada kuota CloudFormation layanan. Untuk informasi selengkapnya, lihat [ CloudFormation kuota AWS](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cloudformation-limits.html). 
+  CloudFormation Tumpukan penyewa dibuat dengan peran CloudFormation `infra-cloudformation-role` layanan dengan karakter wildcard pada tindakan (`sns`\$1 dan`sqs*`) tetapi dengan sumber daya yang dikunci ke awalan. `tenant-cluster` Untuk kasus penggunaan produksi, evaluasi pengaturan ini dan berikan hanya akses yang diperlukan ke peran layanan ini. Fungsi `InfrastructureProvision` Lambda juga menggunakan karakter wildcard (`cloudformation*`) untuk menyediakan CloudFormation tumpukan tetapi dengan sumber daya yang dikunci ke awalan. `tenant-cluster`
+ Contoh docker build kode ini digunakan `--platform=linux/amd64` untuk memaksa gambar `linux/amd64` berbasis. Ini untuk memastikan bahwa artefak gambar akhir akan cocok untuk Lambda, yang secara default menggunakan arsitektur x86-64. Jika Anda perlu mengubah arsitektur Lambda target, pastikan untuk mengubah kode Dockerfiles dan AWS CDK. Untuk informasi selengkapnya, lihat posting blog [Memigrasi fungsi AWS Lambda ke prosesor AWS Graviton2 berbasis ARM](https://aws.amazon.com/blogs/compute/migrating-aws-lambda-functions-to-arm-based-aws-graviton2-processors/).
+ Proses penghapusan tumpukan tidak akan membersihkan CloudWatch Log (grup log dan log) yang dihasilkan oleh tumpukan. Anda harus membersihkan log secara manual melalui konsol AWS Management CloudWatch Console Amazon atau melalui API.

Pola ini diatur sebagai contoh. Untuk penggunaan produksi, evaluasi pengaturan berikut dan buat perubahan berdasarkan kebutuhan bisnis Anda:
+ Bucket [AWS Simple Storage Service (Amazon S3](https://aws.amazon.com/s3/)) dalam contoh ini tidak mengaktifkan versi untuk kesederhanaan. Evaluasi dan perbarui pengaturan sesuai kebutuhan.
+ Contoh ini menyiapkan titik akhir [Amazon API Gateway](https://aws.amazon.com/api-gateway/) REST API tanpa autentikasi, otorisasi, atau pembatasan untuk kesederhanaan. Untuk penggunaan produksi, kami merekomendasikan mengintegrasikan sistem dengan infrastruktur keamanan bisnis. Evaluasi pengaturan ini dan tambahkan pengaturan keamanan yang diperlukan sesuai kebutuhan.
+ Untuk contoh infrastruktur penyewa ini, [Amazon Simple Notification Service (Amazon SNS) dan Amazon](https://aws.amazon.com/sns/) [Simple Queue Service (Amazon SQS) hanya memiliki pengaturan minimum](https://aws.amazon.com/sqs/). [AWS Key Management Service (AWS KMS)](https://aws.amazon.com/kms/) [untuk setiap penyewa terbuka untuk layanan [Amazon](https://aws.amazon.com/cloudwatch/) dan Amazon CloudWatch SNS di akun untuk dikonsumsi berdasarkan kebijakan kunci AWS KMS.](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-key-management.html#compatibility-with-aws-services) Pengaturan hanya contoh placeholder. Sesuaikan pengaturan sesuai kebutuhan berdasarkan kasus penggunaan bisnis Anda.
+ Seluruh penyiapan, yang mencakup tetapi tidak terbatas pada titik akhir API dan penyediaan dan penghapusan penyewa backend dengan menggunakan AWS CloudFormation, hanya mencakup kasus happy path dasar. Evaluasi dan perbarui pengaturan dengan logika coba lagi yang diperlukan, logika penanganan kesalahan tambahan, dan logika keamanan berdasarkan kebutuhan bisnis Anda.
+ Kode contoh diuji dengan up-to-date [cdk-nag](https://github.com/cdklabs/cdk-nag) untuk memeriksa kebijakan pada saat penulisan ini. Kebijakan baru mungkin ditegakkan di masa depan. Kebijakan baru ini mungkin mengharuskan Anda untuk memodifikasi tumpukan secara manual berdasarkan rekomendasi sebelum tumpukan dapat diterapkan. Tinjau kode yang ada untuk memastikan bahwa itu selaras dengan kebutuhan bisnis Anda.
+ Kode bergantung pada AWS CDK untuk menghasilkan akhiran acak alih-alih mengandalkan nama fisik statis yang ditetapkan untuk sebagian besar sumber daya yang dibuat. Pengaturan ini untuk memastikan bahwa sumber daya ini unik dan tidak bertentangan dengan tumpukan lain. Untuk informasi selengkapnya, lihat [dokumentasi AWS CDK](https://docs.aws.amazon.com/cdk/v2/guide/resources.html#resources_physical_names). Sesuaikan ini berdasarkan kebutuhan bisnis Anda.
+ [Contoh kode ini mengemas artefak .NET Lambda ke dalam gambar berbasis Docker dan berjalan dengan runtime image Container yang disediakan Lambda.](https://docs.aws.amazon.com/lambda/latest/dg/csharp-image.html) Runtime image container memiliki keunggulan untuk mekanisme transfer dan penyimpanan standar (pendaftar kontainer) dan lingkungan pengujian lokal yang lebih akurat (melalui image container). Anda dapat mengganti proyek untuk menggunakan [runtime .NET yang disediakan Lambda](https://docs.aws.amazon.com/lambda/latest/dg/lambda-csharp.html) untuk mengurangi waktu pembuatan gambar Docker, tetapi Anda kemudian perlu mengatur mekanisme transfer dan penyimpanan dan memastikan bahwa pengaturan lokal cocok dengan pengaturan Lambda. Sesuaikan kode agar selaras dengan persyaratan bisnis pengguna.

**Versi produk**
+ AWS CDK versi 2.45.0 atau yang lebih baru
+ Studio Visual 2022

## Arsitektur
<a name="tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk-architecture"></a>

**Tumpukan teknologi**
+ Amazon API Gateway
+ AWS CloudFormation
+ Amazon CloudWatch
+ Amazon DynamoDB
+ AWS Identity and Access Management (IAM)
+ AWS KMS
+ AWS Lambda
+ Amazon S3
+ Amazon SNS
+ Amazon SQS

**Arsitektur **

Diagram berikut menunjukkan aliran pembuatan tumpukan penyewa. *Untuk informasi selengkapnya tentang tumpukan teknologi pesawat kontrol dan penyewa, lihat bagian Informasi tambahan.*

![\[Alur kerja untuk membuat penyewa dan menyediakan infrastruktur dasar untuk penyewa di AWS.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/5baef800-fe39-4eb8-b11d-2c23eb3175fc/images/0b579484-b87c-4acb-8c60-8c33c18370e3.png)


**Aliran pembuatan tumpukan penyewa**

1. Pengguna mengirimkan permintaan POST API dengan payload penyewa baru (nama penyewa, deskripsi penyewa) di JSON ke REST API yang dihosting oleh Amazon API Gateway. API Gateway memproses permintaan dan meneruskannya ke fungsi backend Lambda Tenant On-boarding. Dalam contoh ini, tidak ada otorisasi atau otentikasi. Dalam pengaturan produksi, API ini harus diintegrasikan dengan sistem keamanan infrastruktur SaaS.

1. Fungsi Tenant On-boarding memverifikasi permintaan. Kemudian mencoba untuk menyimpan catatan penyewa, yang mencakup nama penyewa, pengidentifikasi unik universal penyewa (UUID) yang dihasilkan, dan deskripsi penyewa, ke dalam tabel On-boarding Amazon DynamoDB Tenant. 

1. Setelah DynamoDB menyimpan catatan, aliran DynamoDB memulai fungsi Infrastruktur Penyewa Lambda hilir.

1. Fungsi Lambda Infrastruktur Penyewa bertindak berdasarkan aliran DynamoDB yang diterima. Jika aliran untuk acara INSERT, fungsi menggunakan NewImage bagian aliran (catatan pembaruan terbaru, bidang Nama Penyewa) untuk memanggil CloudFormation untuk membuat infrastruktur penyewa baru menggunakan templat yang disimpan di bucket S3. CloudFormation Template membutuhkan parameter Nama Penyewa. 

1. AWS CloudFormation membuat infrastruktur penyewa berdasarkan CloudFormation template dan parameter input.

1. Setiap pengaturan infrastruktur penyewa memiliki CloudWatch alarm, alarm penagihan, dan acara alarm.

1. Acara alarm menjadi pesan ke topik SNS, yang dienkripsi oleh kunci AWS KMS penyewa.

1. Topik SNS meneruskan pesan alarm yang diterima ke antrean SQS, yang dienkripsi oleh AWS KMS penyewa untuk kunci enkripsi.

Sistem lain dapat diintegrasikan dengan Amazon SQS untuk melakukan tindakan berdasarkan pesan dalam antrian. Dalam contoh ini, untuk menjaga kode generik, pesan masuk tetap dalam antrian dan memerlukan penghapusan manual.

**Aliran penghapusan tumpukan penyewa**

1. Pengguna mengirimkan permintaan DELETE API dengan payload penyewa baru (nama penyewa, deskripsi penyewa) di JSON ke REST API yang dihosting oleh Amazon API Gateway, yang akan memproses permintaan dan meneruskan ke fungsi Tenant On-boarding. Dalam contoh ini, tidak ada otorisasi atau otentikasi. Dalam pengaturan produksi, API ini akan diintegrasikan dengan sistem keamanan infrastruktur SaaS.

1. Fungsi Tenant On-Boarding akan memverifikasi permintaan dan kemudian mencoba menghapus catatan penyewa (nama penyewa) dari meja On-Boarding Penyewa. 

1. Setelah DynamoDB berhasil menghapus catatan (catatan ada di tabel dan dihapus), aliran DynamoDB memulai fungsi Infrastruktur Penyewa Lambda hilir.

1. Fungsi Lambda Infrastruktur Penyewa bertindak berdasarkan catatan aliran DynamoDB yang diterima. Jika aliran untuk acara REMOVE, fungsi menggunakan OldImage bagian rekaman (informasi rekaman dan bidang Nama Penyewa, sebelum perubahan terbaru, yang dihapus) untuk memulai penghapusan tumpukan yang ada berdasarkan informasi rekaman tersebut.

1. AWS CloudFormation menghapus tumpukan penyewa target sesuai dengan input.

## Alat
<a name="tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk-tools"></a>

**Layanan AWS**
+ [Amazon API Gateway](https://docs.aws.amazon.com/apigateway/latest/developerguide/welcome.html) membantu Anda membuat, menerbitkan, memelihara, memantau, dan mengamankan REST, HTTP, dan WebSocket APIs dalam skala apa pun.
+ [AWS Cloud Development Kit (AWS CDK)](https://docs.aws.amazon.com/cdk/v2/guide/home.html) adalah kerangka kerja pengembangan perangkat lunak yang membantu Anda menentukan dan menyediakan infrastruktur AWS Cloud dalam kode.
+ [AWS CDK Toolkit adalah kit](https://docs.aws.amazon.com/cdk/v2/guide/cli.html) pengembangan cloud baris perintah yang membantu Anda berinteraksi dengan aplikasi AWS Cloud Development Kit (AWS CDK).
+ [AWS Command Line Interface (AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)) adalah alat sumber terbuka yang membantu Anda berinteraksi dengan layanan AWS melalui perintah di shell baris perintah Anda.
+ [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html) membantu Anda menyiapkan sumber daya AWS, menyediakannya dengan cepat dan konsisten, serta mengelolanya sepanjang siklus hidupnya di seluruh akun dan Wilayah AWS.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) adalah layanan database NoSQL yang dikelola sepenuhnya yang menyediakan kinerja yang cepat, dapat diprediksi, dan terukur.
+ [AWS Identity and Access Management (IAM)](https://docs.aws.amazon.com/IAM/latest/UserGuide/introduction.html) membantu Anda mengelola akses ke sumber daya AWS dengan aman dengan mengontrol siapa yang diautentikasi dan diberi wewenang untuk menggunakannya.
+ [AWS Key Management Service (AWS KMS)](https://docs.aws.amazon.com/kms/latest/developerguide/overview.html) membantu Anda membuat dan mengontrol kunci kriptografi untuk membantu melindungi data Anda.
+ [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.
+ [Amazon Simple Notification Service (Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/welcome.html)) membantu Anda mengoordinasikan dan mengelola pertukaran pesan antara penayang dan klien, termasuk server web dan alamat email.
+ [Amazon Simple Queue Service (Amazon Simple Queue Service](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/welcome.html)) menyediakan antrian host yang aman, tahan lama, dan tersedia yang membantu Anda mengintegrasikan dan memisahkan sistem dan komponen perangkat lunak terdistribusi.
+ [AWS Toolkit for Visual](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html) Studio adalah plugin untuk lingkungan pengembangan terintegrasi Visual Studio (IDE). Toolkit for Visual Studio mendukung pengembangan, debugging, dan penerapan aplikasi.NET yang menggunakan layanan AWS.

**Alat-alat lainnya**
+ [Visual Studio](https://docs.microsoft.com/en-us/visualstudio/ide/whats-new-visual-studio-2022?view=vs-2022) adalah IDE yang mencakup kompiler, alat penyelesaian kode, desainer grafis, dan fitur lain yang mendukung pengembangan perangkat lunak.

**Kode**

Kode untuk pola ini ada di [orientasi Tenant di SaaS Architecture for Silo Model APG Example](https://github.com/aws-samples/tenant-onboarding-in-saas-architecture-for-silo-model-apg-example) repository.

## Epik
<a name="tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk-epics"></a>

### Mengatur AWS CDK
<a name="set-up-aws-cdk"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Verifikasi instalasi Node.js. | Untuk memverifikasi bahwa Node.js diinstal pada mesin lokal Anda, jalankan perintah berikut.<pre>node --version</pre> | Administrator AWS, AWS DevOps | 
| Instal AWS CDK Toolkit. | Untuk menginstal AWS CDK Toolkit di komputer lokal Anda, jalankan perintah berikut.<pre>npm install -g aws-cdk</pre>Jika npm tidak diinstal, Anda dapat menginstalnya dari [situs Node.js](https://nodejs.org/en/download/package-manager/). | Administrator AWS, AWS DevOps | 
| Verifikasi versi AWS CDK Toolkit. | Untuk memverifikasi bahwa versi AWS CDK Toolkit diinstal dengan benar di mesin Anda, jalankan perintah berikut.  <pre>cdk --version</pre> | Administrator AWS, AWS DevOps | 

### Tinjau kode untuk pesawat kontrol orientasi penyewa
<a name="review-the-code-for-the-tenant-onboarding-control-plane"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Kloning repositori. | Kloning [repositori](https://github.com/aws-samples/tenant-onboarding-in-saas-architecture-for-silo-model-apg-example), dan arahkan ke folder. `\tenant-onboarding-in-saas-architecture-for-silo-model-apg-example`Di Visual Studio 2022, buka `\src\TenantOnboardingInfra.sln` solusinya. Buka `TenantOnboardingInfraStack.cs` file dan tinjau kodenya.Sumber daya berikut dibuat sebagai bagian dari tumpukan ini:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk.html) | Administrator AWS, AWS DevOps | 
| Tinjau CloudFormation template. | Di `\tenant-onboarding-in-saas-architecture-for-silo-model-apg-example\template` folder, buka`infra.yaml`, dan tinjau CloudFormation template. Template ini akan terhidrasi dengan nama penyewa diambil dari tabel DynamoDB orientasi penyewa.Template menyediakan infrastruktur khusus penyewa. Dalam contoh ini, ia menyediakan kunci AWS KMS, Amazon SNS, Amazon SQS, dan alarm. CloudWatch  | Pengembang aplikasi, AWS DevOps | 
| Tinjau fungsi orientasi penyewa. | Buka`Function.cs`, dan tinjau kode untuk fungsi orientasi penyewa, yang dibuat dengan templat Visual Studio AWS Lambda Project (.NET Core- C\$1) dengan cetak biru .NET 6 (Gambar Kontainer).Buka`Dockerfile`, dan tinjau kodenya. `Dockerfile`Ini adalah file teks yang terdiri dari instruksi untuk membangun gambar wadah Lambda.Perhatikan bahwa NuGet paket-paket berikut ditambahkan sebagai dependensi ke proyek: `TenantOnboardingFunction`[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk.html) | Pengembang aplikasi, AWS DevOps | 
| Tinjau InfraProvisioning fungsi Penyewa. | Navigasi ke `\tenant-onboarding-in-saas-architecture-for-silo-model-apg-example\src\InfraProvisioningFunction`.Buka`Function.cs`, dan tinjau kode untuk fungsi penyediaan infrastruktur penyewa, yang dibuat dengan templat Visual Studio AWS Lambda Project (.NET Core- C\$1) dengan cetak biru .NET 6 (Gambar Kontainer).Buka`Dockerfile`, dan tinjau kodenya. Perhatikan bahwa NuGet paket-paket berikut ditambahkan sebagai dependensi ke proyek: `InfraProvisioningFunction`[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk.html) | Pengembang aplikasi, AWS DevOps | 

### Menerapkan sumber daya AWS
<a name="deploy-the-aws-resources"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Bangun solusinya. | Untuk membangun solusi, lakukan langkah-langkah berikut:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk.html)Pastikan Anda memperbarui `Amazon.CDK.Lib NuGet` paket ke versi terbaru dalam `\tenant-onboarding-in-saas-architecture-for-silo-model-apg-example\src\TenantOnboardingInfra` proyek sebelum Anda membuat solusi. | Pengembang aplikasi | 
| Bootstrap lingkungan AWS CDK. | Buka prompt perintah Windows dan arahkan ke folder root aplikasi AWS CDK tempat `cdk.json` file tersedia (`\tenant-onboarding-in-saas-architecture-for-silo-model-apg-example`). Jalankan perintah berikut untuk bootstrap.<pre>cdk bootstrap </pre>Jika Anda telah membuat profil AWS untuk kredensialnya, gunakan perintah dengan profil Anda.<pre>cdk bootstrap --profile <profile name><br />  </pre> | Administrator AWS, AWS DevOps | 
| Buat daftar tumpukan AWS CDK. | Untuk daftar semua tumpukan yang akan dibuat sebagai bagian dari proyek ini, jalankan perintah berikut.<pre>cdk ls<br />cdk ls --profile <profile name></pre>Jika Anda telah membuat profil AWS untuk kredensialnya, gunakan perintah dengan profil Anda.<pre>cdk ls --profile <profile name></pre> | Administrator AWS, AWS DevOps | 
| Tinjau sumber daya AWS mana yang akan dibuat. | Untuk meninjau semua sumber daya AWS yang akan dibuat sebagai bagian dari proyek ini, jalankan perintah berikut.<pre>cdk diff</pre>Jika Anda telah membuat profil AWS untuk kredensialnya, gunakan perintah dengan profil Anda.<pre>cdk diff --profile <profile name></pre> | Administrator AWS, AWS DevOps | 
| Terapkan semua sumber daya AWS dengan menggunakan AWS CDK. | Untuk menerapkan semua sumber daya AWS, jalankan perintah berikut.<pre>cdk deploy --all --require-approval never</pre>Jika Anda telah membuat profil AWS untuk kredensialnya, gunakan perintah dengan profil Anda.<pre>cdk deploy --all --require-approval never --profile <profile name></pre>Setelah penerapan selesai, salin URL API dari bagian output di prompt perintah, yang ditampilkan dalam contoh berikut.<pre>Outputs:<br />TenantOnboardingInfraStack.TenantOnboardingAPIEndpoint42E526D7 = https://j2qmp8ds21i1i.execute-api.us-west-2.amazonaws.com/prod/</pre> | Administrator AWS, AWS DevOps | 

### Verifikasi fungsionalitas
<a name="verify-the-functionality"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buat penyewa baru. | Untuk membuat penyewa baru, kirim permintaan curl berikut.<pre>curl -X POST <TenantOnboardingAPIEndpoint* from CDK Output>tenant -d '{"Name":"Tenant123", "Description":"Stack for Tenant123"}'</pre>Ubah pemegang tempat `<TenantOnboardingAPIEndpoint* from CDK Output>` ke nilai aktual dari AWS CDK, seperti yang ditunjukkan pada contoh berikut.<pre>curl -X POST https://j2qmp8ds21i1i.execute-api.us-west-2.amazonaws.com/prod/tenant -d '{"Name":"Tenant123", "Description":"test12"}'</pre>Contoh berikut menunjukkan output.<pre>{"message": "A new tenant added - 5/4/2022 7:11:30 AM"}</pre> | Pengembang aplikasi, administrator AWS, AWS DevOps | 
| Verifikasi detail penyewa yang baru dibuat di DynamoDB. | Untuk memverifikasi detail penyewa yang baru dibuat di DynamoDB, lakukan langkah-langkah berikut.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk.html) | Pengembang aplikasi, administrator AWS, AWS DevOps | 
| Verifikasi pembuatan tumpukan untuk penyewa baru. | Verifikasi bahwa tumpukan baru berhasil dibuat dan disediakan dengan infrastruktur untuk penyewa yang baru dibuat sesuai dengan template. CloudFormation [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk.html) | Pengembang aplikasi, administrator AWS, AWS DevOps | 
| Hapus tumpukan penyewa. | Untuk menghapus tumpukan penyewa, kirim permintaan curl berikut.<pre>curl -X DELETE <TenantOnboardingAPIEndpoint* from CDK Output>tenant/<Tenant Name from previous step></pre>Ubah pemegang tempat `<TenantOnboardingAPIEndpoint* from CDK Output>` ke nilai aktual dari AWS CDK, dan ubah `<Tenant Name from previous step>` ke nilai aktual dari langkah pembuatan penyewa sebelumnya, seperti yang ditunjukkan pada contoh berikut.<pre>curl -X DELETE https://j2qmp8ds21i1i.execute-api.us-west-2.amazonaws.com/prod/tenant/Tenant123</pre>Contoh berikut menunjukkan output.<pre>{"message": "Tenant destroyed - 5/4/2022 7:14:48 AM"}</pre> | Pengembang aplikasi, AWS DevOps, administrator AWS | 
| Verifikasi penghapusan tumpukan untuk penyewa yang ada. | Untuk memverifikasi bahwa tumpukan penyewa yang ada telah dihapus, lakukan langkah-langkah berikut:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk.html) | Pengembang aplikasi, administrator AWS, AWS DevOps | 

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


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Hancurkan lingkungan. | Sebelum tumpukan dibersihkan, pastikan hal berikut:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk.html)Setelah pengujian selesai, AWS CDK dapat digunakan untuk menghancurkan semua tumpukan dan sumber daya terkait dengan menjalankan perintah berikut.<pre>cdk destroy --all;</pre>Jika Anda membuat profil AWS untuk kredensialnya, gunakan profil tersebut.Konfirmasikan prompt penghapusan tumpukan untuk menghapus tumpukan. | Administrator AWS, AWS DevOps | 
| Bersihkan CloudWatch Log Amazon. | Proses penghapusan tumpukan tidak akan membersihkan CloudWatch Log (grup log dan log) yang dihasilkan oleh tumpukan. Bersihkan CloudWatch sumber daya secara manual dengan menggunakan CloudWatch konsol atau API. | Pengembang aplikasi, AWS DevOps, administrator AWS | 

## Sumber daya terkait
<a name="tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk-resources"></a>
+ [Workshop AWS CDK .NET](https://cdkworkshop.com/40-dotnet.html)
+ [Bekerja dengan AWS CDK di C \$1](https://docs.aws.amazon.com/cdk/v2/guide/work-with-cdk-csharp.html)
+ [CDK .NET Referensi](https://docs.aws.amazon.com/cdk/api/v2/dotnet/api/index.html)

## Informasi tambahan
<a name="tenant-onboarding-in-saas-architecture-for-the-silo-model-using-c-and-aws-cdk-additional"></a>

**Tumpukan teknologi bidang kontrol**

Kode CDK yang ditulis dalam.NET digunakan untuk menyediakan infrastruktur bidang kontrol, yang terdiri dari sumber daya berikut:

1. **API Gateway**

   Berfungsi sebagai titik masuk REST API untuk tumpukan bidang kontrol.

1. **Fungsi Lambda on-boarding penyewa**

   Fungsi Lambda ini diprakarsai oleh API Gateway menggunakan metode m.

   Permintaan API metode POST menghasilkan (`tenant name`,`tenant description`) yang dimasukkan ke dalam tabel DynamoDB`Tenant Onboarding`.

   Dalam contoh kode ini, nama penyewa juga digunakan sebagai bagian dari nama tumpukan penyewa dan nama sumber daya dalam tumpukan itu. Ini untuk membuat sumber daya ini lebih mudah diidentifikasi. Nama penyewa ini harus unik di seluruh pengaturan untuk menghindari konflik atau kesalahan. Pengaturan validasi masukan terperinci dijelaskan dalam dokumentasi [peran IAM](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles.html) dan bagian *Batasan*.

   Proses persistensi ke tabel DynamoDB akan berhasil hanya jika nama penyewa tidak digunakan dalam catatan lain dalam tabel.

   Nama penyewa dalam hal ini adalah kunci partisi untuk tabel ini, karena hanya kunci partisi yang dapat digunakan sebagai ekspresi `PutItem` kondisi.

   Jika nama penyewa tidak pernah direkam sebelumnya, catatan akan berhasil disimpan ke dalam tabel.

   Namun, jika nama penyewa sudah digunakan oleh catatan yang ada dalam tabel, operasi akan gagal dan memulai pengecualian DynamoDB. `ConditionalCheckFailedException` Pengecualian akan digunakan untuk mengembalikan pesan kegagalan (`HTTP BadRequest`) yang menunjukkan bahwa nama penyewa sudah ada.

   Permintaan `DELETE` metode API akan menghapus catatan untuk nama penyewa tertentu dari tabel `Tenant Onboardin` g.

   Penghapusan catatan DynamoDB dalam contoh ini akan berhasil bahkan jika catatan tidak ada.

   Jika catatan target ada dan dihapus, itu akan membuat catatan aliran DynamoDB. Jika tidak, tidak ada catatan hilir yang akan dibuat.

1. **Penyewa on-boarding DynamoDB, dengan Amazon DynamoDB Streams diaktifkan**

   Ini mencatat informasi metadata penyewa, dan penyimpanan atau penghapusan catatan apa pun akan mengirim aliran hilir ke fungsi Lambda. `Tenant Infrastructure` 

1. **Infrastruktur penyewa fungsi Lambda**

   Fungsi Lambda ini diprakarsai oleh catatan aliran DynamoDB dari langkah sebelumnya. Jika record adalah untuk suatu `INSERT` peristiwa, ia memanggil AWS CloudFormation untuk membuat infrastruktur penyewa baru dengan CloudFormation template yang disimpan dalam bucket S3. Jika catatan untuk`REMOVE`, itu memulai penghapusan tumpukan yang ada berdasarkan bidang rekaman aliran. `Tenant Name`

1. **Ember S3**

   Ini untuk menyimpan CloudFormation template.

1. **Peran IAM untuk setiap fungsi Lambda dan peran layanan untuk CloudFormation**

   Setiap fungsi Lambda memiliki peran IAM yang unik dengan izin [hak istimewa paling sedikit untuk mencapai tugasnya](https://docs.aws.amazon.com/IAM/latest/UserGuide/best-practices.html#grant-least-privilege). Misalnya, fungsi `Tenant On-boarding` Lambda memiliki read/write akses ke DynamoDB, dan fungsi `Tenant Infrastructure` Lambda hanya dapat membaca aliran DynamoDB.

   Peran CloudFormation layanan khusus dibuat untuk penyediaan tumpukan penyewa. Peran layanan ini berisi izin tambahan untuk penyediaan CloudFormation tumpukan (misalnya, kunci AWS KMS). Ini membagi peran antara Lambda CloudFormation dan untuk menghindari semua izin pada satu peran (peran Lambda Infrastruktur).

   Izin yang memungkinkan tindakan kuat (seperti membuat dan menghapus CloudFormation tumpukan) dikunci dan hanya diizinkan pada sumber daya yang dimulai. `tenantcluster-` Pengecualiannya adalah AWS KMS, karena konvensi penamaan sumber dayanya. Nama penyewa yang dicerna dari API akan ditambahkan `tenantcluster-` bersama dengan pemeriksaan validasi lainnya (alfanumerik dengan tanda hubung saja, dan dibatasi hingga kurang dari 30 karakter agar sesuai dengan sebagian besar penamaan sumber daya AWS). Ini memastikan bahwa nama penyewa tidak akan secara tidak sengaja mengakibatkan gangguan tumpukan infrastruktur inti atau sumber daya.

**Tumpukan teknologi penyewa**

 CloudFormation Template disimpan dalam ember S3. [Template menyediakan kunci AWS KMS khusus penyewa, CloudWatch alarm, topik SNS, antrian SQS, dan kebijakan SQS.](https://docs.aws.amazon.com/AWSSimpleQueueService/latest/SQSDeveloperGuide/sqs-using-identity-based-policies.html)

Kunci AWS KMS digunakan untuk enkripsi data oleh Amazon SNS dan Amazon SQS untuk pesan mereka. Praktik keamanan untuk [AwsSolutions- SNS2 dan AwsSolutions - SQS2](https://github.com/cdklabs/cdk-nag/blob/main/RULES.md) merekomendasikan agar Anda mengatur Amazon SNS dan Amazon SQS dengan enkripsi. Namun, CloudWatch alarm tidak berfungsi dengan Amazon SNS saat menggunakan kunci yang dikelola AWS, jadi Anda harus menggunakan kunci yang dikelola pelanggan dalam kasus ini. Untuk informasi selengkapnya, lihat [Pusat Pengetahuan AWS](https://aws.amazon.com/premiumsupport/knowledge-center/cloudwatch-receive-sns-for-alarm-trigger/).

Kebijakan SQS digunakan pada antrean Amazon SQS untuk memungkinkan topik SNS yang dibuat mengirimkan pesan ke antrian. Tanpa kebijakan SQS, akses akan ditolak. Untuk informasi selengkapnya, lihat [dokumentasi Amazon SNS](https://docs.aws.amazon.com/sns/latest/dg/subscribe-sqs-queue-to-sns-topic.html#SendMessageToSQS.sqs.permissions).

# Menguraikan monolit menjadi layanan mikro dengan menggunakan CQRS dan sumber acara
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing"></a>

*Rodolfo Jr. Cerrada, Dmitry Gulin, dan Tabby Ward, Amazon Web* Services

## Ringkasan
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-summary"></a>

Pola ini menggabungkan dua pola, menggunakan pola pemisahan tanggung jawab permintaan perintah (CQRS) dan pola sumber peristiwa. Pola CQRS memisahkan tanggung jawab model perintah dan kueri. Pola sumber acara memanfaatkan komunikasi berbasis peristiwa asinkron untuk meningkatkan pengalaman pengguna secara keseluruhan.

Anda dapat menggunakan layanan CQRS dan Amazon Web Services (AWS) untuk memelihara dan menskalakan setiap model data secara independen sambil memfaktorkan ulang aplikasi monolit Anda ke dalam arsitektur layanan mikro. Kemudian Anda dapat menggunakan pola sumber acara untuk menyinkronkan data dari database perintah ke database kueri.

Pola ini menggunakan kode contoh yang menyertakan file solusi (\$1.sln) yang dapat Anda buka menggunakan versi terbaru Visual Studio. Contoh ini berisi kode Reward API untuk menampilkan cara kerja CQRS dan sumber acara di aplikasi AWS tanpa server dan tradisional atau lokal.

Untuk mempelajari lebih lanjut tentang CQRS dan sumber acara, lihat bagian [Informasi tambahan](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional).

## Prasyarat dan batasan
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-prereqs"></a>

**Prasyarat**
+ Akun AWS yang aktif
+ Amazon CloudWatch
+ Tabel Amazon DynamoDB
+ Amazon DynamoDB Streams
+ Kunci akses AWS Identity and Access Management (IAM) dan kunci rahasia; untuk informasi selengkapnya, lihat video di bagian *Sumber daya terkait*
+ AWS Lambda
+ Keakraban dengan Visual Studio
+ *Keakraban dengan AWS Toolkit for Visual Studio; untuk informasi selengkapnya, lihat video demo *AWS Toolkit for Visual Studio di bagian* Sumber daya terkait*

**Versi produk**
+ [Edisi Komunitas Visual Studio 2019](https://visualstudio.microsoft.com/downloads/).
+ [AWS Toolkit for Visual Studio 2019](https://aws.amazon.com/visualstudio/).
+ .NET Inti 3.1. Komponen ini merupakan opsi dalam instalasi Visual Studio. Untuk menyertakan .NET Core selama instalasi, pilih **NET Core cross-platform development**.

**Batasan**
+ Kode contoh untuk aplikasi lokal tradisional (ASP.NET Core Web API dan objek akses data) tidak disertakan dengan database. Namun, ia datang dengan objek `CustomerData` dalam memori, yang bertindak sebagai database tiruan. Kode yang diberikan cukup bagi Anda untuk menguji polanya.

## Arsitektur
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-architecture"></a>

**Tumpukan teknologi sumber**
+ Proyek API Web Inti ASP.NET
+ Server Web IIS
+ Objek akses data
+ Model CRUD

**Arsitektur sumber**

Dalam arsitektur sumber, model CRUD berisi antarmuka perintah dan kueri dalam satu aplikasi. Misalnya kode, lihat `CustomerDAO.cs` (terlampir).

![\[Koneksi antara aplikasi, antarmuka layanan, model CRUD pelanggan, dan database.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/1cd3a84c-12c7-4306-99aa-23f2c53d3cd3.png)


**Tumpukan teknologi target**
+ Amazon DynamoDB
+ Amazon DynamoDB Streams
+ AWS Lambda
+ (Opsional) Amazon API Gateway
+ (Opsional) Layanan Pemberitahuan Sederhana Amazon (Amazon SNS)

**Arsitektur target**

Dalam arsitektur target, antarmuka perintah dan kueri dipisahkan. Arsitektur yang ditunjukkan dalam diagram berikut dapat diperluas dengan API Gateway dan Amazon SNS. Untuk informasi selengkapnya, lihat bagian [Informasi tambahan](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional).

![\[Aplikasi yang terhubung dengan layanan mikro Customer Command dan Customer Query tanpa server.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/1c665697-e3ac-4ef4-98d0-86c2cbf164c1.png)


1. Fungsi Command Lambda melakukan operasi tulis, seperti membuat, memperbarui, atau menghapus, pada database.

1. Fungsi Query Lambda melakukan operasi baca, seperti dapatkan atau pilih, pada database.

1. Fungsi Lambda ini memproses aliran DynamoDB dari database Command dan memperbarui database Query untuk perubahan.

## Alat
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-tools"></a>

**Alat**
+ [Amazon DynamoDB - Amazon](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) DynamoDB adalah layanan database NoSQL yang dikelola sepenuhnya yang memberikan kinerja yang cepat dan dapat diprediksi dengan skalabilitas yang mulus.
+ [Amazon DynamoDB Streams - DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Streams.html) menangkap urutan urutan waktu modifikasi tingkat item dalam tabel DynamoDB apa pun. Kemudian menyimpan informasi ini dalam log hingga 24 jam. Enkripsi saat istirahat mengenkripsi data dalam DynamoDB streams.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) — AWS Lambda adalah layanan komputasi yang mendukung menjalankan kode tanpa menyediakan atau mengelola server. Lambda menjalankan kode Anda hanya saat diperlukan dan menskalakan secara otomatis, dari beberapa permintaan per hari hingga ribuan per detik. Anda hanya membayar untuk waktu komputasi yang Anda gunakan—tidak ada biaya saat kode Anda tidak berjalan.
+ [AWS Management Console](https://docs.aws.amazon.com/awsconsolehelpdocs/latest/gsg/learn-whats-new.html) — AWS Management Console adalah aplikasi web yang terdiri dari koleksi luas konsol layanan untuk mengelola layanan AWS.
+ [Visual Studio 2019 Community Edition](https://visualstudio.microsoft.com/downloads/) — Visual Studio 2019 adalah lingkungan pengembangan terintegrasi (IDE). Edisi Komunitas gratis untuk kontributor sumber terbuka. Dalam pola ini, Anda akan menggunakan Visual Studio 2019 Community Edition untuk membuka, mengkompilasi, dan menjalankan kode contoh. Untuk melihat saja, Anda dapat menggunakan editor teks atau [Kode Visual Studio](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/welcome.html).
+ [AWS Toolkit for Visual](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html) Studio — AWS Toolkit for Visual Studio adalah plugin untuk Visual Studio IDE. AWS Toolkit for Visual Studio memudahkan Anda mengembangkan, men-debug, dan menerapkan aplikasi.NET yang menggunakan layanan AWS.

**Kode**

Kode contoh terlampir. Untuk petunjuk tentang penerapan kode contoh, lihat bagian *Epik*.

## Epik
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-epics"></a>

### Buka dan bangun solusinya
<a name="open-and-build-the-solution"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Buka solusinya. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Pengembang aplikasi | 
| Bangun solusinya. | Buka menu konteks (klik kanan) untuk solusinya, lalu pilih **Build Solution**. Ini akan membangun dan mengkompilasi semua proyek dalam solusi. Itu harus berhasil dikompilasi.Visual Studio Solution Explorer harus menunjukkan struktur direktori.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Pengembang aplikasi | 

### Membangun tabel DynamoDB
<a name="build-the-dynamodb-tables"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Berikan kredensyal. | Jika Anda belum memiliki kunci akses, lihat video di bagian *Sumber daya terkait*.[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Pengembang aplikasi, Insinyur data, DBA | 
| Bangun proyek. | **Untuk membangun proyek, buka menu konteks (klik kanan) untuk proyek **AWS.apg.cqrses.Build**, lalu pilih Build.** | Pengembang aplikasi, Insinyur data, DBA | 
| Bangun dan isi tabel. | ****Untuk membuat tabel dan mengisinya dengan data benih, buka menu konteks (klik kanan) untuk proyek **AWS.apg.cqrses.Build**, lalu pilih Debug, Start New Instance.**** | Pengembang aplikasi, Insinyur data, DBA | 
| Verifikasi konstruksi tabel dan data. | Untuk memverifikasi, navigasikan ke **AWS Explorer**, dan perluas **Amazon DynamoDB**. Ini harus menampilkan tabel. Buka setiap tabel untuk menampilkan contoh data. | Pengembang aplikasi, Insinyur data, DBA | 

### Jalankan tes lokal
<a name="run-local-tests"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Membangun proyek CQRS. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Pengembang aplikasi, Insinyur uji | 
| Bangun proyek sumber acara. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Pengembang aplikasi, Insinyur uji | 
| Jalankan tes. | Untuk menjalankan semua pengujian, pilih **View**, **Test Explorer**, lalu pilih **Run All Tests In View**. Semua tes harus lulus, yang ditunjukkan oleh ikon tanda centang hijau.  | Pengembang aplikasi, Insinyur uji | 

### Publikasikan fungsi Lambda CQRS ke AWS
<a name="publish-the-cqrs-lambda-functions-to-aws"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Publikasikan fungsi Lambda pertama. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Pengembang aplikasi, DevOps insinyur | 
| Verifikasi fungsi upload. | (Opsional) Anda dapat memverifikasi bahwa fungsi berhasil dimuat dengan menavigasi ke AWS Explorer dan memperluas AWS **Lambda**. Untuk membuka jendela pengujian, pilih fungsi Lambda (klik dua kali). | Pengembang aplikasi, DevOps insinyur | 
| Uji fungsi Lambda. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html)Semua proyek Lambda CQRS ditemukan di bawah folder dan solusi. `CQRS AWS Serverless\CQRS\Command Microservice` ` CQRS AWS Serverless\CQRS\Command Microservice` Untuk direktori solusi dan proyek, lihat **Direktori kode sumber** di bagian [Informasi tambahan](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional). | Pengembang aplikasi, DevOps insinyur | 
| Publikasikan fungsi yang tersisa. | Ulangi langkah sebelumnya untuk proyek-proyek berikut:[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Pengembang aplikasi, DevOps insinyur | 

### Siapkan fungsi Lambda sebagai pendengar acara
<a name="set-up-the-lambda-function-as-an-event-listener"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Publikasikan penangan acara Pelanggan dan Hadiah Lambda. | Untuk mempublikasikan setiap event handler, ikuti langkah-langkah dalam epik sebelumnya.Proyek-proyek berada di bawah folder `CQRS AWS Serverless\Event Source\Reward Event` solusi `CQRS AWS Serverless\Event Source\Customer Event` dan. Untuk informasi selengkapnya, lihat *Direktori kode sumber* di bagian [Informasi tambahan](#decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional). | Pengembang aplikasi | 
| Lampirkan pendengar acara Lambda sumber acara. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html)Setelah pendengar berhasil dilampirkan ke tabel DynamoDB, itu akan ditampilkan di halaman desainer Lambda. | Pengembang aplikasi | 
| Publikasikan dan lampirkan fungsi EventSourceReward Lambda. | **Untuk mempublikasikan dan melampirkan fungsi `EventSourceReward` Lambda, ulangi langkah-langkah dalam dua cerita sebelumnya, pilih **cqrses-reward-cmd**dari daftar dropdown tabel DynamoDB.** | Pengembang aplikasi | 

### Menguji dan memvalidasi aliran DynamoDB dan pemicu Lambda
<a name="test-and-validate-the-dynamodb-streams-and-lambda-trigger"></a>


| Tugas | Deskripsi | Keterampilan yang dibutuhkan | 
| --- | --- | --- | 
| Uji aliran dan pemicu Lambda. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Pengembang aplikasi | 
| Validasi, menggunakan tabel query reward DynamoddB. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Pengembang aplikasi | 
| Validasi, menggunakan CloudWatch Log. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing.html) | Pengembang aplikasi | 
| Validasi EventSourceCustomer pemicunya. | Untuk memvalidasi `EventSourceCustomer` pemicu, ulangi langkah-langkah dalam epik ini, menggunakan tabel dan CloudWatch log pelanggan masing-masing `EventSourceCustomer` pemicu. | Pengembang aplikasi | 

## Sumber daya terkait
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-resources"></a>

**Referensi**
+ [Unduhan Edisi Komunitas Visual Studio 2019](https://visualstudio.microsoft.com/downloads/)
+ [Unduhan AWS Toolkit for Visual Studio](https://aws.amazon.com/visualstudio/)
+ [Panduan Pengguna AWS Toolkit for Visual Studio](https://docs.aws.amazon.com/toolkit-for-visual-studio/latest/user-guide/welcome.html)
+ [Tanpa server di AWS](https://aws.amazon.com/serverless/)
+ [Kasus Penggunaan DynamoDB dan Pola Desain](https://aws.amazon.com/blogs/database/dynamodb-streams-use-cases-and-design-patterns/)
+ [Martin Fowler CQRS](https://martinfowler.com/bliki/CQRS.html)
+ [Sumber Acara Martin Fowler](https://martinfowler.com/eaaDev/EventSourcing.html)

**Video**
+ [AWS Toolkit untuk demo AWS Toolkit for Visual Studio](https://www.youtube.com/watch?v=B190tcu1ERk)
+ [Bagaimana cara membuat ID kunci akses untuk pengguna IAM baru?](https://www.youtube.com/watch?v=665RYobRJDY)

## Informasi tambahan
<a name="decompose-monoliths-into-microservices-by-using-cqrs-and-event-sourcing-additional"></a>

**CQRS dan sumber acara**

*CQRS*

Pola CQRS memisahkan model operasi konseptual tunggal, seperti objek akses data tunggal CRUD (create, read, update, delete) model, ke dalam model operasi perintah dan query. Model perintah mengacu pada operasi apa pun, seperti membuat, memperbarui, atau menghapus, yang mengubah status. Model query mengacu pada setiap operasi yang mengembalikan nilai.

![\[Arsitektur dengan antarmuka layanan, model CRUD, dan database.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/3f64756d-681e-4f0e-8034-746263d857b2.png)


1. Model CRUD Pelanggan mencakup antarmuka berikut:
   + `Create Customer()`
   + `UpdateCustomer()`
   + `DeleteCustomer()`
   + `AddPoints()`
   + `RedeemPoints()`
   + `GetVIPCustomers()`
   + `GetCustomerList()`
   + `GetCustomerPoints()`

Karena kebutuhan Anda menjadi lebih kompleks, Anda dapat beralih dari pendekatan model tunggal ini. CQRS menggunakan model perintah dan model kueri untuk memisahkan tanggung jawab untuk menulis dan membaca data. Dengan begitu, data dapat dikelola dan dikelola secara independen. Dengan pemisahan tanggung jawab yang jelas, peningkatan untuk setiap model tidak memengaruhi yang lain. Pemisahan ini meningkatkan pemeliharaan dan kinerja, dan mengurangi kompleksitas aplikasi saat tumbuh.

![\[Aplikasi dipisahkan menjadi model perintah dan kueri, berbagi database tunggal.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/12db023c-eb81-4c27-bbb9-b085b13176ae.png)


 

1. Antarmuka dalam model Customer Command:
   + `Create Customer()`
   + `UpdateCustomer()`
   + `DeleteCustomer()`
   + `AddPoints()`
   + `RedeemPoints()`

1. Antarmuka dalam model Customer Query:
   + `GetVIPCustomers()`
   + `GetCustomerList()`
   + `GetCustomerPoints()`
   + `GetMonthlyStatement()`

Misalnya kode, lihat *Direktori kode sumber*.

Pola CQRS kemudian memisahkan database. Decoupling ini mengarah pada independensi total setiap layanan, yang merupakan bahan utama arsitektur microservice.

![\[Database terpisah untuk model perintah dan kueri.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/016dbfa8-3bd8-42ee-afa1-38a98986c7d5.png)


 Dengan menggunakan CQRS di AWS Cloud, Anda dapat mengoptimalkan setiap layanan lebih lanjut. Misalnya, Anda dapat mengatur pengaturan komputasi yang berbeda atau memilih antara layanan mikro tanpa server atau berbasis kontainer. Anda dapat mengganti caching lokal dengan Amazon. ElastiCache Jika memiliki publish/subscribe pesan lokal, Anda dapat menggantinya dengan Amazon Simple Notification Service (Amazon SNS). Selain itu, Anda dapat memanfaatkan pay-as-you-go harga dan beragam layanan AWS yang Anda bayar hanya untuk apa yang Anda gunakan.

CQRS mencakup manfaat berikut:
+ Penskalaan independen — Setiap model dapat memiliki strategi penskalaan yang disesuaikan untuk memenuhi persyaratan dan permintaan layanan. Mirip dengan aplikasi berkinerja tinggi, memisahkan baca dan tulis memungkinkan model untuk menskalakan secara independen untuk memenuhi setiap permintaan. Anda juga dapat menambah atau mengurangi sumber daya komputasi untuk mengatasi permintaan skalabilitas dari satu model tanpa mempengaruhi yang lain.
+ Pemeliharaan independen - Pemisahan model kueri dan perintah meningkatkan pemeliharaan model. Anda dapat membuat perubahan kode dan penyempurnaan ke satu model tanpa mempengaruhi yang lain.
+ Keamanan — Lebih mudah menerapkan izin dan kebijakan untuk memisahkan model untuk dibaca dan ditulis.
+ Bacaan yang dioptimalkan - Anda dapat menentukan skema yang dioptimalkan untuk kueri. Misalnya, Anda dapat menentukan skema untuk data agregat dan skema terpisah untuk tabel fakta.
+ Integrasi — CQRS cocok dengan model pemrograman berbasis acara.
+ Kompleksitas terkelola - Pemisahan menjadi model kueri dan perintah cocok untuk domain yang kompleks.

Saat menggunakan CQRS, ingatlah peringatan berikut:
+ Pola CQRS hanya berlaku untuk bagian tertentu dari aplikasi dan bukan seluruh aplikasi. Jika diterapkan pada domain yang tidak sesuai dengan pola, dapat mengurangi produktivitas, meningkatkan risiko, dan menimbulkan kompleksitas.
+ Pola ini bekerja paling baik untuk model yang sering digunakan yang memiliki operasi baca dan tulis ketidakseimbangan.
+ Untuk aplikasi read-heavy, seperti laporan besar yang membutuhkan waktu untuk diproses, CQRS memberi Anda opsi untuk memilih database yang tepat dan membuat skema untuk menyimpan data agregat Anda. Ini meningkatkan waktu respons membaca dan melihat laporan dengan memproses data laporan hanya satu kali dan membuangnya dalam tabel agregat.
+ Untuk aplikasi berat tulis, Anda dapat mengonfigurasi database untuk operasi penulisan dan memungkinkan layanan mikro perintah untuk menskalakan secara independen ketika permintaan untuk menulis meningkat. Sebagai contoh, lihat `AWS.APG.CQRSES.CommandRedeemRewardLambda` dan `AWS.APG.CQRSES.CommandAddRewardLambda` layanan mikro.

*Sumber acara*

Langkah selanjutnya adalah menggunakan sumber acara untuk menyinkronkan database kueri saat perintah dijalankan. Misalnya, pertimbangkan peristiwa-peristiwa berikut:
+ Poin hadiah pelanggan ditambahkan yang mengharuskan total atau poin hadiah gabungan pelanggan dalam database kueri diperbarui.
+ Nama belakang pelanggan diperbarui dalam database perintah, yang mengharuskan informasi pelanggan pengganti dalam database kueri diperbarui.

Dalam model CRUD tradisional, Anda memastikan konsistensi data dengan mengunci data hingga menyelesaikan transaksi. Dalam sumber acara, data disinkronkan melalui penerbitan serangkaian acara yang akan dikonsumsi oleh pelanggan untuk memperbarui data masing-masing.

Pola sumber peristiwa memastikan dan mencatat serangkaian tindakan lengkap yang diambil pada data dan menerbitkannya melalui serangkaian peristiwa. Peristiwa ini mewakili serangkaian perubahan pada data yang harus diproses oleh pelanggan acara tersebut agar catatan mereka diperbarui. Peristiwa ini dikonsumsi oleh pelanggan, menyinkronkan data pada database pelanggan. Dalam hal ini, itulah database query.

Diagram berikut menunjukkan sumber peristiwa yang digunakan dengan CQRS di AWS.

![\[Arsitektur layanan mikro untuk CQRS dan pola sumber acara menggunakan layanan tanpa server AWS.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/cc9bc84a-60b4-4459-9a5c-2334c69dbb4e.png)


1. Fungsi Command Lambda melakukan operasi tulis, seperti membuat, memperbarui, atau menghapus, pada database.

1. Fungsi Query Lambda melakukan operasi baca, seperti dapatkan atau pilih, pada database.

1. Fungsi Lambda ini memproses aliran DynamoDB dari database Command dan memperbarui database Query untuk perubahan. Anda juga dapat menggunakan fungsi ini juga untuk mempublikasikan pesan ke Amazon SNS sehingga pelanggannya dapat memproses data.

1. (Opsional) Pelanggan acara Lambda memproses pesan yang diterbitkan oleh Amazon SNS dan memperbarui database Kueri.

1. (Opsional) Amazon SNS mengirimkan pemberitahuan email tentang operasi tulis.

Di AWS, database kueri dapat disinkronkan oleh DynamoDB Streams. DynamoDB menangkap urutan modifikasi tingkat item yang diurutkan waktu dalam tabel DynamoBDB dalam waktu nyaris nyata dan tahan lama menyimpan informasi dalam waktu 24 jam.

Mengaktifkan DynamoDB Streams memungkinkan database untuk mempublikasikan urutan peristiwa yang memungkinkan pola sumber peristiwa. Pola sumber acara menambahkan pelanggan acara. Aplikasi pelanggan acara mengkonsumsi acara dan memprosesnya tergantung pada tanggung jawab pelanggan. Pada diagram sebelumnya, pelanggan acara mendorong perubahan ke database Query DynamoDB untuk menjaga data tetap disinkronkan. Penggunaan Amazon SNS, broker pesan, dan aplikasi pelanggan acara membuat arsitektur dipisahkan.

Sumber acara mencakup manfaat berikut:
+ Konsistensi untuk data transaksional
+ Jejak audit yang andal dan riwayat tindakan, yang dapat digunakan untuk memantau tindakan yang diambil dalam data
+ Memungkinkan aplikasi terdistribusi seperti microservices untuk menyinkronkan data mereka di seluruh lingkungan
+ Publikasi acara yang andal setiap kali negara berubah
+ Rekonstruksi atau pemutaran ulang keadaan masa lalu
+ Entitas yang digabungkan secara longgar yang bertukar peristiwa untuk migrasi dari aplikasi monolitik ke layanan mikro
+ Pengurangan konflik yang disebabkan oleh pembaruan bersamaan; sumber acara menghindari persyaratan untuk memperbarui objek secara langsung di penyimpanan data
+ Fleksibilitas dan ekstensibilitas dari memisahkan tugas dan acara
+ Pembaruan sistem eksternal
+ Manajemen beberapa tugas dalam satu acara

Saat menggunakan sumber acara, ingatlah peringatan berikut:
+ Karena ada beberapa keterlambatan dalam memperbarui data antara database pelanggan sumber, satu-satunya cara untuk membatalkan perubahan adalah dengan menambahkan acara kompensasi ke toko acara.
+ Menerapkan sumber acara memiliki kurva pembelajaran karena gaya pemrogramannya yang berbeda.

**Data uji**

Gunakan data pengujian berikut untuk menguji fungsi Lambda setelah penerapan berhasil.

**CommandCreate Pelanggan**

```
{  "Id":1501,  "Firstname":"John",  "Lastname":"Done",  "CompanyName":"AnyCompany",  "Address": "USA",  "VIP":true }
```

**CommandUpdate Pelanggan**

```
{  "Id":1501,  "Firstname":"John",  "Lastname":"Doe",  "CompanyName":"Example Corp.",  "Address": "Seattle, USA",  "VIP":true }
```

**CommandDelete Pelanggan**

Masukkan ID pelanggan sebagai data permintaan. Misalnya, jika ID pelanggan adalah 151, masukkan 151 sebagai data permintaan.

```
151
```

**QueryCustomerList**

Ini kosong. Ketika dipanggil, itu akan mengembalikan semua pelanggan.

**CommandAddReward**

Ini akan menambah 40 poin untuk pelanggan dengan ID 1 (Richard).

```
{
  "Id":10101,
  "CustomerId":1,
  "Points":40
}
```

**CommandRedeemReward**

Ini akan mengurangi 15 poin untuk pelanggan dengan ID 1 (Richard).

```
{
  "Id":10110,
  "CustomerId":1,
  "Points":15
}
```

**QueryReward**

Masukkan ID pelanggan. Misalnya, masukkan 1 untuk Richard, 2 untuk Arnav, dan 3 untuk Shirley.

```
2 
```

**Direktori kode sumber**

Gunakan tabel berikut sebagai panduan untuk struktur direktori solusi Visual Studio. 

*Direktori solusi Contoh Kode Lokal CQRS*

![\[Direktori solusi dengan layanan Command dan Query diperluas.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/4811c2c0-643b-410f-bb87-0b86ec5e194c.png)


**Model CRUD pelanggan**

Contoh Kode Lokal CQRS\$1 Model CRUD\$1 Proyek AWS.APG.CQRSES.DAL

**Versi CQRS dari model CRUD Pelanggan**
+ Perintah pelanggan: `CQRS On-Premises Code Sample\CQRS Model\Command Microservice\AWS.APG.CQRSES.Command` proyek
+ Permintaan pelanggan: `CQRS On-Premises Code Sample\CQRS Model\Query Microservice\AWS.APG.CQRSES.Query` proyek

**Layanan mikro Command dan Query**

Layanan mikro Command berada di bawah folder `CQRS On-Premises Code Sample\CQRS Model\Command Microservice` solusi:
+ `AWS.APG.CQRSES.CommandMicroservice`Proyek API ASP.NET Core bertindak sebagai titik masuk di mana konsumen berinteraksi dengan layanan.
+ `AWS.APG.CQRSES.Command`.NET Core adalah objek yang menampung objek dan antarmuka yang berhubungan dengan perintah.

Layanan mikro kueri ada di bawah folder `CQRS On-Premises Code Sample\CQRS Model\Query Microservice` solusi:
+ `AWS.APG.CQRSES.QueryMicroservice`Proyek API ASP.NET Core bertindak sebagai titik masuk di mana konsumen berinteraksi dengan layanan.
+ `AWS.APG.CQRSES.Query`.NET Core adalah objek yang menampung objek dan antarmuka terkait kueri.

*Direktori solusi kode tanpa server CQRS AWS*

![\[Direktori solusi yang menampilkan layanan mikro dan sumber acara diperluas.\]](http://docs.aws.amazon.com/id_id/prescriptive-guidance/latest/patterns/images/pattern-img/9f1bc700-def4-4201-bb2d-f1fa27404f15/images/23f8655c-95ad-422c-b20a-e29dc145e995.png)


 

Kode ini adalah versi AWS dari kode lokal yang menggunakan layanan tanpa server AWS.

Dalam C\$1 .NET Core, setiap fungsi Lambda diwakili oleh satu proyek .NET Core. Dalam contoh kode pola ini, ada proyek terpisah untuk setiap antarmuka dalam model perintah dan kueri.

**CQRS menggunakan layanan AWS**

Anda dapat menemukan direktori solusi root untuk CQRS menggunakan layanan tanpa server AWS ada di folder. `CQRS AWS Serverless\CQRS` Contohnya mencakup dua model: Pelanggan dan Hadiah.

Perintah Lambda berfungsi untuk Pelanggan dan Hadiah berada di bawah `CQRS\Command Microservice\Customer` dan `CQRS\Command Microservice\Reward` folder. Mereka berisi proyek Lambda berikut:
+ Perintah pelanggan:`CommandCreateLambda`,`CommandDeleteLambda`, dan `CommandUpdateLambda`
+ Perintah hadiah: `CommandAddRewardLambda` dan `CommandRedeemRewardLambda`

Fungsi Lambda kueri untuk Pelanggan dan Hadiah ditemukan di bawah folder `CQRS\Query Microservice\Customer` dan`CQRS\QueryMicroservice\Reward`. Mereka berisi proyek `QueryCustomerListLambda` dan `QueryRewardLambda` Lambda.

**Proyek uji CQRS**

Proyek pengujian ada di bawah `CQRS\Tests` folder. Proyek ini berisi skrip pengujian untuk mengotomatiskan pengujian fungsi Lambda CQRS.

**Sumber acara menggunakan layanan AWS**

Penangan peristiwa Lambda berikut diprakarsai oleh aliran DynamoDB Pelanggan dan Reward untuk memproses dan menyinkronkan data dalam tabel kueri.
+ Fungsi `EventSourceCustomer` Lambda dipetakan ke aliran `cqrses-customer-cmd` DynamoDB tabel Pelanggan ().
+ Fungsi `EventSourceReward` Lambda dipetakan ke aliran `cqrses-reward-cmd` DynamoDB tabel Reward ().

## Lampiran
<a name="attachments-9f1bc700-def4-4201-bb2d-f1fa27404f15"></a>

[Untuk mengakses konten tambahan yang terkait dengan dokumen ini, unzip file berikut: attachment.zip](samples/p-attach/9f1bc700-def4-4201-bb2d-f1fa27404f15/attachments/attachment.zip)

# Lebih banyak pola
<a name="modernization-more-patterns-pattern-list"></a>

**Topics**
+ [Akses aplikasi kontainer secara pribadi di Amazon EKS menggunakan AWS PrivateLink dan Network Load Balancer](access-container-applications-privately-on-amazon-eks-using-aws-privatelink-and-a-network-load-balancer.md)
+ [Otomatis menambahkan atau memperbarui entri registri Windows menggunakan AWS Systems Manager](automate-adding-or-updating-windows-registry-entries-using-aws-systems-manager.md)
+ [Otomatiskan failover dan failback lintas wilayah dengan menggunakan DR Orchestrator Framework](automate-cross-region-failover-and-failback-by-using-dr-orchestrator-framework.md)
+ [Secara otomatis membangun dan menyebarkan aplikasi Java ke Amazon EKS menggunakan pipeline CI/CD](automatically-build-and-deploy-a-java-application-to-amazon-eks-using-a-ci-cd-pipeline.md)
+ [Membuat CI/CD pipeline dan kluster Amazon ECS secara otomatis untuk layanan mikro menggunakan AWS CDK](automatically-build-ci-cd-pipelines-and-amazon-ecs-clusters-for-microservices-using-aws-cdk.md)
+ [Cadangkan dan arsipkan data mainframe ke Amazon S3 menggunakan BMC AMI Cloud Data](back-up-and-archive-mainframe-data-to-amazon-s3-using-bmc-ami-cloud-data.md)
+ [Bangun PAC Server Perusahaan Fokus Mikro dengan Amazon EC2 Auto Scaling dan Systems Manager](build-a-micro-focus-enterprise-server-pac-with-amazon-ec2-auto-scaling-and-systems-manager.md)
+ [Membangun mesh data perusahaan dengan Amazon DataZone, AWS CDK, dan AWS CloudFormation](build-enterprise-data-mesh-amazon-data-zone.md)
+ [Kontainerisasi beban kerja mainframe yang telah dimodernisasi oleh Blu Age](containerize-mainframe-workloads-that-have-been-modernized-by-blu-age.md)
+ [Mengonversi dan membongkar data EBCDIC ke ASCII di AWS dengan menggunakan Python](convert-and-unpack-ebcdic-data-to-ascii-on-aws-by-using-python.md)
+ [Mengkonversi file data mainframe dengan layout rekaman yang kompleks menggunakan Micro Focus](convert-mainframe-data-files-with-complex-record-layouts-using-micro-focus.md)
+ [Buat portal untuk frontend mikro dengan menggunakan AWS Amplify, Angular, dan Federasi Modul](create-amplify-micro-frontend-portal.md)
+ [Menyebarkan wadah dengan menggunakan Elastic Beanstalk](deploy-containers-by-using-elastic-beanstalk.md)
+ [Meniru Oracle DR dengan menggunakan database global Aurora yang kompatibel dengan PostgreSQL](emulate-oracle-dr-by-using-a-postgresql-compatible-aurora-global-database.md)
+ [Hasilkan wawasan data dengan menggunakan AWS Mainframe Modernization dan Amazon Q di Quick Sight](generate-data-insights-by-using-aws-mainframe-modernization-and-amazon-q-in-quicksight.md)
+ [Hasilkan wawasan z/OS data Db2 dengan menggunakan dan AWS Mainframe Modernization Amazon Q di Quick Sight](generate-db2-zos-data-insights-aws-mainframe-modernization-amazon-q-in-quicksight.md)
+ [Identifikasi gambar kontainer duplikat secara otomatis saat bermigrasi ke repositori Amazon ECR](identify-duplicate-container-images-automatically-when-migrating-to-ecr-repository.md)
+ [Menerapkan diagnostik Kubernetes yang didukung AI dan pemecahan masalah dengan integrasi K8SGPT dan Amazon Bedrock](implement-ai-powered-kubernetes-diagnostics-and-troubleshooting-with-k8sgpt-and-amazon-bedrock-integration.md)
+ [Menerapkan otentikasi berbasis Microsoft Entra ID dalam aplikasi mainframe modern AWS Blu Age](implement-entra-id-authentication-in-aws-blu-age-modernized-mainframe-application.md)
+ [Menerapkan versi API berbasis jalur dengan menggunakan domain kustom di Amazon API Gateway](implement-path-based-api-versioning-by-using-custom-domains.md)
+ [Bermigrasi secara bertahap dari Amazon RDS for Oracle ke Amazon RDS untuk PostgreSQL menggunakan Oracle SQL Developer dan AWS SCT](incrementally-migrate-from-amazon-rds-for-oracle-to-amazon-rds-for-postgresql-using-oracle-sql-developer-and-aws-sct.md)
+ [Integrasikan Stonebranch Universal Controller dengan AWS Mainframe Modernisasi](integrate-stonebranch-universal-controller-with-aws-mainframe-modernization.md)
+ [Kelola produk AWS Service Catalog di beberapa akun AWS dan Wilayah AWS](manage-aws-service-catalog-products-in-multiple-aws-accounts-and-aws-regions.md)
+ [Migrasi akun AWS anggota dari ke AWS Organizations AWS Control Tower](migrate-an-aws-member-account-from-aws-organizations-to-aws-control-tower.md)
+ [Memigrasi dan mereplikasi file VSAM ke Amazon RDS atau Amazon MSK menggunakan Connect from Excently](migrate-and-replicate-vsam-files-to-amazon-rds-or-amazon-msk-using-connect-from-precisely.md)
+ [Bermigrasi dari SAP ASE ke Amazon RDS for SQL Server menggunakan AWS DMS](migrate-from-sap-ase-to-amazon-rds-for-sql-server-using-aws-dms.md)
+ [Migrasikan tabel eksternal Oracle ke Amazon Aurora PostgreSQL yang kompatibel](migrate-oracle-external-tables-to-amazon-aurora-postgresql-compatible.md)
+ [Modernisasi aplikasi CardDemo mainframe dengan menggunakan AWS Transform](modernize-carddemo-mainframe-app.md)
+ [Memodernisasi dan menyebarkan aplikasi mainframe menggunakan dan Terraform AWS Transform](modernize-mainframe-app-transform-terraform.md)
+ [Modernisasi beban kerja pencetakan batch mainframe dengan menggunakan Rocket Enterprise Server dan LRS AWS VPSX/LFI](modernize-mainframe-batch-printing-workloads-on-aws-by-using-rocket-enterprise-server-and-lrs-vpsx-mfi.md)
+ [Modernisasi beban kerja pencetakan online mainframe di AWS dengan menggunakan Micro Focus Enterprise Server dan LRS VPSX/MFI](modernize-mainframe-online-printing-workloads-on-aws-by-using-micro-focus-enterprise-server-and-lrs-vpsx-mfi.md)
+ [Modernisasi manajemen output mainframe AWS dengan menggunakan Rocket Enterprise Server dan LRS X PageCenter](modernize-mainframe-output-management-on-aws-by-using-rocket-enterprise-server-and-lrs-pagecenterx.md)
+ [Pindahkan file mainframe langsung ke Amazon S3 menggunakan Transfer Family](move-mainframe-files-directly-to-amazon-s3-using-transfer-family.md)
+ [Optimalkan penerapan tanpa server multi-akun dengan menggunakan alur kerja dan Tindakan AWS CDK GitHub](optimize-multi-account-serverless-deployments.md)
+ [Optimalkan kinerja aplikasi modern AWS Blu Age Anda](optimize-performance-aws-blu-age-modernized-application.md)
+ [Mengotomatiskan blue/green penyebaran database global Amazon Aurora dengan menggunakan prinsip IAc](p-automate-blue-green-deployments-aurora-global-databases-iac.md)
+ [Replikasi database mainframe ke AWS dengan menggunakan Exactly Connect](replicate-mainframe-databases-to-aws-by-using-precisely-connect.md)
+ [Jalankan tugas Amazon ECS di Amazon WorkSpaces dengan Amazon ECS Anywhere](run-amazon-ecs-tasks-on-amazon-workspaces-with-amazon-ecs-anywhere.md)
+ [Kirim data telemetri dari AWS Lambda ke OpenSearch untuk analitik dan visualisasi waktu nyata](send-telemetry-data-from-lambda-to-opensearch-for-analytics-visualization.md)
+ [Mengatur deteksi CloudFormation drift di organisasi multi-wilayah dan multi-akun](set-up-aws-cloudformation-drift-detection-in-a-multi-region-multi-account-organization.md)
+ [Struktur proyek Python dalam arsitektur heksagonal menggunakan AWS Lambda](structure-a-python-project-in-hexagonal-architecture-using-aws-lambda.md)
+ [Uji AWS infrastruktur dengan menggunakan LocalStack dan Tes Terraform](test-aws-infra-localstack-terraform.md)
+ [Ubah Easytrieve ke bahasa modern dengan menggunakan kustom AWS Transform](transform-easytrieve-modern-languages.md)
+ [Tingkatkan cluster SAP Pacemaker dari ke ENSA1 ENSA2](upgrade-sap-pacemaker-clusters-from-ensa1-to-ensa2.md)
+ [Gunakan Amazon Q Developer sebagai asisten pengkodean untuk meningkatkan produktivitas Anda](use-q-developer-as-coding-assistant-to-increase-productivity.md)
+ [Validasi Account Factory untuk kode Terraform (AFT) secara lokal](validate-account-factory-for-terraform-aft-code-locally.md)