View a markdown version of this page

gRPC ベースのアプリケーションを Amazon EKS クラスターにデプロイし、Application Load Balancer でアクセスする - AWS 規範ガイダンス

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

gRPC ベースのアプリケーションを Amazon EKS クラスターにデプロイし、Application Load Balancer でアクセスする

Amazon Web Services、Kirankumar Chandrashekar、Huy Nguyen

概要

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

gRPC」は、任意の環境で実行できるオープンソースのリモートプロシージャコール (RPC) フレームワークです。マイクロサービスの統合やクライアントとサーバーの通信に使用できます。gRPC の詳細については、AWS ブログのポスト「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 水平ポッドオートスケーラー」 を使用してトラフィックに基づいて自動的にスケーリングできます。Application Load Balancer のターゲットグループは Amazon EKS ノードのヘルスチェックを行い、ターゲットが正常かどうかを評価して、正常なノードにのみトラフィックを転送します。

前提条件と制限事項

前提条件

アーキテクチャ

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

Amazon EKS での gRPC ベースアプリケーションのアーキテクチャ

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

SSL/TLS トラフィックを gRPC サーバーに送信するワークフロー

ツール

AWS サービス

  • AWS コマンドラインインターフェイス (AWS CLI) はオープンソースのツールであり、コマンドラインシェルのコマンドを使用して AWS サービスとやり取りすることができます。

  • 受信したアプリケーションまたはネットワークトラフィックを複数のターゲットに分散するには、Elastic Load Balancing を使用します。例えば、1 つまたは複数のアベイラビリティーゾーンの Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、コンテナ、および IP アドレスにトラフィックを分散できます。

  • Amazon Elastic Container Registry (Amazon ECR)」 は、セキュリティ、スケーラビリティ、信頼性を備えたマネージドコンテナイメージレジストリサービスです。 

  • Amazon Elastic Kubernetes Service (Amazon EKS) は、 で Kubernetes を実行する際に役立ちます。独自の Kubernetes コントロールプレーンまたはノードをインストールおよび維持する必要はありません。 

ツール

  • eksctl は、Amazon EKS 上にクラスターを作成するためのシンプルな CLI ツールです。

  • kubectl」は、 Kubernetes クラスターに対してコマンドを実行するためのコマンドラインユーティリティです。

  • AWS Load Balancer Controllerは、Kubernetes クラスターの AWS Elastic Load Balancers の管理を支援します。

  • GrpCurl」 は gRPC サービスとのやり取りを支援するコマンドラインツールです。

コードリポジトリ

このパターンのコードは、GitHub 「grpc-traffic-on-alb-to-eks」リポジトリで入手可能です。

エピック

タスク説明必要なスキル

Amazon ECR リポジトリを作成します。

AWS マネジメントコンソールにサインインし、Amazon ECR コンソールを開いて、Amazon ECR リポジトリを作成します。詳細については、「Amazon ECR ドキュメント」の「リポジトリの作成」を参照してください。Amazon ECR リポジトリの URL を必ず記録してください。

次のコマンドを実行して、AWS CLI で Amazon ECR リポジトリを作成することもできます。

aws ecr create-repository --repository-name helloworld-grpc
クラウド管理者

Docker イメージを作成します。

  1. GitHub grpc-traffic-on-alb-to-eks リポジトリの複製を作成します。

    git clone https://github.com/aws-samples/grpc-traffic-on-alb-to-eks.git
  2. リポジトリのルートディレクトリから、Dockerfile が存在することを確認し、次のコマンドを実行して Docker イメージを作成します。 

    docker build -t <amazon_ecr_repository_url>:<Tag> .
    重要

    必ず <amazon_ecr_repository_url> を、前に作成した Amazon ECR リポジトリの URL に置き換えてください。

DevOps エンジニア

Amazon ECR にDocker イメージをプッシュします。

  1. 次のコマンドを実行して、Amazon ECR リポジトリにログインします。

    aws ecr get-login-password --region us-east-1 --no-cli-auto-prompt | docker login --username AWS --password-stdin <your_aws_account_id>.dkr.ecr.us-east-1.amazonaws.com
  2. 次のコマンドを実行して、Docker イメージを Amazon ECR リポジトリにプッシュします。

    docker push <your_aws_account_id>.dkr.ecr.us-east-1.amazonaws.com/helloworld-grpc:1.0
    重要

    必ず <your_aws_account_id> を AWS アカウント ID に置き換えてください。

DevOps エンジニア
タスク説明必要なスキル

Kubernetes マニフェストファイルの値を変更します。

  1. 要件に従って、リポジトリの Kubernetes フォルダにある grpc-sample.yaml Kubernetes マニフェストファイルを変更します。Ingress リソースのアノテーションとホスト名を変更する必要があります。Ingress リソースのサンプルについては、「追加情報」セクションを参照してください。イングレスアノテーションの詳細について、Kubernetes ドキュメントの「イングレスアノテーション」 を参照してください。

  2. Kubernetes デプロイリソースで、image デプロイリソースを Docker イメージをプッシュした Amazon ECR リポジトリのユニフォームリソース識別子 (URI) に変更します。デプロイリソースのサンプルについては、「追加情報」セクションを参照してください。

DevOps エンジニア

Kubernetes マニフェストファイルをデプロイします。

次の kubectl コマンドを実行して grpc-sample.yaml ファイルを Amazon EKS クラスターに展開します。 

kubectl apply -f ./kubernetes/grpc-sample.yaml
DevOps エンジニア
タスク説明必要なスキル

Application Load Balancerの FQDN を記録します。

  1. 次の kubectl コマンドを実行して、Application Load Balancer を管理する Kubernetes 入力リソースを記述します。

    kubectl get ingress -n grpcserver

    サンプル出力は「追加情報」セクションに記載されています。HOSTS 出力のフィールドには、SSL 証明書が作成された DNS ホスト名が表示されます。

  2. 出力のAddress フィールドから、Application Load Balancer の完全修飾ドメイン名 (FQDN) を記録します。 

  3. Application Load Balancer の FQDN を指す DNS レコードを作成します。DNS プロバイダーが Amazon Route 53 の場合は、アプリケーションロードバランサーの FQDN をポイントするエイリアスレコードを作成できます。このオプションについての詳細は、「Route 53 ドキュメント」の「エイリアスと非エイリアスレコードの選択」を参照してください。

DevOps エンジニア
タスク説明必要なスキル

gRPC サーバーをテストします。

GrpCurl を使用して次のコマンドを実行して、エンドポイントをテストします。

grpcurl grpc.example.com:443 list grpc.reflection.v1alpha.ServerReflection helloworld.helloworld
注記

grpc.example.com を DNS 名に置き換えます。

DevOps エンジニア

gRPC クライアントを使用して gRPC サーバーをテストします。

helloworld_client_ssl.py サンプル gRPC クライアントで、grpc.example.com のホスト名を gRPC サーバーに使用されているホスト名に置き換えます。 

次のコードサンプルは、クライアントのリクエストに対する gRPC サーバーからの応答を示しています。

python ./app/helloworld_client_ssl.py message: "Hello to gRPC server from Client" message: "Thanks for talking to gRPC server!! Welcome to hello world. Received message is \"Hello to gRPC server from Client\"" received: true

これは、クライアントがサーバーと通信でき、接続が成功したことを示しています。

DevOps エンジニア
タスク説明必要なスキル

DNS レコードを削除する。

前に作成した Application Load Balancer の FQDN を指す DNS レコードを削除します。

クラウド管理者

ロードバランサーを削除する。

Amazon EC2 コンソールで、[ロードバランサー] を選択し、Kubernetes コントローラーが Ingress リソース用に作成したロードバランサーを削除します。

クラウド管理者

Amazon EKS クラスターを削除する。

eksctl を使用して Amazon EKS クラスターを削除します。

eksctl delete cluster -f ./eks.yaml
AWS DevOps

関連リソース

追加情報

サンプル入力リソース:

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