スキップしてメイン コンテンツに移動

Amazon EC2 Container Serviceを試してみた

という記事を@takipone会社ブログに書いてると思うので、僕は自分のブログに書いてみるのであった。と言ってもAmazon Web ServiceブログEC2 Container Service実践という記事をそのまま試しただけです。

ECS CLI Previewのセットアップ

AWS CLIのECS CLIはまだ Previewなので、AWS CLIの最新版をインストールしたとしても含まれていない。なのでECS Getting StartedのページからECS CLI Previewをダウンロードしてくる。

ダウンロードしたファイルを展開。
$ tar xvzf amazon-ecs-cli-preview.tar.gz
$ cd ./amazon-ecs-cli-preview
$ ls -alF
total 9824
drwxr-xr-x@ 7 smokeymonkey smokeymonkey 238 12 18 17:14 ./
drwxr-xr-x+ 13 smokeymonkey smokeymonkey 442 12 18 17:13 ../
-rw-r--r--@ 1 smokeymonkey smokeymonkey 53249 12 17 16:34 2014-11-13.api.json
drwxr-xr-x@ 12 smokeymonkey smokeymonkey 408 12 17 16:34 AWS CLI Documentation/
-rw-r--r--@ 1 smokeymonkey smokeymonkey 2237 12 17 16:34 README
drwxr-xr-x@ 4 smokeymonkey smokeymonkey 136 12 17 15:12 awscli-bundle/
-rw-r--r--@ 1 smokeymonkey smokeymonkey 4965740 12 17 16:34 ecs-cli.zip
ecs-cli.zipを展開してinstallスクリプトを動かす。
$ unzip ecs-cli.zip
$ cd awscli-bundle/
$ ls
install packages
$ sudo ./install
Running cmd: /usr/local/opt/python/bin/python2.7 virtualenv.py --python /usr/local/opt/python/bin/python2.7 /Users/smokeymonkey/.local/lib/aws
Running cmd: /Users/smokeymonkey/.local/lib/aws/bin/pip install --no-index --find-links file:///Users/smokeymonkey/Downloads/amazon-ecs-cli-preview/awscli-bundle/packages awscli-1.6.5.tar.gz
You can now run: /Users/smokeymonkey/.local/lib/aws/bin/aws --version
バージョンを確認すると、1.6.5になっている。
$ /Users/smokeymonkey/.local/lib/aws/bin/aws --version
aws-cli/1.6.5 Python/2.7.8 Darwin/14.0.0
こんな感じでecsオプションが使えることがわかる。
$ /Users/smokeymonkey/.local/lib/aws/bin/aws ecs help
ECS() ECS()

NAME
ecs -
このままだと使いづらいので、alias貼っておく。
$ alias aws='/Users/smokeymonkey/.local/lib/aws/bin/aws'
$ alias
alias aws='/Users/smokeymonkey/.local/lib/aws/bin/aws'
それと、現時点ではECSはus-east-1でしか動かないので、aws cliのconfigファイルを書き換えておく。
$ vi ~/.aws/config
[default]
region = us-east-1

ECSを試してみる

では本題。さくっとClusterを作成する。
$ aws ecs create-cluster --cluster-name MyCluster
{
"cluster": {
"clusterName": "MyCluster",
"status": "ACTIVE",
"clusterArn": "arn:aws:ecs:us-east-1:1234567890:cluster/MyCluster"
}
}
そして、ここが微妙だなと思ったんだけど、ECSのクラスタとなるEC2インスタンスは手動で立ち上げておく必要があるらしい。今回はマネージメントコンソールからLaunchした。実際はaws cliからやるのが正解だろうな。使ったAMIはECSクラスタ用の「amzn-ami-2014.09.1-amazon-ecs-optimized-preview2 - ami-34ddbe5c」。Launch時のUserDataに以下のようにいれておく。
#!/bin/bash
echo ECS_CLUSTER=MyCluster >> /etc/ecs/ecs.config
EC2が起動した後に以下のコマンドでクラスタインスタンスを確認すると、ちゃんとMyClusterに2つのEC2インスタンスが登録されていることがわかる。
$ aws ecs list-container-instances --cluster MyCluster
{
"containerInstanceArns": [
"arn:aws:ecs:us-east-1:1234567890:container-instance/30b8c142-151f-4708-bcc7-5f1407abea6b",
"arn:aws:ecs:us-east-1:1234567890:container-instance/a604212a-3682-413e-83c2-21fbdbe666d4"
]
}
describe-container-instancesでクラスタインスタンスの情報が取得できる。
$ aws ecs describe-container-instances --cluster MyCluster --container-instances arn:aws:ecs:us-east-1:1234567890:container-instance/30b8c142-151f-4708-bcc7-5f1407abea6b
{
"failures": [],
"containerInstances": [
{
"status": "ACTIVE",
"registeredResources": [
{
"integerValue": 1024,
"longValue": 0,
"type": "INTEGER",
"name": "CPU",
"doubleValue": 0.0
},
{
"integerValue": 996,
"longValue": 0,
"type": "INTEGER",
"name": "MEMORY",
"doubleValue": 0.0
},
...
さて、実際にコンテナを立ち上げてみる。コンテナを立ち上げる前に、コンテナにやらせることをタスクとして作る。以下はEC2のドキュメントにあるタスクの内容そのまんま。
$ vi task.json
[
{
"environment": [],
"name": "sleep",
"image": "busybox",
"cpu": 10,
"portMappings": [],
"entryPoint": [
"/bin/sh"
],
"memory": 10,
"command": [
"sleep",
"360"
],
"essential": true
}
]
で、作成したタスクファイルを指定してregister-task-definitionすることで、タスクが登録される。
$ aws ecs register-task-definition --family sleep360 --container-definitions file://./task.json
{
"taskDefinition": {
"taskDefinitionArn": "arn:aws:ecs:us-east-1:1234567890:task-definition/sleep360:1",
"containerDefinitions": [
{
"environment": [],
"name": "sleep",
"image": "busybox",
"cpu": 10,
"portMappings": [],
"entryPoint": [
"/bin/sh"
],
"memory": 10,
"command": [
"sleep",
"360"
],
"essential": true
}
],
"family": "sleep360",
"revision": 1
}
}
10個のコンテナでタスクを実行してみる。
$ aws ecs run-task --cluster MyCluster --task-definition sleep360:1 --count 10
{
"tasks": [
{
"taskArn": "arn:aws:ecs:us-east-1:1234567890:task/bba3df13-fa23-47f9-943f-c4d45b860708",
"overrides": {
"containerOverrides": [
{
"name": "sleep"
}
]
},
"lastStatus": "PENDING",
タスクが実行されているコンテナを一覧表示。
$ aws ecs list-tasks --cluster MyCluster
{
"taskArns": [
"arn:aws:ecs:us-east-1:1234567890:task/2e073f60-8d86-4405-9e1c-df4164a2aa67",
"arn:aws:ecs:us-east-1:1234567890:task/3334a759-15bd-4305-9f4e-aed66c211efd",
"arn:aws:ecs:us-east-1:1234567890:task/56552e1d-0b81-45fe-b109-e8baa6fc23b9",
"arn:aws:ecs:us-east-1:1234567890:task/b0e550e6-1fef-44b5-9def-8afecb93ffb4",
"arn:aws:ecs:us-east-1:1234567890:task/b1275e5a-f6f2-43ab-bf8b-289d9c3126ee",
"arn:aws:ecs:us-east-1:1234567890:task/bba3df13-fa23-47f9-943f-c4d45b860708",
"arn:aws:ecs:us-east-1:1234567890:task/bbf3caca-3272-4485-8b94-dc8fe677cb79",
"arn:aws:ecs:us-east-1:1234567890:task/d046b9ed-c299-4df5-b2fb-8a9baabad6d4",
"arn:aws:ecs:us-east-1:1234567890:task/d96df087-89f2-4f75-aa2f-db649a6ccbe5",
"arn:aws:ecs:us-east-1:1234567890:task/f061e120-f82d-4d7b-9824-f42aae5bb9b6"
]
}

感想

EC2インスタンスを別に立ち上げなきゃいけないの面倒臭いなと思ったんだけど、ECSとEC2の役割を明確に分離したってことなのかなぁ。外部にサービス展開するときはELBとの組み合わせもちゃんと考えなきゃいけなさそうだ。勉強のキモになるのはタスクの書き方で、Dockerfileを指定することもできるようなので、この切り口で勉強しようと思う。

このブログの人気の投稿

自走する組織に必要なのはルールではなくガイドライン

ということをいつも心がけている、という話です。 僕が組織のマネジメント職を20年ほどやらせてもらっている上で、いつも意識しているのは権限移譲とセルフマネジメントです。この辺の話は過去のブログにも書きました。 管理職のためのエンジニア組織構築マニュアル 管理職のための役職引退マニュアル 現場に口を出さないマネージャーの作り方 つまり「権限と裁量を同時に移譲し、責任感を持ってプロアクティブに仕事をしてもらいながらも、メンバーの良いところを更に引き出して高いパフォーマンスを出してもらう」ことこそが、マネジメント職のやるべきことだと思っています。 そのために僕がいつも権限移譲の際に伝えるのは、ルールではなくガイドラインです。ルールは規則や規定といった決まりごとなので「やること」「やってはいけないこと」が書かれたものです。ガイドラインは大まかな指針なので「方向性」「やったほうがいいこと」「やらないほうがいいこと」が書かれたものです。 ルールを提示した場合、そのとおりにすれば過去の実績からある程度の成功は見込めるものの、状況に応じた柔軟な判断が出来ませんし、メンバーの考えや意見が行動に反映されません。メンバーはルール通りの行動しか出来ず、結果としてルールを作成した人以上の成果は出せなくなってしまいます。 ガイドラインの場合、会社として望ましいと考える方向性だけが書かれているので、状況に応じた柔軟な判断も出来ますし、メンバーが考えるより良いやり方や行動を取り入れることが出来ます。ガイドラインを作成した人以上の良いアイデアがあればガイドラインをアップデートすることも出来ます。 これは権限移譲だけでなく、育成においても同様だと僕は考えます。1から10まで決まりきったカリキュラムをやらせることも時には(あるいは人によっては)必要だけれど、本当に価値のある育成は、メンバーに目指してほしい姿を伝え、現在とのギャップを一緒に認識し、そのギャップを埋めるための多種多様な方法を伝えて、その上で本人が取捨選択して自分自身で学習していく。企業や上長はそのサポートを行う。というのが、最も成長出来る育成方法だと思います。 学習する組織 ― システム思考で未来を創造する posted with AmaQuick at 2

努力できること自体が才能なので、努力しただけで褒められるべき

発明王トーマス・エジソンの名言としてよく知られる「天才とは1%のひらめきと99%の努力である」という言葉があります。実際の意図は「1%のひらめきがなければ、99%の努力は無駄になる」であったとも 言われています が、まぁどちらにせよ、ひらめきだけでは成功することはできず、そこには必ず努力も必要となります。 漫画「はじめの一歩」において主人公の師匠である鴨川会長は「努力した者が全て報われるとは限らん。しかし、成功した者は皆すべからく努力しておる」と言っていました。ここにも、成功において努力は必要不可欠であるとの強いメッセージがあります。 しかし、実際には誰もが努力できるわけではありません。 努力できること自体が才能 なのだと思います。 努力をしないことが問題だと言うつもりはありませんし、努力をしないという選択肢を選ぶことは個人の自由だと思います。必ずしも成功が万人の幸せなわけではないし、成功しなくても得られる生活によって満足する人だっています。 僕が言いたいのは「そもそも努力できない人がいる」という事実です。こういう方は選択の余地が無く、何かにおいて1位になったり、一流になったり、勝利したり、成功したりすることは難しくなります。それらには必ず努力が必要になるからであり、そして努力ができない、努力をする才能が無いからです。 これには実験の裏付けがあります。詳しくは10年前の WIREDの記事 に書かれていますが、ざっくり言うと、脳内の一部(左線条体と前頭前皮質腹内側部)におけるドーパミン作動性活性が高いと努力ができる、違う一部( 島皮質)の ドーパミン作動性活性が高いと努力できない、という実験結果があります。そもそも脳の作りや働きによって努力ができる人とできない人がいる、ということです。 繰り返しになりますが、僕は努力しない人が悪いとも思っていないし、責めるつもりもありません。僕が言いたいのは以下の2点です。 (1)努力できること自体が才能であり、その才能が無い人はそもそも努力ができないので 、努力できないことを責めてはいけない。 それは本人の特性であり個性だから。 (2)努力できること自体がすごいことなので、努力した結果が成功に結びつかなかったとしても、責めてはいけない。 努力しただけで褒められてよい。 人にはそれぞれ適材適所があるので、めちゃくちゃ努力する人は努力が

「許可を得るな、謝罪せよ」が意図していること

 弊社ではセルフマネジメントとアウトプットファーストを行動指針として掲げていますが、セルフマネジメントを象徴する言葉としてよく使われるのが 「許可を得るな、謝罪せよ」 です。 細かい話は 以前ブログにした のでそちらを読んで頂くとして、この言葉が意味するのは「アクションするのにいちいち許可を得る必要はない。許可を取る時間が無駄。やっていいですかじゃなくてやりましたと言えばいい。その結果間違っていれば謝れば良いだけ」です。 何故この方針を取るのか、この方針によってどのような結果を期待しているのか、を改めて整理したいと思います。 アクションのスピードを上げたい これは上述した意味の通りで、何らかの施策や企画があるときに、上長の許可を取るために資料を作ったり、打ち合わせしたり、下調べをしたり、という時間が無駄だからです。 この考え方の前提として「小さな失敗を早くたくさんする」というのがあります。どんな施策も企画も、正解なんて誰にもわからないし、やり方次第で変わるものです。アイデアの時点であーだこーだ言うより、実際に手を動かしてやってみて、その結果から継続の判断を行うことで、リスクを小さく、コストも小さく、たくさんアクションすることが出来ます。 モチベーションを持って取り組んでもらいたい 何でもそうですけど、人に言われたことをそのままやるより、自分で考えたことを自分のやり方でやるほうが、面白いです。僕が仕事をする上で、または僕がピープルマネジメントする上で、一番重要視しているのは、面白いかどうか、です。 担当者がモチベーションのないままやって成功することなんて(ほとんど)ありません。その施策や企画の実施に一番モチベーションがあるのはそれを考えた人なので、その人に主導してもらうのが一番成功率が高いです。 主体性を持って取り組んでもらいたい モチベーションと同様に、担当者が主体性のないままやって成功することなんて(ほとんど)ありません。その施策/企画を自分ごととして捉え、だからこそ知恵を絞って、全力を発揮する、つまり主体性を持って取り組むことが、一番成功率が高いです。そしてもちろん、一番主体性を持てるのはそれを考えた人です。 なお、主体性と責任は違います。前述の通り「小さな失敗を早くたくさんする」ためには、失敗に対して責任を追求するのではなく、結果と知見を追求する、という文化が