Glide Note

glidenote's blog

AWS Application Load Balancer + Amazon ECS でDockerのホットデプロイ環境を構築した

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は利用してません。

デプロイフロー

デプロイフローは下記のような形になってます。

デプロイ前の稼働中の状態

  • ALBは80,443ポートで稼働
  • コンテナではnode.jsのアプリが3000ポートで稼働

デプロイ直後の状態

  • CircleCI経由で、ecs-deployを実行し、新しいコンテナを作成。
  • 新しいコンテナが起動すると、自動でALB配下に追加されアクセスを流れる
  • 古いコンテナと新しいコンテナが混在する

ecs-deployは下記のような形で実行。CircleCI上ではAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY を環境変数に設定し、引数に利用しているregionを-r us-west-1を追加して実行してます。

1
2
3
4
5
ecs-deploy \
-c クラスター名 \
-n サービス名 \
-i xxxxxxxxxxxx.dkr.ecr.us-west-1.amazonaws.com/kaizenplatform/kaizen-xxxxxxxx:947 \
-t 300

デプロイ部分のdocker pushecs-deploy合わせて1分半くらいで完了している。

デプロイ完了後の状態

  • しばらくすると古いコンテナが破棄され、新しいコンテナだけで稼働する
  • 一連の作業中にリクエストを流し続けて、サービスが停止しないことも確認

ecs-deployの実行が走ってから、新しいコンテナが起動し、古いコンテナが廃棄されるまで、 大体6分くらい要している。

ALBとECSの初期設定が結構面倒ですが、設定さえ終われば、 新旧コンテナの入れ替え、ALB配下への追加削除が自動で行われるようになるので大変便利。

引き続きDynamic Port Mappingを利用した構成も検証中。

参考

Comments