Amazon EC2 Container Service( AWS ECS )を触ってみた

| コメントをどうぞ

もう2月ですよ。
2月と言えば、イベントが色々ありますね。
節分だったり、バレンタインだったり。
えーと、甘いものは結構好きです。
甘いものは結構好きです!
大事なことなので2回書きました。
どうも、DiceK Mikamiです。

さて、今回は昨年の AWS re:Invent2014 にて発表されたAmazon EC2 Container Service(以下、ECS)をようやく触ってみましたので、その所感など。

ECSは、AWSから提供されるコンテナ管理サービスで、端的にいえば 「EC2上でDocker動かそうぜ!」 なサービスです。
と言っても、今までだってEC2にDockerをセットアップすれば、同じようなことができていたわけですが、ECSによってより簡単にかつコンテナに最適化されたサービスを受けることができるようになりました。
まぁ、ものは試しと言うことで触ってみましょう。

 

ECSクラスタの作成

ECSはあくまでもEC2に付随するサービスですので、EC2のインスタンスを必要とします。
ECSクラスタはコンテナを稼働するEC2インスタンスをまとめるためのクラスタであり、ここに登録されているインスタンスの状況にあわせてサービスがうまいこと処理をハンドリングしてくれます。
ECSクラスタの作成には、プレビュー版のAWS CLIが必要になります。

プレビュー版のダウンロード

準備ができましたら、クラスタを作成します。

aws ecs create-cluster --region us-east-1 --cluster-name HogeCluster

 

ECS用のIAMロールを作成

コンテナを稼働させるインスタンスからECSのAPIにアクセスできるようにするために、ロールを設定します。
IAMロールはAWSの管理画面から作成することができます。
[IAM] > [Roles] > [Create New Role]と進みます。
Role TypeAmazon EC2 を選択します。
PermissionsCustom Policy を選択し、Policy Documentに以下を記述します。

{
  "Version": "2012-10-17",
  "Statement": [{
      "Effect": "Allow",
      "Action": [
        "ecs:CreateCluster",
        "ecs:RegisterContainerInstance",
        "ecs:DeregisterContainerInstance",
        "ecs:DiscoverPollEndpoint",
        "ecs:Submit*",
        "ecs:Poll"
      ],
      "Resource": [
        "*"
      ]
  }]
}

Policy Nameはロール名と同じでいいと思います。
 
 

ECSに最適化されたインスタンスを立ち上げる

次に、実際にコンテナが稼働するインスタンスを立ち上げます。
クラスタ作成のところで気がつかれた方もいらっしゃると思いますが、現在のところプレビュー版は US Eastリージョンでしか使えません。
US Eastリージョンでしか使えません。

大事なことなので、2回かk(ry

インスタンスを作成する際、リージョンをUS Eastに変更します。
次に、インスタンス作成画面のCommunity AMIsより「ecs-optimized-preview」と検索して、出てきたOSタイプを選びましょう。
具体的には、以下のOSです。

ecs

preview1には、どうもバグがあるらしいので、preview2をセレクトします。

次に、Step3まで道なりに進んでいただき、「Configure Instance Details」にていくつか設定します。
ひとつは、前項目で作成したIAMロールを指定します。
これは IAM role 項目から選択するだけです。

もうひとつは、作成したECSクラスタを指定します。
ページ下部の「Advanced Details」にて、以下を設定します。(As textで指定します)

#!/bin/bash
echo ECS_CLUSTER=HogeCluster >> /etc/ecs/ecs.config

あとは、適当に設定してあげれば、ECSクラスタに登録されます。
(登録されるまで少し時間がかかるかもしれません)
登録されたかを確認したい場合は、以下のコマンドをAWS CLIにて実行します。

aws ecs list-container-instances --cluster HogeCluster --region us-east-1

 

タスクの登録

クラスタの作成とそこに所属するインスタンスを作成できました。
次に、実際に動かすコンテナの設定をしていきます。
コンテナのイメージをどのように動かすかの設定をECSではタスクと読んでいます。
チュートリアルにタスクのサンプルがありましたので、これを利用します。
HogeTask.jsonとして保存します。

[
  {
    "environment": [],
    "name": "sleep",
    "image": "busybox",
    "cpu": 10,
    "portMappings": [],
    "entryPoint": [
      "/bin/sh",
      "-c"
    ],
    "memory": 10,
    "command": [
      "sleep 360"
    ],
    "essential": true
  }
]

コンテナの名前やコンテナイメージ、エントリーポイント、起動時に実行されるコマンドなどなどを設定できるようです。
AWS ECSではデフォルトでDockerHubのリポジトリを参照しています。
DockerHub以外を参照したい場合は、こちらのタスクファイルに記述する必要があります。
Dockerfileを扱ったことがある方ならばお察しいただけていると思いますが、タスクファイルの image の項目に repository-url/image:tag というかたちで記述できます。
その他の項目詳細に関しては、以下を参照してください。
http://docs.aws.amazon.com/AmazonECS/latest/developerguide/task_defintions.html
 
 

タスクの実行

保存したタスクファイルをAWS CLIを使って流し込みます。

aws ecs register-task-definition --family sleep360 --container-definitions file://HogeTask.json --region us-east-1 --output json

クラスタに登録したインスタンスに接続できるならば、そこで docker ps コマンドを実行するとコンテナが稼働していることがわかると思います。
 
 

実際使えるのか?

さて、チュートリアルを触ってみましたが、動かしてみて気になったポイントがいくつかありました。
現状でECSを試すには プレビュー版にサインアップする必要がある のですが、これが結構時間がかかります。
私は2週間ほど待ちました。
また、プレビュー版のためかリージョンがUS Eastしか選択できないのは、少し気にかかる所です。
実運用には少し早い気がします。

イメージの置き場所が(デフォルトで)DockerHubというオープンな場所と言うのは少し気になりますが、DockerリポジトリをS3に作るなんて方法もありますので、この点はクリアされているかと思います。
しかし、そこまで準備するのはかなり手間がかかります。
DockerリポジトリもAWSで提供して欲しいなぁなんて。

既存の運用を置き換えるものかと言う観点から見た場合ですが、ここは難しいところもあります。
すでに安定稼働していたり、全く別の思想で運用されている(例えば、ゴールデンイメージの利用)場合などは、置き換えに相応のコストが発生するため踏み切るのに若干苦しいものがあります。
反面、マシンパワーを効率的に利用できるため、並列運用している場合などはコストメリットが非常に大きくなります。
(インスタンス2台だったものを1台にできたりする場合もあります)
こうしたメリット・デメリットを鑑みた上で決断すべきではないでしょうか。

ともあれ、まだまだ進化の途中と言った具合ですので、もう少し様子をうかがっていきたいと思います。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>