初めに
以下のチュートリアルをやってみました。初めはマイクロサービスについて勉強したかったのでこのチュートリアルをやってみたのですが、ALB についての勉強にもなりました。具体的には ALB のパスベースルーティングを初めて使い、非常に勉強になりました。
なお、このチュートリアルでは EC2 タイプを使っていますが、この記事では Fargate でチュートリアルを検証しています。また、チュートリアルでは CloudFormation を使っていますが、この記事では簡略化のため VPC などはデフォルトのリソースを使い、ALB は手動で作成しています。
マイクロサービスが重要な理由
マイクロサービスのメリットについて簡単に確認します。
- モノリシックアーキテクチャ
- スケーリングが困難
- アプリケーションのコードベースが拡大するにつれ、更新と維持が複雑化する
- 新しい機能、言語、フレームワーク、テクノロジーの導入が難しい
- マイクロサービス
- さまざまなフレームワークやプログラミング言語を使用して作成することができる
- マイクロサービスは、単一のサービスとして、またはサービスのグループとして個別にデプロイできる
モノリスのコンテナ化
このチュートリアルに使用するリポジトリをクローンします。
git clone https://github.com/awslabs/amazon-ecs-nodejs-microservices
ECR に api という名前のリポジトリを作成し、以下のようにモノリスアプリケーションの Dockerfile のあるディレクトリに移動し、ビルドします。
cd ~/amazon-ecs-nodejs-microservices/2-containerized/services/api
docker build -t api .
ECR にログインし、タグ付け・プッシュを行います。
$(aws ecr get-login --no-include-email --region ap-northeast-1)
docker tag api:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/api:v1
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/api:v1
モノリスのデプロイ
以下の手順に従い ALB と ターゲットグループを作成し、モノリスをデプロイします。
/api/users 、/api/threads、/api/posts にアクセスし、適切なレスポンスが返ってくることを確認します。
モノリスの分割
以下のように機能ごとにマイクロサービスに分割し、それぞれのイメージをビルド・プッシュします。~/amazon-ecs-nodejs-microservices/3-microservices/services にはすでに分割済みのソースコードや Dockerfile が用意されています。
cd ~/amazon-ecs-nodejs-microservices/3-microservices/services
docker build -t posts ./posts
docker build -t users ./users
docker build -t threads ./threads
docker tag users:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/users:v1
docker tag posts:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/posts:v1
docker tag threads:latest 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/threads:v1
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/users:v2
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/posts:v2
docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/threads:v2
マイクロサービスのデプロイ
users、threads、posts 用にタスク定義を作成します。
ELB はモノリスアプリケーションで使用したものを利用します。ターゲットグループごとにリスナールールを作成し、リクエスト URL のパスによってルーティングを行うことができます。
users、threads、posts 用に 3 つのターゲットグループを作成します。ターゲットタイプを「IP」にすることを除いて、デフォルトの設定で作成します。
以下のようにリスナールールを作成します。
サービスを作成します。作成後、以下のようにモノリスアプリケーションとマイクロサービスアプリケーションが両方デプロイされた状態ですが、上記のリスナールールにより、リクエストはすべてモノリスアプリケーションが処理するようになっています。これはモノリスアプリケーションからマイクロサービスアプリケーションに切り替える時のダウンタイムを 0 にするためです。
以下のようにトラフィックの切り替えを行います。これ以降、モノリスアプリケーションにリクエストが到達することはありません。
最後に api サービスのタスクの必要数を 0 にし、マイクロサービスアプリケーションに移行が完了します。
参考記事