

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

# Memulai dengan App Mesh
<a name="getting-started"></a>

**penting**  
Pemberitahuan akhir dukungan: Pada 30 September 2026, AWS akan menghentikan dukungan untuk. AWS App Mesh Setelah 30 September 2026, Anda tidak akan lagi dapat mengakses AWS App Mesh konsol atau AWS App Mesh sumber daya. Untuk informasi lebih lanjut, kunjungi posting blog ini [Migrasi dari AWS App Mesh ke Amazon ECS Service Connect](https://aws.amazon.com/blogs/containers/migrating-from-aws-app-mesh-to-amazon-ecs-service-connect). 

Anda dapat menggunakan App Mesh dengan aplikasi yang Anda terapkan ke Amazon ECS, Kubernetes (yang Anda terapkan ke instans Amazon EC2 Anda sendiri atau berjalan di Amazon EKS), dan Amazon EC2. Untuk memulai App Mesh, pilih salah satu layanan yang Anda miliki aplikasi yang digunakan untuk yang ingin Anda gunakan dengan App Mesh. Anda selalu dapat mengaktifkan aplikasi di layanan lain untuk juga bekerja dengan App Mesh setelah Anda menyelesaikan salah satu panduan Memulai.

**Topics**
+ [Memulai dengan AWS App Mesh dan Amazon ECS](getting-started-ecs.md)
+ [Memulai dengan AWS App Mesh dan Kubernetes](getting-started-kubernetes.md)
+ [Memulai dengan AWS App Mesh dan Amazon EC2](getting-started-ec2.md)
+ [Contoh App Mesh](examples.md)

# Memulai dengan AWS App Mesh dan Amazon ECS
<a name="getting-started-ecs"></a>

**penting**  
Pemberitahuan akhir dukungan: Pada 30 September 2026, AWS akan menghentikan dukungan untuk. AWS App Mesh Setelah 30 September 2026, Anda tidak akan lagi dapat mengakses AWS App Mesh konsol atau AWS App Mesh sumber daya. Untuk informasi lebih lanjut, kunjungi posting blog ini [Migrasi dari AWS App Mesh ke Amazon ECS Service Connect](https://aws.amazon.com/blogs/containers/migrating-from-aws-app-mesh-to-amazon-ecs-service-connect). 

Topik ini membantu Anda menggunakan AWS App Mesh layanan aktual yang berjalan di Amazon ECS. Tutorial ini mencakup fitur dasar dari beberapa jenis sumber daya App Mesh.

## Skenario
<a name="scenario"></a>

Untuk mengilustrasikan cara menggunakan App Mesh, asumsikan bahwa Anda memiliki aplikasi dengan karakteristik sebagai berikut:
+ Terdiri dari dua layanan bernama `serviceA` dan`serviceB`. 
+ Kedua layanan terdaftar ke namespace bernama. `apps.local`
+ `ServiceA`berkomunikasi dengan `serviceB` lebih dari HTTP/2, port 80.
+  Anda telah menerapkan versi 2 `serviceB` dan mendaftarkannya dengan nama `serviceBv2` di `apps.local` namespace.

Anda memiliki persyaratan berikut:
+ Anda ingin mengirim 75 persen lalu lintas dari `serviceA` ke `serviceB` dan 25 persen lalu lintas ke yang `serviceBv2` pertama. Dengan hanya mengirim 25 persen ke`serviceBv2`, Anda dapat memvalidasi bahwa itu bebas bug sebelum Anda mengirim 100 persen lalu lintas dari`serviceA`.
+ Anda ingin dapat dengan mudah menyesuaikan bobot lalu lintas sehingga 100 persen lalu lintas masuk `serviceBv2` setelah terbukti dapat diandalkan. Setelah semua lalu lintas dikirim ke`serviceBv2`, Anda ingin berhenti`serviceB`.
+ Anda tidak ingin harus mengubah kode aplikasi atau pendaftaran penemuan layanan yang ada untuk layanan Anda yang sebenarnya untuk memenuhi persyaratan sebelumnya. 

Untuk memenuhi kebutuhan Anda, Anda memutuskan untuk membuat mesh layanan App Mesh dengan layanan virtual, node virtual, router virtual, dan rute. Setelah menerapkan mesh Anda, Anda memperbarui layanan Anda untuk menggunakan proxy Envoy. Setelah diperbarui, layanan Anda berkomunikasi satu sama lain melalui proxy Utusan daripada langsung satu sama lain.

## Prasyarat
<a name="prerequisites"></a>

**penting**  
Pemberitahuan akhir dukungan: Pada 30 September 2026, AWS akan menghentikan dukungan untuk. AWS App Mesh Setelah 30 September 2026, Anda tidak akan lagi dapat mengakses AWS App Mesh konsol atau AWS App Mesh sumber daya. Untuk informasi lebih lanjut, kunjungi posting blog ini [Migrasi dari AWS App Mesh ke Amazon ECS Service Connect](https://aws.amazon.com/blogs/containers/migrating-from-aws-app-mesh-to-amazon-ecs-service-connect). 
+ Pemahaman yang ada tentang konsep App Mesh. Untuk informasi selengkapnya, lihat [Apa itu AWS App Mesh?](what-is-app-mesh.md).
+ Pemahaman yang ada tentang ECSs konsep Amazon. Untuk informasi selengkapnya, lihat [Apa itu Amazon ECS](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/Welcome.html) di Panduan Pengembang Layanan Kontainer Elastis Amazon.
+ App Mesh mendukung layanan Linux yang terdaftar dengan DNS, AWS Cloud Map, atau keduanya. Untuk menggunakan panduan memulai ini, kami sarankan Anda memiliki tiga layanan yang sudah ada yang terdaftar di DNS. Prosedur dalam topik ini mengasumsikan bahwa layanan yang ada diberi nama`serviceA`,`serviceB`, `serviceBv2` dan bahwa semua layanan dapat ditemukan melalui namespace bernama. `apps.local` 

  Anda dapat membuat mesh layanan dan sumber dayanya bahkan jika layanan tidak ada, tetapi Anda tidak dapat menggunakan mesh sampai Anda telah menerapkan layanan yang sebenarnya. Untuk informasi selengkapnya tentang penemuan layanan di Amazon ECS, lihat [Penemuan Layanan](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/service-discovery.html). Untuk membuat layanan Amazon ECS dengan penemuan layanan, lihat [Tutorial: Membuat Layanan Menggunakan Penemuan Layanan](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service-discovery.html). Jika Anda belum menjalankan layanan, Anda dapat [membuat layanan Amazon ECS dengan penemuan layanan](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/create-service-discovery.html).

## Langkah 1: Buat mesh dan layanan virtual
<a name="create-mesh-and-virtual-service2"></a>

Mesh layanan adalah batas logis untuk lalu lintas jaringan antara layanan yang berada di dalamnya. Untuk informasi selengkapnya, lihat [Jala Layanan](meshes.md). Layanan virtual adalah abstraksi dari layanan yang sebenarnya. Untuk informasi selengkapnya, lihat [Layanan virtual](virtual_services.md). 

Buat sumber daya berikut:
+ Sebuah mesh bernama`apps`, karena semua layanan dalam skenario terdaftar ke `apps.local` namespace.
+ Layanan virtual bernama`serviceb.apps.local`, karena layanan virtual mewakili layanan yang dapat ditemukan dengan nama itu, dan Anda tidak ingin mengubah kode Anda untuk merujuk nama lain. Layanan virtual bernama `servicea.apps.local` ditambahkan pada langkah selanjutnya.

Anda dapat menggunakan Konsol Manajemen AWS atau AWS CLI versi 1.18.116 atau lebih tinggi atau 2.0.38 atau lebih tinggi untuk menyelesaikan langkah-langkah berikut. Jika menggunakan AWS CLI, gunakan `aws --version` perintah untuk memeriksa AWS CLI versi yang Anda instal. [Jika Anda tidak memiliki versi 1.18.116 atau lebih tinggi atau 2.0.38 atau lebih tinggi diinstal, maka Anda harus menginstal atau memperbarui. AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/appmesh/cli-chap-install.html) Pilih tab untuk alat yang ingin Anda gunakan.

------
#### [ Konsol Manajemen AWS ]

1. Buka wizard yang dijalankan pertama kali konsol App Mesh saat memulai [https://console.aws.amazon.com/appmesh/.](https://console.aws.amazon.com/appmesh/get-started)

1. Untuk **nama Mesh**, masukkan**apps**.

1. Untuk **nama layanan Virtual**, masukkan**serviceb.apps.local**.

1. Untuk melanjutkan, pilih **Berikutnya**.

------
#### [ AWS CLI ]

1. Buat mesh dengan `[create-mesh](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-mesh.html)` perintah.

   ```
   aws appmesh create-mesh --mesh-name apps
   ```

1. Buat layanan virtual dengan `[create-virtual-service](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-virtual-service.html)` perintah.

   ```
   aws appmesh create-virtual-service --mesh-name apps --virtual-service-name serviceb.apps.local --spec {}
   ```

------

## Langkah 2: Buat simpul virtual
<a name="create-virtual-node2"></a>

Node virtual bertindak sebagai pointer logis ke layanan yang sebenarnya. Untuk informasi selengkapnya, lihat [Node virtual](virtual_nodes.md). 

Buat node virtual bernama`serviceB`, karena salah satu node virtual mewakili layanan yang sebenarnya bernama`serviceB`. Layanan aktual yang diwakili oleh node virtual dapat ditemukan melalui `DNS` dengan nama host dari. `serviceb.apps.local` Sebagai alternatif, Anda dapat menemukan layanan aktual menggunakan. AWS Cloud Map Node virtual akan mendengarkan lalu lintas menggunakan protokol HTTP/2 pada port 80. Protokol lain juga didukung, seperti halnya pemeriksaan kesehatan. Anda akan membuat node virtual untuk `serviceA` dan `serviceBv2` di langkah selanjutnya.

------
#### [ Konsol Manajemen AWS ]

1. Untuk **nama simpul Virtual**, masukkan**serviceB**. 

1. Untuk **metode Penemuan layanan**, pilih **DNS** dan masukkan **serviceb.apps.local** untuk nama host **DNS**.

1. **Di bawah **konfigurasi Listener**, pilih **http2** untuk **Protokol** dan masukkan **80** untuk Port.**

1. Untuk melanjutkan, pilih **Berikutnya**.

------
#### [ AWS CLI ]

1. Buat file bernama `create-virtual-node-serviceb.json` dengan konten berikut:

   ```
   {
       "meshName": "apps",
       "spec": {
           "listeners": [
               {
                   "portMapping": {
                       "port": 80,
                       "protocol": "http2"
                   }
               }
           ],
           "serviceDiscovery": {
               "dns": {
                   "hostname": "serviceB.apps.local"
               }
           }
       },
       "virtualNodeName": "serviceB"
   }
   ```

1. Buat node virtual dengan [create-virtual-node](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-virtual-node.html)perintah menggunakan file JSON sebagai input.

   ```
   aws appmesh create-virtual-node --cli-input-json file://create-virtual-node-serviceb.json
   ```

------

## Langkah 3: Buat router virtual dan rute
<a name="create-virtual-router-and-route"></a>

Router virtual merutekan lalu lintas untuk satu atau lebih layanan virtual di dalam mesh Anda. Untuk informasi selengkapnya, lihat [Router virtual](virtual_routers.md) dan [Rute](routes.md).

Buat sumber daya berikut:
+ Router virtual bernama`serviceB`, karena layanan `serviceB.apps.local` virtual tidak memulai komunikasi keluar dengan layanan lain. Ingatlah bahwa layanan virtual yang Anda buat sebelumnya adalah abstraksi dari `serviceb.apps.local` layanan Anda yang sebenarnya. Layanan virtual mengirimkan lalu lintas ke router virtual. Router virtual mendengarkan lalu lintas menggunakan protokol HTTP/2 pada port 80. Protokol lain juga didukung. 
+ Sebuah rute bernama`serviceB`. Ini merutekan 100 persen lalu lintasnya ke node `serviceB` virtual. Bobotnya ada di langkah selanjutnya setelah Anda menambahkan simpul `serviceBv2` virtual. Meskipun tidak tercakup dalam panduan ini, Anda dapat menambahkan kriteria filter tambahan untuk rute dan menambahkan kebijakan coba lagi untuk menyebabkan proxy Envoy melakukan beberapa upaya untuk mengirim lalu lintas ke node virtual ketika mengalami masalah komunikasi.

------
#### [ Konsol Manajemen AWS ]

1. Untuk **nama router Virtual,** masukkan**serviceB**.

1. **Di bawah **konfigurasi Listener**, pilih **http2** untuk **Protokol** dan tentukan **80** untuk Port.**

1. Untuk **nama Rute**, masukkan**serviceB**. 

1. Untuk **jenis Rute**, pilih **http2**.

1. Untuk **nama simpul Virtual** di bawah **konfigurasi Target**, pilih `serviceB` dan masukkan **100** untuk **Berat**.

1. Di bawah **konfigurasi Match**, pilih **Metode**.

1. Untuk melanjutkan, pilih **Berikutnya**.

------
#### [ AWS CLI ]

1. Buat router virtual.

   1. Buat file bernama `create-virtual-router.json` dengan konten berikut:

      ```
      {
          "meshName": "apps",
          "spec": {
              "listeners": [
                  {
                      "portMapping": {
                          "port": 80,
                          "protocol": "http2"
                      }
                  }
              ]
          },
          "virtualRouterName": "serviceB"
      }
      ```

   1. Buat router virtual dengan [create-virtual-router](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-virtual-router.html)perintah menggunakan file JSON sebagai input.

      ```
      aws appmesh create-virtual-router --cli-input-json file://create-virtual-router.json
      ```

1. Buat rute.

   1. Buat file bernama `create-route.json` dengan konten berikut:

      ```
      {
          "meshName" : "apps",
          "routeName" : "serviceB",
          "spec" : {
              "httpRoute" : {
                  "action" : {
                      "weightedTargets" : [
                          {
                              "virtualNode" : "serviceB",
                              "weight" : 100
                          }
                      ]
                  },
                  "match" : {
                      "prefix" : "/"
                  }
              }
          },
          "virtualRouterName" : "serviceB"
      }
      ```

   1. Buat rute dengan perintah [create-route](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-route.html) menggunakan file JSON sebagai input.

      ```
      aws appmesh create-route --cli-input-json file://create-route.json
      ```

------

## Langkah 4: Tinjau dan buat
<a name="review-create"></a>

Tinjau pengaturan terhadap instruksi sebelumnya.

------
#### [ Konsol Manajemen AWS ]

Pilih **Edit** jika Anda perlu membuat perubahan di bagian mana pun. Setelah Anda puas dengan pengaturan, pilih **Buat mesh**.

Layar **Status** menunjukkan kepada Anda semua sumber daya mesh yang dibuat. Anda dapat melihat sumber daya yang dibuat di konsol dengan memilih **View mesh**.

------
#### [ AWS CLI ]

Tinjau pengaturan mesh yang Anda buat dengan [perintah describe-mesh](https://docs.aws.amazon.com/cli/latest/reference/appmesh/describe-mesh.html).

```
aws appmesh describe-mesh --mesh-name apps
```

Tinjau pengaturan layanan virtual yang Anda buat dengan [describe-virtual-service](https://docs.aws.amazon.com/cli/latest/reference/appmesh/describe-virtual-service.html)perintah.

```
aws appmesh describe-virtual-service --mesh-name apps --virtual-service-name serviceb.apps.local
```

Tinjau pengaturan node virtual yang Anda buat dengan [describe-virtual-node](https://docs.aws.amazon.com/cli/latest/reference/appmesh/describe-virtual-node.html)perintah.

```
aws appmesh describe-virtual-node --mesh-name apps --virtual-node-name serviceB
```

Tinjau pengaturan router virtual yang Anda buat dengan [describe-virtual-router](https://docs.aws.amazon.com/cli/latest/reference/appmesh/describe-virtual-router.html)perintah.

```
aws appmesh describe-virtual-router --mesh-name apps --virtual-router-name serviceB
```

Tinjau pengaturan rute yang Anda buat dengan [perintah deskripsi-rute](https://docs.aws.amazon.com/cli/latest/reference/appmesh/describe-route.html).

```
aws appmesh describe-route --mesh-name apps \
    --virtual-router-name serviceB  --route-name serviceB
```

------

## Langkah 5: Buat sumber daya tambahan
<a name="create-additional-resources"></a>

Untuk menyelesaikan skenario, Anda perlu:
+ Buat satu node virtual bernama `serviceBv2` dan yang lain bernama`serviceA`. Kedua node virtual mendengarkan permintaan melalui HTTP/2 port 80. Untuk node `serviceA` virtual, konfigurasikan backend dari. `serviceb.apps.local` Semua lalu lintas keluar dari node `serviceA` virtual dikirim ke layanan virtual bernama`serviceb.apps.local`. Meskipun tidak tercakup dalam panduan ini, Anda juga dapat menentukan jalur file untuk menulis log akses untuk node virtual.
+ Buat satu layanan virtual tambahan bernama`servicea.apps.local`, yang mengirimkan semua lalu lintas langsung ke node `serviceA` virtual.
+ Perbarui `serviceB` rute yang Anda buat pada langkah sebelumnya untuk mengirim 75 persen lalu lintasnya ke node `serviceB` virtual dan 25 persen lalu lintasnya ke node `serviceBv2` virtual. Seiring waktu, Anda dapat terus memodifikasi bobot hingga `serviceBv2` menerima 100 persen dari lalu lintas. Setelah semua lalu lintas dikirim`serviceBv2`, Anda dapat mematikan dan menghentikan node `serviceB` virtual dan layanan aktual. Saat Anda mengubah bobot, kode Anda tidak memerlukan modifikasi apa pun, karena nama layanan `serviceb.apps.local` virtual dan aktual tidak berubah. Ingatlah bahwa layanan `serviceb.apps.local` virtual mengirimkan lalu lintas ke router virtual, yang merutekan lalu lintas ke node virtual. Nama penemuan layanan untuk node virtual dapat diubah kapan saja.

------
#### [ Konsol Manajemen AWS ]

1. Di panel navigasi kiri, pilih **Meshes**.

1. Pilih `apps` mesh yang Anda buat pada langkah sebelumnya.

1. Di panel navigasi kiri, pilih **Virtual nodes**.

1. Pilih **Buat simpul virtual**.

1. Untuk **nama simpul Virtual**, masukkan**serviceBv2**, untuk **metode penemuan Layanan**, pilih **DNS**, dan untuk **nama host DNS**, masukkan. **servicebv2.apps.local**

1. **Untuk **konfigurasi Listener**, pilih **http2** untuk **Protokol** dan masukkan **80** untuk Port.**

1. Pilih **Buat simpul virtual**.

1. Pilih **Buat simpul virtual** lagi. Masukkan **serviceA** untuk **nama simpul Virtual**. Untuk **metode Penemuan layanan**, pilih **DNS**, dan untuk **nama host DNS**, masukkan. **servicea.apps.local**

1. Untuk **Masukkan nama layanan virtual** di bawah **Backend baru**, masukkan. **serviceb.apps.local**

1. Di bawah **konfigurasi Listener**, pilih **http2** untuk **Protokol**, masukkan **80** untuk **Port**, dan kemudian pilih **Buat** simpul virtual.

1. Di panel navigasi kiri, pilih **Router virtual** dan kemudian pilih router `serviceB` virtual dari daftar.

1. **Di bawah Rute, pilih rute bernama `ServiceB` yang Anda buat pada langkah sebelumnya, dan pilih **Edit**.**

1. Di bawah **Target**, **nama node Virtual**, ubah nilai **Weight** `serviceB` untuk menjadi**75**.

1. Pilih **Tambah target**, pilih `serviceBv2` dari daftar dropdown, dan atur nilai **Weight** ke. **25**

1. Pilih **Simpan**.

1. Di panel navigasi kiri, pilih **Layanan virtual** dan kemudian pilih **Buat layanan virtual**.

1. Masukkan **servicea.apps.local** **nama layanan Virtual**, pilih **Virtual node** for **Provider**, pilih `serviceA` untuk **Virtual node**, dan kemudian pilih **Create Virtual Service.**

------
#### [ AWS CLI ]

1. Buat node `serviceBv2` virtual.

   1. Buat file bernama `create-virtual-node-servicebv2.json` dengan konten berikut:

      ```
      {
          "meshName": "apps",
          "spec": {
              "listeners": [
                  {
                      "portMapping": {
                          "port": 80,
                          "protocol": "http2"
                      }
                  }
              ],
              "serviceDiscovery": {
                  "dns": {
                      "hostname": "serviceBv2.apps.local"
                  }
              }
          },
          "virtualNodeName": "serviceBv2"
      }
      ```

   1. Buat node virtual.

      ```
      aws appmesh create-virtual-node --cli-input-json file://create-virtual-node-servicebv2.json
      ```

1. Buat node `serviceA` virtual.

   1. Buat file bernama `create-virtual-node-servicea.json` dengan konten berikut:

      ```
      {
         "meshName" : "apps",
         "spec" : {
            "backends" : [
               {
                  "virtualService" : {
                     "virtualServiceName" : "serviceb.apps.local"
                  }
               }
            ],
            "listeners" : [
               {
                  "portMapping" : {
                     "port" : 80,
                     "protocol" : "http2"
                  }
               }
            ],
            "serviceDiscovery" : {
               "dns" : {
                  "hostname" : "servicea.apps.local"
               }
            }
         },
         "virtualNodeName" : "serviceA"
      }
      ```

   1. Buat node virtual.

      ```
      aws appmesh create-virtual-node --cli-input-json file://create-virtual-node-servicea.json
      ```

1. Perbarui layanan `serviceb.apps.local` virtual yang Anda buat pada langkah sebelumnya untuk mengirim lalu lintas ke router `serviceB` virtual. Ketika layanan virtual awalnya dibuat, itu tidak mengirim lalu lintas ke mana pun, karena router `serviceB` virtual belum dibuat.

   1. Buat file bernama `update-virtual-service.json` dengan konten berikut:

      ```
      {
         "meshName" : "apps",
         "spec" : {
            "provider" : {
               "virtualRouter" : {
                  "virtualRouterName" : "serviceB"
               }
            }
         },
         "virtualServiceName" : "serviceb.apps.local"
      }
      ```

   1. Perbarui layanan virtual dengan [update-virtual-service](https://docs.aws.amazon.com/cli/latest/reference/appmesh/update-virtual-service.html)perintah.

      ```
      aws appmesh update-virtual-service --cli-input-json file://update-virtual-service.json
      ```

1. Perbarui `serviceB` rute yang Anda buat di langkah sebelumnya.

   1. Buat file bernama `update-route.json` dengan konten berikut:

      ```
      {
         "meshName" : "apps",
         "routeName" : "serviceB",
         "spec" : {
            "http2Route" : {
               "action" : {
                  "weightedTargets" : [
                     {
                        "virtualNode" : "serviceB",
                        "weight" : 75
                     },
                     {
                        "virtualNode" : "serviceBv2",
                        "weight" : 25
                     }
                  ]
               },
               "match" : {
                  "prefix" : "/"
               }
            }
         },
         "virtualRouterName" : "serviceB"
      }
      ```

   1. Perbarui rute dengan perintah [update-route](https://docs.aws.amazon.com/cli/latest/reference/appmesh/update-route.html).

      ```
      aws appmesh update-route --cli-input-json file://update-route.json
      ```

1. Buat layanan `serviceA` virtual.

   1. Buat file bernama `create-virtual-servicea.json` dengan konten berikut:

      ```
      {
         "meshName" : "apps",
         "spec" : {
            "provider" : {
               "virtualNode" : {
                  "virtualNodeName" : "serviceA"
               }
            }
         },
         "virtualServiceName" : "servicea.apps.local"
      }
      ```

   1. Buat layanan virtual.

      ```
      aws appmesh create-virtual-service --cli-input-json file://create-virtual-servicea.json
      ```

------

**Ringkasan mesh**  
Sebelum Anda membuat mesh layanan, Anda memiliki tiga layanan aktual bernama`servicea.apps.local`,`serviceb.apps.local`, dan`servicebv2.apps.local`. Selain layanan yang sebenarnya, Anda sekarang memiliki mesh layanan yang berisi sumber daya berikut yang mewakili layanan sebenarnya:
+ Dua layanan virtual. Proxy mengirimkan semua lalu lintas dari layanan `servicea.apps.local` virtual ke layanan `serviceb.apps.local` virtual melalui router virtual. 
+ Tiga node virtual bernama`serviceA`,`serviceB`, dan`serviceBv2`. Proxy Envoy menggunakan informasi penemuan layanan yang dikonfigurasi untuk node virtual untuk mencari alamat IP dari layanan yang sebenarnya. 
+ Satu router virtual dengan satu rute yang menginstruksikan proxy Utusan untuk merutekan 75 persen lalu lintas masuk ke node `serviceB` virtual dan 25 persen lalu lintas ke node virtual. `serviceBv2` 

## Langkah 6: Perbarui layanan
<a name="update-services"></a>

Setelah membuat mesh Anda, Anda harus menyelesaikan tugas-tugas berikut:
+ Otorisasi proxy Envoy yang Anda terapkan dengan setiap tugas Amazon ECS untuk membaca konfigurasi satu atau beberapa node virtual. Untuk informasi selengkapnya tentang cara mengotorisasi proxy, lihat [Otorisasi proxy](https://docs.aws.amazon.com/app-mesh/latest/userguide/proxy-authorization.html).
+ Perbarui setiap definisi tugas Amazon ECS yang ada untuk menggunakan proxy Envoy.

**Kredensial**  
Container Envoy memerlukan AWS Identity and Access Management kredensil untuk menandatangani permintaan yang dikirim ke layanan App Mesh. [Untuk tugas Amazon ECS yang diterapkan dengan jenis peluncuran Amazon EC2, kredensialnya dapat berasal dari peran [instans atau dari peran IAM](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/instance_IAM_role.html) tugas.](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html) Tugas Amazon ECS yang diterapkan dengan Fargate di wadah Linux tidak memiliki akses ke server metadata Amazon EC2 yang menyediakan kredenal profil IAM instans. Untuk menyediakan kredensialnya, Anda harus melampirkan peran tugas IAM ke tugas apa pun yang digunakan dengan Fargate pada jenis container Linux. 

*Jika tugas diterapkan dengan jenis peluncuran Amazon EC2 dan akses diblokir ke server metadata Amazon EC2, seperti yang dijelaskan dalam anotasi Penting dalam Peran IAM [untuk Tugas, maka peran IAM](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html) tugas juga harus dilampirkan ke tugas.* Peran yang Anda tetapkan ke instans atau tugas harus memiliki kebijakan IAM yang dilampirkan padanya seperti yang dijelaskan dalam otorisasi [Proxy](https://docs.aws.amazon.com/app-mesh/latest/userguide/proxy-authorization.html).



**Untuk memperbarui definisi tugas Anda menggunakan AWS CLI**  
Anda menggunakan AWS CLI perintah [https://docs.aws.amazon.com/cli/latest/reference/ecs/register-task-definition.html](https://docs.aws.amazon.com/cli/latest/reference/ecs/register-task-definition.html)Amazon ECS. Contoh definisi tugas di bawah ini menunjukkan cara mengonfigurasi App Mesh untuk layanan Anda.

**catatan**  
Mengonfigurasi App Mesh untuk Amazon ECS melalui konsol tidak tersedia.

### Definisi tugas json
<a name="getting-started-ecs-json"></a>

**Konfigurasi proxy**  
Untuk mengonfigurasi layanan Amazon ECS agar menggunakan App Mesh, definisi tugas layanan Anda harus memiliki bagian konfigurasi proxy berikut. Atur konfigurasi proxy `type` ke `APPMESH` dan `containerName` ke`envoy`. Tetapkan nilai properti berikut sesuai.

`IgnoredUID`  
Proxy Envoy tidak merutekan lalu lintas dari proses yang menggunakan ID pengguna ini. Anda dapat memilih ID pengguna apa pun yang Anda inginkan untuk nilai properti ini, tetapi ID ini harus sama dengan `user` ID untuk wadah Utusan dalam definisi tugas Anda. Pencocokan ini memungkinkan Utusan untuk mengabaikan lalu lintasnya sendiri tanpa menggunakan proxy. Contoh kami digunakan `1337` untuk tujuan sejarah.

`ProxyIngressPort`  
Ini adalah port masuk untuk wadah proxy Envoy. Tetapkan nilai ini ke`15000`.

`ProxyEgressPort`  
Ini adalah port keluar untuk wadah proxy Envoy. Tetapkan nilai ini ke`15001`.

`AppPorts`  
Tentukan port masuk yang didengarkan oleh wadah aplikasi Anda. Dalam contoh ini, wadah aplikasi mendengarkan pada port`9080`. Port yang Anda tentukan harus cocok dengan port yang dikonfigurasi pada pendengar simpul virtual.

`EgressIgnoredIPs`  
Utusan tidak mem-proxy lalu lintas ke alamat IP ini. Tetapkan nilai ini ke`169.254.170.2,169.254.169.254`, yang mengabaikan server metadata Amazon EC2 dan titik akhir metadata tugas Amazon ECS. Titik akhir metadata menyediakan peran IAM untuk kredensil tugas. Anda dapat menambahkan alamat tambahan.

`EgressIgnoredPorts`  
Anda dapat menambahkan daftar port yang dipisahkan koma. Utusan tidak mem-proxy lalu lintas ke port ini. Bahkan jika Anda tidak mencantumkan port, port 22 diabaikan.  
Jumlah maksimum port keluar yang dapat diabaikan adalah 15.

```
"proxyConfiguration": {
	"type": "APPMESH",
	"containerName": "envoy",
	"properties": [{
			"name": "IgnoredUID",
			"value": "1337"
		},
		{
			"name": "ProxyIngressPort",
			"value": "15000"
		},
		{
			"name": "ProxyEgressPort",
			"value": "15001"
		},
		{
			"name": "AppPorts",
			"value": "9080"
		},
		{
			"name": "EgressIgnoredIPs",
			"value": "169.254.170.2,169.254.169.254"
		},
		{
			"name": "EgressIgnoredPorts",
			"value": "22"
		}
	]
}
```

**Ketergantungan Utusan wadah aplikasi**  
Wadah aplikasi dalam definisi tugas Anda harus menunggu proxy Utusan untuk bootstrap dan mulai sebelum mereka dapat memulai. Untuk memastikan ini terjadi, Anda menetapkan `dependsOn` bagian di setiap definisi wadah aplikasi untuk menunggu kontainer Utusan melaporkan sebagai. `HEALTHY` Kode berikut menunjukkan contoh definisi wadah aplikasi dengan ketergantungan ini. Semua properti dalam contoh berikut diperlukan. Beberapa nilai properti juga diperlukan, tetapi beberapa di antaranya*replaceable*.

```
{
	"name": "appName",
	"image": "appImage",
	"portMappings": [{
		"containerPort": 9080,
		"hostPort": 9080,
		"protocol": "tcp"
	}],
	"essential": true,
	"dependsOn": [{
		"containerName": "envoy",
		"condition": "HEALTHY"
	}]
}
```

**Definisi wadah utusan**

Definisi tugas Amazon ECS Anda harus berisi gambar wadah App Mesh Envoy.

Semua Wilayah yang [didukung](https://docs.aws.amazon.com/general/latest/gr/appmesh.html) dapat diganti *Region-code* dengan Wilayah apa pun selain`me-south-1`,`ap-east-1`,`ap-southeast-3`,,`eu-south-1`,`il-central-1`, dan`af-south-1`.  
Standar  

```
840364872350.dkr.ecr.region-code.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod
```
Sesuai FIPS  

```
840364872350.dkr.ecr.region-code.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod-fips
```

`me-south-1`  
Standar  

```
772975370895.dkr.ecr.me-south-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod
```

`ap-east-1`  
Standar  

```
856666278305.dkr.ecr.ap-east-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod
```

`ap-southeast-3`  
Standar  

```
909464085924.dkr.ecr.ap-southeast-3.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod
```

`eu-south-1`  
Standar  

```
422531588944.dkr.ecr.eu-south-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod
```

`il-central-1`  
Standar  

```
564877687649.dkr.ecr.il-central-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod
```

`af-south-1`  
Standar  

```
924023996002.dkr.ecr.af-south-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod
```

`Public repository`  
Standar  

```
public.ecr.aws/appmesh/aws-appmesh-envoy:v1.34.13.0-prod
```
Sesuai FIPS  

```
public.ecr.aws/appmesh/aws-appmesh-envoy:v1.34.13.0-prod-fips
```

**penting**  
Hanya versi v1.9.0.0-prod atau yang lebih baru yang didukung untuk digunakan dengan App Mesh.

Anda harus menggunakan image container App Mesh Envoy hingga tim project Envoy menggabungkan perubahan yang mendukung App Mesh. Untuk detail tambahan, lihat [masalah GitHub peta jalan](https://github.com/aws/aws-app-mesh-roadmap/issues/10).

Semua properti dalam contoh berikut diperlukan. Beberapa nilai properti juga diperlukan, tetapi beberapa di antaranya*replaceable*.

**catatan**  
Definisi wadah Utusan harus ditandai sebagai. `essential`
Kami merekomendasikan mengalokasikan unit `512` CPU dan setidaknya `64` MiB memori ke wadah Envoy. Di Fargate, yang terendah yang dapat Anda atur adalah memori `1024` MiB.
Nama node virtual untuk layanan Amazon ECS harus disetel ke nilai `APPMESH_RESOURCE_ARN` properti. Properti ini memerlukan versi `1.15.0` atau yang lebih baru dari gambar Utusan. Untuk informasi selengkapnya, lihat [Gambar utusan](envoy.md).
Nilai untuk `user` pengaturan harus sesuai dengan `IgnoredUID` nilai dari konfigurasi proxy definisi tugas. Dalam contoh ini, kami menggunakan `1337`. 
Pemeriksaan kesehatan yang ditunjukkan di sini menunggu wadah Utusan untuk melakukan bootstrap dengan benar sebelum melaporkan ke Amazon ECS bahwa wadah Utusan sehat dan siap untuk wadah aplikasi dimulai. 
Secara default, App Mesh menggunakan nama sumber daya yang Anda tentukan `APPMESH_RESOURCE_ARN` saat Envoy merujuk dirinya sendiri dalam metrik dan jejak. Anda dapat menimpa perilaku ini dengan mengatur variabel lingkungan `APPMESH_RESOURCE_CLUSTER` dengan nama Anda sendiri. Properti ini memerlukan versi `1.15.0` atau yang lebih baru dari gambar Utusan. Untuk informasi selengkapnya, lihat [Gambar utusan](envoy.md).

Kode berikut menunjukkan contoh definisi kontainer Utusan.

```
{
	"name": "envoy",
	"image": "840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod",
	"essential": true,
	"environment": [{
		"name": "APPMESH_RESOURCE_ARN",
		"value": "arn:aws:appmesh:us-west-2:111122223333:mesh/apps/virtualNode/serviceB"
	}],
	"healthCheck": {
		"command": [
			"CMD-SHELL",
			"curl -s http://localhost:9901/server_info | grep state | grep -q LIVE"
		],
		"startPeriod": 10,
		"interval": 5,
		"timeout": 2,
		"retries": 3
	},
	"user": "1337"
}
```

**Contoh ketentuan tugas**  
Contoh berikut definisi tugas Amazon ECS menunjukkan cara menggabungkan contoh dari atas ke definisi tugas untuk. `taskB` Contoh disediakan untuk membuat tugas untuk kedua jenis peluncuran Amazon ECS dengan atau tanpa menggunakan AWS X-Ray. Ubah *replaceable* nilai, yang sesuai, untuk membuat definisi tugas untuk tugas bernama `taskBv2` dan `taskA` dari skenario. Gantikan nama mesh dan nama node virtual Anda dengan `APPMESH_RESOURCE_ARN` nilai dan daftar port yang didengarkan aplikasi Anda untuk `AppPorts` nilai konfigurasi proxy. Secara default, App Mesh menggunakan nama sumber daya yang Anda tentukan `APPMESH_RESOURCE_ARN` saat Envoy merujuk dirinya sendiri dalam metrik dan jejak. Anda dapat menimpa perilaku ini dengan mengatur variabel lingkungan `APPMESH_RESOURCE_CLUSTER` dengan nama Anda sendiri. Semua properti dalam contoh berikut diperlukan. Beberapa nilai properti juga diperlukan, tetapi beberapa di antaranya*replaceable*.

Jika Anda menjalankan tugas Amazon ECS seperti yang dijelaskan di bagian Kredensial, Anda perlu menambahkan [peran IAM tugas](https://docs.aws.amazon.com/AmazonECS/latest/developerguide/task-iam-roles.html) yang ada, ke contoh.

**penting**  
Fargate harus menggunakan nilai port yang lebih besar dari 1024.

**Example Definisi tugas JSON untuk Amazon ECS - Fargate pada wadah Linux**  

```
{
   
   "family" : "taskB",
   "memory" : "1024",
   "cpu" : "0.5 vCPU",
   "proxyConfiguration" : {
      "containerName" : "envoy",
      "properties" : [
         {
            "name" : "ProxyIngressPort",
            "value" : "15000"
         },
         {
            "name" : "AppPorts",
            "value" : "9080"
         },
         {
            "name" : "EgressIgnoredIPs",
            "value" : "169.254.170.2,169.254.169.254"
         },
         {
            "name": "EgressIgnoredPorts",
            "value": "22"
         },
         {
            "name" : "IgnoredUID",
            "value" : "1337"
         },
         {
            "name" : "ProxyEgressPort",
            "value" : "15001"
         }
      ],
      "type" : "APPMESH"
   },
   "containerDefinitions" : [
      {
         "name" : "appName",
         "image" : "appImage",
         "portMappings" : [
            {
               "containerPort" : 9080,
               "protocol" : "tcp"
            }
         ],
         "essential" : true,
         "dependsOn" : [
            {
               "containerName" : "envoy",
               "condition" : "HEALTHY"
            }
         ]
      },
      {         
         "name" : "envoy",
         "image" : "840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod",
         "essential" : true,
         "environment" : [
            {
               "name" : "APPMESH_VIRTUAL_NODE_NAME",
               "value" : "mesh/apps/virtualNode/serviceB"
            }
         ],
         "healthCheck" : {
            "command" : [
               "CMD-SHELL",
               "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE"
            ],
            "interval" : 5,
            "retries" : 3,
            "startPeriod" : 10,
            "timeout" : 2
         },
         "memory" : 500,
         "user" : "1337"
      }
   ],
   "requiresCompatibilities" : [ "FARGATE" ],
   "taskRoleArn" : "arn:aws:iam::123456789012:role/ecsTaskRole",
   "executionRoleArn" : "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
   "networkMode" : "awsvpc"
}
```

**Example Definisi tugas JSON untuk Amazon ECS dengan - AWS X-Ray Fargate pada wadah Linux**  
X-Ray memungkinkan Anda mengumpulkan data tentang permintaan yang dilayani aplikasi dan menyediakan alat yang dapat Anda gunakan untuk memvisualisasikan arus lalu lintas. Menggunakan driver X-Ray untuk Utusan memungkinkan Utusan untuk melaporkan informasi penelusuran ke X-Ray. Anda dapat mengaktifkan penelusuran X-Ray menggunakan konfigurasi [Envoy](https://docs.aws.amazon.com/app-mesh/latest/userguide/envoy.html). Berdasarkan konfigurasi, Envoy mengirimkan data penelusuran ke daemon X-Ray yang berjalan sebagai wadah [sespan](https://docs.aws.amazon.com/xray/latest/devguide/xray-daemon-ecs.html) dan daemon meneruskan jejak ke layanan X-Ray. Setelah jejak dipublikasikan ke X-Ray, Anda dapat menggunakan konsol X-Ray untuk memvisualisasikan grafik panggilan layanan dan meminta detail jejak. JSON berikut merupakan definisi tugas untuk mengaktifkan integrasi X-Ray.  

```
{
   
   
   "family" : "taskB",
   "memory" : "1024",
   "cpu" : "512",
   "proxyConfiguration" : {
      "containerName" : "envoy",
      "properties" : [
         {
            "name" : "ProxyIngressPort",
            "value" : "15000"
         },
         {
            "name" : "AppPorts",
            "value" : "9080"
         },
         {
            "name" : "EgressIgnoredIPs",
            "value" : "169.254.170.2,169.254.169.254"
         },
         {
            "name": "EgressIgnoredPorts",
            "value": "22"
         },
         {
            "name" : "IgnoredUID",
            "value" : "1337"
         },
         {
            "name" : "ProxyEgressPort",
            "value" : "15001"
         }
      ],
      "type" : "APPMESH"
   },
   "containerDefinitions" : [
      {
         "name" : "appName",
         "image" : "appImage",
         "portMappings" : [
            {
               "containerPort" : 9080,
               "protocol" : "tcp"
            }
         ],
         "essential" : true,
         "dependsOn" : [
            {
               "containerName" : "envoy",
               "condition" : "HEALTHY"
            }
         ]
      },
      {
         
         "name" : "envoy",
         "image" : "840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod",
         "essential" : true,
         "environment" : [
            {
               "name" : "APPMESH_VIRTUAL_NODE_NAME",
               "value" : "mesh/apps/virtualNode/serviceB"
            },
            {
               "name": "ENABLE_ENVOY_XRAY_TRACING",
               "value": "1"
            }
         ],
         "healthCheck" : {
            "command" : [
               "CMD-SHELL",
               "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE"
            ],
            "interval" : 5,
            "retries" : 3,
            "startPeriod" : 10,
            "timeout" : 2
         },
         "memory" : 500,
         "user" : "1337"
      },
      {
         "name" : "xray-daemon",
         "image" : "amazon/aws-xray-daemon",
         "user" : "1337",
         "essential" : true,
         "cpu" : "32",
         "memoryReservation" : "256",
         "portMappings" : [
            {
               "containerPort" : 2000,
               "protocol" : "udp"
            }
         ]
      }
   ],
   "requiresCompatibilities" : [ "FARGATE" ],
   "taskRoleArn" : "arn:aws:iam::123456789012:role/ecsTaskRole",
   "executionRoleArn" : "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
   "networkMode" : "awsvpc"
}
```

**Example Definisi tugas JSON untuk Amazon ECS - Jenis peluncuran EC2**  

```
{
  "family": "taskB",
  "memory": "256",
  "proxyConfiguration": {
    "type": "APPMESH",
    "containerName": "envoy",
    "properties": [
      {
        "name": "IgnoredUID",
        "value": "1337"
      },
      {
        "name": "ProxyIngressPort",
        "value": "15000"
      },
      {
        "name": "ProxyEgressPort",
        "value": "15001"
      },
      {
        "name": "AppPorts",
        "value": "9080"
      },
      {
        "name": "EgressIgnoredIPs",
        "value": "169.254.170.2,169.254.169.254"
      },
      {
        "name": "EgressIgnoredPorts",
        "value": "22"
      }
    ]
  },
  "containerDefinitions": [
    {
      "name": "appName",
      "image": "appImage",
      "portMappings": [
        {
          "containerPort": 9080,
          "hostPort": 9080,
          "protocol": "tcp"
        }
      ],
      "essential": true,
      "dependsOn": [
        {
          "containerName": "envoy",
          "condition": "HEALTHY"
        }
      ]
    },
    {
      "name": "envoy",
      "image": "840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod",
      "essential": true,
      "environment": [
        {
          "name": "APPMESH_VIRTUAL_NODE_NAME",
          "value": "mesh/apps/virtualNode/serviceB"
        }
      ],
      "healthCheck": {
        "command": [
          "CMD-SHELL",
          "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE"
        ],
        "startPeriod": 10,
        "interval": 5,
        "timeout": 2,
        "retries": 3
      },
      "user": "1337"
    }
  ],
  "requiresCompatibilities" : [ "EC2" ],
  "taskRoleArn" : "arn:aws:iam::123456789012:role/ecsTaskRole",
  "executionRoleArn" : "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
  "networkMode": "awsvpc"
}
```

**Example Definisi tugas JSON untuk Amazon ECS dengan AWS X-Ray - tipe peluncuran EC2**  

```
{
  "family": "taskB",
  "memory": "256",
   "cpu" : "1024",
  "proxyConfiguration": {
    "type": "APPMESH",
    "containerName": "envoy",
    "properties": [
      {
        "name": "IgnoredUID",
        "value": "1337"
      },
      {
        "name": "ProxyIngressPort",
        "value": "15000"
      },
      {
        "name": "ProxyEgressPort",
        "value": "15001"
      },
      {
        "name": "AppPorts",
        "value": "9080"
      },
      {
        "name": "EgressIgnoredIPs",
        "value": "169.254.170.2,169.254.169.254"
      },
      {
        "name": "EgressIgnoredPorts",
        "value": "22"
      }
    ]
  },
  "containerDefinitions": [
    {
      "name": "appName",
      "image": "appImage",
      "portMappings": [
        {
          "containerPort": 9080,
          "hostPort": 9080,
          "protocol": "tcp"
        }
      ],
      "essential": true,
      "dependsOn": [
        {
          "containerName": "envoy",
          "condition": "HEALTHY"
        }
      ]
    },
    {
      "name": "envoy",
      "image": "840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod",
      "essential": true,
      "environment": [
        {
          "name": "APPMESH_VIRTUAL_NODE_NAME",
          "value": "mesh/apps/virtualNode/serviceB"
        },
        {
         "name": "ENABLE_ENVOY_XRAY_TRACING",
         "value": "1"
        }
      ],
      "healthCheck": {
        "command": [
          "CMD-SHELL",
          "curl -s http://localhost:9901/server_info | grep state | grep -q LIVE"
        ],
        "startPeriod": 10,
        "interval": 5,
        "timeout": 2,
        "retries": 3
      },
      "user": "1337"
    },
    {
      "name": "xray-daemon",
      "image": "amazon/aws-xray-daemon",
      "user": "1337",
      "essential": true,
      "cpu": 32,
      "memoryReservation": 256,
      "portMappings": [
        {
          "containerPort": 2000,
          "protocol": "udp"
        }
      ]
    }
  ],
  "requiresCompatibilities" : [ "EC2" ],
  "taskRoleArn" : "arn:aws:iam::123456789012:role/ecsTaskRole",
  "executionRoleArn" : "arn:aws:iam::123456789012:role/ecsTaskExecutionRole",
  "networkMode": "awsvpc"
}
```

## Topik lanjutan
<a name="advanced-topics-ecs"></a>

### Penerapan Canary menggunakan App Mesh
<a name="canary-appmesh-ecs"></a>

Penerapan dan rilis Canary membantu Anda mengalihkan lalu lintas antara versi lama aplikasi dan versi yang baru digunakan. Ini juga memantau kesehatan versi yang baru digunakan. Jika ada masalah dengan versi baru, penyebaran kenari dapat secara otomatis mengalihkan lalu lintas kembali ke versi lama. Penerapan Canary memberi Anda kemampuan untuk mengalihkan lalu lintas antar versi aplikasi dengan kontrol lebih besar.

Untuk informasi selengkapnya tentang cara menerapkan penerapan canary untuk Amazon ECS menggunakan App Mesh, lihat [Membuat pipeline dengan penerapan canary untuk Amazon ECS menggunakan App Mesh](https://aws.amazon.com/blogs/containers/create-a-pipeline-with-canary-deployments-for-amazon-ecs-using-aws-app-mesh/)

**catatan**  
Untuk contoh dan penelusuran lainnya untuk App Mesh, lihat repositori contoh [App Mesh](https://github.com/aws/aws-app-mesh-examples).

# Memulai dengan AWS App Mesh dan Kubernetes
<a name="getting-started-kubernetes"></a>

**penting**  
Pemberitahuan akhir dukungan: Pada 30 September 2026, AWS akan menghentikan dukungan untuk. AWS App Mesh Setelah 30 September 2026, Anda tidak akan lagi dapat mengakses AWS App Mesh konsol atau AWS App Mesh sumber daya. Untuk informasi lebih lanjut, kunjungi posting blog ini [Migrasi dari AWS App Mesh ke Amazon ECS Service Connect](https://aws.amazon.com/blogs/containers/migrating-from-aws-app-mesh-to-amazon-ecs-service-connect). 

Ketika Anda berintegrasi AWS App Mesh dengan Kubernetes menggunakan pengontrol App Mesh untuk Kubernetes, Anda mengelola resource App Mesh, seperti mesh, layanan virtual, node virtual, router virtual, dan rute melalui Kubernetes. Anda juga secara otomatis menambahkan gambar container sidecar App Mesh ke spesifikasi pod Kubernetes. Tutorial ini memandu Anda melalui instalasi pengontrol App Mesh untuk Kubernetes untuk mengaktifkan integrasi ini.

Pengontrol disertai dengan penerapan definisi sumber daya kustom Kubernetes berikut:`meshes`,,, `virtual services` dan. `virtual nodes` `virtual routers` Pengontrol mengawasi pembuatan, modifikasi, dan penghapusan sumber daya kustom dan membuat perubahan pada sumber daya App Mesh[Jala Layanan](meshes.md),,,,,[Layanan virtual](virtual_services.md), [Node virtual](virtual_nodes.md) [Gerbang virtual](virtual_gateways.md)[Rute gerbang](gateway-routes.md), [Router virtual](virtual_routers.md) (termasuk[Rute](routes.md)) yang sesuai melalui App Mesh API. Untuk mempelajari lebih lanjut atau berkontribusi pada pengontrol, lihat [GitHubproyek](https://github.com/aws/aws-app-mesh-controller-for-k8s).

Controller juga menginstal webhook yang menyuntikkan kontainer berikut ke dalam pod Kubernetes yang diberi label dengan nama yang Anda tentukan.
+ **Proxy App Mesh Envoy** — Envoy menggunakan konfigurasi yang ditentukan dalam bidang kontrol App Mesh untuk menentukan ke mana harus mengirim lalu lintas aplikasi Anda. 
+ **Manajer rute proxy App Mesh** — Memperbarui `iptables` aturan di namespace jaringan pod yang merutekan lalu lintas masuk dan keluar melalui Envoy. Container ini berjalan sebagai kontainer init Kubernetes di dalam pod.

## Prasyarat
<a name="mesh-k8s-integration-prerequisites"></a>
+ Pemahaman yang ada tentang konsep App Mesh. Untuk informasi selengkapnya, lihat [Apa itu AWS App Mesh?](what-is-app-mesh.md).
+ Pemahaman yang ada tentang konsep Kubernetes. Untuk informasi selengkapnya, lihat [Apa itu Kubernetes dalam dokumentasi Kubernetes](https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/).
+ Cluster Kubernetes yang sudah ada. Jika Anda tidak memiliki klaster yang ada, lihat [Memulai Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) di *Panduan Pengguna Amazon EKS*. Jika Anda menjalankan cluster Kubernetes Anda sendiri di Amazon EC2, pastikan Docker diautentikasi ke repositori Amazon ECR tempat image Envoy berada. Untuk informasi selengkapnya, lihat [Envoy image](https://docs.aws.amazon.com/app-mesh/latest/userguide/envoy.html), [Registry authentication](https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth) di Amazon Elastic Container Registry User Guide, dan [Pull an Image dari Private Registry](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/) di dokumentasi Kubernetes.
+ App Mesh mendukung layanan Linux yang terdaftar dengan DNS, AWS Cloud Map, atau keduanya. Untuk menggunakan panduan memulai ini, kami sarankan Anda memiliki tiga layanan yang sudah ada yang terdaftar di DNS. Prosedur dalam topik ini mengasumsikan bahwa layanan yang ada diberi nama`serviceA`,`serviceB`, `serviceBv2` dan bahwa semua layanan dapat ditemukan melalui namespace bernama. `apps.local`

  Anda dapat membuat mesh layanan dan sumber dayanya bahkan jika layanan tidak ada, tetapi Anda tidak dapat menggunakan mesh sampai Anda telah menerapkan layanan yang sebenarnya.
+  AWS CLI Versi 1.18.116 atau yang lebih baru atau 2.0.38 atau yang lebih baru diinstal. Untuk menginstal atau memutakhirkan AWS CLI, lihat [Menginstal AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html). 
+ `kubectl`Klien yang dikonfigurasi untuk berkomunikasi dengan klaster Kubernetes Anda. Jika Anda menggunakan Amazon Elastic Kubernetes Service, Anda dapat menggunakan petunjuk untuk `[kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)` menginstal dan mengonfigurasi file. `[kubeconfig](https://docs.aws.amazon.com/eks/latest/userguide/create-kubeconfig.html)`
+ Helm versi 3.0 atau yang lebih baru diinstal. Jika Anda belum menginstal Helm, lihat [Menggunakan Helm dengan Amazon EKS](https://docs.aws.amazon.com/eks/latest/userguide/helm.html) di *Panduan Pengguna Amazon EKS*.
+ Amazon EKS saat ini hanya mendukung `IPv4_ONLY` dan `IPv6_ONLY` hanya preferensi IP, karena Amazon EKS saat ini hanya mendukung pod yang mampu melayani hanya `IPv4` lalu lintas atau hanya `IPv6` lalu lintas. 

Langkah-langkah yang tersisa mengasumsikan bahwa layanan yang sebenarnya diberi nama `serviceA``serviceB`,, `serviceBv2` dan bahwa semua layanan dapat ditemukan melalui namespace bernama. `apps.local`

## Langkah 1: Instal komponen integrasi
<a name="install-controller"></a>

Instal komponen integrasi satu kali ke setiap cluster yang meng-host pod yang ingin Anda gunakan dengan App Mesh.

**Untuk menginstal komponen integrasi**

1. Langkah-langkah yang tersisa dari prosedur ini memerlukan cluster tanpa versi pra-rilis dari controller diinstal. Jika Anda telah menginstal versi pra-rilis, atau tidak yakin apakah sudah, Anda dapat mengunduh dan menjalankan skrip yang memeriksa untuk melihat apakah versi pra-rilis diinstal pada klaster Anda.

   ```
   curl -o pre_upgrade_check.sh https://raw.githubusercontent.com/aws/eks-charts/master/stable/appmesh-controller/upgrade/pre_upgrade_check.sh
   sh ./pre_upgrade_check.sh
   ```

   Jika skrip kembali `Your cluster is ready for upgrade. Please proceed to the installation instructions` maka Anda dapat melanjutkan ke langkah berikutnya. Jika pesan yang berbeda dikembalikan, maka Anda harus menyelesaikan langkah-langkah peningkatan sebelum melanjutkan. Untuk informasi selengkapnya tentang memutakhirkan versi pra-rilis, lihat [Upgrade](https://github.com/aws/eks-charts/blob/master/stable/appmesh-controller/README.md#upgrade) pada. GitHub

1. Tambahkan `eks-charts` repositori ke Helm.

   ```
   helm repo add eks https://aws.github.io/eks-charts
   ```

1. Instal definisi sumber daya kustom (CRD) App Mesh Kubernetes.

   ```
   kubectl apply -k "https://github.com/aws/eks-charts/stable/appmesh-controller/crds?ref=master"
   ```

1. Buat namespace Kubernetes untuk controller.

   ```
   kubectl create ns appmesh-system
   ```

1. Tetapkan variabel berikut untuk digunakan dalam langkah selanjutnya. Ganti `cluster-name` dan `Region-code` dengan nilai untuk cluster Anda yang ada.

   ```
   export CLUSTER_NAME=cluster-name
   export AWS_REGION=Region-code
   ```

1. (Opsional) Jika Anda ingin menjalankan controller di Fargate, maka Anda perlu membuat profil Fargate. Jika Anda belum `eksctl` menginstal, lihat [Menginstal atau Memutakhirkan `eksctl`](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html#installing-eksctl) di *Panduan Pengguna Amazon EKS*. Jika Anda lebih suka membuat profil menggunakan konsol, lihat [Membuat profil Fargate](https://docs.aws.amazon.com/eks/latest/userguide/fargate-profile.html#create-fargate-profile) di *Panduan Pengguna Amazon EKS*.

   ```
   eksctl create fargateprofile --cluster $CLUSTER_NAME --name appmesh-system --namespace appmesh-system
   ```

1. Buat penyedia identitas OpenID Connect (OIDC) untuk klaster Anda. Jika Anda belum `eksctl` menginstal, Anda dapat menginstalnya dengan petunjuk di [Menginstal atau memutakhirkan `eksctl`](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html#installing-eksctl) di *Panduan Pengguna Amazon EKS*. Jika Anda lebih suka membuat penyedia menggunakan konsol, lihat [Mengaktifkan peran IAM untuk akun layanan di klaster Anda di](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html) *Panduan Pengguna Amazon EKS*.

   ```
   eksctl utils associate-iam-oidc-provider \
       --region=$AWS_REGION \
       --cluster $CLUSTER_NAME \
       --approve
   ```

1. Buat peran IAM, lampirkan [https://console.aws.amazon.com/iam/home?#policies/arn:aws:iam::aws:policy/AWSAppMeshFullAccess$jsonEditor](https://console.aws.amazon.com/iam/home?#policies/arn:aws:iam::aws:policy/AWSAppMeshFullAccess$jsonEditor)dan [https://console.aws.amazon.com/iam/home?#policies/arn:aws:iam::aws:policy/AWSCloudMapFullAccess$jsonEditor](https://console.aws.amazon.com/iam/home?#policies/arn:aws:iam::aws:policy/AWSCloudMapFullAccess$jsonEditor) AWS kelola kebijakan ke dalamnya, dan ikat ke akun layanan `appmesh-controller` Kubernetes. Peran ini memungkinkan pengontrol untuk menambah, menghapus, dan mengubah resource App Mesh.
**catatan**  
Perintah membuat peran AWS IAM dengan nama yang dibuat secara otomatis. Anda tidak dapat menentukan nama peran IAM yang dibuat.

   ```
   eksctl create iamserviceaccount \
       --cluster $CLUSTER_NAME \
       --namespace appmesh-system \
       --name appmesh-controller \
       --attach-policy-arn  arn:aws:iam::aws:policy/AWSCloudMapFullAccess,arn:aws:iam::aws:policy/AWSAppMeshFullAccess \
       --override-existing-serviceaccounts \
       --approve
   ```

   Jika Anda lebih suka membuat akun layanan menggunakan Konsol Manajemen AWS atau AWS CLI, lihat [Membuat peran dan kebijakan IAM untuk akun layanan Anda](https://docs.aws.amazon.com/eks/latest/userguide/create-service-account-iam-policy-and-role.html#create-service-account-iam-role) di *Panduan Pengguna Amazon EKS*. Jika Anda menggunakan Konsol Manajemen AWS atau AWS CLI untuk membuat akun, Anda juga perlu memetakan peran tersebut ke akun layanan Kubernetes. Untuk informasi selengkapnya, lihat [Menentukan peran IAM untuk akun layanan Anda](https://docs.aws.amazon.com/eks/latest/userguide/specify-service-account-role.html) di *Panduan Pengguna Amazon EKS*. 

1. 

**Menerapkan pengontrol App Mesh. Untuk daftar semua opsi konfigurasi, lihat [Konfigurasi](https://github.com/aws/eks-charts/blob/master/stable/appmesh-controller/README.md#configuration) aktif GitHub.**

   1. Untuk menerapkan pengontrol App Mesh untuk klaster pribadi, Anda harus mengaktifkan App Mesh dan penemuan layanan titik akhir Amazon VPC Amazon ke subnet pribadi yang ditautkan terlebih dahulu. Anda juga diminta untuk mengatur`accountId`.

      ```
      --set accountId=$AWS_ACCOUNT_ID
      ```

      Untuk mengaktifkan penelusuran X-Ray di cluster pribadi, aktifkan titik akhir X-Ray dan Amazon ECR Amazon VPC. Pengontrol menggunakan secara `public.ecr.aws/xray/aws-xray-daemon:latest` default, jadi tarik gambar ini ke lokal dan [dorong ke repositori ECR pribadi Anda](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html).
**catatan**  
[Titik akhir Amazon VPC](https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html) saat ini tidak mendukung repositori publik Amazon ECR.

      Contoh berikut menunjukkan penerapan controller dengan konfigurasi untuk X-Ray.

      ```
      helm upgrade -i appmesh-controller eks/appmesh-controller \
          --namespace appmesh-system \
          --set region=$AWS_REGION \
          --set serviceAccount.create=false \
          --set serviceAccount.name=appmesh-controller \
          --set accountId=$AWS_ACCOUNT_ID \
          --set log.level=debug \
          --set tracing.enabled=true \
          --set tracing.provider=x-ray \
          --set xray.image.repository=your-account-id.dkr.ecr.your-region.amazonaws.com/your-repository \
          --set xray.image.tag=your-xray-daemon-image-tag
      ```

      Verifikasi apakah daemon X-Ray berhasil disuntikkan saat mengikat penerapan aplikasi dengan node atau gateway virtual Anda.

      Untuk informasi selengkapnya, lihat [Cluster Pribadi](https://docs.aws.amazon.com/eks/latest/userguide/private-clusters.html) di *Panduan Pengguna Amazon EKS*.

   1. Menerapkan pengontrol App Mesh untuk cluster lain. Untuk daftar semua opsi konfigurasi, lihat [Konfigurasi](https://github.com/aws/eks-charts/blob/master/stable/appmesh-controller/README.md#configuration) aktif GitHub.

      ```
      helm upgrade -i appmesh-controller eks/appmesh-controller \
          --namespace appmesh-system \
          --set region=$AWS_REGION \
          --set serviceAccount.create=false \
          --set serviceAccount.name=appmesh-controller
      ```
**catatan**  
Jika keluarga cluster Amazon EKS Anda`IPv6`, setel nama cluster saat menerapkan pengontrol App Mesh dengan menambahkan opsi berikut ke perintah `--set clusterName=$CLUSTER_NAME` sebelumnya.
**penting**  
Jika cluster Anda berada di`me-south-1`,`ap-east-1`,`ap-southeast-3`,`eu-south-1`,`il-central-1`, atau `af-south-1` Regions, maka Anda perlu menambahkan opsi berikut ke perintah sebelumnya:  
Ganti *account-id* dan *Region-code* dengan salah satu set nilai yang sesuai.  

       ```
        --set image.repository=account-id.dkr.ecr.Region-code.amazonaws.com/amazon/appmesh-controller
       ```
772975370895.dkr. ecr.me-south-1.amazonaws.com /:v1.34.13.0-prod aws-appmesh-envoy
856666278305.dkr. ecr.ap-east-1.amazonaws.com /:v1.34.13.0-prod aws-appmesh-envoy
909464085924.dkr. ecr.ap-southeast-3.amazonaws.com /:v1.34.13.0-prod aws-appmesh-envoy
422531588944.dkr. ecr.eu-south-1.amazonaws.com /:v1.34.13.0-prod aws-appmesh-envoy
564877687649.dkr. ecr.il-central-1.amazonaws.com /:v1.34.13.0-prod aws-appmesh-envoy
924023996002.dkr. ecr.af-south-1.amazonaws.com /:v1.34.13.0-prod aws-appmesh-envoy
Gambar yang lebih tua URIs dapat ditemukan di [log perubahan](https://github.com/aws/aws-app-mesh-controller-for-k8s/releases) GitHub. AWS Akun tempat gambar hadir telah berubah dalam versi`v1.5.0`. Versi gambar yang lebih lama di-host di AWS akun yang ditemukan di Amazon Elastic Kubernetes [Service](https://docs.aws.amazon.com/eks/latest/userguide/add-ons-images.html) Amazon Container Image Registries.

       ```
       --set sidecar.image.repository=account-id.dkr.ecr.Region-code.amazonaws.com/aws-appmesh-envoy
       ```
772975370895.dkr.ecr.me-selatan-1.amazonaws. com/amazon/appmesh-pengontrol: v1.13.1
856666278305.dkr.ecr.ap-east-1.amazonaws. com/amazon/appmesh-pengontrol: v1.13.1
909464085924.dkr.ecr.ap-southeast-3.amazonaws. com/amazon/appmesh-pengontrol: v1.13.1
422531588944.dkr.ecr.eu-south-1.amazonaws. com/amazon/appmesh-pengontrol: v1.13.1
564877687649.dkr.ecr.il-central-1.amazonaws. com/amazon/appmesh-pengontrol: v1.13.1
924023996002.dkr.ecr.af-selatan-1.amazonaws. com/amazon/appmesh-pengontrol: v1.13.1

       ```
       --set sidecar.image.repository=account-id.dkr.ecr.Region-code.amazonaws.com/aws-appmesh-envoy
       ```
772975370895.dkr. ecr.me-south-1.amazonaws.com/-manajer:v7-prod aws-appmesh-proxy-route
856666278305.dkr. ecr.ap-east-1.amazonaws.com/-manajer:v7-prod aws-appmesh-proxy-route
909464085924.dkr. ecr.ap-southeast-3.amazonaws.com/-manajer:v7-prod aws-appmesh-proxy-route
422531588944.dkr. ecr.eu-south-1.amazonaws.com/-manajer:v7-prod aws-appmesh-proxy-route
564877687649.dkr. ecr.il-central-1.amazonaws.com/-manajer:v7-prod aws-appmesh-proxy-route
924023996002.dkr. ecr.af-south-1.amazonaws.com/-manajer:v7-prod aws-appmesh-proxy-route
**penting**  
Hanya versi v1.9.0.0-prod atau yang lebih baru yang didukung untuk digunakan dengan App Mesh.

1. Konfirmasikan bahwa versi pengontrol adalah `v1.4.0` atau lebih baru. Anda dapat meninjau [log perubahan](https://github.com/aws/aws-app-mesh-controller-for-k8s/releases) GitHub.

   ```
   kubectl get deployment appmesh-controller \
       -n appmesh-system \
       -o json  | jq -r ".spec.template.spec.containers[].image" | cut -f2 -d ':'
   ```
**catatan**  
Jika Anda melihat log untuk wadah yang sedang berjalan, Anda mungkin melihat baris yang menyertakan teks berikut, yang dapat diabaikan dengan aman.  

   ```
   Neither -kubeconfig nor -master was specified. Using the inClusterConfig. This might not work.
   ```

## Langkah 2: Menyebarkan sumber daya App Mesh
<a name="configure-app-mesh"></a>

Saat Anda menerapkan aplikasi di Kubernetes, Anda juga membuat sumber daya kustom Kubernetes sehingga pengontrol dapat membuat resource App Mesh yang sesuai. Prosedur berikut membantu Anda menerapkan resource App Mesh dengan beberapa fiturnya. Anda dapat menemukan contoh manifes untuk menerapkan fitur resource App Mesh lainnya di `v1beta2` sub-folder dari banyak folder fitur yang tercantum pada [penelusuran App Mesh](https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs). GitHub

**penting**  
Setelah pengontrol membuat resource App Mesh, sebaiknya Anda hanya membuat perubahan atau menghapus resource App Mesh menggunakan controller. Jika Anda membuat perubahan atau menghapus sumber daya menggunakan App Mesh, pengontrol tidak akan mengubah atau membuat ulang sumber daya App Mesh yang diubah atau dihapus selama sepuluh jam, secara default. Anda dapat mengonfigurasi durasi ini menjadi lebih sedikit. Untuk informasi selengkapnya, lihat [Konfigurasi](https://github.com/aws/eks-charts/blob/master/stable/appmesh-controller/README.md#configuration) pada GitHub.

**Untuk menerapkan sumber daya App Mesh**

1. Buat namespace Kubernetes untuk menerapkan resource App Mesh. 

   1. Simpan konten berikut ini ke file bernama `namespace.yaml` pada komputer Anda.

      ```
      apiVersion: v1
      kind: Namespace
      metadata:
        name: my-apps
        labels:
          mesh: my-mesh
          appmesh.k8s.aws/sidecarInjectorWebhook: enabled
      ```

   1. Buat namespace.

      ```
      kubectl apply -f namespace.yaml
      ```

1. Buat mesh layanan App Mesh.

   1. Simpan konten berikut ini ke file bernama `mesh.yaml` pada komputer Anda. File ini digunakan untuk membuat sumber daya mesh bernama`my-mesh`. Mesh layanan adalah batas logis untuk lalu lintas jaringan antara layanan yang berada di dalamnya.

      ```
      apiVersion: appmesh.k8s.aws/v1beta2
      kind: Mesh
      metadata:
        name: my-mesh
      spec:
        namespaceSelector:
          matchLabels:
            mesh: my-mesh
      ```

   1. Buat mesh.

      ```
      kubectl apply -f mesh.yaml
      ```

   1. Lihat detail sumber daya mesh Kubernetes yang telah dibuat.

      ```
      kubectl describe mesh my-mesh
      ```

      Output

      ```
      Name:         my-mesh
      Namespace:
      Labels:       <none>
      Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                      {"apiVersion":"appmesh.k8s.aws/v1beta2","kind":"Mesh","metadata":{"annotations":{},"name":"my-mesh"},"spec":{"namespaceSelector":{"matchLa...
      API Version:  appmesh.k8s.aws/v1beta2
      Kind:         Mesh
      Metadata:
        Creation Timestamp:  2020-06-17T14:51:37Z
        Finalizers:
          finalizers.appmesh.k8s.aws/mesh-members
          finalizers.appmesh.k8s.aws/aws-appmesh-resources
        Generation:        1
        Resource Version:  6295
        Self Link:         /apis/appmesh.k8s.aws/v1beta2/meshes/my-mesh
        UID:               111a11b1-c11d-1e1f-gh1i-j11k1l111m711
      Spec:
        Aws Name:  my-mesh
        Namespace Selector:
          Match Labels:
            Mesh:  my-mesh
      Status:
        Conditions:
          Last Transition Time:  2020-06-17T14:51:37Z
          Status:                True
          Type:                  MeshActive
        Mesh ARN:                arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh
        Observed Generation:     1
      Events:                    <none>
      ```

   1. Lihat detail tentang mesh layanan App Mesh yang dibuat oleh pengontrol.

      ```
      aws appmesh describe-mesh --mesh-name my-mesh
      ```

      Output

      ```
      {
          "mesh": {
              "meshName": "my-mesh",
              "metadata": {
                  "arn": "arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh",
                  "createdAt": "2020-06-17T09:51:37.920000-05:00",
                  "lastUpdatedAt": "2020-06-17T09:51:37.920000-05:00",
                  "meshOwner": "111122223333",
                  "resourceOwner": "111122223333",
                  "uid": "111a11b1-c11d-1e1f-gh1i-j11k1l111m711",
                  "version": 1
              },
              "spec": {},
              "status": {
                  "status": "ACTIVE"
              }
          }
      }
      ```

1. Buat node virtual App Mesh. Node virtual bertindak sebagai pointer logis ke penerapan Kubernetes.

   1. Simpan konten berikut ini ke file bernama `virtual-node.yaml` pada komputer Anda. File ini digunakan untuk membuat node virtual App Mesh bernama `my-service-a` di *`my-apps`* namespace. Node virtual mewakili layanan Kubernetes yang dibuat di langkah selanjutnya. Nilai untuk `hostname` adalah nama host DNS yang sepenuhnya memenuhi syarat dari layanan aktual yang diwakili oleh node virtual ini.

      ```
      apiVersion: appmesh.k8s.aws/v1beta2
      kind: VirtualNode
      metadata:
        name: my-service-a
        namespace: my-apps
      spec:
        podSelector:
          matchLabels:
            app: my-app-1
        listeners:
          - portMapping:
              port: 80
              protocol: http
        serviceDiscovery:
          dns:
            hostname: my-service-a.my-apps.svc.cluster.local
      ```

      Node virtual memiliki kemampuan, seperti end-to-end enkripsi dan pemeriksaan kesehatan, yang tidak tercakup dalam tutorial ini. Untuk informasi selengkapnya, lihat [Node virtual](virtual_nodes.md). Untuk melihat semua pengaturan yang tersedia untuk node virtual yang dapat Anda atur dalam spesifikasi sebelumnya, jalankan perintah berikut.

      ```
      aws appmesh create-virtual-node --generate-cli-skeleton yaml-input
      ```

   1. Menyebarkan simpul virtual.

      ```
      kubectl apply -f virtual-node.yaml
      ```

   1. Lihat detail sumber daya node virtual Kubernetes yang telah dibuat.

      ```
      kubectl describe virtualnode my-service-a -n my-apps
      ```

      Output

      ```
      Name:         my-service-a
      Namespace:    my-apps
      Labels:       <none>
      Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                      {"apiVersion":"appmesh.k8s.aws/v1beta2","kind":"VirtualNode","metadata":{"annotations":{},"name":"my-service-a","namespace":"my-apps"},"s...
      API Version:  appmesh.k8s.aws/v1beta2
      Kind:         VirtualNode
      Metadata:
        Creation Timestamp:  2020-06-17T14:57:29Z
        Finalizers:
          finalizers.appmesh.k8s.aws/aws-appmesh-resources
        Generation:        2
        Resource Version:  22545
        Self Link:         /apis/appmesh.k8s.aws/v1beta2/namespaces/my-apps/virtualnodes/my-service-a
        UID:               111a11b1-c11d-1e1f-gh1i-j11k1l111m711
      Spec:
        Aws Name:  my-service-a_my-apps
        Listeners:
          Port Mapping:
            Port:      80
            Protocol:  http
        Mesh Ref:
          Name:  my-mesh
          UID:   111a11b1-c11d-1e1f-gh1i-j11k1l111m711
        Pod Selector:
          Match Labels:
            App:  nginx
        Service Discovery:
          Dns:
            Hostname:  my-service-a.my-apps.svc.cluster.local
      Status:
        Conditions:
          Last Transition Time:  2020-06-17T14:57:29Z
          Status:                True
          Type:                  VirtualNodeActive
        Observed Generation:     2
        Virtual Node ARN:        arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualNode/my-service-a_my-apps
      Events:                    <none>
      ```

   1. Lihat detail node virtual yang dibuat pengontrol di App Mesh.
**catatan**  
Meskipun nama node virtual yang dibuat di Kubernetes adalah`my-service-a`, nama node virtual yang dibuat di App Mesh adalah. `my-service-a_my-apps` Kontroler menambahkan nama namespace Kubernetes ke nama node virtual App Mesh saat membuat resource App Mesh. Nama namespace ditambahkan karena di Kubernetes Anda dapat membuat node virtual dengan nama yang sama di ruang nama yang berbeda, tetapi di App Mesh nama node virtual harus unik di dalam mesh.

      ```
      aws appmesh describe-virtual-node --mesh-name my-mesh --virtual-node-name my-service-a_my-apps
      ```

      Output

      ```
      {
          "virtualNode": {
              "meshName": "my-mesh",
              "metadata": {
                  "arn": "arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualNode/my-service-a_my-apps",
                  "createdAt": "2020-06-17T09:57:29.840000-05:00",
                  "lastUpdatedAt": "2020-06-17T09:57:29.840000-05:00",
                  "meshOwner": "111122223333",
                  "resourceOwner": "111122223333",
                  "uid": "111a11b1-c11d-1e1f-gh1i-j11k1l111m711",
                  "version": 1
              },
              "spec": {
                  "backends": [],
                  "listeners": [
                      {
                          "portMapping": {
                              "port": 80,
                              "protocol": "http"
                          }
                      }
                  ],
                  "serviceDiscovery": {
                      "dns": {
                          "hostname": "my-service-a.my-apps.svc.cluster.local"
                      }
                  }
              },
              "status": {
                  "status": "ACTIVE"
              },
              "virtualNodeName": "my-service-a_my-apps"
          }
      }
      ```

1. Buat router virtual App Mesh. Router virtual menangani lalu lintas untuk satu atau lebih layanan virtual dalam mesh Anda.

   1. Simpan konten berikut ini ke file bernama `virtual-router.yaml` pada komputer Anda. File ini digunakan untuk membuat router virtual untuk merutekan lalu lintas ke node virtual bernama `my-service-a` yang dibuat pada langkah sebelumnya. Pengontrol membuat router virtual App Mesh dan sumber daya rute. Anda dapat menentukan lebih banyak kemampuan untuk rute Anda dan menggunakan protokol selain. `http` Untuk informasi selengkapnya, lihat [Router virtual](virtual_routers.md) dan [Rute](routes.md). Perhatikan bahwa nama node virtual yang direferensikan adalah nama node virtual Kubernetes, bukan nama node virtual App Mesh yang dibuat di App Mesh oleh controller.

      ```
      apiVersion: appmesh.k8s.aws/v1beta2
      kind: VirtualRouter
      metadata:
        namespace: my-apps
        name: my-service-a-virtual-router
      spec:
        listeners:
          - portMapping:
              port: 80
              protocol: http
        routes:
          - name: my-service-a-route
            httpRoute:
              match:
                prefix: /
              action:
                weightedTargets:
                  - virtualNodeRef:
                      name: my-service-a
                    weight: 1
      ```

      (Opsional) Untuk melihat semua pengaturan yang tersedia untuk router virtual yang dapat Anda atur dalam spesifikasi sebelumnya, jalankan perintah berikut.

      ```
      aws appmesh create-virtual-router --generate-cli-skeleton yaml-input
      ```

      Untuk melihat semua pengaturan yang tersedia untuk rute yang dapat Anda atur dalam spesifikasi sebelumnya, jalankan perintah berikut.

      ```
      aws appmesh create-route --generate-cli-skeleton yaml-input
      ```

   1. Menyebarkan router virtual.

      ```
      kubectl apply -f virtual-router.yaml
      ```

   1. Lihat sumber daya router virtual Kubernetes yang telah dibuat.

      ```
      kubectl describe virtualrouter my-service-a-virtual-router -n my-apps
      ```

      Output dipersingkat

      ```
      Name:         my-service-a-virtual-router
      Namespace:    my-apps
      Labels:       <none>
      Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                      {"apiVersion":"appmesh.k8s.aws/v1beta2","kind":"VirtualRouter","metadata":{"annotations":{},"name":"my-service-a-virtual-router","namespac...
      API Version:  appmesh.k8s.aws/v1beta2
      Kind:         VirtualRouter
      ...
      Spec:
        Aws Name:  my-service-a-virtual-router_my-apps
        Listeners:
          Port Mapping:
            Port:      80
            Protocol:  http
        Mesh Ref:
          Name:  my-mesh
          UID:   111a11b1-c11d-1e1f-gh1i-j11k1l111m711
        Routes:
          Http Route:
            Action:
              Weighted Targets:
                Virtual Node Ref:
                  Name:  my-service-a
                Weight:  1
            Match:
              Prefix:  /
          Name:        my-service-a-route
      Status:
        Conditions:
          Last Transition Time:  2020-06-17T15:14:01Z
          Status:                True
          Type:                  VirtualRouterActive
        Observed Generation:     1
        Route AR Ns:
          My - Service - A - Route:  arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualRouter/my-service-a-virtual-router_my-apps/route/my-service-a-route
        Virtual Router ARN:          arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualRouter/my-service-a-virtual-router_my-apps
      Events:                        <none>
      ```

   1. Lihat sumber daya router virtual yang dibuat oleh pengontrol di App Mesh. Anda menentukan `my-service-a-virtual-router_my-apps` untuk`name`, karena ketika controller membuat router virtual di App Mesh, ia menambahkan nama namespace Kubernetes ke nama router virtual.

      ```
      aws appmesh describe-virtual-router --virtual-router-name my-service-a-virtual-router_my-apps --mesh-name my-mesh
      ```

      Output

      ```
      {
          "virtualRouter": {
              "meshName": "my-mesh",
              "metadata": {
                  "arn": "arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualRouter/my-service-a-virtual-router_my-apps",
                  "createdAt": "2020-06-17T10:14:01.547000-05:00",
                  "lastUpdatedAt": "2020-06-17T10:14:01.547000-05:00",
                  "meshOwner": "111122223333",
                  "resourceOwner": "111122223333",
                  "uid": "111a11b1-c11d-1e1f-gh1i-j11k1l111m711",
                  "version": 1
              },
              "spec": {
                  "listeners": [
                      {
                          "portMapping": {
                              "port": 80,
                              "protocol": "http"
                          }
                      }
                  ]
              },
              "status": {
                  "status": "ACTIVE"
              },
              "virtualRouterName": "my-service-a-virtual-router_my-apps"
          }
      }
      ```

   1. Melihat sumber daya rute yang dibuat oleh pengontrol di App Mesh. Sumber daya rute tidak dibuat di Kubernetes karena rute tersebut merupakan bagian dari konfigurasi router virtual di Kubernetes. Informasi rute ditampilkan dalam detail sumber daya Kubernetes di sub-langkah. `c` Kontroler tidak menambahkan nama namespace Kubernetes ke nama rute App Mesh saat membuat rute di App Mesh karena nama rute unik untuk router virtual.

      ```
      aws appmesh describe-route \
          --route-name my-service-a-route \
          --virtual-router-name my-service-a-virtual-router_my-apps \
          --mesh-name my-mesh
      ```

      Output

      ```
      {
          "route": {
              "meshName": "my-mesh",
              "metadata": {
                  "arn": "arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualRouter/my-service-a-virtual-router_my-apps/route/my-service-a-route",
                  "createdAt": "2020-06-17T10:14:01.577000-05:00",
                  "lastUpdatedAt": "2020-06-17T10:14:01.577000-05:00",
                  "meshOwner": "111122223333",
                  "resourceOwner": "111122223333",
                  "uid": "111a11b1-c11d-1e1f-gh1i-j11k1l111m711",
                  "version": 1
              },
              "routeName": "my-service-a-route",
              "spec": {
                  "httpRoute": {
                      "action": {
                          "weightedTargets": [
                              {
                                  "virtualNode": "my-service-a_my-apps",
                                  "weight": 1
                              }
                          ]
                      },
                      "match": {
                          "prefix": "/"
                      }
                  }
              },
              "status": {
                  "status": "ACTIVE"
              },
              "virtualRouterName": "my-service-a-virtual-router_my-apps"
          }
      }
      ```

1. Buat layanan virtual App Mesh. Layanan virtual adalah abstraksi dari layanan sebenarnya yang disediakan oleh simpul virtual secara langsung atau tidak langsung berdasarkan alat router virtual. Layanan dependen memanggil layanan virtual Anda dengan namanya. Meskipun nama tidak masalah untuk App Mesh, kami sarankan untuk menamai layanan virtual nama domain yang sepenuhnya memenuhi syarat dari layanan aktual yang diwakili oleh layanan virtual. Dengan menamai layanan virtual Anda dengan cara ini, Anda tidak perlu mengubah kode aplikasi Anda untuk mereferensikan nama yang berbeda. Permintaan dirutekan ke node virtual atau router virtual yang ditentukan sebagai penyedia layanan virtual.

   1. Simpan konten berikut ini ke file bernama `virtual-service.yaml` pada komputer Anda. File ini digunakan untuk membuat layanan virtual yang menggunakan penyedia router virtual untuk merutekan lalu lintas ke node virtual bernama `my-service-a` yang dibuat pada langkah sebelumnya. Nilai untuk `awsName` in `spec` adalah nama domain yang sepenuhnya memenuhi syarat (FQDN) dari layanan Kubernetes aktual yang diabstraksikan oleh layanan virtual ini. Layanan Kubernetes dibuat di. [Langkah 3: Buat atau perbarui layanan](#create-update-services) Untuk informasi selengkapnya, lihat [Layanan virtual](virtual_services.md).

      ```
      apiVersion: appmesh.k8s.aws/v1beta2
      kind: VirtualService
      metadata:
        name: my-service-a
        namespace: my-apps
      spec:
        awsName: my-service-a.my-apps.svc.cluster.local
        provider:
          virtualRouter:
            virtualRouterRef:
              name: my-service-a-virtual-router
      ```

      Untuk melihat semua pengaturan yang tersedia untuk layanan virtual yang dapat Anda atur dalam spesifikasi sebelumnya, jalankan perintah berikut.

      ```
      aws appmesh create-virtual-service --generate-cli-skeleton yaml-input
      ```

   1. Buat layanan virtual.

      ```
      kubectl apply -f virtual-service.yaml
      ```

   1. Lihat detail sumber daya layanan virtual Kubernetes yang telah dibuat.

      ```
      kubectl describe virtualservice my-service-a -n my-apps
      ```

      Output

      ```
      Name:         my-service-a
      Namespace:    my-apps
      Labels:       <none>
      Annotations:  kubectl.kubernetes.io/last-applied-configuration:
                      {"apiVersion":"appmesh.k8s.aws/v1beta2","kind":"VirtualService","metadata":{"annotations":{},"name":"my-service-a","namespace":"my-apps"}...
      API Version:  appmesh.k8s.aws/v1beta2
      Kind:         VirtualService
      Metadata:
        Creation Timestamp:  2020-06-17T15:48:40Z
        Finalizers:
          finalizers.appmesh.k8s.aws/aws-appmesh-resources
        Generation:        1
        Resource Version:  13598
        Self Link:         /apis/appmesh.k8s.aws/v1beta2/namespaces/my-apps/virtualservices/my-service-a
        UID:               111a11b1-c11d-1e1f-gh1i-j11k1l111m711
      Spec:
        Aws Name:  my-service-a.my-apps.svc.cluster.local
        Mesh Ref:
          Name:  my-mesh
          UID:   111a11b1-c11d-1e1f-gh1i-j11k1l111m711
        Provider:
          Virtual Router:
            Virtual Router Ref:
              Name:  my-service-a-virtual-router
      Status:
        Conditions:
          Last Transition Time:  2020-06-17T15:48:40Z
          Status:                True
          Type:                  VirtualServiceActive
        Observed Generation:     1
        Virtual Service ARN:     arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualService/my-service-a.my-apps.svc.cluster.local
      Events:                    <none>
      ```

   1. Lihat detail sumber daya layanan virtual yang dibuat oleh pengontrol di App Mesh. Kontroler Kubernetes tidak menambahkan nama namespace Kubernetes ke nama layanan virtual App Mesh ketika membuat layanan virtual di App Mesh karena nama layanan virtual adalah FQDN yang unik.

      ```
      aws appmesh describe-virtual-service --virtual-service-name my-service-a.my-apps.svc.cluster.local --mesh-name my-mesh
      ```

      Output

      ```
      {
          "virtualService": {
              "meshName": "my-mesh",
              "metadata": {
                  "arn": "arn:aws:appmesh:us-west-2:111122223333:mesh/my-mesh/virtualService/my-service-a.my-apps.svc.cluster.local",
                  "createdAt": "2020-06-17T10:48:40.182000-05:00",
                  "lastUpdatedAt": "2020-06-17T10:48:40.182000-05:00",
                  "meshOwner": "111122223333",
                  "resourceOwner": "111122223333",
                  "uid": "111a11b1-c11d-1e1f-gh1i-j11k1l111m711",
                  "version": 1
              },
              "spec": {
                  "provider": {
                      "virtualRouter": {
                          "virtualRouterName": "my-service-a-virtual-router_my-apps"
                      }
                  }
              },
              "status": {
                  "status": "ACTIVE"
              },
              "virtualServiceName": "my-service-a.my-apps.svc.cluster.local"
          }
      }
      ```

Meskipun tidak tercakup dalam tutorial ini, controller juga dapat menyebarkan App Mesh [Gerbang virtual](virtual_gateways.md) dan[Rute gerbang](gateway-routes.md). Untuk panduan penerapan sumber daya ini dengan pengontrol, lihat [Mengonfigurasi Gateway Masuk](https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/howto-k8s-ingress-gateway), atau [contoh manifes](https://github.com/aws/aws-app-mesh-examples/blob/main/walkthroughs/howto-k8s-ingress-gateway/v1beta2/manifest.yaml.template) yang menyertakan sumber daya pada. GitHub

## Langkah 3: Buat atau perbarui layanan
<a name="create-update-services"></a>

Pod apa pun yang ingin Anda gunakan dengan App Mesh harus memiliki wadah sidecar App Mesh yang ditambahkan ke dalamnya. Injektor secara otomatis menambahkan kontainer sidecar ke setiap pod yang digunakan dengan label yang Anda tentukan.

1. Aktifkan otorisasi proxy. Kami menyarankan Anda mengaktifkan setiap penerapan Kubernetes untuk melakukan streaming hanya konfigurasi untuk node virtual App Mesh miliknya sendiri.

   1. Simpan konten berikut ini ke file bernama `proxy-auth.json` pada komputer Anda. Pastikan untuk mengganti *alternate-colored values* dengan milik Anda sendiri.

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "appmesh:StreamAggregatedResources",
                  "Resource": [
                      "arn:aws:appmesh:us-east-1:111122223333:mesh/my-mesh/virtualNode/my-service-a_my-apps"
                  ]
              }
          ]
      }
      ```

------

   1. Buat kebijakan.

      ```
      aws iam create-policy --policy-name my-policy --policy-document file://proxy-auth.json
      ```

   1. Buat peran IAM, lampirkan kebijakan yang Anda buat pada langkah sebelumnya, buat akun layanan Kubernetes, dan ikat kebijakan ke akun layanan Kubernetes. Peran ini memungkinkan pengontrol untuk menambah, menghapus, dan mengubah resource App Mesh.

      ```
      eksctl create iamserviceaccount \
          --cluster $CLUSTER_NAME \
          --namespace my-apps \
          --name my-service-a \
          --attach-policy-arn  arn:aws:iam::111122223333:policy/my-policy \
          --override-existing-serviceaccounts \
          --approve
      ```

      Jika Anda lebih suka membuat akun layanan menggunakan Konsol Manajemen AWS atau AWS CLI, lihat [Membuat Peran dan kebijakan IAM untuk akun layanan Anda](https://docs.aws.amazon.com/eks/latest/userguide/create-service-account-iam-policy-and-role.html#create-service-account-iam-role) di *Panduan Pengguna Amazon EKS*. Jika Anda menggunakan Konsol Manajemen AWS atau AWS CLI untuk membuat akun, Anda juga perlu memetakan peran tersebut ke akun layanan Kubernetes. Untuk informasi selengkapnya, lihat [Menentukan peran IAM untuk akun layanan Anda](https://docs.aws.amazon.com/eks/latest/userguide/specify-service-account-role.html) di *Panduan Pengguna Amazon EKS*.

1. (Opsional) Jika Anda ingin menerapkan penerapan Anda ke pod Fargate, maka Anda perlu membuat profil Fargate. Jika Anda belum `eksctl` menginstal, Anda dapat menginstalnya dengan petunjuk di [Instalasi atau Upgrade `eksctl`](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html#installing-eksctl) di *Panduan Pengguna Amazon EKS*. Jika Anda lebih suka membuat profil menggunakan konsol, lihat [Membuat profil Fargate](https://docs.aws.amazon.com/eks/latest/userguide/fargate-profile.html#create-fargate-profile) di *Panduan Pengguna Amazon EKS*.

   ```
   eksctl create fargateprofile --cluster my-cluster --region Region-code --name my-service-a --namespace my-apps
   ```

1. Buat layanan dan deployment Kubernetes. Jika Anda memiliki penerapan yang sudah ada yang ingin Anda gunakan dengan App Mesh, maka Anda perlu menerapkan node virtual, seperti yang Anda lakukan di `3` sub-langkah. [Langkah 2: Menyebarkan sumber daya App Mesh](#configure-app-mesh) Perbarui penerapan Anda untuk memastikan bahwa labelnya cocok dengan label yang Anda tetapkan pada node virtual, sehingga kontainer sidecar ditambahkan secara otomatis ke pod dan pod di-deploy ulang.

   1. Simpan konten berikut ini ke file bernama `example-service.yaml` pada komputer Anda. Jika Anda mengubah nama namespace dan menggunakan pod Fargate, pastikan nama namespace cocok dengan nama namespace yang Anda tentukan di profil Fargate Anda.

      ```
      apiVersion: v1
      kind: Service
      metadata:
        name: my-service-a
        namespace: my-apps
        labels:
          app: my-app-1
      spec:
        selector:
          app: my-app-1
        ports:
          - protocol: TCP
            port: 80
            targetPort: 80
      ---
      apiVersion: apps/v1
      kind: Deployment
      metadata:
        name: my-service-a
        namespace: my-apps
        labels:
          app: my-app-1
      spec:
        replicas: 3
        selector:
          matchLabels:
            app: my-app-1
        template:
          metadata:
            labels:
              app: my-app-1
          spec:
            serviceAccountName: my-service-a
            containers:
            - name: nginx
              image: nginx:1.19.0
              ports:
              - containerPort: 80
      ```
**penting**  
Nilai untuk spesifikasi harus sesuai dengan nilai yang Anda tentukan saat Anda membuat node virtual di sub-langkah `3`[Langkah 2: Menyebarkan sumber daya App Mesh](#configure-app-mesh), atau kontainer sidecar tidak akan disuntikkan ke dalam pod. `app` `matchLabels` `selector` Pada contoh sebelumnya, nilai untuk label adalah`my-app-1`. Jika Anda menerapkan gateway virtual, bukan node virtual, maka `Deployment` manifes harus menyertakan hanya wadah Envoy. Untuk informasi selengkapnya tentang gambar yang akan digunakan, lihat[Gambar utusan](envoy.md). Untuk contoh manfest, lihat [contoh penerapan](https://github.com/aws/aws-app-mesh-examples/blob/main/walkthroughs/howto-k8s-ingress-gateway/v1beta2/manifest.yaml.template#L585) di. GitHub

   1. Menyebarkan layanan.

      ```
      kubectl apply -f example-service.yaml
      ```

   1. Lihat layanan dan penyebaran.

      ```
      kubectl -n my-apps get pods
      ```

      Output

      ```
      NAME                            READY   STATUS    RESTARTS   AGE
      my-service-a-54776556f6-2cxd9   2/2     Running   0          10s
      my-service-a-54776556f6-w26kf   2/2     Running   0          18s
      my-service-a-54776556f6-zw5kt   2/2     Running   0          26s
      ```

   1. Lihat detail untuk salah satu pod yang di-deploy.

      ```
      kubectl -n my-apps describe pod my-service-a-54776556f6-2cxd9
      ```

      Output dipersingkat

      ```
      Name:         my-service-a-54776556f6-2cxd9
      Namespace:    my-app-1
      Priority:     0
      Node:         ip-192-168-44-157.us-west-2.compute.internal/192.168.44.157
      Start Time:   Wed, 17 Jun 2020 11:08:59 -0500
      Labels:       app=nginx
                    pod-template-hash=54776556f6
      Annotations:  kubernetes.io/psp: eks.privileged
      Status:       Running
      IP:           192.168.57.134
      IPs:
        IP:           192.168.57.134
      Controlled By:  ReplicaSet/my-service-a-54776556f6
      Init Containers:
        proxyinit:
          Container ID:   docker://e0c4810d584c21ae0cb6e40f6119d2508f029094d0e01c9411c6cf2a32d77a59
          Image:          111345817488.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-proxy-route-manager:v2
          Image ID:       docker-pullable://111345817488.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-proxy-route-manager
          Port:           <none>
          Host Port:      <none>
          State:          Terminated
            Reason:       Completed
            Exit Code:    0
            Started:      Fri, 26 Jun 2020 08:36:22 -0500
            Finished:     Fri, 26 Jun 2020 08:36:22 -0500
          Ready:          True
          Restart Count:  0
          Requests:
            cpu:     10m
            memory:  32Mi
          Environment:
            APPMESH_START_ENABLED:         1
            APPMESH_IGNORE_UID:            1337
            APPMESH_ENVOY_INGRESS_PORT:    15000
            APPMESH_ENVOY_EGRESS_PORT:     15001
            APPMESH_APP_PORTS:             80
            APPMESH_EGRESS_IGNORED_IP:     169.254.169.254
            APPMESH_EGRESS_IGNORED_PORTS:  22
            AWS_ROLE_ARN:                  arn:aws:iam::111122223333:role/eksctl-app-mesh-addon-iamserviceaccount-my-a-Role1-NMNCVWB6PL0N
            AWS_WEB_IDENTITY_TOKEN_FILE:   /var/run/secrets/eks.amazonaws.com/serviceaccount/token
          ...
      Containers:
        nginx:
          Container ID:   docker://be6359dc6ecd3f18a1c87df7b57c2093e1f9db17d5b3a77f22585ce3bcab137a
          Image:          nginx:1.19.0
          Image ID:       docker-pullable://nginx
          Port:           80/TCP
          Host Port:      0/TCP
          State:          Running
            Started:      Fri, 26 Jun 2020 08:36:28 -0500
          Ready:          True
          Restart Count:  0
          Environment:
            AWS_ROLE_ARN:                 arn:aws:iam::111122223333:role/eksctl-app-mesh-addon-iamserviceaccount-my-a-Role1-NMNCVWB6PL0N
            AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token
          ...
        envoy:
          Container ID:   docker://905b55cbf33ef3b3debc51cb448401d24e2e7c2dbfc6a9754a2c49dd55a216b6
          Image:          840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.12.4.0-prod
          Image ID:       docker-pullable://840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy
          Port:           9901/TCP
          Host Port:      0/TCP
          State:          Running
            Started:      Fri, 26 Jun 2020 08:36:36 -0500
          Ready:          True
          Restart Count:  0
          Requests:
            cpu:     10m
            memory:  32Mi
          Environment:
            APPMESH_RESOURCE_ARN:         arn:aws:iam::111122223333:mesh/my-mesh/virtualNode/my-service-a_my-apps
            APPMESH_PREVIEW:              0
            ENVOY_LOG_LEVEL:              info
            AWS_REGION:                   us-west-2
            AWS_ROLE_ARN:                 arn:aws:iam::111122223333:role/eksctl-app-mesh-addon-iamserviceaccount-my-a-Role1-NMNCVWB6PL0N
            AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token
      ...
      Events:
        Type    Reason     Age   From                                                   Message
        ----    ------     ----  ----                                                   -------
        Normal  Pulling    30s   kubelet, ip-192-168-44-157.us-west-2.compute.internal  Pulling image "111345817488.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-proxy-route-manager:v2"
        Normal  Pulled     23s   kubelet, ip-192-168-44-157.us-west-2.compute.internal  Successfully pulled image "111345817488.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-proxy-route-manager:v2"
        Normal  Created    21s   kubelet, ip-192-168-44-157.us-west-2.compute.internal  Created container proxyinit
        Normal  Started    21s   kubelet, ip-192-168-44-157.us-west-2.compute.internal  Started container proxyinit
        Normal  Pulling    20s   kubelet, ip-192-168-44-157.us-west-2.compute.internal  Pulling image "nginx:1.19.0"
        Normal  Pulled     16s   kubelet, ip-192-168-44-157.us-west-2.compute.internal  Successfully pulled image "nginx:1.19.0"
        Normal  Created    15s   kubelet, ip-192-168-44-157.us-west-2.compute.internal  Created container nginx
        Normal  Started    15s   kubelet, ip-192-168-44-157.us-west-2.compute.internal  Started container nginx
        Normal  Pulling    15s   kubelet, ip-192-168-44-157.us-west-2.compute.internal  Pulling image "840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.12.4.0-prod"
        Normal  Pulled     8s    kubelet, ip-192-168-44-157.us-west-2.compute.internal  Successfully pulled image "840364872350.dkr.ecr.us-west-2.amazonaws.com/aws-appmesh-envoy:v1.12.4.0-prod"
        Normal  Created    7s    kubelet, ip-192-168-44-157.us-west-2.compute.internal  Created container envoy
        Normal  Started    7s    kubelet, ip-192-168-44-157.us-west-2.compute.internal  Started container envoy
      ```

      Pada output sebelumnya, Anda dapat melihat bahwa `envoy` kontainer `proxyinit` dan ditambahkan ke pod oleh pengontrol. Jika Anda menerapkan layanan contoh ke Fargate, maka `envoy` kontainer ditambahkan ke pod oleh pengontrol, tetapi `proxyinit` kontainer tidak.

1. (Opsional) Instal add-on seperti Prometheus, Grafana,, Jaeger, dan Datadog. AWS X-Ray Untuk informasi selengkapnya, lihat [add-on App Mesh](https://github.com/aws/eks-charts#app-mesh-add-ons) GitHub dan bagian [Observabilitas](https://docs.aws.amazon.com/app-mesh/latest/userguide/observability.html) dari Panduan Pengguna App Mesh. 

**catatan**  
Untuk contoh dan penelusuran lainnya untuk App Mesh, lihat repositori contoh [App Mesh](https://github.com/aws/aws-app-mesh-examples).

## Langkah 4: Membersihkan
<a name="remove-integration"></a>

Hapus semua sumber daya contoh yang dibuat dalam tutorial ini. Pengontrol juga menghapus sumber daya yang dibuat di mesh layanan `my-mesh` App Mesh.

```
kubectl delete namespace my-apps
```

Jika Anda membuat profil Fargate untuk layanan contoh, maka hapus.

```
eksctl delete fargateprofile --name my-service-a --cluster my-cluster --region Region-code
```

Hapus jala.

```
kubectl delete mesh my-mesh
```

(Opsional) Anda dapat menghapus komponen integrasi Kubernetes.

```
helm delete appmesh-controller -n appmesh-system
```

(Opsional) Jika Anda menerapkan komponen integrasi Kubernetes ke Fargate, hapus profil Fargate.

```
eksctl delete fargateprofile --name appmesh-system --cluster my-cluster --region Region-code
```

# Memulai dengan AWS App Mesh dan Amazon EC2
<a name="getting-started-ec2"></a>

**penting**  
Pemberitahuan akhir dukungan: Pada 30 September 2026, AWS akan menghentikan dukungan untuk. AWS App Mesh Setelah 30 September 2026, Anda tidak akan lagi dapat mengakses AWS App Mesh konsol atau AWS App Mesh sumber daya. Untuk informasi lebih lanjut, kunjungi posting blog ini [Migrasi dari AWS App Mesh ke Amazon ECS Service Connect](https://aws.amazon.com/blogs/containers/migrating-from-aws-app-mesh-to-amazon-ecs-service-connect). 

Topik ini membantu Anda menggunakan AWS App Mesh layanan aktual yang berjalan di Amazon EC2. Tutorial ini mencakup fitur dasar dari beberapa jenis sumber daya App Mesh.

## Skenario
<a name="scenario"></a>

Untuk mengilustrasikan cara menggunakan App Mesh, asumsikan bahwa Anda memiliki aplikasi dengan karakteristik sebagai berikut:
+ Terdiri dari dua layanan bernama `serviceA` dan`serviceB`. 
+ Kedua layanan terdaftar ke namespace bernama. `apps.local`
+ `ServiceA`berkomunikasi dengan `serviceB` lebih dari HTTP/2, port 80.
+  Anda telah menerapkan versi 2 `serviceB` dan mendaftarkannya dengan nama `serviceBv2` di `apps.local` namespace.

Anda memiliki persyaratan berikut:
+ Anda ingin mengirim 75 persen lalu lintas dari `serviceA` ke `serviceB` dan 25 persen lalu lintas ke yang `serviceBv2` pertama. Dengan hanya mengirim 25 persen ke`serviceBv2`, Anda dapat memvalidasi bahwa itu bebas bug sebelum Anda mengirim 100 persen lalu lintas dari`serviceA`.
+ Anda ingin dapat dengan mudah menyesuaikan bobot lalu lintas sehingga 100 persen lalu lintas masuk `serviceBv2` setelah terbukti dapat diandalkan. Setelah semua lalu lintas dikirim ke`serviceBv2`, Anda ingin berhenti`serviceB`.
+ Anda tidak ingin harus mengubah kode aplikasi atau pendaftaran penemuan layanan yang ada untuk layanan Anda yang sebenarnya untuk memenuhi persyaratan sebelumnya. 

Untuk memenuhi kebutuhan Anda, Anda memutuskan untuk membuat mesh layanan App Mesh dengan layanan virtual, node virtual, router virtual, dan rute. Setelah menerapkan mesh Anda, Anda memperbarui layanan Anda untuk menggunakan proxy Envoy. Setelah diperbarui, layanan Anda berkomunikasi satu sama lain melalui proxy Utusan daripada langsung satu sama lain.

## Prasyarat
<a name="prerequisites"></a>

App Mesh mendukung layanan Linux yang terdaftar dengan DNS, AWS Cloud Map, atau keduanya. Untuk menggunakan panduan memulai ini, kami sarankan Anda memiliki tiga layanan yang sudah ada yang terdaftar di DNS. Anda dapat membuat mesh layanan dan sumber dayanya bahkan jika layanan tidak ada, tetapi Anda tidak dapat menggunakan mesh sampai Anda telah menerapkan layanan yang sebenarnya.

Jika Anda belum menjalankan layanan, Anda dapat meluncurkan instans Amazon EC2 dan menyebarkan aplikasi ke dalamnya. Untuk informasi selengkapnya, lihat [Tutorial: Memulai instans Amazon EC2 Linux di Panduan](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-lamp-amazon-linux-2.html) Pengguna Amazon EC2. Langkah-langkah yang tersisa mengasumsikan bahwa layanan yang sebenarnya diberi nama `serviceA``serviceB`,, `serviceBv2` dan bahwa semua layanan dapat ditemukan melalui namespace bernama. `apps.local` 

## Langkah 1: Buat mesh dan layanan virtual
<a name="create-mesh-and-virtual-service"></a>

Mesh layanan adalah batas logis untuk lalu lintas jaringan antara layanan yang berada di dalamnya. Untuk informasi selengkapnya, lihat [Jala Layanan](meshes.md). Layanan virtual adalah abstraksi dari layanan yang sebenarnya. Untuk informasi selengkapnya, lihat [Layanan virtual](virtual_services.md). 

Buat sumber daya berikut:
+ Sebuah mesh bernama`apps`, karena semua layanan dalam skenario terdaftar ke `apps.local` namespace.
+ Layanan virtual bernama`serviceb.apps.local`, karena layanan virtual mewakili layanan yang dapat ditemukan dengan nama itu, dan Anda tidak ingin mengubah kode Anda untuk merujuk nama lain. Layanan virtual bernama `servicea.apps.local` ditambahkan pada langkah selanjutnya.

Anda dapat menggunakan AWS CLI versi 1.18.116 Konsol Manajemen AWS atau lebih tinggi atau 2.0.38 atau lebih tinggi untuk menyelesaikan langkah-langkah berikut. Jika menggunakan AWS CLI, gunakan `aws --version` perintah untuk memeriksa AWS CLI versi yang Anda instal. [Jika Anda tidak memiliki versi 1.18.116 atau lebih tinggi atau 2.0.38 atau lebih tinggi diinstal, maka Anda harus menginstal atau memperbarui. AWS CLI](https://docs.aws.amazon.com/cli/latest/reference/appmesh/cli-chap-install.html) Pilih tab untuk alat yang ingin Anda gunakan.

------
#### [ Konsol Manajemen AWS ]

1. Buka wizard yang dijalankan pertama kali konsol App Mesh saat memulai [https://console.aws.amazon.com/appmesh/.](https://console.aws.amazon.com/appmesh/get-started)

1. Untuk **nama Mesh**, masukkan**apps**.

1. Untuk **nama layanan virtual**, masukkan**serviceb.apps.local**.

1. Untuk melanjutkan, pilih **Berikutnya**.

------
#### [ AWS CLI ]

1. Buat mesh dengan `[create-mesh](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-mesh.html)` perintah.

   ```
   aws appmesh create-mesh --mesh-name apps
   ```

1. Buat layanan virtual dengan `[create-virtual-service](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-virtual-service.html)` perintah.

   ```
   aws appmesh create-virtual-service --mesh-name apps --virtual-service-name serviceb.apps.local --spec {}
   ```

------

## Langkah 2: Buat simpul virtual
<a name="create-virtual-node"></a>

Node virtual bertindak sebagai pointer logis ke layanan yang sebenarnya. Untuk informasi selengkapnya, lihat [Node virtual](virtual_nodes.md). 

Buat node virtual bernama`serviceB`, karena salah satu node virtual mewakili layanan yang sebenarnya bernama`serviceB`. Layanan aktual yang diwakili oleh node virtual dapat ditemukan melalui `DNS` dengan nama host dari. `serviceb.apps.local` Sebagai alternatif, Anda dapat menemukan layanan aktual menggunakan. AWS Cloud Map Node virtual mendengarkan lalu lintas menggunakan protokol HTTP/2 pada port 80. Protokol lain juga didukung, seperti halnya pemeriksaan kesehatan. Anda membuat node virtual untuk `serviceA` dan `serviceBv2` di langkah selanjutnya.

------
#### [ Konsol Manajemen AWS ]

1. Untuk **nama simpul Virtual**, masukkan**serviceB**. 

1. Untuk **metode Penemuan layanan**, pilih **DNS** dan masukkan **serviceb.apps.local** untuk nama host **DNS**.

1. **Di bawah **konfigurasi Listener**, pilih **http2** untuk **Protokol** dan masukkan **80** untuk Port.**

1. Untuk melanjutkan, pilih **Berikutnya**.

------
#### [ AWS CLI ]

1. Buat file bernama `create-virtual-node-serviceb.json` dengan konten berikut:

   ```
   {
       "meshName": "apps",
       "spec": {
           "listeners": [
               {
                   "portMapping": {
                       "port": 80,
                       "protocol": "http2"
                   }
               }
           ],
           "serviceDiscovery": {
               "dns": {
                   "hostname": "serviceB.apps.local"
               }
           }
       },
       "virtualNodeName": "serviceB"
   }
   ```

1. Buat node virtual dengan [create-virtual-node](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-virtual-node.html)perintah menggunakan file JSON sebagai input.

   ```
   aws appmesh create-virtual-node --cli-input-json file://create-virtual-node-serviceb.json
   ```

------

## Langkah 3: Buat router virtual dan rute
<a name="create-virtual-router-and-route"></a>

Router virtual merutekan lalu lintas untuk satu atau lebih layanan virtual di dalam mesh Anda. Untuk informasi selengkapnya, lihat [Router virtual](virtual_routers.md) dan [Rute](routes.md).

Buat sumber daya berikut:
+ Router virtual bernama`serviceB`, karena layanan `serviceB.apps.local` virtual tidak memulai komunikasi keluar dengan layanan lain. Ingatlah bahwa layanan virtual yang Anda buat sebelumnya adalah abstraksi dari `serviceb.apps.local` layanan Anda yang sebenarnya. Layanan virtual mengirimkan lalu lintas ke router virtual. Router virtual mendengarkan lalu lintas menggunakan protokol HTTP/2 pada port 80. Protokol lain juga didukung. 
+ Sebuah rute bernama`serviceB`. Ini merutekan 100 persen lalu lintasnya ke node `serviceB` virtual. Bobotnya ada di langkah selanjutnya setelah Anda menambahkan simpul `serviceBv2` virtual. Meskipun tidak tercakup dalam panduan ini, Anda dapat menambahkan kriteria filter tambahan untuk rute dan menambahkan kebijakan coba lagi untuk menyebabkan proxy Envoy melakukan beberapa upaya untuk mengirim lalu lintas ke node virtual ketika mengalami masalah komunikasi.

------
#### [ Konsol Manajemen AWS ]

1. Untuk **nama router Virtual,** masukkan**serviceB**.

1. **Di bawah **konfigurasi Listener**, pilih **http2** untuk **Protokol** dan tentukan **80** untuk Port.**

1. Untuk **nama Rute**, masukkan**serviceB**. 

1. Untuk **jenis Rute**, pilih **http2**.

1. Untuk **nama simpul Virtual** di bawah **konfigurasi Target**, pilih `serviceB` dan masukkan **100** untuk **Berat**.

1. Di bawah **konfigurasi Match**, pilih **Metode**.

1. Untuk melanjutkan, pilih **Berikutnya**.

------
#### [ AWS CLI ]

1. Buat router virtual.

   1. Buat file bernama `create-virtual-router.json` dengan konten berikut:

      ```
      {
          "meshName": "apps",
          "spec": {
              "listeners": [
                  {
                      "portMapping": {
                          "port": 80,
                          "protocol": "http2"
                      }
                  }
              ]
          },
          "virtualRouterName": "serviceB"
      }
      ```

   1. Buat router virtual dengan [create-virtual-router](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-virtual-router.html)perintah menggunakan file JSON sebagai input.

      ```
      aws appmesh create-virtual-router --cli-input-json file://create-virtual-router.json
      ```

1. Buat rute.

   1. Buat file bernama `create-route.json` dengan konten berikut:

      ```
      {
          "meshName" : "apps",
          "routeName" : "serviceB",
          "spec" : {
              "httpRoute" : {
                  "action" : {
                      "weightedTargets" : [
                          {
                              "virtualNode" : "serviceB",
                              "weight" : 100
                          }
                      ]
                  },
                  "match" : {
                      "prefix" : "/"
                  }
              }
          },
          "virtualRouterName" : "serviceB"
      }
      ```

   1. Buat rute dengan perintah [create-route](https://docs.aws.amazon.com/cli/latest/reference/appmesh/create-route.html) menggunakan file JSON sebagai input.

      ```
      aws appmesh create-route --cli-input-json file://create-route.json
      ```

------

## Langkah 4: Tinjau dan buat
<a name="review-create"></a>

Tinjau pengaturan terhadap instruksi sebelumnya.

------
#### [ Konsol Manajemen AWS ]

Pilih **Edit** jika Anda perlu membuat perubahan di bagian mana pun. Setelah Anda puas dengan pengaturan, pilih **Buat mesh**.

Layar **Status** menunjukkan kepada Anda semua sumber daya mesh yang dibuat. Anda dapat melihat sumber daya yang dibuat di konsol dengan memilih **View mesh**.

------
#### [ AWS CLI ]

Tinjau pengaturan mesh yang Anda buat dengan [perintah describe-mesh](https://docs.aws.amazon.com/cli/latest/reference/appmesh/describe-mesh.html).

```
aws appmesh describe-mesh --mesh-name apps
```

Tinjau pengaturan layanan virtual yang Anda buat dengan [describe-virtual-service](https://docs.aws.amazon.com/cli/latest/reference/appmesh/describe-virtual-service.html)perintah.

```
aws appmesh describe-virtual-service --mesh-name apps --virtual-service-name serviceb.apps.local
```

Tinjau pengaturan node virtual yang Anda buat dengan [describe-virtual-node](https://docs.aws.amazon.com/cli/latest/reference/appmesh/describe-virtual-node.html)perintah.

```
aws appmesh describe-virtual-node --mesh-name apps --virtual-node-name serviceB
```

Tinjau pengaturan router virtual yang Anda buat dengan [describe-virtual-router](https://docs.aws.amazon.com/cli/latest/reference/appmesh/describe-virtual-router.html)perintah.

```
aws appmesh describe-virtual-router --mesh-name apps --virtual-router-name serviceB
```

Tinjau pengaturan rute yang Anda buat dengan [perintah deskripsi-rute](https://docs.aws.amazon.com/cli/latest/reference/appmesh/describe-route.html).

```
aws appmesh describe-route --mesh-name apps \
    --virtual-router-name serviceB  --route-name serviceB
```

------

## Langkah 5: Buat sumber daya tambahan
<a name="create-additional-resources"></a>

Untuk menyelesaikan skenario, Anda perlu:
+ Buat satu node virtual bernama `serviceBv2` dan yang lain bernama`serviceA`. Kedua node virtual mendengarkan permintaan melalui HTTP/2 port 80. Untuk node `serviceA` virtual, konfigurasikan backend dari. `serviceb.apps.local` Semua lalu lintas keluar dari node `serviceA` virtual dikirim ke layanan virtual bernama`serviceb.apps.local`. Meskipun tidak tercakup dalam panduan ini, Anda juga dapat menentukan jalur file untuk menulis log akses untuk node virtual.
+ Buat satu layanan virtual tambahan bernama`servicea.apps.local`, yang mengirimkan semua lalu lintas langsung ke node `serviceA` virtual.
+ Perbarui `serviceB` rute yang Anda buat pada langkah sebelumnya untuk mengirim 75 persen lalu lintasnya ke node `serviceB` virtual dan 25 persen lalu lintasnya ke node `serviceBv2` virtual. Seiring waktu, Anda dapat terus memodifikasi bobot hingga `serviceBv2` menerima 100 persen dari lalu lintas. Setelah semua lalu lintas dikirim`serviceBv2`, Anda dapat mematikan dan menghentikan node `serviceB` virtual dan layanan aktual. Saat Anda mengubah bobot, kode Anda tidak memerlukan modifikasi apa pun, karena nama layanan `serviceb.apps.local` virtual dan aktual tidak berubah. Ingatlah bahwa layanan `serviceb.apps.local` virtual mengirimkan lalu lintas ke router virtual, yang merutekan lalu lintas ke node virtual. Nama penemuan layanan untuk node virtual dapat diubah kapan saja.

------
#### [ Konsol Manajemen AWS ]

1. Di panel navigasi kiri, pilih **Meshes**.

1. Pilih `apps` mesh yang Anda buat pada langkah sebelumnya.

1. Di panel navigasi kiri, pilih **Virtual nodes**.

1. Pilih **Buat simpul virtual**.

1. Untuk **nama simpul Virtual**, masukkan**serviceBv2**, untuk **metode penemuan Layanan**, pilih **DNS**, dan untuk **nama host DNS**, masukkan. **servicebv2.apps.local**

1. **Untuk **konfigurasi Listener**, pilih **http2** untuk **Protokol** dan masukkan **80** untuk Port.**

1. Pilih **Buat simpul virtual**.

1. Pilih **Buat simpul virtual** lagi. Masukkan **serviceA** untuk **nama simpul Virtual**. Untuk **metode Penemuan layanan**, pilih **DNS**, dan untuk **nama host DNS**, masukkan. **servicea.apps.local**

1. Untuk **Masukkan nama layanan virtual** di bawah **Backend baru**, masukkan. **serviceb.apps.local**

1. Di bawah **konfigurasi Listener**, pilih **http2** untuk **Protokol**, masukkan **80** untuk **Port**, dan kemudian pilih **Buat** simpul virtual.

1. Di panel navigasi kiri, pilih **Router virtual** dan kemudian pilih router `serviceB` virtual dari daftar.

1. **Di bawah Rute, pilih rute bernama `ServiceB` yang Anda buat pada langkah sebelumnya, dan pilih **Edit**.**

1. Di bawah **Target**, **nama simpul Virtual**, ubah nilai **Weight** `serviceB` untuk menjadi**75**.

1. Pilih **Tambah target**, pilih `serviceBv2` dari daftar dropdown, dan atur nilai **Weight** ke. **25**

1. Pilih **Simpan**.

1. Di panel navigasi kiri, pilih **Layanan virtual** dan kemudian pilih **Buat layanan virtual**.

1. Masukkan **servicea.apps.local** **nama layanan Virtual**, pilih **Virtual node** for **Provider**, pilih `serviceA` untuk **Virtual node**, dan kemudian pilih **Create Virtual Service.**

------
#### [ AWS CLI ]

1. Buat node `serviceBv2` virtual.

   1. Buat file bernama `create-virtual-node-servicebv2.json` dengan konten berikut:

      ```
      {
          "meshName": "apps",
          "spec": {
              "listeners": [
                  {
                      "portMapping": {
                          "port": 80,
                          "protocol": "http2"
                      }
                  }
              ],
              "serviceDiscovery": {
                  "dns": {
                      "hostname": "serviceBv2.apps.local"
                  }
              }
          },
          "virtualNodeName": "serviceBv2"
      }
      ```

   1. Buat node virtual.

      ```
      aws appmesh create-virtual-node --cli-input-json file://create-virtual-node-servicebv2.json
      ```

1. Buat node `serviceA` virtual.

   1. Buat file bernama `create-virtual-node-servicea.json` dengan konten berikut:

      ```
      {
         "meshName" : "apps",
         "spec" : {
            "backends" : [
               {
                  "virtualService" : {
                     "virtualServiceName" : "serviceb.apps.local"
                  }
               }
            ],
            "listeners" : [
               {
                  "portMapping" : {
                     "port" : 80,
                     "protocol" : "http2"
                  }
               }
            ],
            "serviceDiscovery" : {
               "dns" : {
                  "hostname" : "servicea.apps.local"
               }
            }
         },
         "virtualNodeName" : "serviceA"
      }
      ```

   1. Buat node virtual.

      ```
      aws appmesh create-virtual-node --cli-input-json file://create-virtual-node-servicea.json
      ```

1. Perbarui layanan `serviceb.apps.local` virtual yang Anda buat pada langkah sebelumnya untuk mengirim lalu lintas ke router `serviceB` virtual. Ketika layanan virtual awalnya dibuat, itu tidak mengirim lalu lintas ke mana pun, karena router `serviceB` virtual belum dibuat.

   1. Buat file bernama `update-virtual-service.json` dengan konten berikut:

      ```
      {
         "meshName" : "apps",
         "spec" : {
            "provider" : {
               "virtualRouter" : {
                  "virtualRouterName" : "serviceB"
               }
            }
         },
         "virtualServiceName" : "serviceb.apps.local"
      }
      ```

   1. Perbarui layanan virtual dengan [update-virtual-service](https://docs.aws.amazon.com/cli/latest/reference/appmesh/update-virtual-service.html)perintah.

      ```
      aws appmesh update-virtual-service --cli-input-json file://update-virtual-service.json
      ```

1. Perbarui `serviceB` rute yang Anda buat di langkah sebelumnya.

   1. Buat file bernama `update-route.json` dengan konten berikut:

      ```
      {
         "meshName" : "apps",
         "routeName" : "serviceB",
         "spec" : {
            "http2Route" : {
               "action" : {
                  "weightedTargets" : [
                     {
                        "virtualNode" : "serviceB",
                        "weight" : 75
                     },
                     {
                        "virtualNode" : "serviceBv2",
                        "weight" : 25
                     }
                  ]
               },
               "match" : {
                  "prefix" : "/"
               }
            }
         },
         "virtualRouterName" : "serviceB"
      }
      ```

   1. Perbarui rute dengan perintah [update-route](https://docs.aws.amazon.com/cli/latest/reference/appmesh/update-route.html).

      ```
      aws appmesh update-route --cli-input-json file://update-route.json
      ```

1. Buat layanan `serviceA` virtual.

   1. Buat file bernama `create-virtual-servicea.json` dengan konten berikut:

      ```
      {
         "meshName" : "apps",
         "spec" : {
            "provider" : {
               "virtualNode" : {
                  "virtualNodeName" : "serviceA"
               }
            }
         },
         "virtualServiceName" : "servicea.apps.local"
      }
      ```

   1. Buat layanan virtual.

      ```
      aws appmesh create-virtual-service --cli-input-json file://create-virtual-servicea.json
      ```

------

**Ringkasan mesh**  
Sebelum Anda membuat mesh layanan, Anda memiliki tiga layanan aktual bernama`servicea.apps.local`,`serviceb.apps.local`, dan`servicebv2.apps.local`. Selain layanan yang sebenarnya, Anda sekarang memiliki mesh layanan yang berisi sumber daya berikut yang mewakili layanan sebenarnya:
+ Dua layanan virtual. Proxy mengirimkan semua lalu lintas dari layanan `servicea.apps.local` virtual ke layanan `serviceb.apps.local` virtual melalui router virtual. 
+ Tiga node virtual bernama`serviceA`,`serviceB`, dan`serviceBv2`. Proxy Envoy menggunakan informasi penemuan layanan yang dikonfigurasi untuk node virtual untuk mencari alamat IP dari layanan yang sebenarnya. 
+ Satu router virtual dengan satu rute yang menginstruksikan proxy Utusan untuk merutekan 75 persen lalu lintas masuk ke node `serviceB` virtual dan 25 persen lalu lintas ke node virtual. `serviceBv2` 

## Langkah 6: Perbarui layanan
<a name="update-services"></a>

Setelah membuat mesh Anda, Anda harus menyelesaikan tugas-tugas berikut:
+ Otorisasi proxy Envoy yang Anda gunakan dengan setiap layanan untuk membaca konfigurasi satu atau lebih node virtual. Untuk informasi selengkapnya tentang cara mengotorisasi proxy, lihat[Otorisasi Proxy Utusan](proxy-authorization.md).
+ Untuk memperbarui layanan Anda yang ada, selesaikan langkah-langkah berikut.

**Untuk mengonfigurasi instans Amazon EC2 sebagai anggota node virtual**

1. Buat peran IAM.

   1. Buat file bernama `ec2-trust-relationship.json` dengan isi berikut ini.

------
#### [ JSON ]

****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "Service": "ec2.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
          }
        ]
      }
      ```

------

   1. Buat peran IAM dengan perintah berikut.

      ```
      aws iam create-role --role-name mesh-virtual-node-service-b --assume-role-policy-document file://ec2-trust-relationship.json
      ```

1. Lampirkan kebijakan IAM ke peran yang memungkinkannya membaca dari Amazon ECR dan hanya konfigurasi node virtual App Mesh tertentu.

   1. Buat file bernama `virtual-node-policy.json` dengan konten berikut. `apps`adalah nama mesh yang Anda buat [Langkah 1: Buat mesh dan layanan virtual](#create-mesh-and-virtual-service) dan `serviceB` merupakan nama node virtual yang Anda buat[Langkah 2: Buat simpul virtual](#create-virtual-node). Ganti *111122223333* dengan ID akun Anda dan *us-west-2* dengan Wilayah tempat Anda membuat mesh.

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Action": "appmesh:StreamAggregatedResources",
                  "Resource": [
                      "arn:aws:appmesh:us-west-2:111122223333:mesh/apps/virtualNode/serviceB"
                  ]
              }
          ]
      }
      ```

------

   1. Buat kebijakan dengan perintah berikut.

      ```
      aws iam create-policy --policy-name virtual-node-policy --policy-document file://virtual-node-policy.json
      ```

   1. Lampirkan kebijakan yang Anda buat di langkah sebelumnya ke peran sehingga peran dapat membaca konfigurasi hanya untuk node `serviceB` virtual dari App Mesh.

      ```
      aws iam attach-role-policy --policy-arn arn:aws:iam::111122223333:policy/virtual-node-policy --role-name mesh-virtual-node-service-b
      ```

   1. Lampirkan kebijakan `AmazonEC2ContainerRegistryReadOnly` terkelola ke peran sehingga dapat menarik image container Envoy dari Amazon ECR.

      ```
      aws iam attach-role-policy --policy-arn arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly --role-name mesh-virtual-node-service-b
      ```

1. [Luncurkan instans Amazon EC2 dengan peran IAM](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html#launch-instance-with-role) yang Anda buat. 

1. Connect ke instans Anda melalui SSH.

1. Instal Docker dan AWS CLI pada instance Anda sesuai dengan dokumentasi sistem operasi Anda.

1. Otentikasi ke repositori Envoy Amazon ECR di Wilayah tempat Anda ingin klien Docker Anda menarik gambarnya.
   + Semua Wilayah kecuali`me-south-1`,`ap-east-1`,`ap-southeast-3`,`eu-south-1`,`il-central-1`, dan`af-south-1`. Anda dapat mengganti *us-west-2* dengan [Wilayah yang didukung](https://docs.aws.amazon.com/general/latest/gr/appmesh.html) kecuali`me-south-1`,,`ap-east-1`,`ap-southeast-3`,`eu-south-1`,`il-central-1`, dan`af-south-1`.

     ```
     $aws ecr get-login-password \
         --region us-west-2 \
     | docker login \
         --username AWS \
         --password-stdin 840364872350.dkr.ecr.us-west-2.amazonaws.com
     ```
   + Wilayah `me-south-1`

     ```
     $aws ecr get-login-password \
         --region me-south-1 \
     | docker login \
         --username AWS \
         --password-stdin 772975370895.dkr.ecr.me-south-1.amazonaws.com
     ```
   + Wilayah `ap-east-1`

     ```
     $aws ecr get-login-password \
         --region ap-east-1 \
     | docker login \
         --username AWS \
         --password-stdin 856666278305.dkr.ecr.ap-east-1.amazonaws.com
     ```

1. Jalankan salah satu perintah berikut untuk memulai container App Mesh Envoy pada instance Anda, bergantung pada Region mana Anda ingin menarik gambarnya. *serviceB*Nilai-nilai *apps* dan adalah mesh dan nama node virtual yang didefinisikan dalam skenario. Informasi ini memberi tahu proxy konfigurasi node virtual mana yang akan dibaca dari App Mesh. Untuk menyelesaikan skenario, Anda juga perlu menyelesaikan langkah-langkah ini untuk instans Amazon EC2 yang meng-host layanan yang diwakili oleh node `serviceBv2` dan `serviceA` virtual. Untuk aplikasi Anda sendiri, ganti nilai-nilai ini dengan milik Anda sendiri.
   + Semua Wilayah kecuali`me-south-1`,`ap-east-1`,`ap-southeast-3`,`eu-south-1`,`il-central-1`, dan`af-south-1`. Anda dapat mengganti *Region-code* dengan [Wilayah apa pun yang didukung](https://docs.aws.amazon.com/general/latest/gr/appmesh.html) kecuali`me-south-1`,`ap-east-1`,`ap-southeast-3`,`eu-south-1`,,`il-central-1`, dan `af-south-1` Wilayah. Anda dapat mengganti `1337` dengan nilai apa pun antara `0` dan`2147483647`.

     ```
     sudo docker run --detach --env APPMESH_RESOURCE_ARN=mesh/apps/virtualNode/serviceB  \
     -u 1337 --network host 840364872350.dkr.ecr.region-code.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod
     ```
   + `me-south-1`Wilayah. Anda dapat mengganti `1337` dengan nilai apa pun antara `0` dan`2147483647`.

     ```
     sudo docker run --detach --env APPMESH_RESOURCE_ARN=mesh/apps/virtualNode/serviceB  \
     -u 1337 --network host 772975370895.dkr.ecr.me-south-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod
     ```
   + `ap-east-1`Wilayah. Anda dapat mengganti `1337` dengan nilai apa pun antara `0` dan`2147483647`.

     ```
     sudo docker run --detach --env APPMESH_RESOURCE_ARN=mesh/apps/virtualNode/serviceB  \
     -u 1337 --network host 856666278305.dkr.ecr.ap-east-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod
     ```
**catatan**  
`APPMESH_RESOURCE_ARN`Properti memerlukan versi `1.15.0` atau yang lebih baru dari gambar Utusan. Untuk informasi selengkapnya, lihat [Gambar utusan](envoy.md).
**penting**  
Hanya versi v1.9.0.0-prod atau yang lebih baru yang didukung untuk digunakan dengan App Mesh.

1. Pilih `Show more` di bawah ini. Buat file bernama `envoy-networking.sh` pada instance Anda dengan konten berikut. Ganti *8000* dengan port yang digunakan kode aplikasi Anda untuk lalu lintas masuk. Anda dapat mengubah nilainya`APPMESH_IGNORE_UID`, tetapi nilainya harus sama dengan nilai yang Anda tentukan pada langkah sebelumnya; misalnya`1337`. Anda dapat menambahkan alamat tambahan `APPMESH_EGRESS_IGNORED_IP` jika perlu. Jangan memodifikasi baris lainnya.

   ```
   #!/bin/bash -e
   
   #
   # Start of configurable options
   #
   
   
   #APPMESH_START_ENABLED="0"
   APPMESH_IGNORE_UID="1337"
   APPMESH_APP_PORTS="8000"
   APPMESH_ENVOY_EGRESS_PORT="15001"
   APPMESH_ENVOY_INGRESS_PORT="15000"
   APPMESH_EGRESS_IGNORED_IP="169.254.169.254,169.254.170.2" 
   
   # Enable routing on the application start.
   [ -z "$APPMESH_START_ENABLED" ] && APPMESH_START_ENABLED="0"
   
   # Enable IPv6.
   [ -z "$APPMESH_ENABLE_IPV6" ] && APPMESH_ENABLE_IPV6="0"
   
   # Egress traffic from the processess owned by the following UID/GID will be ignored.
   if [ -z "$APPMESH_IGNORE_UID" ] && [ -z "$APPMESH_IGNORE_GID" ]; then
       echo "Variables APPMESH_IGNORE_UID and/or APPMESH_IGNORE_GID must be set."
       echo "Envoy must run under those IDs to be able to properly route it's egress traffic."
       exit 1
   fi
   
   # Port numbers Application and Envoy are listening on.
   if [ -z "$APPMESH_ENVOY_EGRESS_PORT" ]; then
       echo "APPMESH_ENVOY_EGRESS_PORT must be defined to forward traffic from the application to the proxy."
       exit 1
   fi
   
   # If an app port was specified, then we also need to enforce the proxies ingress port so we know where to forward traffic.
   if [ ! -z "$APPMESH_APP_PORTS" ] && [ -z "$APPMESH_ENVOY_INGRESS_PORT" ]; then
       echo "APPMESH_ENVOY_INGRESS_PORT must be defined to forward traffic from the APPMESH_APP_PORTS to the proxy."
       exit 1
   fi
   
   # Comma separated list of ports for which egress traffic will be ignored, we always refuse to route SSH traffic.
   if [ -z "$APPMESH_EGRESS_IGNORED_PORTS" ]; then
       APPMESH_EGRESS_IGNORED_PORTS="22"
   else
       APPMESH_EGRESS_IGNORED_PORTS="$APPMESH_EGRESS_IGNORED_PORTS,22"
   fi
   
   #
   # End of configurable options
   #
   
   function initialize() {
       echo "=== Initializing ==="
       if [ ! -z "$APPMESH_APP_PORTS" ]; then
           iptables -t nat -N APPMESH_INGRESS
           if [ "$APPMESH_ENABLE_IPV6" == "1" ]; then
               ip6tables -t nat -N APPMESH_INGRESS
           fi
       fi
       iptables -t nat -N APPMESH_EGRESS
       if [ "$APPMESH_ENABLE_IPV6" == "1" ]; then
           ip6tables -t nat -N APPMESH_EGRESS
       fi
   }
   
   function enable_egress_routing() {
       # Stuff to ignore
       [ ! -z "$APPMESH_IGNORE_UID" ] && \
           iptables -t nat -A APPMESH_EGRESS \
           -m owner --uid-owner $APPMESH_IGNORE_UID \
           -j RETURN
   
       [ ! -z "$APPMESH_IGNORE_GID" ] && \
           iptables -t nat -A APPMESH_EGRESS \
           -m owner --gid-owner $APPMESH_IGNORE_GID \
           -j RETURN
   
       [ ! -z "$APPMESH_EGRESS_IGNORED_PORTS" ] && \
           for IGNORED_PORT in $(echo "$APPMESH_EGRESS_IGNORED_PORTS" | tr "," "\n"); do
             iptables -t nat -A APPMESH_EGRESS \
             -p tcp \
             -m multiport --dports "$IGNORED_PORT" \
             -j RETURN
           done
   
       if [ "$APPMESH_ENABLE_IPV6" == "1" ]; then
         # Stuff to ignore ipv6
         [ ! -z "$APPMESH_IGNORE_UID" ] && \
             ip6tables -t nat -A APPMESH_EGRESS \
             -m owner --uid-owner $APPMESH_IGNORE_UID \
             -j RETURN
   
         [ ! -z "$APPMESH_IGNORE_GID" ] && \
             ip6tables -t nat -A APPMESH_EGRESS \
             -m owner --gid-owner $APPMESH_IGNORE_GID \
             -j RETURN
   
         [ ! -z "$APPMESH_EGRESS_IGNORED_PORTS" ] && \
           for IGNORED_PORT in $(echo "$APPMESH_EGRESS_IGNORED_PORTS" | tr "," "\n"); do
             ip6tables -t nat -A APPMESH_EGRESS \
             -p tcp \
             -m multiport --dports "$IGNORED_PORT" \
             -j RETURN
           done
       fi
   
       # The list can contain both IPv4 and IPv6 addresses. We will loop over this list
       # to add every IPv4 address into `iptables` and every IPv6 address into `ip6tables`.
       [ ! -z "$APPMESH_EGRESS_IGNORED_IP" ] && \
           for IP_ADDR in $(echo "$APPMESH_EGRESS_IGNORED_IP" | tr "," "\n"); do
               if [[ $IP_ADDR =~ .*:.* ]]
               then
                   [ "$APPMESH_ENABLE_IPV6" == "1" ] && \
                       ip6tables -t nat -A APPMESH_EGRESS \
                           -p tcp \
                           -d "$IP_ADDR" \
                           -j RETURN
               else
                   iptables -t nat -A APPMESH_EGRESS \
                       -p tcp \
                       -d "$IP_ADDR" \
                       -j RETURN
               fi
           done
   
       # Redirect everything that is not ignored
       iptables -t nat -A APPMESH_EGRESS \
           -p tcp \
           -j REDIRECT --to $APPMESH_ENVOY_EGRESS_PORT
   
       # Apply APPMESH_EGRESS chain to non local traffic
       iptables -t nat -A OUTPUT \
           -p tcp \
           -m addrtype ! --dst-type LOCAL \
           -j APPMESH_EGRESS
   
       if [ "$APPMESH_ENABLE_IPV6" == "1" ]; then
           # Redirect everything that is not ignored ipv6
           ip6tables -t nat -A APPMESH_EGRESS \
               -p tcp \
               -j REDIRECT --to $APPMESH_ENVOY_EGRESS_PORT
           # Apply APPMESH_EGRESS chain to non local traffic ipv6
           ip6tables -t nat -A OUTPUT \
               -p tcp \
               -m addrtype ! --dst-type LOCAL \
               -j APPMESH_EGRESS
       fi
   
   }
   
   function enable_ingress_redirect_routing() {
       # Route everything arriving at the application port to Envoy
       iptables -t nat -A APPMESH_INGRESS \
           -p tcp \
           -m multiport --dports "$APPMESH_APP_PORTS" \
           -j REDIRECT --to-port "$APPMESH_ENVOY_INGRESS_PORT"
   
       # Apply AppMesh ingress chain to everything non-local
       iptables -t nat -A PREROUTING \
           -p tcp \
           -m addrtype ! --src-type LOCAL \
           -j APPMESH_INGRESS
   
       if [ "$APPMESH_ENABLE_IPV6" == "1" ]; then
           # Route everything arriving at the application port to Envoy ipv6
           ip6tables -t nat -A APPMESH_INGRESS \
               -p tcp \
               -m multiport --dports "$APPMESH_APP_PORTS" \
               -j REDIRECT --to-port "$APPMESH_ENVOY_INGRESS_PORT"
   
           # Apply AppMesh ingress chain to everything non-local ipv6
           ip6tables -t nat -A PREROUTING \
               -p tcp \
               -m addrtype ! --src-type LOCAL \
               -j APPMESH_INGRESS
       fi
   }
   
   function enable_routing() {
       echo "=== Enabling routing ==="
       enable_egress_routing
       if [ ! -z "$APPMESH_APP_PORTS" ]; then
           enable_ingress_redirect_routing
       fi
   }
   
   function disable_routing() {
       echo "=== Disabling routing ==="
       iptables -t nat -F APPMESH_INGRESS
       iptables -t nat -F APPMESH_EGRESS
   
       if [ "$APPMESH_ENABLE_IPV6" == "1" ]; then
           ip6tables -t nat -F APPMESH_INGRESS
           ip6tables -t nat -F APPMESH_EGRESS
       fi
   }
   
   function dump_status() {
       echo "=== iptables FORWARD table ==="
       iptables -L -v -n
       echo "=== iptables NAT table ==="
       iptables -t nat -L -v -n
   
       if [ "$APPMESH_ENABLE_IPV6" == "1" ]; then
           echo "=== ip6tables FORWARD table ==="
           ip6tables -L -v -n
           echo "=== ip6tables NAT table ==="
           ip6tables -t nat -L -v -n
       fi
   }
   
   function clean_up() {
       disable_routing
       ruleNum=$(iptables -L PREROUTING -t nat --line-numbers | grep APPMESH_INGRESS | cut -d " " -f 1)
       iptables -t nat -D PREROUTING $ruleNum
   
       ruleNum=$(iptables -L OUTPUT -t nat --line-numbers | grep APPMESH_EGRESS | cut -d " " -f 1)
       iptables -t nat -D OUTPUT $ruleNum
   
       iptables -t nat -X APPMESH_INGRESS
       iptables -t nat -X APPMESH_EGRESS
   
       if [ "$APPMESH_ENABLE_IPV6" == "1" ]; then
           ruleNum=$(ip6tables -L PREROUTING -t nat --line-numbers | grep APPMESH_INGRESS | cut -d " " -f 1)
           ip6tables -t nat -D PREROUTING $ruleNum
   
           ruleNum=$(ip6tables -L OUTPUT -t nat --line-numbers | grep APPMESH_EGRESS | cut -d " " -f 1)
           ip6tables -t nat -D OUTPUT $ruleNum
   
           ip6tables -t nat -X APPMESH_INGRESS
           ip6tables -t nat -X APPMESH_EGRESS
       fi
   }
   
   function main_loop() {
       echo "=== Entering main loop ==="
       while read -p '> ' cmd; do
           case "$cmd" in
               "quit")
                   clean_up
                   break
                   ;;
               "status")
                   dump_status
                   ;;
               "enable")
                   enable_routing
                   ;;
               "disable")
                   disable_routing
                   ;;
               *)
                   echo "Available commands: quit, status, enable, disable"
                   ;;
           esac
       done
   }
   
   function print_config() {
       echo "=== Input configuration ==="
       env | grep APPMESH_ || true
   }
   
   print_config
   
   initialize
   
   if [ "$APPMESH_START_ENABLED" == "1" ]; then
       enable_routing
   fi
   
   main_loop
   ```

1. Untuk mengonfigurasi `iptables` aturan untuk merutekan lalu lintas aplikasi ke proxy Envoy, jalankan skrip yang Anda buat di langkah sebelumnya.

   ```
   sudo ./envoy-networking.sh
   ```

1. Mulai kode aplikasi node virtual Anda.

**catatan**  
Untuk contoh dan penelusuran lainnya untuk App Mesh, lihat repositori contoh [App Mesh](https://github.com/aws/aws-app-mesh-examples).

# Contoh App Mesh
<a name="examples"></a>

**penting**  
Pemberitahuan akhir dukungan: Pada 30 September 2026, AWS akan menghentikan dukungan untuk. AWS App Mesh Setelah 30 September 2026, Anda tidak lagi dapat mengakses AWS App Mesh konsol atau AWS App Mesh sumber daya. Untuk informasi lebih lanjut, kunjungi posting blog ini [Migrasi dari AWS App Mesh ke Amazon ECS Service Connect](https://aws.amazon.com/blogs/containers/migrating-from-aws-app-mesh-to-amazon-ecs-service-connect). 

Anda dapat menemukan end-to-end panduan yang menunjukkan AWS App Mesh contoh tindakan dan kode untuk diintegrasikan dengan berbagai AWS layanan di repositori berikut:

[Contoh App Mesh](https://github.com/aws/aws-app-mesh-examples)