Bloxを使ってみました

less than 1 minute read

re:Inventで発表のあったAmazon ECSのためのオープンソースのスケジューラであるbloxを使ってみました。

Bloxとは、ECS上でのイベントを検知してコンテナのスケジューリングを行う一連の流れをより簡単に行える仕組みです。

今までECS上でのイベントに応じてスケジューリングを行おうとした場合、ECSのイベントをCloudWatch Eventで検知して、 そのイベントストリームをLambdaで解析、解析結果に応じたスケジューリングを行うといったフローをとる必要がありました。 ecsflow

Bloxではそのフローをより簡単にするためにclouster-state-servicedeamon-shedular、Key-Valueストアであるetcdの3つを常駐します。
この3つの実体はDockerコンテナなので、ローカルでもAWS上でもDockerコンテナを起動させられるところであればどこでも常駐させられます。 ecs-blox 今回はローカル上にBloxを構築しました。

Blox構築方法(ローカル)

  • Bloxのリポジトリをクローン
  • Bloxに必要なAWSリソースを作成
  • clouster-state-servicedeamon-shedularetcdの起動

Bloxのリポジトリをクローン

GitHub上のBloxのリポジトリをローカルにクローンします。

$ git clone https://github.com/blox/blox.git

Bloxに必要なAWSリソースを作成

リポジトリのクローンが完了したら、リポジトリにCloudFormationのテンプレートがあるので、これを利用してBloxに必要なAWSリソースを作成します。
(aws cliを使用しています)

$ cd <GitRepoBase>
$ aws --region <region> cloudformation create-stack --stack-name BloxLocal --template-body file://./deploy/docker/conf/cloudformation_template.json

clouster-state-servicedeamon-shedularetcdの起動

各コンポーネントの起動にはdocker-composeを使用します。

リポジトリにあるdocker-compose.ymlを利用して各コンポーネントを起動していきますが、利用する前にdocker-compose.yml内のAWS_REGIONAWS_PROFILEの値を環境に合わせて修正します。
今回はAWS_REGIONをap-northeast-1、AWS_PROFILEをdefaultとしました。

docker-compose.ymlの修正が終わったら、各コンポーネントを起動します。
(先にECSでクラスタが起動していないと、conf_css_1の起動に失敗します。)

$ cd <GitRepoBase>/deploy/docker/conf/
$ docker-compose up -d
$ docker-compose ps
Name               Command                          State   Ports
----------------------------------------------------------------------------------------
conf_etcd_1        /usr/local/bin/etcd --data ...   Up      2379/tcp, 2380/tcp
conf_scheduler_1   --bind 0.0.0.0:2000 --css- ...   Up      0.0.0.0:2000->2000/tcp
conf_css_1         --bind 0.0.0.0:3000 --etcd ...   Up      3000/tcp

これでBloxを利用する準備ができました。

Blox利用方法

clouster-state-servicedeamon-shedularはREST APIを利用して操作可能ですが、今回はBlox Demo CLI Toosを利用してBloxを操作します。

  • environmentの作成
  • deploymentの作成

environmentの作成

まず、イベントに応じて実行するECSのタスク定義と、それを紐付けるenvironmentを作成します。

$ cd <GitRepoBase>/deploy/demo-cli
$ ./blox-create-environment.py --environment TestEnvironment --cluster <MyClusterName> --task-definition <task-def-arn>

{
  "items": [
  {
    "deploymentToken": "XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX",
    "health": "healthy",
    "name": "releaseenvironment",
    "instanceGroup": {
      "cluster": "arn:aws:ecs:ap-northeast-1:XXXXXXXXXXXX:cluster/TestCluster"
    }
  }
 ]
}

オプションの--environmentには作成するenvironmentの名前を任意で、--clusterにはECS上のクラスタ名、--task-definitionにはECS上のタスク定義のarnを指定します。
environmentの作成に成功すると、deploymentTokenが返されます。これはdeploymentの作成で使用するので控えておきます。

deploymentの作成

次に作成したenvironmentをECSクラスタにdeployするために、deploymentを作成します。
environmentの作成時に返ってきたdeploymentTokenを指定します。

$ ./blox-create-deployment.py --environment TestEnvironment --deploymentToken <deploymentToken>

これでBloxを利用してECS上でイベントに応じてタスクを実行できるようになりました!
あとは、ECSでタスクが停止するなどイベントが発生すると、指定したタスクが起動されます。

まとめ

ローカルでBloxを構築して試してみましたが簡単に利用できました。
今回はBloxの操作にCLIを利用しましたが、REST APIで操作も可能なのでECSのスケジューリングがより簡単になるかもしれません。

参考リンク

AWS Blog(英語)
Github blox - Blox Installation
Github blox - Blox Demo CLI Tools

Tags: ,

Categories:

Updated: