【短期企画】触ったことのないAWSサービスを触っていくぞ -ECS編-

Amazon ECS

ごあいさつ

ゲストブロガーとして投稿させていただくことになりました。
豊崎隆です。

自己紹介

某会社でインフラエンジニアをしております。
この度、ご縁がありましてブログを投稿させて頂くことになりました。
よろしくお願いします。

触ったことのないAWSサービスを触っていくぞのコーナー

短期企画(勝手につくりました)
「触ったことのないAWSサービスを触っていくぞのコーナー」を担当させていただきます。
では、さっそく始めたいと思います。

今回の触っていくぞ

Amazon ECS(Amazon EC2 Container Service)

ECSとは?

コンテナを管理してれるマネージドサービス
–  シンプルなAPIで、EC2クラスタ上にDockerコンテナを起動/管理
–  Docker管理で面倒な所を取り除くために出来たサービス
–  EC2インスタンス上に複数コンテナをホストすることが可能
–  クラスタの管理や構成管理についての運用が不要

参考: ECS for Docker Meetup

ECS用語

クラスター ECSインスタンスを管理
複数のサービスを管理
ECS インスタンス ECSエージェントが稼働するEC2インスタンス
サービス 複数のタスクを管理
タスク定義と紐づける
タスク定義 タスクに含めるコンテナの定義とコンテナ間のやり取りの方法を指定する
タスク タスク定義で定めた内容を実行する単位
コンテナの定義 利用するDockerImageやImageを実行するリソースの割り当てを指定する

 

料金

作成した AWS リソース(EC2 インスタンス、EBS ボリュームなど)に対してのみ料金が発生します。

AWSマネジメントコンソールから使ってみる

今すぐ始めるから進むと「サンプルアプリケーションのデプロイ」と
「Amazon ECRの作成」(※1)が選択できるので、このまま進めてみます。

Amazon_EC2_Container_Service_13

ECRのリポジトリを作成します。

Amazon_EC2_Container_Service_12

作成したリポジトリにDockerImageをプッシュします。
※ローカルにDockerImageのない人は画面の指示に従ってImageを作成する。

Amazon_EC2_Container_Service_11

タスク定義では管理するコンテナの定義などを行います。
サンプルアプリケーションのデプロイウィザードなので、コンテナが1つしか選択できませんが、
ウィザードでなければ複数のコンテナが指定できます。
Dockerイメージの選択と、Dockerホストとコンテナのポートマッピング設定のみ行い、
あとはデフォルトで作成をしていきます。

Amazon_EC2_Container_Service_10

サービスの設定では定義した内容のタスクの実行数やELBの設定を行います。
タスク数は冗長化をさせたいので「2」とします。

Amazon_EC2_Container_Service_9

ELBのリスナープロトコルと、リスナーポートとIAMロールを設定します。
ECS用のIAMロールがない場合は自動的に作成されます。
(サービスIAMロールはクラスタに付与してECSインスタンスをELBへのAssociateする等に使用)

Amazon_EC2_Container_Service_8

クラスタの設定ではECSインスタンスの設定を行います。
タスクの実行数(固定ポート利用数)>ECSインスタンス数
となっているので、怒られています。(※2)
インスタンス数を2にすると警告が消えます。
(このままでも作成を継続できますがタスクが使用するポートが足りずにタスクが1つしか起動しません)

Amazon_EC2_Container_Service_7

また、SGやIAMロールの設定もここで行います。
今回はデフォルトのまま進んで行きます。
ここでも同様にECSインスタンス用のIAMロールがない場合は自動作成されます。
(ECSインスタンスIAMロールはECS Agentが実行するAPIアクションに使用)

Amazon_EC2_Container_Service_6

設定を確認し、起動してみます。
ServiceがActiveになっていることを確認し、作成されたELBに接続してみます。

Amazon_EC2_Container_Service_15

無事、WEBページが表示されました。

WS2016-12-05_000064

タスクを停止してから次のタスクが起動するまでの時間を確認

コンテナの起動がどれくらい早いのか確認してみたいと思います。
タスクを選択して、停止します。

Amazon_EC2_Container_Service_1

停止されてタスクが1つになりました。

Amazon_EC2_Container_Service_2

画面の更新を連打していると、すぐにRUNNINGになりました。
この間、たったの21秒です。

Amazon_EC2_Container_Service_3

実際にはELB側のヘルスチェックがあるので、
ELBでInServiceになるまではもう少しかかりますが、それでも早い!

蛇足ですが、ウィザードで作成されたELBのヘルスチェックは30秒間隔、正常の閾値2回でした。
(ELBを作成するときのデフォルトは30秒間隔、正常の閾値10回)

EC2_Management_Console

まとめ

コンテナでの起動時間の早さに驚きました。
やはりサーバでのスケールとは時間的に比較になりませんね。
ECSの表層を触っただけですが、すこし雰囲気はつかめたんじゃないでしょうか。
触っていない設定などがまだまだあるので、もう少し詳しく触っていきたいです。
また、改めて書きたいと思います。

以上、「触ったことのないAWSサービスを触っていくぞのコーナー」でした。
お付き合いありがとうございました。

脚注

※1:DockerHubのAWSサービス版(private)
※2:ECSインスタンス1つに対して80番Portは1つしかないんだから、
タスク2つは、無理っしょ。と言われている模様