Amazon ECSについて
Amazon ECS(Amazon Elastic Container Service)とはDockerコンテナを実行させるためのサービスです。
ECSでのコンテナの動かし方には2種類あり、EC2上で動かすものと、Fargateと呼ばれるインスタンスを抽象化してコンテナのみ扱うものがあります。
今回はFargateを使用する方のECSの設定を行っていきます。
Dockerイメージの準備
まずはnginxのイメージを元にしたDockerのイメージを作成します。
Dockerfile作成
FROM nginx:latest
COPY index.html /usr/share/nginx/html
EXPOSE 80
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>INDEX</h1>
</body>
</html>
Dokerイメージをビルドします。
docker build -t nginx-test .
Amazon ECRへpush
リポジトリからpullする必要がありますのでDocker用のリポジトリが必要となります。
幸いAWSにはAmazon ECRというリポジトリサービスがありますのでこちらを使用します。
aws ecr get-login --no-include-email --region ap-northeast-1
-> 出力されたコマンドを実行する
docker tag nginx-test:latest xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-test:1
docker push xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-test:1
ECSの設定
作業の流れとしては
- タスク定義作成
- クラスター作成
- ALB作成
- サービス作成
となります。
タスク定義
ECSのタスク定義を開きます。

新しいタスク定義の作成をクリックし、起動タイプをFargateにします。

タスク定義とコンテナの設定
タスク定義名を設定します。

タスクの実行ロール IAMロール
タスク実行ロールは初めてだと自動的に作成されます。

タスクサイズ
タスクサイズですが、特定の組み合わせでしか設定できません。組み合わせについてはこちらにあります。
https://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/task-cpu-memory-error.html
今回はミニマムのメモリ 0.5GB / CPU 0.25 vCPU で設定します。

コンテナの定義
コンテナの設定をします。
コンテナの追加をクリックして、コンテナのリポジトリやタグを設定します。

コンテナの追加
イメージは先程pushしたECRのリポジトリとタグを記載します。
ポートマッピング部分にはリッスンさせるportを設定します。
その他はそのままで作成します。

クラスター
クラスターの作成をクリックします。

クラスターテンプレートの選択
Fargateの場合はネットワーキングのみを選択します。

クラスターの設定
クラスター名をいれて完了です。

ALB作成
ロードバランサーの作成をクリックします。

ロードバランサーの種類の選択
種類からALBを選びます。

ロードバランサーの設定
ロードバランサーの設定です。
リスナーは一旦80だけにします。
設置するアベイラビリティーゾーンを選択します(今回はデフォルトのVPCを使用します)。

セキュリティグループの設定
セキュリティグループを設定します。
80に対して0.0.0.0からアクセスできるような設定のものにします。

ルーティングの設定
ルーティングの設定です。
ターゲットグループは新しいターゲットグループに、ターゲットの種類をIPにしてポートを80とします。

ターゲットの登録
ターゲットの登録はここでは行わないのでそのまま確認に進みます(登録はECSで行います)。

確認し、作成します。
サービスの作成
ECSの画面からサービスの作成をクリックします。

サービスの設定
サービスの設定でタスク定義を先程作成したものにします。
起動タイプはFargate、タスクの数がコンテナの数になります。

デプロイメントはローリングアップデートにします。
そして次のステップに進みます。

VPCとセキュリティグループ
ネットワークの設定です。
サブネットには設置するサブネットを設定します(今回はデフォルトのVPC使います)。
セキュリティグループは新規作成されるものをそのまま使用します。

Load balancing
ヘルスチェックの猶予期間を飛ばして、Load balancingの項目に進みます。
ロードバランサーの種類をALBにしてロードバランサー名のボックスから先程作成したALBを選択します。

ロードバランス用のコンテナ
ロードバランス用のコンテナでロードバランサーへ追加ボタンをクリックします。

ターゲットグループ名に先程作成したターゲットグループを指定します。

サービス検出はそのままで問題ありません。
オートスケーリングの設定は今回なしにします。

しばらく待つとタスクにコンテナが作成されます。

ALBのDNSにアクセスすると、index.htmlの内容が表示されます。

コンテナの更新
コンテナの更新方法ですが
- タスク定義の更新(新しいリビジョンの作成)
- サービスを更新(タスク定義のリビジョンを上げて更新)
となります。
docker更新
まずは、index.htmlの内容を書き換えます。
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>Hello</h1>
</body>
</html>
ビルドして、ECRにpushします。
docker build -t nginx-test .
docker tag nginx-test:latest xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-test:2
docker push xxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/nginx-test:2
タスク定義の更新
タスク定義の一覧からnginx-test-taskを選択し、新しいリビジョンを作成をクリックします。
コンテナの定義から設定してあるコンテナを選択し、更新画面にいきます。
コンテナの編集
イメージのタグを1から2に変更し、更新をクリックします。
作成すると、タスク定義の新しいリビジョンが作成されます。

クラスターのサービス一覧からnginx-test-serviceを選択し、更新ボタンをクリックします。

リビジョンを1から2に変更してサービスを更新します。

すると、リビジョン2のタスクが作成されていきます。

RUNNINGになるとALBからアクセス可能になります。

ALBにアクセスしてみると、index.htmlが書き換わって表示されました。

リビジョン:1のタスクたちはしばらく時間が立つと自動で停止されます。
おわりに
以上でECSのFargateの基本的な使い方の説明は終わりです。
ECS固有の名称が多く初めてだと分かりづらいかと思いますが一度流れをつかめば理解しやすいと思います。
実際の運用時はコンテナの配置をprivateなVPCにしたりデプロイメントをCodePipelineつかったりAuto Scalingを有効にしたりとかでしょうか。