最近、コンテナの技術があらためて注目されています。分散アプリケーションプラットフォームの基盤としてコンテナを使うと、一貫性、開発効率、運用効率などのメリットがあります。コンテナは非常に軽量であり、仮想マシンと比べて、より少ないメモリや計算オーバーヘッド達成することができ、小さな独立した数百、数千の「動く部品」からなるアプリケーションをサポートするのが非常に簡単です。適切にコンテナ化されたアプリケーションは、スケールさせたり保守するのが簡単で、システムリソースを効率的に利用することができます。AWSにおいてもこれまでAWS Elastic BeanstalkやAWS OpsWorksにおいてコンテナのサポートをしていることを紹介してきました(参照ブログ)。
Amazon EC2 Container Serviceの紹介
本日は、さらにコンテナのメリットを存分に活かせるように、新しいコンテナ管理のサービス、EC2 Container Service (略してECS) を発表致します!このサービスを用いると、Amazon Elastic Compute Cloud (EC2) インスタンスのクラスターにまたがる沢山のDockerコンテナを、パワフルなAPIやツールを用いて簡単に稼働させることができます。ECSを用いれば、もう、クラスター管理のソフトウェアをインストールしたり、クラスターハードウェアを購入したり保守したり、ソフトウェアの利用量にあわせてハードウェアの在庫を管理する必要はありません。単に、クラスターの中で好きなだけインスタンスを立ち上げ、タスクを定義し、スタートするだけです。ECSは、スケーラブルでフォールトトレラントで、マルチテナントであり、クラスター管理の詳細の全ての面倒をみてくれます。
ちなみに、クラスターといっても恐れることはありません。ここでいうクラスターとは単に、コンテナ化された複数アプリケーションをホストするための、コンピューター、ストレージ、ネットワークのリソースプールのことを指しています。実際、クラスターは単一のt2.microインスタンスでも構いません。一般的には、クラスターとして効率的に使うのに十分なリソースを持っている中くらいのサイズの一つのEC2インスタンスを使うことが多いでしょう。
EC2 Container Service
こちらがDockerベースのアプリケーションを作成、稼働、スケールさせる際におけるECSのメリットになります。
- 簡単なクラスター管理 - ECSはDockerコンテナから成るクラスターをセットアップし管理します。ECSはコンテナの起動や終了を行い、クラスターのステート情報を保持します。複数のアベイラビリティゾーンにまたがる数万のコンテナを保持するクラスターに簡単にスケールすることができます
- ハイパフォーマンス - アプリケーションのビルディングブロックとしてコンテナを用いることができます。数秒で数千のコンテナを起動、停止、管理できます
- 柔軟なスケジューリング - ECSは組み込みスケジューラーを持っており、可用性、効率性の面でコンテナをクラスター上で適切に管理します。ECSはステート情報へのアクセスを提供しますが、もちろん、独自のスケジューラーや既存のオープンソースのスケジューラを用いてサービスAPIを利用することも可能です
- 拡張可能でポータブル - ECSはオンプレミスで用いるのと同様のDockerデーモンを用います。オンプレミスで用いたものを容易にAWSに持ち込み、持ち出すことが可能です
- リソースの効率的利用 - コンテナ化されたアプリケーションはリソースを非常に効果的に使えます。単一のEC2インスタンスの上で複数のお互いに関係のないコンテナを走らせることができます。例えば、同じインスタンスの上で、短期間だけ画像処理を行うコンテナと、長期間にわたって動かすWebサービス用のコンテナを同時に動かすことができます
- AWSの他サービスとの統合 - ECS上のアプリケーションは、もちろん、Elastic IPアドレスやリソースタグ、Virtual Private Cloud (VPC)といったAWSの機能を利用できます。コンテナはEC2やS3と同様に新しいレベルのビルディングブロックとして用いることができるでしょう
- セキュアなサービス - VPCの中のEC2インスタンスでタスクを動かすことができます。タスクはIAMロール、セキュリティグループなどのAWSセキュリティ機能を活用できます。コンテナはマルチテナント環境で動作し、定義されたインタフェースを通じてお互いに会話することができます。コンテナが稼働するEC2インスタンスも完全に所有しコントロールできます。
EC2 Container Serviceの利用
ECSは、簡単にセットアップして利用できるように設計されています。
ECS有効AMIを起動すると、インスタンスは自動的にデフォルトのクラスターにチェックインされます。もし異なるクラスターに起動したい場合は、定義ファイルを編集する、もしくは、起動の際にUser Dataに引き渡すことで特定することができます。Linux AMIをECS有効にするには、単純にECSのエージェントとDockerデーモンをインストールするだけです。
ECSエージェントはオープンソースとしてApacheライセンスの下で利用可能です。既存のLinux AMIにインストールすれば、registerContainerInstancesのAPIを呼ぶことでクラスターに追加することができます。

ECSで使われる用語集は以下の通りです。
- クラスター (Cluster) - クラスターは特定のAWSリージョンのEC2インスタンスのプールで、ECSに管理されます。ひとつのクラスターは、異なるインスタンスタイプとサイズを含むことができ、複数のアベイラビリティゾーンにわたって配置できます。
- スケジューラー (Scheduler) - スケジューラーは各クラスターにひもづけられます。スケジューラーはコンテナをインスタンスにアサインし、クラスター内のリソースを最適に利用する責任を持ちます。スケジューラーはリソースの配置上の制約を理解し出来るだけ並列に稼働させて高い可用性を実現します
- コンテナ (Container) - コンテナはパッケージ化されたアプリケーションコンポーネントです(英語ではDockerizedとも言います)。クラスター内の各EC2インスタンスは複数のコンテナをホストすることになります
- タスク定義 (Task Definition) - コンテナのためにタスクを定義するJSONファイルです。ファイルの中のフィールドは各コンテナのイメージを定義し、メモリやCPUの条件をきめ、コンテナがお互いに会話するためのポートマッピングを特定します
- タスク (Task) - タスクは、タスク定義を実行したもので、実行する仕事が定義されています
- ECS有効AMI (ECS-Enabled AMI) - ECSエージェントを稼働させるDocker化されたAmazon Machine Image (AMI)です。Amazon Linux AMIをECS有効にしたものを提供する予定ですし、CoreOSやRHEL、UbuntuのAMIも提供できるように取り組んでいます。
EC2 Container Serviceは、シンプルでパワフルなAPIセットを提供しています。クラスターの作成、表示、削除ができ、そのクラスターの中にEC2インスタンスを登録できます。タスク定義を作成でき、タスクの起動と管理が行えます。
ECS上でアプリケーションを起動するには以下の手順をとります。この例ではすでにお手持ちのアプリケーションがDocker用になっている、つまり、適切な粒度のコンポーネントになっており、各アプリがDockerfileで表現されており、既存のインフラの上で適切に動いていると仮定しています。すでにオンライン上にこういったリソースは沢山見つけられるでしょう。人気のあるアプリケーションコンポーネントはすでにDocker用になっており、Docker Hubで発見することができます。Docker repositoryにアクセス可能であれば、それがパブリックであろうとプライベートであろうとECSを用いることができます。こちらがその手順となります。
- 指定のリージョンでクラスターを作成します。アカウントに設定されたデフォルトのものを利用することもできます
- タスク定義を作成し、クラスターに登録します
- EC2インスタンス(複数可)を起動し、クラスターに登録します
- 各タスクにおいて望みのコピー数を起動します
- クラスターにおける全体の利用率とアプリケーションのスループットを監視し、調整します。例えば、利用可能なクラスターのリソースプールを拡張するために、追加のEC2インスタンスを起動して登録できます
EC2 Container Serviceの料金と利用形態
今回の発表はプレビューの形式をとっています。もしサインアップすることに興味がありましたら、こちらをクリックして登録してください。ECSに追加の料金は必要ありません。通常通り、実際に使って頂いた分だけ利用料金を支払って頂く形となります。