

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# AWS App Mesh および Kubernetes の開始方法
<a name="getting-started-kubernetes"></a>

**重要**  
サポート終了通知: 2026 年 9 月 30 日、 AWS はサポートを終了します AWS App Mesh。2026 年 9 月 30 日以降、 AWS App Mesh コンソールまたは AWS App Mesh リソースにアクセスできなくなります。詳細については、このブログ記事[「 から Amazon ECS Service Connect AWS App Mesh への移行](https://aws.amazon.com/blogs/containers/migrating-from-aws-app-mesh-to-amazon-ecs-service-connect)」を参照してください。

App Mesh Controller for Kubernetes を使用して Kubernetes AWS App Mesh と統合する場合、メッシュ、仮想サービス、仮想ノード、仮想ルーター、Kubernetes 経由のルートなどの App Mesh リソースを管理します。また、Kubernetes ポッド仕様に App Mesh サイドカーコンテナイメージを自動的に追加できます。このチュートリアルでは、Kubernetes 用 App Mesh コントローラーをインストールして、この統合を有効にする方法について説明します。

コントローラーには、Kubernetes カスタムリソース定義 `meshes`、`virtual services`、`virtual nodes`、`virtual routers` のデプロイが備わっています。コントローラーは、カスタムリソースの作成、変更、削除を監視し、App Mesh API を通じて、対応する App Mesh の [サービスメッシュ](meshes.md) [仮想サービス](virtual_services.md)、[仮想ノード](virtual_nodes.md)、[仮想ゲートウェイ](virtual_gateways.md)、[ゲートウェイルート](gateway-routes.md)、[仮想ルーター](virtual_routers.md) ([ルート](routes.md) を含む)などのリソースを変更します。詳細を確認したり、コントローラーに貢献したりするには、[GitHub プロジェクト](https://github.com/aws/aws-app-mesh-controller-for-k8s)を参照してください。

コントローラーは、指定した名前でラベル付けされた Kubernetes ポッドに、次のコンテナを挿入する Webhook もインストールします。
+ **App Mesh Envoy プロキシ** — Envoy は、App Mesh コントロールプレーンで定義されている設定を使用して、アプリケーショントラフィックの送信先を決定します。
+ **App Mesh プロキシルートマネージャー**– Envoyを介してインバウンドトラフィックとアウトバウンドトラフィックをルーティングするポッドのネットワーク名前空間の `iptables` ルールを更新します。このコンテナは、ポッド内の Kubernetes init コンテナとして実行されます。

## 前提条件
<a name="mesh-k8s-integration-prerequisites"></a>
+ App Mesh の概念を既に理解している。詳細については、「[とは AWS App Mesh](what-is-app-mesh.md)」を参照してください。
+ Kubernetes の概念を既に理解している。詳細については、Kubernetes ドキュメントの「[Kubernetes とは](https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/)」を参照してください。
+ 既存の Kubernetes クラスター。既存のクラスターがない場合は、「[Amazon EKS ユーザーガイド](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)」の「*Amazon EKS の開始方法*」を参照してください。Amazon EC2 で独自の Kubernetes クラスターを実行している場合は、Envoy イメージがある Amazon ECR リポジトリに対して Docker が認証されていることを確認してください。詳細については、「Amazon Elastic Container Registry ユーザーガイド」の「[Envoy イメージ](https://docs.aws.amazon.com/app-mesh/latest/userguide/envoy.html)」、「[レジストリの認証](https://docs.aws.amazon.com/AmazonECR/latest/userguide/Registries.html#registry_auth)」、および「Kubernetesドキュメント」の「[プライベートレジストリからイメージをプルする](https://kubernetes.io/docs/tasks/configure-pod-container/pull-image-private-registry/)」を参照してください。
+ App Mesh は、DNS に登録されている Linux サービス AWS Cloud Map、またはその両方をサポートしています。この入門ガイドを使用するには、DNS に登録されている3つの既存のサービスをお勧めします。このトピックの手順は、既存のサービスが、`serviceA`、`serviceB`、`serviceBv2` という名前で、すべてのサービスが `apps.local` という名前の名前空間を介して検出可能であることを前提としています。

  サービスが存在しない場合でもサービスメッシュとそのリソースを作成できますが、実際のサービスをデプロイするまでメッシュを使用することはできません。
+  AWS CLI バージョン 1.18.116 以降または 2.0.38 以降がインストールされている。をインストールまたはアップグレードするには AWS CLI、[「 のインストール AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)」を参照してください。
+ Kubernetes クラスターと通信するよう設定されている `kubectl` クライアント。Amazon Elastic Kubernetes Service を使用している場合は、`[kubectl](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)` のインストール手順と `[kubeconfig](https://docs.aws.amazon.com/eks/latest/userguide/create-kubeconfig.html)` ファイルの設定手順を実行してください。
+ Helm バージョン 3.0 以降がインストールされています。Helm がインストールされていない場合は、「*Amazon EKS ユーザーガイド*」の「[Amazon EKS での Helm の使用](https://docs.aws.amazon.com/eks/latest/userguide/helm.html)」を参照してください。
+ Amazon EKS は現在、`IPv4_ONLY` および `IPv6_ONLY` の IP 設定にのみ対応しています。これは、Amazon EKS が `IPv4` トラフィックのみまたは `IPv6` トラフィックのみを処理できるポッドのみを現在サポートしているためです。

残りのステップでは、実際のサービスが `serviceA`、`serviceB`、`serviceBv2` という名前で、すべてのサービスが `apps.local` という名前の名前空間を介して検出可能であることを前提としています。

## ステップ 1: 統合コンポーネントをインストールする
<a name="install-controller"></a>

App Mesh で使用するポッドをホストする各クラスターに、統合コンポーネントを 1 回インストールします。

**統合コンポーネントをインストールするには**

1. この手順の残りのステップでは、プレリリースバージョンのコントローラーがインストールされていないクラスターが必要です。プレリリースバージョンをインストールした場合、またはインストールしたかどうかが不明な場合は、プレリリースバージョンがクラスターにインストールされているかどうかを確認するスクリプトをダウンロードし、実行できます。

   ```
   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
   ```

   スクリプトが `Your cluster is ready for upgrade. Please proceed to the installation instructions` を返した場合は、次のステップに進むことができます。別のメッセージが返された場合は、続行する前にアップグレード手順を完了する必要があります。プレリリースバージョンのアップグレードの詳細については、GitHub の「[アップグレード](https://github.com/aws/eks-charts/blob/master/stable/appmesh-controller/README.md#upgrade)」を参照してください。

1. `eks-charts` リポジトリを Helm に追加します。

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

1. App Mesh Kubernetes カスタムリソース定義 (CRD) をインストールします。

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

1. コントローラーの Kubernetes 名前空間を作成します。

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

1. 後の手順で使用するために、次の数を設定します。`{{cluster-name}}` と `{{Region-code}}` を既存のクラスターの値に置き換えます。

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

1. (オプション) Fargate でコントローラーを実行する場合は、Fargate プロファイルを作成する必要があります。`eksctl` をンストールしていない場合は、「*Amazon EKS ユーザーガイド*」の「[`eksctl` のインストールまたはアップグレード](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html#installing-eksctl)」を参照してください。コンソールを使用してプロファイルを作成する場合は、「*Amazon EKS ユーザーガイド*」の「[Fargate プロファイルの作成](https://docs.aws.amazon.com/eks/latest/userguide/fargate-profile.html#create-fargate-profile)」を参照してください。

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

1. クラスターの OpenID 接続 (OIDC) ID プロバイダーを作成します。`eksctl` をインストールしていない場合、「*Amazon EKS ユーザーガイド*」の「[`eksctl` のインストールまたはアップグレード](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html#installing-eksctl)」の手順に従ってインストールできます。コンソールを使用してプロバイダーを作成する場合、「*Amazon EKS ユーザーガイド*」の「[クラスターでのサービスアカウントの IAM ロールの有効化](https://docs.aws.amazon.com/eks/latest/userguide/enable-iam-roles-for-service-accounts.html)」を参照してください。

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

1. IAM ロールを作成し、 [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) と [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 管理ポリシーをアタッチして、Kubernetes `appmesh-controller` サービスアカウントにバインドします。このロールにより、コントローラーは App Mesh リソースの追加、削除、変更を行うことができます。
**注記**  
コマンドは、自動生成された名前で AWS IAM ロールを作成します。作成された IAM ロール名を指定することはできません。

   ```
   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
   ```

    AWS マネジメントコンソール または を使用してサービスアカウントを作成する場合は AWS CLI、*「Amazon EKS* [ユーザーガイド」の「サービスアカウントの IAM ロールとポリシー](https://docs.aws.amazon.com/eks/latest/userguide/create-service-account-iam-policy-and-role.html#create-service-account-iam-role)の作成」を参照してください。 AWS マネジメントコンソール または を使用してアカウント AWS CLI を作成する場合は、ロールを Kubernetes サービスアカウントにマッピングする必要もあります。詳細については、「*Amazon EKS ユーザーガイド*」の「[サービスアカウントの IAM ロールを指定する](https://docs.aws.amazon.com/eks/latest/userguide/specify-service-account-role.html)」を参照してください。

1. 

**App Mesh コントローラーをデプロイします。すべての設定オプションの一覧については、GitHub の「[設定](https://github.com/aws/eks-charts/blob/master/stable/appmesh-controller/README.md#configuration)」を参照してください。**

   1. プライベートクラスターの App Mesh コントローラーをデプロイするには、まず、リンクされたプライベートサブネットへの App Mesh エンドポイントおよびサービス検出 Amazon VPC エンドポイントを有効にする必要があります。また、`accountId` を設定する必要があります。

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

      プライベートクラスターで X-Ray トレースを有効にするには、X-Ray エンドポイントおよび Amazon ECR Amazon VPC エンドポイントを有効にします。コントローラーはデフォルトで `public.ecr.aws/xray/aws-xray-daemon:latest` を使用するため、このイメージをローカルにプルし、[ECR 個人リポジトリにプッシュ](https://docs.aws.amazon.com/AmazonECR/latest/userguide/docker-push-ecr-image.html)します。
**注記**  
現在、[Amazon VPC エンドポイント](https://docs.aws.amazon.com/AmazonECR/latest/userguide/vpc-endpoints.html)は Amazon ECR パブリックリポジトリをサポートしていません。

      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}}
      ```

      アプリケーションのデプロイを仮想ノードまたはゲートウェイにバインドするときに、X-Ray デーモンが正常に挿入されるかどうかを検証します。

      詳細については、「*Amazon EKS ユーザーガイド*」の「[プライベートクラスター](https://docs.aws.amazon.com/eks/latest/userguide/private-clusters.html)」を参照してください。

   1. 他のクラスターの App Mesh コントローラーをデプロイします。すべての設定オプションの一覧については、GitHub の「[設定](https://github.com/aws/eks-charts/blob/master/stable/appmesh-controller/README.md#configuration)」を参照してください。

      ```
      helm upgrade -i appmesh-controller eks/appmesh-controller \
          --namespace appmesh-system \
          --set region=$AWS_REGION \
          --set serviceAccount.create=false \
          --set serviceAccount.name=appmesh-controller
      ```
**注記**  
Amazon EKS クラスターファミリーが `IPv6` の場合、App Mesh コントローラーをデプロイするときに、前のコマンド `--set clusterName=$CLUSTER_NAME` に次のオプションを追加してクラスター名を設定してください。
**重要**  
クラスターが `me-south-1`、`ap-east-1`、`ap-southeast-3`、`eu-south-1`、`il-central-1`、または `af-south-1` リージョンにある場合は、前のコマンドに次のオプションを追加する必要があります。  
{{account-id}}と{{Region-code}}を適切な値のセットの 1 つに置き換えます。  

       ```
        --set image.repository={{account-id}}.dkr.ecr.{{Region-code}}.amazonaws.com/amazon/appmesh-controller
       ```
772975370895.dkr.ecr.me-south-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod
856666278305.dkr.ecr.ap-east-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod
909464085924.dkr.ecr.ap-southeast-3.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod
422531588944.dkr.ecr.eu-south-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod
564877687649.dkr.ecr.il-central-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod
924023996002.dkr.ecr.af-south-1.amazonaws.com/aws-appmesh-envoy:v1.34.13.0-prod
以前のイメージの URI については、GitHub の[変更ログ](https://github.com/aws/aws-app-mesh-controller-for-k8s/releases)を参照してください。イメージが存在する AWS アカウントがバージョン で変更されました`v1.5.0`。以前のバージョンのイメージは、Amazon Elastic Kubernetes Service の [Amazon コンテナイメージレジストリ](https://docs.aws.amazon.com/eks/latest/userguide/add-ons-images.html)にある AWS アカウントでホストされています。

       ```
       --set sidecar.image.repository={{account-id}}.dkr.ecr.{{Region-code}}.amazonaws.com/aws-appmesh-envoy
       ```
772975370895.dkr.ecr.me-south-1.amazonaws.com/amazon/appmesh-controller:v1.13.1
856666278305.dkr.ecr.ap-east-1.amazonaws.com/amazon/appmesh-controller:v1.13.1
909464085924.dkr.ecr.ap-southeast-3.amazonaws.com/amazon/appmesh-controller:v1.13.1
422531588944.dkr.ecr.eu-south-1.amazonaws.com/amazon/appmesh-controller:v1.13.1
564877687649.dkr.ecr.il-central-1.amazonaws.com/amazon/appmesh-controller:v1.13.1
924023996002.dkr.ecr.af-south-1.amazonaws.com/amazon/appmesh-controller: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/aws-appmesh-proxy-route-manager:v7-prod
856666278305.dkr.ecr.ap-east-1.amazonaws.com/aws-appmesh-proxy-route-manager:v7-prod
909464085924.dkr.ecr.ap-southeast-3.amazonaws.com/aws-appmesh-proxy-route-manager:v7-prod
422531588944.dkr.ecr.eu-south-1.amazonaws.com/aws-appmesh-proxy-route-manager:v7-prod
564877687649.dkr.ecr.il-central-1.amazonaws.com/aws-appmesh-proxy-route-manager:v7-prod
924023996002.dkr.ecr.af-south-1.amazonaws.com/aws-appmesh-proxy-route-manager:v7-prod
**重要**  
App Mesh での使用は、バージョン v1.9.0.0-prod 以降のみサポートされています。

1. コントローラーのバージョンが `v1.4.0` 以降であることを確認します。GitHub の [change log](https://github.com/aws/aws-app-mesh-controller-for-k8s/releases) を確認できます。

   ```
   kubectl get deployment appmesh-controller \
       -n appmesh-system \
       -o json  | jq -r ".spec.template.spec.containers[].image" | cut -f2 -d ':'
   ```
**注記**  
実行中のコンテナのログを表示すると、次のテキストを含む行が表示されますが、無視しても問題ありません。  

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

## ステップ2：App Mesh リソースをデプロイするには
<a name="configure-app-mesh"></a>

Kubernetes でアプリケーションをデプロイするときは、Kubernetes カスタムリソースも作成し、コントローラーが対応する App Mesh リソースを作成できるようにします 次の手順は、App Mesh リソースの一部の機能をデプロイするのに役立ちます。他の App Mesh リソース機能をデプロイするためのマニフェストの例は、GitHub 上の [App Mesh チュートリアル](https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs) 一覧されている多くの機能フォルダの `v1beta2` サブフォルダにあります。

**重要**  
コントローラーによって App Mesh リソースが作成されたら、App Mesh リソースの変更または削除は、コントローラーのみを使用して行うことをお勧めします。App Mesh を使用してリソースの変更または削除をする場合、デフォルトでは、コントローラーは、変更または削除された AppMesh リソースを10時間の間、変更または再作成しません。この期間を短く設定できます。詳細については、GitHub の「[設定](https://github.com/aws/eks-charts/blob/master/stable/appmesh-controller/README.md#configuration)」を参照してください。

**App Mesh リソースをデプロイするには**

1. App Mesh リソースをデプロイする Kubernetes 名前空間を作成します。

   1. 次の内容をコンピュータ上の `namespace.yaml` という名前のファイルに保存します。

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

   1. 名前空間を作成します。

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

1. App Mesh サービスメッシュを作成します。

   1. 次の内容をコンピュータ上の `mesh.yaml` という名前のファイルに保存します。このファイルは、`{{my-mesh}}` という名前のメッシュリソースを作成するために使用されます。サービスメッシュは、サービス間のネットワークトラフィックの論理的な境界であり、サービスはその中に存在します。

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

   1. メッシュを作成します。

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

   1. 作成された Kubernetes メッシュリソースの詳細を表示します。

      ```
      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. コントローラーによって作成された App Mesh サービスメッシュの詳細を表示します。

      ```
      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. App Mesh 仮想ノードを作成します。仮想ノードは、Kubernetes デプロイメントへの論理ポインタとして機能します。

   1. 次の内容をコンピュータ上の `virtual-node.yaml` という名前のファイルに保存します。このファイルは、`{{my-service-a}}` という名前の付いた App Mesh 仮想ノードを、{{`my-apps`}} 名前空間に作成するために使用されます。仮想ノードは、後のステップで作成される Kubernetes サービスを表します。`hostname` の値は、この仮想ノードが表す実際のサービスの完全修飾 DNS ホスト名です。

      ```
      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}}
      ```

      仮想ノードには、このチュートリアルでは扱われていないエンドツーエンドの暗号化やヘルスチェックなどの機能があります。詳細については、「[仮想ノード](virtual_nodes.md)」を参照してください。前述の仕様で設定できる仮想ノードで使用可能なすべての設定を表示するには、次のコマンドを実行します。

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

   1. 仮想ノードをデプロイします。

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

   1. 作成された Kubernetes 仮想ノードリソースの詳細を表示します。

      ```
      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. App Mesh でコントローラーによって作成された仮想ノードの詳細を表示します。
**注記**  
Kubernetes で作成される仮想ノードの名前は `{{my-service-a}}` ですが、App Mesh で作成される仮想ノードの名前は `{{my-service-a_my-apps}}` です。コントローラーは、App Mesh リソースの作成時に、Kubernetes 名前空間名を App Mesh 仮想ノード名に追加します。Kubernetes では、異なる名前空間に同じ名前の仮想ノードを作成できるため、名前空間名が追加されますがますが、App 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. App Mesh 仮想ルーターを作成します。仮想ルーターは、メッシュ内の 1 つ以上の仮想サービスのトラフィックを処理します。

   1. 次の内容をコンピュータ上の `virtual-router.yaml` という名前のファイルに保存します。このファイルは、前のステップで作成された `my-service-a` という名前の仮想ノードにトラフィックをルーティングする仮想ルーターを作成するために使用されます。コントローラーは App Mesh 仮想ルーターを作成し、リソースをルーティングします。ルートにさらに多くの機能を指定し、`http` 以外のプロトコルを使用することができます。詳細については、「[仮想ルーター](virtual_routers.md)」および「[ルート](routes.md)」を参照してください。参照される仮想ノード名は、 Kubernetes 仮想ノード名であり、コントローラーによって App Mesh で作成された App Mesh 仮想ノード名ではないことに注意してください。

      ```
      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}}
      ```

      (オプション) 前述の仕様で設定できる仮想ルーターに使用できるすべての設定を表示するには、次のコマンドを実行します。

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

      前述の仕様で設定できるルートに使用できるすべての設定を表示するには、次のコマンドを実行します。

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

   1. 仮想ルーターをデプロイします。

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

   1. 作成された Kubernetes 仮想ルーターリソースを表示します。

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

      省略された出力

      ```
      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. App Mesh でコントローラーによって作成された仮想ルーターリソースを表示します。コントローラーが App Mesh で仮想ルーターを作成したときに、仮想ルーターの名前に Kubernetes 名前空間名が追加されたため、`name` の `my-service-a-virtual-router_my-apps` を指定します。

      ```
      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. App Mesh でコントローラーによって作成されたルートリソースを表示します。その ルートは Kubernetes の仮想ルーター設定の一部であるため、ルートリソースが Kubernetes で作成されませんでした。ルート情報は、サブステップ `c` の Kubernetes リソースの詳細に表示されました。ルート名が仮想ルーターに固有であるため、コントローラーは、App Mesh　 でルートを作成したときに、AppMesh ルート名に Kubernetes 名前空間名を追加しませんでした。

      ```
      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. App Mesh 仮想サービスを作成します。仮想サービスは、仮想ノードが仮想ルーターを使用して直接または間接的に提供する実際のサービスを抽象化したものです。依存サービスは、仮想サービスを名前で呼び出します。名前は AppMesh にとって重要ではありませんが、仮想サービスに、仮想サービスが表す実際のサービスの完全修飾ドメイン名を付けるようお勧めします。このように仮想サービスに名前を付けることで、別の名前を参照するようにアプリケーションコードを変更する必要がなくなります。リクエストは、仮想サービスのプロバイダーとして指定されている仮想ノードまたは仮想ルーターにルーティングされます。

   1. 次の内容をコンピュータ上の `virtual-service.yaml` という名前のファイルに保存します。このファイルは、仮想ルータープロバイダーを使用して、前のステップで作成された `my-service-a` という名前の仮想ノードにトラフィックをルーティングする仮想サービスを作成するために使用されます。`spec` の `awsName` に対する値 は、この仮想サービスが抽象化する実際の Kubernetes サービスの完全修飾ドメイン名 (FQDN) です。Kubernetes サービスは「[ステップ 3: サービスを作成または更新する](#create-update-services)」で作成されます。詳細については、「[仮想サービス](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}}
      ```

      前述の仕様で設定できる仮想サービスに使用できるすべての設定を表示するには、次のコマンドを実行します。

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

   1. 仮想サービスを作成します。

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

   1. 作成された Kubernetes 仮想サービスリソースの詳細を表示します。

      ```
      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. App Mesh でコントローラーによって作成された仮想サービスリソースの詳細を表示します。仮想サービスの名前が一意の FQDN であるため、Kubernetes コントローラーは、App Mesh で仮想サービスを作成したときに、App Mesh 仮想サービス名に Kubernetes 名前空間名を追加しませんでした。

      ```
      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"
          }
      }
      ```

このチュートリアルでは説明していませんが、コントローラーは App Mesh [仮想ゲートウェイ](virtual_gateways.md) と [ゲートウェイルート](gateway-routes.md)をデプロイすることもできます。コントローラーでこれらのリソースをデプロイするチュートリアルについては、「[インバウンドゲートウェイの設定](https://github.com/aws/aws-app-mesh-examples/tree/main/walkthroughs/howto-k8s-ingress-gateway)」、または「[マニフェストサンプル](https://github.com/aws/aws-app-mesh-examples/blob/main/walkthroughs/howto-k8s-ingress-gateway/v1beta2/manifest.yaml.template)」(GitHub のリソースを含む) を参照してください。

## ステップ 3: サービスを作成または更新する
<a name="create-update-services"></a>

App Mesh で使用するポッドには、App Mesh サイドカーコンテナを追加する必要があります。インジェクターは、指定したラベルでデプロイされたポッドに、自動的にサイドカーコンテナを追加します。

1. プロキシ認可を有効にします。各 Kubernetes デプロイメントを有効にして、独自の App Mesh 仮想ノードの設定のみをストリーミングするようお勧めします。

   1. 次の内容をコンピュータ上の `proxy-auth.json` という名前のファイルに保存します。{{alternate-colored values}} は、独自の値に置き換えてください。

------
#### [ 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. ポリシーを作成します。

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

   1. IAM ロールを作成して、前のステップで作成したポリシーをそれにアタッチし、Kubernetes サービスアカウントを作成した後、ポリシーを Kubernetes サービスアカウントにバインドします。このロールにより、コントローラーは 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
      ```

       AWS マネジメントコンソール または を使用してサービスアカウントを作成する場合は AWS CLI、*「Amazon EKS* [ユーザーガイド」の「サービスアカウントの IAM ロールとポリシー](https://docs.aws.amazon.com/eks/latest/userguide/create-service-account-iam-policy-and-role.html#create-service-account-iam-role)の作成」を参照してください。 AWS マネジメントコンソール または を使用してアカウント AWS CLI を作成する場合は、ロールを Kubernetes サービスアカウントにマッピングする必要もあります。詳細については、「*Amazon EKS ユーザーガイド*」の「[サービスアカウントの IAM ロールを指定する](https://docs.aws.amazon.com/eks/latest/userguide/specify-service-account-role.html)」を参照してください。

1. (オプション) デプロイを Fargate ポッドにデプロイする場合は、Fargate プロファイルを作成する必要があります。`eksctl` をインストールしていない場合、「*Amazon EKS ユーザーガイド*」の「[`eksctl` のインストールまたはアップグレード](https://docs.aws.amazon.com/eks/latest/userguide/eksctl.html#installing-eksctl)」の手順に従ってインストールできます。コンソールを使用してプロファイルを作成する場合は、「*Amazon EKS ユーザーガイド*」の「[Fargate プロファイルの作成](https://docs.aws.amazon.com/eks/latest/userguide/fargate-profile.html#create-fargate-profile)」を参照してください。

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

1. Kubernetes サービスとデプロイメントを作成します。App Mesh で使用する既存のデプロイがある場合は、「[ステップ2：App Mesh リソースをデプロイするには](#configure-app-mesh)」のサブステップ `3` で行ったように、仮想ノードをデプロイする必要があります。デプロイを更新して、そのラベルが仮想ノードに設定したラベルに一致しているか確認し、サイドカーコンテナが自動的にポッドに追加され、ポッドが再デプロイされるようにします。

   1. 次の内容をコンピュータ上の `example-service.yaml` という名前のファイルに保存します。名前空間名を変更して Fargate ポッドを使用している場合は、名前空間名が Fargate プロファイルで定義した名前空間名と一致していることを確認してください。

      ```
      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}}
      ```
**重要**  
仕様の `app`、`matchLabels`、`selector` の値は、`3` のサブステップ [ステップ2：App Mesh リソースをデプロイするには](#configure-app-mesh) で仮想ノードを作成したときに指定した値と一致する必要があります。一致しないと、サイドカーコンテナがポッドに挿入されません。前の例では、ラベルの値は `my-app-1` です。仮想ノードではなく仮想ゲートウェイをデプロイする場合は、`Deployment` マニフェストには、Envoy コンテナのみを含める必要があります。使用する画像の詳細については、「[Envoy イメージ](envoy.md)」を参照してください。マニフェストの例については、GitHub の「[デプロイの例](https://github.com/aws/aws-app-mesh-examples/blob/main/walkthroughs/howto-k8s-ingress-gateway/v1beta2/manifest.yaml.template#L585)」を参照してください。

   1. サービスをデプロイします。

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

   1. サービスとデプロイメントを表示します。

      ```
      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. デプロイ済みポッドの 1 つの詳細を表示します。

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

      省略された出力

      ```
      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
      ```

      上記の出力では、コントローラーによって `envoy` および `proxyinit` コンテナがポッドに追加されたことがわかります。サンプルサービスを Fargate にデプロイした場合は、`envoy` コンテナはコントローラーによってポッドに追加されましたが、`proxyinit` コンテナはそうではありませんでした。

1. (オプション) Prometheus、Grafana、Jaeger AWS X-Ray、Datadog などのアドオンをインストールします。詳しい情報については、GitHub の「[App Mesh アドオン](https://github.com/aws/eks-charts#app-mesh-add-ons)」と「App Mesh ユーザーガイド」の「[オブザーバビリティ](https://docs.aws.amazon.com/app-mesh/latest/userguide/observability.html)」セクションを参照してください。

**注記**  
App Mesh のその他の例とチュートリアルについては、[App Mesh サンプルリポジトリ](https://github.com/aws/aws-app-mesh-examples)を参照してください。

## ステップ 4: クリーンアップする
<a name="remove-integration"></a>

このチュートリアルで作成したサンプルリソースをすべて削除します。コントローラーは、`my-mesh` App Mesh サービスメッシュで作成されたリソースも削除します。

```
kubectl delete namespace {{my-apps}}
```

サンプルサービスの Fargate プロファイルを作成した場合は、それを削除します。

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

メッシュを削除します。

```
kubectl delete mesh {{my-mesh}}
```

(オプション) Kubernetes 統合コンポーネントを削除できます。

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

(オプション) Kubernetes 統合コンポーネントを Fargate にデプロイした場合は、Fargate プロファイルを削除します。

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