

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

# gRPC ベースのアプリケーションを Amazon EKS クラスターにデプロイし、Application Load Balancer でアクセスする
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer"></a>

*Amazon Web Services、Kirankumar Chandrashekar、Huy Nguyen*

## 概要
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-summary"></a>

このパターンでは、gRPC ベースのアプリケーションを Amazon Elastic Kubernetes Service (Amazon EKS) クラスターでホストし、Application Load Balancer を介して安全にアクセスする方法を説明します。

「[gRPC](https://grpc.io/)」は、任意の環境で実行できるオープンソースのリモートプロシージャコール (RPC) フレームワークです。マイクロサービスの統合やクライアントとサーバーの通信に使用できます。gRPC の詳細については、AWS ブログのポスト「[Application Load Balancer support for end-to-end HTTP/2 and gRPC](https://aws.amazon.com/blogs/aws/new-application-load-balancer-support-for-end-to-end-http-2-and-grpc/)」を参照してください。

このパターンは、Amazon EKS で Kubernetes ポッドとして実行される gRPC ベースアプリケーションの実行環境を提供する方法を示しています。gRPC クライアントは、SSL/TLS 暗号化接続を使用して、HTTP/2 プロトコルを介して Application Load Balancer に接続します。Application Load Balancer は、Amazon EKS ポッドで実行される gRPC アプリケーションにトラフィックを転送します。gRPC ポッドの数は、「[Kubernetes 水平ポッドオートスケーラー](https://docs.aws.amazon.com/eks/latest/userguide/horizontal-pod-autoscaler.html)」 を使用してトラフィックに基づいて自動的にスケーリングできます。Application Load Balancer のターゲットグループは Amazon EKS ノードのヘルスチェックを行い、ターゲットが正常かどうかを評価して、正常なノードにのみトラフィックを転送します。

## 前提条件と制限事項
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-prereqs"></a>

**前提条件**
+ アクティブな AWS アカウント。
+ [Docker](https://www.docker.com/)、Linux、macOS、または Windows にインストールして設定します。
+ Linux、macOS または Windows にインストールして設定されている「[AWS Command Line Interface (AWS CLI) バージョン 2](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html)」。
+ Linux、macOS、または Windows にインストールして設定されている [eksctl](https://github.com/eksctl-io/eksctl#installation)。
+ `kubectl`、Amazon EKS クラスターのリソースにアクセスするようにインストールおよび設定されています。詳細については、「Amazon EKS ドキュメント」の「[kubectl のインストールまたは更新](https://docs.aws.amazon.com/eks/latest/userguide/install-kubectl.html)」を参照してください。 
+ 「[GrpCurl](https://github.com/fullstorydev/grpcurl)」、インストールおよび設定。
+ 新規もしくは既存の Amazon EKS クラスター。詳細については、「[Amazon EKS を使い始める](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html)」を参照してください。
+ Amazon EKS クラスターにアクセスするように設定されたコンピュータのターミナル。詳細については、「Amazon EKS ドキュメント」の「[クラスターと通信するようにコンピュータを設定する](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-console.html#eks-configure-kubectl)」を参照してください。
+ Amazon EKS クラスターにプロビジョニングされた「[AWS Load Balancer Controller](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html)」 
+ 有効な SSL または SSL/TLS 証明書を持つ既存の DNS ホスト名。AWS Certificate Manager (ACM) を使用するか、既存の証明書を ACM にアップロードすることで、ドメインの証明書を取得できます。この 2 つのオプションの詳細については、ACM ドキュメントの 「[パブリック証明書のリクエスト](https://docs.aws.amazon.com/acm/latest/userguide/gs-acm-request-public.html)」 と 「[AWS 認定 Manager への証明書のインポート](https://docs.aws.amazon.com/acm/latest/userguide/import-certificate.html)」 を参照してください。

## アーキテクチャ
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-architecture"></a>

次の図に、このパターンが構築するアーキテクチャを示します。

![\[Amazon EKS での gRPC ベースアプリケーションのアーキテクチャ\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/abf727c1-ff8b-43a7-923f-bce825d1b459/images/281936fa-bc43-4b4e-a343-ba1eab97df38.png)


 

次の図は、SSL/TLS トラフィックを gRPC クライアントから受信し、Application Load Balancer にオフロードするワークフローを示しています。トラフィックは仮想プライベートクラウド (VPC) から送信されるため、gRPC サーバーにはプレーンテキストで転送されます。

![\[SSL/TLS トラフィックを gRPC サーバーに送信するワークフロー\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/images/pattern-img/abf727c1-ff8b-43a7-923f-bce825d1b459/images/09e0c3f6-0c39-40b7-908f-8c4c693a5f02.png)


## ツール
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-tools"></a>

**AWS サービス**
+ [AWS コマンドラインインターフェイス (AWS CLI)](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html) はオープンソースのツールであり、コマンドラインシェルのコマンドを使用して AWS サービスとやり取りすることができます。
+ 受信したアプリケーションまたはネットワークトラフィックを複数のターゲットに分散するには、[Elastic Load Balancing](https://docs.aws.amazon.com/elasticloadbalancing/latest/userguide/what-is-load-balancing.html) を使用します。例えば、1 つまたは複数のアベイラビリティーゾーンの Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、コンテナ、および IP アドレスにトラフィックを分散できます。
+ 「[Amazon Elastic Container Registry (Amazon ECR)](https://docs.aws.amazon.com/AmazonECR/latest/userguide/what-is-ecr.html)」 は、セキュリティ、スケーラビリティ、信頼性を備えたマネージドコンテナイメージレジストリサービスです。 
+ [Amazon Elastic Kubernetes Service (Amazon EKS)](https://docs.aws.amazon.com/eks/latest/userguide/getting-started.html) は、 で Kubernetes を実行する際に役立ちます。独自の Kubernetes コントロールプレーンまたはノードをインストールおよび維持する必要はありません。 

**ツール**
+ [eksctl](https://eksctl.io/) は、Amazon EKS 上にクラスターを作成するためのシンプルな CLI ツールです。
+ 「[kubectl](https://kubernetes.io/docs/tasks/tools/install-kubectl/)」は、 Kubernetes クラスターに対してコマンドを実行するためのコマンドラインユーティリティです。
+ [AWS Load Balancer Controller](https://docs.aws.amazon.com/eks/latest/userguide/aws-load-balancer-controller.html)は、Kubernetes クラスターの AWS Elastic Load Balancers の管理を支援します。
+ 「[GrpCurl](https://github.com/fullstorydev/grpcurl)」 は gRPC サービスとのやり取りを支援するコマンドラインツールです。

**コードリポジトリ**

このパターンのコードは、GitHub 「[grpc-traffic-on-alb-to-eks](https://github.com/aws-samples/grpc-traffic-on-alb-to-eks.git)」リポジトリで入手可能です。

## エピック
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-epics"></a>

### gRPC サーバーの Docker イメージをビルドして Amazon ECR にプッシュします
<a name="build-and-push-the-grpc-serverrsquor-s-docker-image-to-amazon-ecr"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Amazon ECR リポジトリを作成します。 | AWS マネジメントコンソールにサインインし、[Amazon ECR コンソール](https://console.aws.amazon.com/ecr/)を開いて、Amazon ECR リポジトリを作成します。詳細については、「Amazon ECR ドキュメント」の「[リポジトリの作成](https://docs.aws.amazon.com/AmazonECR/latest/userguide/repository-create.html)」を参照してください。Amazon ECR リポジトリの URL を必ず記録してください。次のコマンドを実行して、AWS CLI で Amazon ECR リポジトリを作成することもできます。<pre>aws ecr create-repository --repository-name helloworld-grpc</pre> | クラウド管理者 | 
| Docker イメージを作成します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.html) | DevOps エンジニア | 
| Amazon ECR にDocker イメージをプッシュします。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.html) | DevOps エンジニア | 

### Kubernetes マニフェストを Amazon EKS クラスターにデプロイします。
<a name="deploy-the-kubernetes-manifests-to-the-amazon-eks-cluster"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Kubernetes マニフェストファイルの値を変更します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.html) | DevOps エンジニア | 
| Kubernetes マニフェストファイルをデプロイします。 | 次の `kubectl` コマンドを実行して `grpc-sample.yaml` ファイルを Amazon EKS クラスターに展開します。 <pre>kubectl apply -f ./kubernetes/grpc-sample.yaml</pre> | DevOps エンジニア | 

### Application Load Balancerの FQDN の DNS レコードを作成します。
<a name="create-the-dns-record-for-the-application-load-balancerapos-s-fqdn"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| Application Load Balancerの FQDN を記録します。 | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/prescriptive-guidance/latest/patterns/deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer.html) | DevOps エンジニア | 

### ソリューションをテストする
<a name="test-the-solution"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| gRPC サーバーをテストします。 | GrpCurl を使用して次のコマンドを実行して、エンドポイントをテストします。<pre>grpcurl grpc.example.com:443 list <br />grpc.reflection.v1alpha.ServerReflection<br />helloworld.helloworld</pre>`grpc.example.com` を DNS 名に置き換えます。 | DevOps エンジニア | 
| gRPC クライアントを使用して gRPC サーバーをテストします。 | `helloworld_client_ssl.py` サンプル gRPC クライアントで、`grpc.example.com` のホスト名を gRPC サーバーに使用されているホスト名に置き換えます。 次のコードサンプルは、クライアントのリクエストに対する gRPC サーバーからの応答を示しています。<pre>python ./app/helloworld_client_ssl.py<br />message: "Hello to gRPC server from Client"<br /><br />message: "Thanks for talking to gRPC server!! Welcome to hello world. Received message is \"Hello to gRPC server from Client\""<br />received: true</pre>これは、クライアントがサーバーと通信でき、接続が成功したことを示しています。 | DevOps エンジニア | 

### クリーンアップ
<a name="clean-up"></a>


| タスク | 説明 | 必要なスキル | 
| --- | --- | --- | 
| DNS レコードを削除する。 | 前に作成した Application Load Balancer の FQDN を指す DNS レコードを削除します。 | クラウド管理者 | 
| ロードバランサーを削除する。 | [Amazon EC2 コンソール](https://console.aws.amazon.com/ec2/)で、**[ロードバランサー]** を選択し、Kubernetes コントローラーが Ingress リソース用に作成したロードバランサーを削除します。 | クラウド管理者 | 
| Amazon EKS クラスターを削除する。 | `eksctl` を使用して Amazon EKS クラスターを削除します。<pre>eksctl delete cluster -f ./eks.yaml</pre> | AWS DevOps  | 

## 関連リソース
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-resources"></a>
+ 「[Amazon EKS でのネットワーク負荷分散](https://docs.aws.amazon.com/eks/latest/userguide/load-balancing.html)」 
+ 「[Application Load Balancer のターゲットグループ](https://docs.aws.amazon.com/elasticloadbalancing/latest/application/load-balancer-target-groups.html#target-group-protocol-version)」

## 追加情報
<a name="deploy-a-grpc-based-application-on-an-amazon-eks-cluster-and-access-it-with-an-application-load-balancer-additional"></a>

サンプル入力リソース:

```
---
apiVersion: networking.k8s.io/v1
kind: Ingress
metadata:
  annotations:
    alb.ingress.kubernetes.io/healthcheck-protocol: HTTP
    alb.ingress.kubernetes.io/ssl-redirect: "443"
    alb.ingress.kubernetes.io/backend-protocol-version: "GRPC"
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/scheme: internet-facing
    alb.ingress.kubernetes.io/target-type: ip
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:<AWS-Region>:<AccountId>:certificate/<certificate_ID>
  labels:
    app: grpcserver
    environment: dev
  name: grpcserver
  namespace: grpcserver
spec:
  ingressClassName: alb
  rules:
  - host: grpc.example.com # <----- replace this as per your host name for which the SSL certtficate is available in ACM
    http:
      paths:
      - backend:
          service:
            name: grpcserver
            port:
              number: 9000
        path: /
        pathType: Prefix
```

サンプルデプロイリソース:

```
apiVersion: apps/v1
kind: Deployment
metadata:
  name: grpcserver
  namespace: grpcserver
spec:
  selector:
    matchLabels:
      app: grpcserver
  replicas: 1
  template:
    metadata:
      labels:
        app: grpcserver
    spec:
      containers:
      - name: grpc-demo
        image: <your_aws_account_id>.dkr.ecr.us-east-1.amazonaws.com/helloworld-grpc:1.0   #<------- Change to the URI that the Docker image is pushed to
        imagePullPolicy: Always
        ports:
        - name: grpc-api
          containerPort: 9000
        env:
        - name: POD_IP
          valueFrom:
            fieldRef:
              fieldPath: status.podIP
      restartPolicy: Always
```

**サンプル出力**:

```
NAME             CLASS           HOSTS                          Address                PORTS          AGE
 grpcserver      <none>      <DNS-HostName>                  <ELB-address>              80            27d
```