ECSのScheduled Taskを管理するツールを作った
その名もecschedule。だいぶ前から作っていたのだが、この度実戦投入した。
https://github.com/Songmu/ecschedule
Nature社では、ECS上でGoのサービスを動かしており、バッチ系の定期実行タスクもECS Scheduled Taskを利用している。
最近バッチの本数が増えてきて管理したくなり、このツールを導入しました。
便利だとは思うが、かなり社内事情にべったりであるため、フィードバック歓迎です。具体的には以下の制約を前提としています。
- Rule名がユニークであること
- RuleにはTargetが1つだけ紐付いており、TaskのContainer Overridesでタスクを実行している
ecspressoにかなり影響を受けており、ECS Scheduled Task用のecspressoのような作りになっています。
インストール
% brew install Songmu/tap/ecschedule
# or
% go get github.com/Songmu/ecschedule/cmd/ecschedule
導入方法
以下のコマンドで設定をダンプします。
% ecschedule dump --cluster clusterName --region us-east-1 > ecschedule.yaml
これを、環境変数を変数化するなどして調整すると以下のようになります。must_env
あたりにecspressoリスペクトが感じられます。
region: us-east-1
cluster: clusterName
- name: taskName1
description: task 1
scheduledExpression: cron(30 15 ? * * *)
taskDefinition: taskDefName
containerOverrides:
- name: containerName
command: [subcommand1, arg]
environment:
HOGE: foo
FUGA: {{ must_env `APP_FUGA` }}
- name: taskName2
description: task2
scheduledExpression: cron(30 16 ? * * *)
taskDefinition: taskDefName2
containerOverrides:
- name: containerName2
command: [subcommand2, arg]
変更の適用
設定ファイルを編集して、ルールの変更を適用したい場合には、apply
サブコマンドを利用します。
% ecschedule -conf ecschedule.yaml apply -rule $ruleName
事前に diff
サブコマンドを叩いておくと変更差分が確認できるので便利です。
% ecschedule -conf ecschedule.yaml diff -rule $ruleName
全部のルールを一斉に適用したい場合には apply
サブコマンドに -all
オプションを付与します。差分があるものだけが適用されます。
% ecschedule -conf ecschedule.yaml apply -all
弊社ではこの-all
オプションをdeploy時に自動適用するようにしています。一斉自動適用最初はちょっと怖かったのですが、特に問題なく動いています。
goccy/go-yamlは神
このツールを作り始めた頃に、既存のGoのYAMLライブラリが理想の挙動にならなくて困り果てており、自分で作るかという沼にハマりかけたところに、goccyさんが颯爽とイケてるyamlライブラリを作り始めてくれて助かりました。皆さん使いましょう。
goccy/go-yamlの素晴らしいと思っている点
— songmu (@songmu) February 20, 2020
- JSONタグを相互利用可能
- struct埋め込みに対してinline指定ができる
- flowが指定可能
- structフィールド定義順にきちんとMarshalされる
- コードが読みやすい!https://t.co/UBTgNQ4TqH
https://github.com/goccy/go-yaml
ということで、ecschedule
も便利ですのでぜひご利用ください。