AWS re:Invent にて、Amazon EC2 Container Service(ECS)をアナウンス・プレビューをご案内してから、多くのお客様から反響をいただきました。プレビューとしては非常に高いサインアップを頂いており、感謝しています。今年も終わりに近づいてますが、お客様のこの高い要望のペースに沿えるように、今までにプレビューの申し込みをいただいたお客様全てにプレビューをお渡しするとともに、今後の新しいプレビューリクエストに関しては現状24時間程度でお届けできるようになりました。
以前のエントリーで書いたように、ECSはDockerベースのアプリケーションのビルド、実行とそしてスケールを助けるためのサービスです。利点としては、より簡単なクラスターマネージメント、ハイパフォーマンス、柔軟なスケジューリング、拡張性、ポータビリティ、そしてAWSの他サービスや機能とのインテグレーションです。勿論他のAWSでの実行環境がセキュアで効率的なのは周知の事実かと思います。
ECSの基礎
詳細に行く前に、まずはECSの用語と基本コンセプトについておさらいしましょう。
- Cluster - Taskを実行するためのContainer Instanceの論理的なグループの事です
- Container Instance - ECSエージェントが稼働しているEC2インスタンスで、かつClusterに登録されているものです。Cluster内で動いているインスタンスの集合はTaskを実行するために使われるリソースプールとして作成されます。
- Task Definition - Task DefinitionはContainerの集合の定義です。この定義にはTask Descriptionが含まれており、1つかそれ以上のContainerを定義します。あるTask Definitionで定義された全てのContainerは同一のContainer Instanceで稼働します。
- Task - Task Definitionの実態です。
- Container - Taskの一部として生成されたDockerコンテナーです。
ECS Container AgentはContainerインスタンスの中で動くエージェントです。このエージェントはECSにかわって、Containerを開始する役割を持ちます。エージェント自身もDockerコンテナとして稼働しており(Docker Hubから利用可能です)、インスタンス内で動くDockerデーモンとコミュニケーションします。
クラスターおよびコンテナーサービスの文脈では、"スケジューリング"はインスタンスにタスクをアサインするプロセスとなります。ECSは、以下の3つのスケジューリングオプションを提供します。
- オート -
RunTask
ファンクションはCluster上でTask(Task Definitionで定義)をランダムなプレースメントで開始します。 - マニュアル -
StartTask
ファンクションは特定のContainer Instance(またはインスタンス)でTask(Task Definitionで定義するのは同じ)を開始します。 - カスタム -
ListContainerInstances
およびDescribeContainerInstances
を使う事で、Cluster内の利用可能なリソースの情報を収集する事が出来るので、スケジューラの"核"を構築する事が出来るので(言い換えれば、最適なContainer Instanceを選ぶために利用できる情報を使って)、その後StartTask
を実行してインスタンス上でタスクを実行します。これを実施するという事は、事実上、自分独自のRunTask
を実装するのと同じ意味合いになります。
EC2 Container Service実践
ECSを実際に試してみるために、プレビューに登録して、AWS CLIのプレビューバージョンをダウンロード、インストール、設定しておきます。その後、IAM RoleとVPCを作成して、クラスターを作るための準備をします(ECSは現状 US Eastリージョンで利用可能となっており、今後他リージョンも徐々にサポートします)。下記のコマンドを実行してMyClusterという名前のClusterを作成してみましょう。
$ aws ecs create-cluster --cluster-name MyCluster --profile jbarr-cli
コマンドはJSONの記法で、新規に生成したClusterの情報を返します。
{"cluster":{"clusterName":"MyCluster","status":"ACTIVE","clusterArn":"arn:aws:ecs:us-east-1:348414629041:cluster/MyCluster"}}
次にプレビューのプロセスの一環で共有されているはずのECS用AMI(中身はAmazon Linux AMIの軽量バージョンで、ECS向けに最適化されています)を使って、自分のVPCの中で複数のEC2インスタンスをロウンチします。EC2をロウンチするときに、ECS向けに作成したIAM Role(ecsという名前です)を選択しておきます。

また、EC2のユーザデータ設定で自分のCluster(MyCluster)内に起動するように、ECSの設定を少しだけ記載します(defaultクラスターの場合、いりません)。

インスタンス起動後、自分のClusterに入ったかどうかをlist-container-instancesコマンドで確認する事が出来ます。登録されたContainer InstanceはそれぞれにARNが割り振られます。
$ aws ecs list-container-instances --cluster MyCluster --profile jbarr-cli
{"containerInstanceArns":["arn:aws:ecs:us-east-1:348414629041:container-instance/4cf62484-da62-49a5-ad32-2015286a6d39","arn:aws:ecs:us-east-1:348414629041:container-instance/be672053-0ff8-4478-b136-7fae9225e493"]}
Cluster内のインスタンスを選択して、登録されて利用可能なCPUとメモリーのリソースに関してクエリーを実行して探し出す事が出来ます。
$ aws ecs describe-container-instances --cluster MyCluster \
--container-instances arn:aws:ecs:us-east-1:348414629041:container-instance/4cf62484-da62-49a5-ad32-2015286a6d39 \
--profile jbarr-cli
下記が返却されたデータのサンプルです。
{"registeredResources":[{"integerValue":1024,"longValue":0,"type":"INTEGER","name":"CPU","doubleValue":0.0},{"integerValue":3768,"longValue":0,"type":"INTEGER","name":"MEMORY","doubleValue":0.0}]}
プレビュー版で配布されるECSのデベロッパーガイドに従って、次にシンプルなTask Definitionを作成して登録してみます。
$ aws ecs register-task-definition --family sleep360 \
--container-definitions file://$HOME/tmp/task.json \
--profile jbarr-cli
そして、タスクとして10個実行してみます。
aws ecs run-task --cluster MyCluster --task-definition sleep360:1 --count 10 --profile jbarr-cli
実行中のタスクは下記のようにlist-tasksコマンドで見る事ができます。
$ aws ecs list-tasks --cluster MyCluster --profile jbarr-cli
下記のように実行中のコンテナが返ってきます。
{"taskArns":["arn:aws:ecs:us-east-1:348414629041:task/0c949733-862c-4979-b5bd-d4f8b474c58e","arn:aws:ecs:us-east-1:348414629041:task/3ababde9-08dc-4fc9-b005-be5723d1d495","arn:aws:ecs:us-east-1:348414629041:task/602e13d2-681e-4c87-a1d9-74c139f7335e","arn:aws:ecs:us-east-1:348414629041:task/6d072f42-75da-4a84-8b68-4841fdfe600d","arn:aws:ecs:us-east-1:348414629041:task/6da6c947-8071-4111-9d31-b87b8b93cc53","arn:aws:ecs:us-east-1:348414629041:task/6ec9828a-cbfb-4a39-b491-7b7705113ad2","arn:aws:ecs:us-east-1:348414629041:task/87e29ab2-34be-4495-988b-c93ac1f8b77c","arn:aws:ecs:us-east-1:348414629041:task/ad4fc3cc-7e80-4681-b858-68ff46716fe5","arn:aws:ecs:us-east-1:348414629041:task/cdd221ea-837c-4108-9577-2e4f53376c12","arn:aws:ecs:us-east-1:348414629041:task/eab79263-087f-43d3-ae4c-1a89678c7101"]}
ここまでで、タスクを実行してインスタンスをシャットダウンしましたので、まとめます。これら全てを通してみた結果として、下記の3つの点だけちょっとしたTipsを記載しておきます。
- VPCが外部コネクティビティがあるか確認しておいてください
- ECSが利用可能な適切なAMIを使ってください(プレビュー段階)
- IAM Roleが必要ですので、こちらも上記AMIでロウンチ時にセットしてください
ECSクイックスタートテンプレート更にスピード早くECSを実行できるように、CloudFormationを使った、ECSクイックスタートテンプレートを作成しましたのでご活用ください。このテンプレートはIAM RoleとそのロールのためのInstance Profileを生成します。このロールはECSエージェントがECSとコミュニケーションを取ることを許可するためのものです。テンプレートでは、このロールを使ってインスタンスをロウンチして、結果としてインスタンスにアクセスできるSSHコマンドを生成して返します。既存のクラスターへインスタンスをロウンチして登録する事も出来ますし、"default"という名前のデフォルトクラスターを利用することも出来ます。このテンプレートを使った場合、インスタンスはDefault VPCを使ってロウンチするようになっています。
Contain Yourself
ECS、ぜひ始めていただければと思いますが、その場合はまずはプレビューに登録してみてください。出来るだけすぐに利用可能になるように致します。
ECSについて更に知りたい場合には、re:Inventの下記セッションをみていただければと思います。大体30分程度になります(注意点として、ECS自体が凄い勢いで進化していますので、若干変更されています。例えばTask Definitionはバージョニングはされなくなったなどの変更点があります。)。
更に、来年のAmazon EC2 Container Service Deep Dive (2015年1月14日、US現地時間)というウェビナーをやります。このウェビナーでは、我々の同僚でECS Sr.ManagerのDeepak Singhが何故我々がECSを作ったのか、コアコンセプトは何か、お客様のアプリケーションでECSをどのように使えばよいか、などを発表します。ぜひご参加いただければ幸いです。
また、ここで発表があります。CoreOS はモダンなインフラストラクチャスタックのニーズを満たすように設計された新しいディストリビューションですが、このたび CoreOS AMI がECSをサポートしたことをお知らせ致します!詳細については、こちらのドキュメント(Amazon ECS on CoreOS)をご覧ください。このサポートで、CoreOSを使って、ECSエージェントをインストールしてECS内部をCoreOSディストリビューションを利用する事ができます。
最後に、いつもの通りではありますが、AWSとして我々は常にお客様からフィードバックを頂きたいと考えています。ECSはまだプレビューモードですので、お客様のニーズや要望をお聞きするには最高のタイミングです。フィードバックはECSフォーラムに頂ければと思います。また、ECSに関して何かサポートが必要な場合、お近くのソリューションアーキテクトかAWSサポートへケースとしてあげてください。
P.S. 既に満杯ではありますが、 次回Docker Meetup Tokyo #4にて、Amazon ECSについて発表させていただきます。