DaprとAmazon EKSを活用してマイクロサービス開発を効率化する

マイクロサービスとコンテナは、現代のアプリケーションの構築、展開、およびクラウドでの管理方法を革新しています。ただし、マイクロサービスの開発と運用には複雑さが伴う場合があり、しばしば開発者がサービス検出、状態管理、および可観測性などの横断的関心事に貴重な時間を費やす必要があります。

Dapr、または分散アプリケーションランタイムは、クラウドおよびエッジ環境でマイクロサービスを構築するためのオープンソースのランタイムです。サービス検出、状態管理、パブサブメッセージング、および可観測性などのプラットフォームに依存しないビルディングブロックを提供します。Daprは、CNCF(Cloud Native Computing Foundation)の卒業レベルに移行し、現在多くの企業によって使用されています。

Amazon Elastic Kubernetes Service(Amazon EKS)と組み合わせると、AWSからのマネージドKubernetesサービスであるDaprがマイクロサービスとコンテナの採用を加速し、開発者がインフラストラクチャのプラムビングを気にすることなくビジネスロジックの記述に集中できるようになります。Amazon EKSにより、Kubernetesクラスターの管理が容易になり、ワークロードが変化するにつれてスケーリングが容易になります。

このブログ投稿では、DaprがAmazon EKS上でのマイクロサービス開発を簡素化する方法を探っていきます。まず、サービス呼び出し状態管理という2つの重要なビルディングブロックについて詳しく調べていきます。

サービスの呼び出し

マイクロサービス間のシームレスで信頼性の高い通信は重要です。しかし、開発者はしばしばサービスの検出、APIの標準化、通信チャネルのセキュリティ確保、障害の適切な処理、および観測性の実装などの複雑なタスクに苦労します。

Daprのサービス呼び出しを使用すると、これらの問題は過去のものとなります。 gRPCやHTTP/HTTPSなどの業界標準のプロトコルを使用して、サービスは簡単にお互いと通信できます。サービス呼び出しは、サービスの登録と検出からリクエストの再試行、暗号化、アクセス制御、分散トレーシングまで、すべてを処理します。

状態管理

Daprの状態管理ビルディングブロックは、開発者がアプリケーション内で状態を操作する方法を簡素化します。これは、基礎となる状態ストア(例:Redis、AWS DynamoDB、Azure Cosmos DB)に関係なく、状態データの保存と取得のための一貫したAPIを提供します。

この抽象化により、開発者は状態ストアの管理やスケーリングの複雑さを気にすることなく、状態を持つアプリケーションを構築することができます。

前提条件

この投稿に従うためには、以下が必要です:

  • AWSアカウント。アカウントがない場合は、サインアップしてください。
  • 適切な権限を持つIAMユーザー。使用しているIAMセキュリティプリンシパルには、Amazon EKS IAMロール、サービスリンクロール、AWS CloudFormation、VPC、および関連リソースと連携する権限が必要です。詳細については、Amazon Elastic Container Service for Kubernetesのアクション、リソース、および条件キーとAWS Identity and Access Managementユーザーガイドのサービスリンクロールの使用を参照してください。

アプリケーションアーキテクチャ

以下の図では、2つのマイクロサービスがあります:PythonアプリとNode.jsアプリ。Pythonアプリは注文データを生成し、Node.jsアプリが公開している/neworderエンドポイントを呼び出します。Node.jsアプリは受信した注文データを状態ストア(この場合はAmazon ElastiCache)に書き込み、注文IDをPythonアプリに応答として返します。

Daprのサービス呼び出しビルディングブロックを活用することで、Pythonアプリはサービスディスカバリ、API標準化、通信チャネルセキュリティ、障害処理、および可観測性を気にすることなくNode.jsアプリとシームレスに通信できます。安全なサービス間通信を提供するために、mTLSを実装しています。

Daprはこれらの横断的な関心事を処理し、開発者がコアビジネスロジックの記述に集中できるようにします。

さらに、Daprの状態管理ビルディングブロックは、Node.jsアプリケーションが状態ストア(Amazon ElastiCache)とやり取りする方法を簡素化します。Daprは、一貫したAPIを提供し、状態データの格納と取得を抽象化することで、基礎となる状態ストアの管理とスケーリングの複雑さを隠蔽します。この抽象化により、開発者は状態を持つアプリケーションを構築する際に、状態ストアの管理の詳細について心配する必要がありません。

Amazon EKSクラスターには、Daprコントロールプレーンコンポーネントが含まれるdapr-systemという名前空間がホストされています。 dapr-sidecar-injectorは、Daprが有効になっているマイクロサービスのポッドに自動的にDaprランタイムをインジェクトします。

サービス呼び出しステップ

  1. 注文ジェネレーターサービス(Pythonアプリ)は、Nodeアプリのメソッド/neworderを呼び出します。このリクエストは、Pythonアプリと同じポッドで実行されているローカルのDaprサイドカーに送信されます。
  2. Daprは、Amazon EKSクラスターのDNSプロバイダーを使用してターゲットアプリを解決し、リクエストをNodeアプリのサイドカーに送信します。
  3. Nodeアプリのサイドカーは、その後、リクエストをNodeアプリのマイクロサービスに送信します。
  4. Nodeアプリは、Pythonアプリから受け取った注文IDをAmazon ElasticCacheに書き込みます。
  5. Nodeアプリは、レスポンスをローカルのDaprサイドカーに送信します。
  6. Nodeアプリのサイドカーは、レスポンスをPythonアプリのDaprサイドカーに転送します。
  7. Pythonアプリサイドカーは、Nodeアプリのメソッド/neworderにリクエストを開始したPythonアプリにレスポンスを返します。

デプロイメント手順

EKSクラスターの作成と確認

Amazon EKS(Elastic Kubernetes Service)クラスターをセットアップするには、いくつかの手順に従う必要があります。以下は、プロセスの概要です:

前提条件

  • AWS CLIをインストールして構成する
  • eksctlkubectl、およびAWS IAM Authenticatorをインストール

1. EKSクラスターを作成する。 eksctlを使用して、次のようなコマンドで基本クラスターを作成する:

Shell

 

2. kubectlを構成する。新しいクラスターに接続するためにkubeconfigを更新する:

Shell

 

3. クラスターを確認する。 ノードが準備完了かどうかを確認する:

Shell

 

EKSクラスターにDAPRをインストール

1. DAPR CLIをインストールする:

Shell

 

2. インストールを検証する:

Shell

 

3. DAPRをインストールして検証する:

Shell

 

Daprコンポーネントのstatestorepubsubはデフォルトのネームスペースに作成されます。以下のコマンドを使用して確認できます:

Shell

 

Amazon ElastiCacheをDapr StateStoreとして構成する

マイクロサービスの状態を保存するためにAmazon ElastiCacheを作成します。この例では、ElastiCacheサーバーレスを使用しています。これは、自動的にスケーリングされ、管理するサーバーがないため、アプリケーショントラフィックの需要に応じて迅速にキャッシュを作成します。

ElastiCacheのセキュリティグループを構成して、EKSクラスターからの接続を許可します。簡単のため、EKSクラスターと同じVPC内に保つこと。次の手順に必要なキャッシュエンドポイントに注意してください。

サンプルアプリケーションの実行

1. サンプルアプリケーションのGitリポジトリをクローンします:

Shell

 

2. redis-state.yamlを作成し、redisHostにAmazon ElasticCacheエンドポイントを指定します:

YAML

 

kubectlを使用して状態ストアコンポーネントのyaml構成を適用します。

Shell

 

3. サイドカーを使用してマイクロサービスをデプロイします。

マイクロサービスノードアプリケーションについては、/quickstarts/tutorials/hello-kubernetes/deploy/node.yamlファイルに移動し、以下の注釈があることに気づきます。これは、Daprコントロールプレーンにサイドカーをインジェクトし、Daprアプリケーションに名前を割り当てることを示しています。

YAML

 

node.yamlに注釈service.beta.kubernetes.io/aws-load-balancer-scheme: "internet-facing"を追加して、AWS ELBを作成します。

YAML

 

kubectlを使用してノードアプリケーションをデプロイします。 /quickstarts/tutorials/hello-kubernetes/deployディレクトリに移動し、以下のコマンドを実行します。

Shell

 

以下のコマンドの出力に表示されるExternal IPの下に表示されるAWS NLBを取得します。

Shell

 

/quickstarts/tutorials/hello-kubernetesディレクトリに移動し、sample.jsonファイルがあることを確認して、以下の手順を実行します。

Shell

 

ブラウザでロードバランサーを使用して/orderエンドポイントにアクセスして出力を確認できます。

Plain Text

 

出力は{“OrderId”:“42”}を見ることができます。

次に、ビジネスロジックを持つ2番目のマイクロサービスPythonアプリケーションを展開し、新しい注文IDを毎秒生成してNodeアプリの/neworderメソッドを呼び出します。

/quickstarts/tutorials/hello-kubernetes/deployディレクトリに移動して、以下のコマンドを実行します。

Shell

 

4. アプリケーションの展開を検証およびテストします。

今、両方のマイクロサービスが展開されました。Pythonアプリは注文を生成し、ログから明らかに/neworderを呼び出しています。

Shell

 

SystemVerilog

 

Nodeアプリがリクエストを受信し、例としてAmazon ElasticCacheのステートストアに書き込んでいることがわかります。

Shell

 

SystemVerilog

 

Amazon ElasticCacheにデータが永続化されているかどうかを確認するために、以下のエンドポイント/orderにアクセスします。これにより、Pythonアプリによって生成された最新の注文IDが返されます。

Plain Text

 

最新の注文として{“OrderId”:“370”}を含む出力が表示されます。

クリーンアップ

以下のコマンドを実行して、展開されたNodeアプリとPythonアプリ、およびステートストアコンポーネントを削除します。

/quickstarts/tutorials/hello-kubernetes/deployディレクトリに移動して、以下のコマンドを実行します。

YAML

 

eksctlコマンドを使用してEKSクラスターを解体し、Amazon ElastiCacheを削除できます。

最初のステップでクラスターを作成するために使用されたcluster.yamlファイルを持つディレクトリに移動します。

Shell

 

結論

DaprとAmazon EKSは、マイクロサービス開発における強力な連携関係を形成しています。Daprは横断的関心事を簡素化し、EKSはKubernetesインフラストラクチャを管理することで、開発者がコアビジネスロジックに集中し、生産性を向上させることができます。

この組み合わせにより、スケーラブルで耐障害性があり、観測可能なアプリケーションの作成が加速し、運用オーバーヘッドを大幅に削減できます。これはマイクロサービスの旅路に最適な基盤です。DaprとEKSの分散トレーシングと観測性の機能に焦点を当て、より深い洞察とベストプラクティスを提供する今後の投稿にご期待ください。

Source:
https://dzone.com/articles/streamline-microservices-development-with-dapr-amazon-eks