ECS CLIでAmazon ECSを操作してみた #reinvent

Amazon ECS

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

AWS re:Invent 2015 Keynote 2でWarnerから発表された新機能の一つに、Amazon EC2 Container Service(Amazon ECS)のCLI、ECS CLIがあります。

aws-reinvent-2015-keynote2nd_018

このECS CLI、Docker Composeに対応しており、Composeと同じ操作でAmazon ECSを操作することができます。

ということで、早速ECS CLIを試してみました!

やってみた

ECS CLIのインストール

今回使っている環境はAmazon Linuxです。以下のようにecs-cliコマンドをダウンロードします。

$ sudo curl -o /usr/local/bin/ecs-cli https://s3.amazonaws.com/amazon-ecs-cli/ecs-cli-linux-amd64-latest

ダウンロードしたコマンドに実行権限をつけます。

$ sudo chmod +x /usr/local/bin/ecs-cli
$ which ecs-cli
/usr/local/bin/ecs-cli

AWS環境にアクセスするためのアクセスキーは、環境変数として持つか、ecs-cli configureで指定するか、通常のAWS CLIを使用する際に認証情報を設定するaws configureで設定するか、の3パターンです。今回はaws configureで設定しておきました。

$ aws configure

ECSクラスタを作成する

ecs-cli configureによって、リージョンとECSクラスタ名を指定します。

$ ecs-cli configure --region ap-northeast-1 --cluster my-ecs-cluster
INFO[0000] Saved ECS CLI configuration for cluster (my-ecs-cluster)

ecs-cli upコマンドでECSクラスタを起動します。

$ ecs-cli up --keypair YOUR_KEYPAIR --capability-iam --size 2 --instance-type t2.medium
INFO[0000] Created cluster                               cluster=my-ecs-cluster
INFO[0000] 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[0181] Cloudformation stack status                   stackStatus=CREATE_IN_PROGRESS

以下のようにECSクラスタが作成され、2台のECSインスタンスが起動しました。 Amazon_EC2_Container_Service

Composeでタスクを動かす

以下のようなDocker Compose用のYAMLファイルを作成しました。

$ vi wordpress.yml
wordpress:
  image: wordpress
  ports:
    - "80:80"
  links:
    - mysql
mysql:
  image: mysql
  environment:
    MYSQL_ROOT_PASSWORD: password

このYAMLファイルを指定して、ecs-cli composeコマンドでupします。

$ ecs-cli compose --file wordpress.yml up
INFO[0000] Using ECS task definition                     TaskDefinition=ecscompose-ec2-user:1
INFO[0000] Starting container...                         container=X-X-X-X-X/wordpress
INFO[0000] Starting container...                         container=X-X-X-X-X/mysql
INFO[0000] Describe ECS container status                 container=X-X-X-X-X/wordpress desiredStatus=RUNNING lastStatus=PENDING taskDefinition=ecscompose-ec2-user:1
INFO[0000] Describe ECS container status                 container=X-X-X-X-X/mysql desiredStatus=RUNNING lastStatus=PENDING taskDefinition=ecscompose-ec2-user:1
INFO[0060] Started container...                          container=X-X-X-X-X/wordpress desiredStatus=RUNNING lastStatus=RUNNING taskDefinition=ecscompose-ec2-user:1
INFO[0060] Started container...                          container=X-X-X-X-X/mysql desiredStatus=RUNNING lastStatus=RUNNING taskDefinition=ecscompose-ec2-user:1

AWS管理コンソールで確認すると、タスクが出来たことが分かります。

Amazon_EC2_Container_Service 2

ecs-cli psコマンドで確認すると、wordpressとmysqlの2つのコンテナが起動していることがわかります!

$ ecs-cli ps
Name                                            State    Ports                     TaskDefinition
X-X-X-X-X/wordpress  RUNNING  52.69.211.XXX:80->80/tcp  ecscompose-ec2-user:1
X-X-X-X-X/mysql      RUNNING                            ecscompose-ec2-user:1

実際にWebブラウザでwordpressコンテナにアクセスすると、WordPressのログイン画面が表示されます。

WordPress_›_Installation

タスクをスケールさせる

このタスクをスケールさせてみます。ecs-cli composeコマンドで、scaleオプションを2と指定します。

$ ecs-cli compose --file wordpress.yml scale 2

ecs-cli psコマンドで確認すると、wordpressとmysqlがそれぞれ2台ずつにスケールしています。

$ ecs-cli ps
Name                                            State    Ports                      TaskDefinition
X-X-X-X-X/mysql      RUNNING                             ecscompose-ec2-user:1
X-X-X-X-X/wordpress  RUNNING  54.178.193.XXX:80->80/tcp  ecscompose-ec2-user:1
Y-Y-Y-Y-Y/wordpress  RUNNING  52.69.211.XXX:80->80/tcp   ecscompose-ec2-user:1
Y-Y-Y-Y-Y/mysql      RUNNING                             ecscompose-ec2-user:1

ECSサービスとして定義する

タスクで動作を検証し、問題無ければ、今度はECSサービスとして登録します。まずは今上がっているタスクをダウンさせます。

$ ecs-cli compose --file wordpress.yml down
INFO[0000] Stopping container...                         container=Y-Y-Y-Y-Y/mysql
INFO[0000] Stopping container...                         container=Y-Y-Y-Y-Y/wordpress
INFO[0000] Stopping container...                         container=X-X-X-X-X/wordpress
INFO[0000] Stopping container...                         container=X-X-X-X-X/mysql
INFO[0000] Describe ECS container status                 container=Y-Y-Y-Y-Y/mysql desiredStatus=STOPPED lastStatus=RUNNING taskDefinition=ecscompose-ec2-user:1
INFO[0000] Describe ECS container status                 container=Y-Y-Y-Y-Y/wordpress desiredStatus=STOPPED lastStatus=RUNNING taskDefinition=ecscompose-ec2-user:1
INFO[0000] Describe ECS container status                 container=X-X-X-X-X/wordpress desiredStatus=STOPPED lastStatus=RUNNING taskDefinition=ecscompose-ec2-user:1
INFO[0000] Describe ECS container status                 container=X-X-X-X-X/mysql desiredStatus=STOPPED lastStatus=RUNNING taskDefinition=ecscompose-ec2-user:1
INFO[0006] Stopped container...                          container=Y-Y-Y-Y-Y/mysql desiredStatus=STOPPED lastStatus=STOPPED taskDefinition=ecscompose-ec2-user:1
INFO[0006] Stopped container...                          container=Y-Y-Y-Y-Y/wordpress desiredStatus=STOPPED lastStatus=STOPPED taskDefinition=ecscompose-ec2-user:1
INFO[0006] Stopped container...                          container=X-X-X-X-X/wordpress desiredStatus=STOPPED lastStatus=STOPPED taskDefinition=ecscompose-ec2-user:1
INFO[0006] Stopped container...                          container=X-X-X-X-X/mysql desiredStatus=STOPPED lastStatus=STOPPED taskDefinition=ecscompose-ec2-user:1

ecs-cli psで確認。全てのコンテナがSTOPPEDとなっていますね。

$ ecs-cli ps
Name                                            State                Ports  TaskDefinition
X-X-X-X-X/mysql      STOPPED ExitCode: 0         ecscompose-ec2-user:1
X-X-X-X-X/wordpress  STOPPED ExitCode: 0         ecscompose-ec2-user:1
Y-Y-Y-Y-Y/wordpress  STOPPED ExitCode: 0         ecscompose-ec2-user:1
Y-Y-Y-Y-Y/mysql      STOPPED ExitCode: 0         ecscompose-ec2-user:1

AWS管理コンソールからもタスクが削除されました。

Amazon_EC2_Container_Service 3

次に、ecs-cli composeコマンドで、タスクで検証していたファイルを指定し、service upオプションで実行します。

$ ecs-cli compose --file wordpress.yml service up
INFO[0000] Using ECS task definition                     TaskDefinition=ecscompose-ec2-user:1
INFO[0000] Created an ECS Service                        serviceName=ecscompose-service-ec2-user taskDefinition=ecscompose-ec2-user:1
INFO[0000] Updated ECS service successfully              desiredCount=1 serviceName=ecscompose-service-ec2-user
INFO[0000] Describe ECS Service status                   desiredCount=1 runningCount=0 serviceName=ecscompose-service-ec2-user
INFO[0030] ECS Service has reached a stable state        desiredCount=1 runningCount=1 serviceName=ecscompose-service-ec2-user

AWS管理コンソールで確認。サービスとして追加されました!

Amazon_EC2_Container_Service 4

ecs-cli psコマンドで確認すると、コンテナが2つ起動しています。

$ ecs-cli ps
Name                                            State                Ports                      TaskDefinition
Z-Z-Z-Z-Z/wordpress  RUNNING              54.178.193.188:80->80/tcp  ecscompose-ec2-user:1
Z-Z-Z-Z-Z/mysql      RUNNING                                         ecscompose-ec2-user:1

ECSサービスを削除する

さて、最後に削除してみます。ecs-cli composeコマンドでservice rmオプションをつけて実行します。

$ ecs-cli compose --file wordpress.yml service rm
INFO[0000] Updated ECS service successfully              desiredCount=0 serviceName=ecscompose-service-ec2-user
INFO[0000] Describe ECS Service status                   desiredCount=0 runningCount=1 serviceName=ecscompose-service-ec2-user
INFO[0030] ECS Service has reached a stable state        desiredCount=0 runningCount=0 serviceName=ecscompose-service-ec2-user
INFO[0030] Deleted ECS service                           service=ecscompose-service-ec2-user
INFO[0030] ECS Service has reached a stable state        desiredCount=0 runningCount=0 serviceName=ecscompose-service-ec2-user

AWS管理コンソールから確認。ECSサービスが無くなりました。

Amazon_EC2_Container_Service 5

ECSクラスタを停止する

ecs-cli downコマンドを実行します。

$ ecs-cli down --force
INFO[0000] Waiting for your cluster resources to be deleted
INFO[0000] Cloudformation stack status                   stackStatus=DELETE_IN_PROGRESS
INFO[0061] Cloudformation stack status                   stackStatus=DELETE_IN_PROGRESS
INFO[0121] Deleted cluster                               cluster=my-ecs-cluster

ECSクラスタに含まれていたECSインスタンスが無くなりました。

Amazon_EC2_Container_Service 6

これで綺麗さっぱり掃除が終わりました。

さいごに

Docker Composeと同じ操作でAmazon ECSが操作できるということは、ローカル検証環境ではSwarm + Compose、本番環境ではAmazon ECS + Compose、というように、より近い形で検証環境と本番環境を操作できるようになります。すでにComposeを使っているDockerユーザであれば簡単にAmazon ECSが使えるようになりました。GUIにアクセスしなくてもCUIで簡単にECSクラスタが作れてサービスが起動できる、これは便利です!