読者です 読者をやめる 読者になる 読者になる

kzk-casino.com

一人前のITエンジニアを目指して

AWSのECSを使ってdockerを動かしてみたりDeployの挙動を見てみたりした ④タスク・サービスの設定

AWS DevOps docker Tech Tips

ここまで実施した内容で、ECSを利用してEC2をClusterとして登録し、コンテナサービスをEC2インスタンス上で動かす準備ができた
ここから実際にコンテナ稼働に関する設定を行う

最初に触れたように、ECSでコンテナを実行するには、下記の概念が必要となる。

  • タスク:複数のコンテナをグループ化した、デプロイと実行の最小単位
  • サービス:タスクの起動ポリシーで、起動数の確保や自動復旧を可能に為る

AWSのECSを使ってdockerを動かしてみたりDeployの挙動を見てみたりした ①全体イメージ - kzk-casino.com

設定としては、「Task Definition」の設定→「Service」の作成の順で行う
#Serviceの中でTaskを呼び出すため

Task Definitionの設定

ECS設定画面から、「Task Definition」を選択し、「Create new Task Definition」をクリックする

f:id:kzk_casino:20161015190307p:plain


Task Definitionの名前を入力し、「Add Container」をクリックする

f:id:kzk_casino:20161015190401p:plain


ここで、Taskの中で起動させるContainerの選択や、割り当てるリソース、実行コマンドなどを設定する

f:id:kzk_casino:20161015190531p:plain

Container Nameは、任意のコンテナ名を入力する

Imageにはコンテナイメージを指定する
今回はイメージ管理リポジトリとしてDocker Hubを利用したので、<リポジトリ>/<イメージ>/<リビジョン>のように指定する

Memory LimitはHard Limitで128MBとする
ここは実際にはEC2インスタンスインスタンスサイズや、想定コンテナサイズなどを加味して設計する必要が有る

Port Mappingは、EC2インスタンスのany port(0)とコンテナのhttp port(80)をマッピングする
前回紹介したALBによるダイナミックポートマッピングを使用するため、インスタンス側はanyとしている


f:id:kzk_casino:20161015190930p:plain

次に、Commandにはコンテナ起動時に実行する起動スクリプトを指定している
起動スクリプトの内容は、例えば下記のようなものを含ませるとよい

  • 最新のコードをGithubから取得
  • Nginxサービスの起動
  • Unicornの起動
  • RDSとの接続
#!/bin/bash

cd /var/www/gatebook

# Get latest App code
git pull

# Starting nginx
/usr/sbin/service nginx start

# Starting Unicorn
/usr/local/bin/bundle exec unicorn -c config/unicorn.rb -D

# Migrate DB
/usr/local/bundle/bin/rake db:migrate

while true ; do
    /bin/bash
done

最後のwhile文は、コンテナが起動した状態のままリクエストを受け付けるための定型句のようなもの

ここまで設定して、「Add」をクリック


コンテナが追加されたことを確認して、「Create」をクリックする

f:id:kzk_casino:20161015191451p:plain


ここまででTask Definitionの設定は完了

Serviceの設定

Cluster詳細画面からServiceタブを選択し、「Create」をクリックする

f:id:kzk_casino:20161015191630p:plain

f:id:kzk_casino:20161015191756p:plain

Task Definitionで、先ほど作成したTaskを選択する
このとき、リビジョンが1になっているのに注目
Taskは定義を更新することができ、更新のたびにリビジョンが上がっていく。定義の更新は、例えばDocker Imageを更新したときなどに実施

Clusterで、コンテナを稼働させたいEC2があるClusterを選択

Service Nameに、サービスの任意の名前を入力

Number of Tasksに起動させたいTaskの数を入力
これがイコールCluster内で起動するコンテナの数になる

Minimum Healthy PercentとMaximum Healthy Percentは許容するTask起動数の最小値と最大値を設定する
例えば、今回は下記のように各値を設定した

 - Number of Tasks : 4
 - Minimum Healthy Percent : 50
 - Maximum Healthy Percent : 200

これが指す意味は、「平常時は4つのTaskを常時起動し、Deployなどのタイミングで最小Task数が2、最大Task数が8となることを許容する」ということとなる

Deploy時にも起動しているTaskの数を減らしたくないならMinimum Healthy Percentを100とし、逆にリソース観点から起動する最大Task数を常時起動数から増やしたくない場合はMaximum Healthy Percentを100とするなどの変更が必要である


さらに下に行くと、ELBの設定を行えるので、Configure ELBをクリック

f:id:kzk_casino:20161015192522p:plain


ダイナミックポートマッピングを利用するためにALBを選択し、作成したIAM RoleやALB、Containerを選択し、「Add to ELB」をクリック

f:id:kzk_casino:20161015192718p:plain


ALB作成時に指定したターゲットグループが選択可能になっているので、選択して「Save」

f:id:kzk_casino:20161015192839p:plain


これでServiceが設定されるのでTaskが起動してくる


次は起動しているTaskの確認や、更新について