Help us understand the problem. What is going on with this article?

ローカルで使用したdocker-compose.ymlを使ってECS上でコンテナを起動する

More than 1 year has passed since last update.

AWSのマネージドなコンテナサービスEC2 Container Service、略してECSのTask definitionを操作していて思うのが、これってDocker Composeじゃーーん!です。
各コンテナに必要な定義を別の様式で記述しているわけです。

ECSでもdocker-compose.yml使えたらな〜、と思ったらありました。

Using the Amazon ECS Command Line Interface
http://docs.aws.amazon.com/ja_jp/AmazonECS/latest/developerguide/ECS_CLI.html

ECSをコマンドラインから使うものではあるのですが、おまけ(?)として、コンテナをデプロイするのにdocker-compose.ymlが使えます。操作があいまいになりがちなGUIを使わなくていい上に、Composeのymlまで使えてしまうという。ステキ。
とりあえずノウハウが豊富なWordPressを題材にやってみます。
なお、2016年9月26日現在、ecs-cliのWindows版は提供されておらず、Mac版とLinux版だけの模様。
Windowsな方、すみません。

なお今回の記事にはクラスメソッドさんの記事を超参考にさせて頂きました。

http://dev.classmethod.jp/cloud/aws/using-ecs-cl/

WordPress用 docker-compose.ymlを作成する

まずローカルで動かそう、ということでymlを作成します。

docker-compose.yml
wordpress:
  image: wordpress
  mem_limit: 268435456
  ports:
    - "80:80"
  links:
    - mysql

mysql:
  image: mysql
  mem_limit: 268435456
  environment:
    MYSQL_ROOT_PASSWORD: password

mem_limitでコンテナのメモリを制限しています。これは本来いらない設定なのですが、後ほどAWS上のt2-microで動作させようと目論んでおり、その際に必要となります。

WordPressをローカルで起動する

では早速起動。

$ docker-compose up -d
Creating tmp_mysql_1
Creating tmp_wordpress_1

WordPressのwelcomeが表示されれば成功です。
Screen Shot 2016-09-26 at 13.42.49.png

確認が済んだので停止してお掃除します。

$ docker-compose stop
Stopping tmp_wordpress_1 ... done
Stopping tmp_mysql_1 ... done

$ docker-compose rm -f
Going to remove tmp_wordpress_1, tmp_mysql_1
Removing tmp_wordpress_1 ... done
Removing tmp_mysql_1 ... done

ECS-CLIをインストールする

ではECSにコンテナをデプロイするための準備としてECS-CLIをダウンロード、インストールします。

brewでECS-CLIをインストールする

ちなみにMacの場合はbrewでインストールできます。

brew install amazon-ecs-cli

ECS-CLIを設定する

ecs-cliが使用するAWSの情報を設定します。
リージョン、アクセスキー、シークレットキーが必要になりますので事前に準備してください。

ecs-cli configure --region ap-northeast-1 --access-key XXXXXXXX --secret-key XXXXXXXX --cluster ecs-cli-test

--clusterでクラスタ名を指定しています。これはてきとうで。

ECSクラスタを起動する

では、クラスタを起動します。テストなのでケチってt2.microインスタンスX2です。

ecs-cli up --keypair KEY_NAME --capability-iam --size 2 --instance-type t2.micro

KEY_NAMEにはインスタンスアクセス用の鍵名を指定します。

この時点でAWSのコンソールにアクセスすると、クラスタが起動していることが確認できます。
なお、クラスタの作成には結構時間がかかります。約5分。お茶でも飲みながら待ちましょう。

INFO[0000] Created cluster                               cluster=ecs-cli-test
INFO[0001] Waiting for your cluster resources to be created 
INFO[0001] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
INFO[0061] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
INFO[0121] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
INFO[0182] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS
INFO[0242] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS

ECS上でコンテナを起動する

ではいよいよコンテナを起動します。使用するのはローカルで使ったymlそのまんまです。

ecs-cli compose -f docker-compose.yml up

うまくいけば、コンテナがデプロイされます。 AWSのコンソールでタスクが走っているのがわかります。

tasks.png

コンテナの起動状況を確認

$ ecs-cli ps
Name                                            State    Ports                    TaskDefinition
9070ad27-7798-4018-9389-42842eb5ee7d/wordpress  RUNNING  52.xx.xx.xx:80->80/tcp  ecscompose-tmp:3
9070ad27-7798-4018-9389-42842eb5ee7d/mysql      RUNNING                           ecscompose-tmp:3

表示されたIPにアクセスすればWordPressが表示されます。
fd23e57e-43e9-068f-e5a0-b31c2161bb6d.png

ローカルで動作させたコンテナがそのまんまAWSでも動作する。しかもこんなに簡単に。すごい!

ECS上でコンテナをスケールさせる

せっかくEC2を2つ使っているのでスケールさせてみます。

ecs-cli compose -f docker-compose.yml scale 2

かくにん。

$ ecs-cli ps
Name                                            State    Ports                     TaskDefinition
9070ad27-7798-4018-9389-42842eb5ee7d/wordpress  RUNNING  52.xx.xx.xxx:80->80/tcp   ecscompose-tmp:3
9070ad27-7798-4018-9389-42842eb5ee7d/mysql      RUNNING                            ecscompose-tmp:3
caad2e0b-6ad6-48fc-a9b0-2d2a23cdea13/mysql      RUNNING                            ecscompose-tmp:3
caad2e0b-6ad6-48fc-a9b0-2d2a23cdea13/wordpress  RUNNING  52.xx.xxx.xxx:80->80/tcp  ecscompose-tmp:3

無事増えてます!

なお今回はmysqlごとまとめてタスクにしているので、スケールしたコンテナ毎にストレージがついていることになります。そのため、片方のタスクで操作しても、もう一方のタスクには反映されないという悲しいことになっております。実運用ではmysqlはRDSを使って、アプリケーション部分のみコンテナにするのが常套手段と思われます。

ECSのサービスを定義する

最後にサービスを定義します。サービスを定義することにより、オートスケールやコンテナがコケた場合の再起動が可能になります。詳しい設定はただいま調査中のため、とりあえずサービスを定義するところまでです。

まずコンテナを落とす

$ ecs-cli compose -f ./docker-compose.yml down

サービスとして起動する

$ ecs-cli compose -f ./docker-compose.yml service up

service.png

無事サービスが上がってますね。

ECSクラスタを削除する

では最後にクラスタを削除します。まるっと綺麗に消えちゃうので本番運用している場合には注意が必要です。

ecs-cli compose -f ./docker-compose.yml service rm
ecs-cli down --force

--forceで稼働中であろうが無慈悲に削除します。気をつけましょう。


以上です。参考になれば。

furu8ma
なぜかレガシーシステムのモダナイゼーションを担当することが多いです。通称Dockerおじさん。最近podcastはじめました
https://wakateossan.github.io
Colorkrew
東京・秋葉原にあるIT企業、株式会社Colorkrew。 ”世界のシゴトをたのしくするビジョナリーカンパニー”をビジョンに掲げています。 管理職0(ゼロ)、階層0(ナシ)、 チーム力∞(無限大)の組織運営、バリフラットモデルを策定・導入。OpenWork(旧Vorkers)が選ぶ自由主義で個性を活かす企業、性格のいい会社に上位ランクイン!
https://www.colorkrew.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした