AWS上でDockerを使ったプロジェクトについて。ECR・ECS・EC2・ELB・Route53など多数のサービスが必要になる。
そもそも、Docker関連のECR・ECSの繋がりや、ECS内のタスク、コンテナ、クラスター、サービスの違いがイマイチ分からなかったので図で理解してみる。
目次
アプリケーションの概要
ECRにプッシュしたイメージからECSでコンテナを起動する。コンテナはEC2のサービスと結びついており、ELBでサービスを割り振る構造になっている。
ネットワーキングは、ユーザーが入力したFQDN/URLを、設定したエイリアスレコードで識別し、ロードバランサー(ELB)でサービスにつなぐ。
ECSとECRの関係
ECRはイメージを保存するレポジトリ。DockerのDocker hubに該当する。
ECSがDockerに該当する。コンテナの要件定義にあたる、docker-compose.ymlをECS(のタスク定義)に記述する。
流れとしては、ローカル(自分のPC)でイメージを作成してECRにプッシュ。ECSでそのイメージを拾ってきてコンテナを起動する。
プロジェクトによって他のAWSサービス(S3, EC2, CloudFrontなど)が必要な場合はIAMで設定する。
ECS
ECSはdocker-compose.ymlの用件定義をするだけでなく、AWS上で複数のサービス(プロジェクト)を実行するためにプラットホームとなる仮想サーバーをサービスとして定義する。
アプリケーションを更新した場合のデプロイ(展開)方法や、ロードバランサーでEC2とコンテナを接続する設定もここで行う。
▼ECSの構造
クラスターはプロジェクトを管理しやすくするためのグループといった位置付け。その中に例えば、productionやstagingといった環境の異なるサービスを作成する。
実際のサービスの根幹となるコンテナはタスクの中に定義する。このタスクをサービスの上に乗っける。
ネットワーキング
例えば、エディタアプリケーション(EC2)が複数のサービス(ECS)につながっている場合など、
ユーザーがURLを叩いて、このコンテナにアクセスするまでの流れは以下のようになる。
FQDN/URLはユーザーが入力した内容
(sub.example.com)
↓
エイリアスレコードで識別
(example.comのエイリアス)
↓
セキュリティグループ
(許可されたIPアドレスか確認)
↓
ロードバランサー
(sub.example.comに対応するサービスに割り振る)
↓
コンテナ
(Dockerのアプリケーションに入る)
↓
必要に応じてDBなどのコンテナにアクセス
AWSのサービスとの関係
このネットワークとサービスを、AWSのサービス毎にまとめると以下のようになる。
さらに、EC2がS3など他のAWSサービスとも連携していることが多い。
デプロイの自動化
上記では、手動デプロイになっているため、ローカルで更新があったら、イメージをECRにプッシュ、タスク定義の更新(対象のイメージの変更)、サービスの更新(対象のタスクのリビジョンの変更)をする必要がある。
この一連の更新作業を自動化するためにCodePipelineを使う。
CodePipelineはmasterとなるgithubやCodeCommitのレポジトリ/ブランチを指定して、変更があった場合に自動検知して更新をかける。
モニタリング
CloudWatchというAWSのサービスを使うと、CPUやタスクの使用状況などをモニタリングすることができる。
サービスからCloud Watchにログを送る設定をすればすぐに使える。
AWSの難解さはこのサービスの多さだと思う。。そして、一つ一つのサービスが結構複雑で専門用語も多い。
まずは、各サービスの役割と関係性を覚えるのが導入としてはわかりやすい。
プロジェクト作成の流れ
様々なサービスが必要になるが、例えばECSのクラスターの作成など、事前にEC2でサービスを作成し、Route53のエイリアスレコードやELB、ECSのタスク定義などをしておく必要がある。
絶対にコレという手順はなく後から変更できるものも多い。(名前は変更できない場合が多い)
▼大まかな作成の流れ
- EC2インスタンス
- セキュリティグループ
- ロードバランサー
- IAM
- Route53
- ECR
- ECS(タスク定義)
- ECS(クラスター・サービス)
- CodePipeline
参考リンク(一部)
・ロードバランサー
・Route53 エイリアスレコードの作成
・ECRにイメージをプッシュする方法
・ECSのタスク定義手順
・Fargateとは何か?
・ECSのクラスター作成手順
・Blue/Greenデプロイとは何か?
・CodeCommitとGithubの違い
・更新したイメージをビルドした後のECRとECSの作業手順