TL;DR
- AWS Application Load Balancer(以下ALB) + Amazon ECS でDockerのホットデプロイ環境を構築した
- ALBのTarget GroupとECSのServiceを紐付けることで、ALB配下のコンテナの入れ替えが自動で行われるようになる
ALBは先日リリースされたばかりで、私もまだ色々と検証している段階なので、内容や認識等に誤りがあるかもしれないのでご容赦下さい。(詳しい人教えてください!!)
その他弊社の前提情報
- GitHub + CircleCIが連携済み
- Docker RepoにはAmazon EC2 Container Registry(以下ECR)を利用
- DeployはGitHubのデプロイブランチへのマージを契機にCircleCI経由で、Docker Pushとecs-deployでDockerデプロイを実施
準備
ALBとECSの設定については@inokaraさんのブログが詳しいので、そちらを参照ください。 今回はALBのDynamic Port Mappingは利用してません。
- Amazon ECS と AWS Application Load Balancer の組み合わせを試しているメモ - ようへいの日々精進XP
- Amazon ECS と AWS Application Load Balancer の組み合わせを試しているメモ(2)〜 AWS CLI で試す 〜 - ようへいの日々精進XP
デプロイフロー
デプロイフローは下記のような形になってます。
デプロイ前の稼働中の状態
- ALBは80,443ポートで稼働
- コンテナではnode.jsのアプリが3000ポートで稼働
デプロイ直後の状態
- CircleCI経由で、ecs-deployを実行し、新しいコンテナを作成。
- 新しいコンテナが起動すると、自動でALB配下に追加されアクセスを流れる
- 古いコンテナと新しいコンテナが混在する
ecs-deployは下記のような形で実行。CircleCI上ではAWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
を環境変数に設定し、引数に利用しているregionを-r us-west-1
を追加して実行してます。
1 2 3 4 5 |
|
デプロイ部分のdocker push
とecs-deploy
合わせて1分半くらいで完了している。
デプロイ完了後の状態
- しばらくすると古いコンテナが破棄され、新しいコンテナだけで稼働する
- 一連の作業中にリクエストを流し続けて、サービスが停止しないことも確認
ecs-deployの実行が走ってから、新しいコンテナが起動し、古いコンテナが廃棄されるまで、 大体6分くらい要している。
ALBとECSの初期設定が結構面倒ですが、設定さえ終われば、 新旧コンテナの入れ替え、ALB配下への追加削除が自動で行われるようになるので大変便利。
引き続きDynamic Port Mappingを利用した構成も検証中。