Amazon EC2 Container Serviceより、Bloxをご紹介
本日私達はBloxという新しいオープンソースプロジェクトをAmazon ECSチームから発表しました。これによって、ECS上にカスタムスケジューラや他のツールを開発することができます。Bloxの目標は、カスタムスケジューラ、ダッシュボード、その他の拡張を作ることをシンプルにするためのツールを提供することで、皆さんの特定のユースケースの要件に合わせることができます。
ECSは先日、イベントストリームが利用可能になったこともアナウンスしており、これによってECSコンテナインスタンスとタスクの状態変化が[cloudwatch_events]に送られます。スケジュールワークフローを開発するお客様はしばしばECSクラスタで生成されたイベントを受け取り、この状態を手元に保存して、ローカルのクラスタの状態を使って操作を行います。Bloxにはこの機能とローカルのクラスタの状態をREST APIで提供するcluster-state-serviceが含まれます。BloxはECSクラスタの現在のリソース状況を必要とするカスタムスケジューラや処理を開発したり、クラスタのイベントに応じてアクションをしたい開発者をターゲットとしています。
Bloxは、ECSクラスタ上のすべてのコンテナインスタンスにおいてそれぞれ1つだけのタスクを起動できるdaemon-schedulerも含まれています。このスケジューラは新しいコンテナインスタンスがクラスタの参加したかを監視していて、そこにタスクを配置します。Bloxのdaemon-schedulerによって、ログエージェントやメトリクス収集エージェントの様なタスクをECSクラスタ上で起動できるようになります。
私達はBloxをオープンソースソフトウェアとしてリリースできて大変うれしく思っており、ECSの周辺ツールのエコシステムを開発していく計画があります。もしBloxを使ったり貢献したりすることに興味があれば、BloxのGitHubレポジトリをご覧ください。機能要望の数を見続けていて、ロードマップのために評価しています。ぜひGitHubのレポジトリに参加して、改善点の発見や優先度づけにご協力下さい。
Bloxをデプロイする
ローカル環境にBloxをデプロイする
Bloxをとりあえず初めてみたい方には、ローカルのDocker環境にフレームワークをデプロイすることをお勧めします。Bloxはローカル環境へのデプロイを可能にするDocker Composeファイルを提供しています。これによって、cluster-state-serviceを使ったカスタムスケジューラの開発を始めることができます。
こちらがローカルで実行した時のBloxのアーキテクチャです:
- ECSはクラスタの状態変化をCloudWatch Evetnsにプッシュします
- CloudWatch EventsはSQSキューに送る様に設定されています
- Bloxのcluster-state-serviceがこれらのイベントを受け取り、クラスタの状態をローカルに保存し、REST APIを提供します
- Bloxのdaemon-schedulerはcluster-state-serviceのAPIを使ってECSクラスタのコンテナインスタンスを追尾し、タスクをその上に起動します
Step 1: SQSキューを作成し、ECSイベントがSQSキューに送られる様にCloudWatch Eventsを設定する
BloxはCloudWatch Eventsで送られるECSイベントストリームに依存しています。Bloxを使うためには、SQSキューを作成し、ECSイベントがこのSQSキューに送られる様にCloudWatchを設定する必要があります。Bloxは既に構成済のAWS CloudFormationテンプレートを提供していて、必要なAWSのコンポーネントをデプロイし設定することができます。BloxのレポジトリからCloudFormationテンプレートを持ってきたら、AWS CLIを使って以下のコマンドを実行します:
$ aws --region cloudformation create-stack --stack-name BloxLocal --template-body file://cloudformation_template.json
数分すると、CloudFormationテンプレートでのCloudWatch EventsとSQSキューの設定が終わり、Bloxをデプロイする準備が整います。
Step 2: Bloxを起動する
次に、BloxのレポジトリからDocker Composeファイルをダウンロードします。Bloxを起動する前に、先に以下の様にdocker-compose.ymlを更新する必要があります:
- AWS_REGIONの値を、ECSとSQSのリソースがあるリージョンに更新します
- AWS_PROFILEの値を、~/.aws/credentials内のプロファイルの名前に更新します。defaultプロファイルを使っているなら、このステップは省略可能です。
docker-compose.ymlを更新したら、以下のコマンドを使ってローカルのDocker環境にBloxのコンテナを起動することができます:
# From the folder where you downloaded docker-compose.yml
$ docker-compose up –d
$ docker-compose ps
出力として、Bloxのcluster-state-service、daemon-scheduler、そしてetcdストレージを確認できます:
Name Command State Ports ----------------------------------------------------------------------------- etcd_1 /usr/local/bin/etcd --data ... Up 2379/tcp, 2380/tcp scheduler_1 --bind 0.0.0.0:2000 --css- ... Up 0.0.0.0:2000->2000/tcp css_1 --bind 0.0.0.0:3000 --etcd ... Up 3000/tcp
これでBloxのローカルインストールは完了です。http://localhost:2000/でScheduler APIを利用開始できます。
daemon-schedulerを使う
daemon-schedulerは以下のコンセプトを持っています:
- environmentは、管理されるタスクの希望の状態設定を表しています。daemon-schedulerでは、指定のクラスタに起動したいタスク定義のことを指します。
- deploymentは、environmentを実際に実現する操作のことです。このスケジューラでのdeploymentとは、environmentにある希望の設定状態をそのクラスタに実現させることを指します。
Step 1: ECSクラスタを作成
もしECSクラスタを持っていなければ、Create Clusterのガイドに従って下さい。
Step 2: タスク定義の登録
ECSクラスタにタスクを起動するためには、ECSにタスク定義を登録する必要があります。もしまだなければ、以下のタスク定義を使うことができます。
$ cat > /tmp/nginx.json << EOF { "family": "nginx", "containerDefinitions": [{ "name": "nginx", "image": "nginx", "cpu": 1024, "memory": 128 } ] } EOF $ aws ecs register-task-definition --cli-input-json file:///tmp/nginx.json
nginxタスク定義のARNを調べておきます。次のステップで必要になります。
$ aws ecs list-task-definitions { "taskDefinitionArns": [ "arn:aws:ecs:us-west-2::task-definition/nginx:1" ] }
daemon-schedulerを使ってデーモンのワークロードを起動
この例では、Bloxが提供するスケジューラとのやりとりのためのdemo-cliを使っています。daemon-schedulerのAPIの説明はBloxのGitHubレポジトリをご覧ください。
Step 3: environmentを作成
以下のコマンドのクラスタ名とタスク定義ARNを置き換えて、environmentを作成します:
./blox-create-environment.py --environment TestEnvironment --cluster --task-definition
サンプル出力はこちら:
{ "items": [ { "deploymentToken": "17fb6b8b-abf3-4e7b-b9f4-fdb431d53887", "health": "healthy", "name": "releaseenvironment", "instanceGroup": { "cluster": "arn:aws:ecs:us-west-2:203719379804:cluster/BloxTestCluster-1123-2" } } ] }
environmentの作成に成功すると、daemon-schedulerのレスポンスの中には次のステップで使われるdeploymentTokenが含まれます。
Step 4: deploymentを作成
このenvironmentを実際にECSクラスタ上に実現するために、deployment操作をする必要があります:
./blox-create-deployment.py --environment TestEnvironment --deploymentToken
deploymentを作成することで、スケジューラはenvironmentに設定されたタスク定義をクラスタ内のすべてのコンテナインスタンスに起動します。そうしたら、ECSコンソールに行って、コンテナインスタンス上で実行されているタスクを確認することができます。これで、daemon-schedulerを使って無事にECSクラスタにデーモンのワークロードを起動することができました。
AWSにBloxをデプロイする
BloxはAWS上にもデプロイ可能です。BloxのCloudFormationテンプレートを使って作成します:
- 1つのコンテナインスタンスを持つ新しいECSクラスタ上に、ECSサービスとしてcluster-state-service、daemon-scheduler、そしてetcdのコンテナが1つのタスクにまとめられて、Bloxのコンポーネントがセットアップされます
- daemon-schedulerのエンドポイントの前段に、Application Load Balancerが1つ作られます
- パブリックなBloxのフロントエンドとしてAPI Gatewayが作られ、認証機構を提供します。このAPI Gatewayはスケジューラに到達するために使われ、ECSクラスタ上のタスクを管理できます
- Lambda関数は単純なプロキシとして動作してlパブリックなAPI GatewayのエンドポイントからリクエストをVPC内のALBのリスナーに転送しています。
このBloxのデプロイをすることで、アカウントに紐付いているECSクラスタの管理に使うことができます。
このオプションでの設定方法については、GitHubレポジトリの説明をご覧ください。
今から利用可能です
Bloxは本日から利用可能です。詳細は、GitHubレポジトリ内のドキュメントをご覧下さい。
原文: Introducing Blox from Amazon EC2 Container Service (翻訳: SA岩永)
コメント