DigDagとは?
Workflowのためのツールです。定期的に何か処理をしたいという時に使うものです。
毎日の天気をSlackに通知したいとか?そんな感じ。
要はcronとかWindowsのサービスでバッチを動かしたりするのをモダンに出来る仕組みです。
さっそくインストールしてみる
今回はAWS EC2に入れてみます。
Javaを8系にUpdateする
java -version
時と場合によるかもしれませんがEC2 LinuxではJava 1.7が入っているかもしれませんがDigDagでは8系が必要なようです。まずバージョンを確認して 1.8 になっているか確認してみてください。1.8ならOKなので次の手順は飛ばしてください。 1.7だった場合には下記手順で8系にしてください。
まずyumでインストール。
$ sudo yum install java-1.8.0-openjdk-src.x86_64
その後使うバージョンをalternatives
コマンドで入れ替えます。メニューが出てくるので 1.8 を選択。
$ sudo alternatives --config java
バージョンを確認しておいてください。1.8とかになってればOKです。
$ java -version
DigDagを入れる
基本は公式の通りです。
http://docs.digdag.io/getting_started.html
ただ今回は諸事情で ~/bin/diag
ではなく /usr/local
に入れたかったのでパスを書き換えています。この辺りはお好きなところへどうぞです。
$ cd /usr/local
$ sudo curl -o ./digdag/digdag --create-dirs -L "https://dl.digdag.io/digdag-latest"
$ sudo chmod +x ./digdag/digdag
$ sudo chown ec2-user:ec2-user ./digdag
$ echo 'export PATH="/usr/local/digdag/:$PATH"' >> ~/.bashrc
$ . ~/.bashrc
入ったことを念のため確認しておきます。
$ digdag --version
0.9.35
サンプルを動かしてみる
適当な場所を作って。
$ mkdir digdag_test
$ cd digdag_test
init
でプロジェクトを作ってみる。
$ digdag init mydag
2019-03-26 09:30:44 +0900: Digdag v0.9.35
Creating mydag/mydag.dig
Creating mydag/.gitignore
Done. Type `cd mydag` and then `digdag run mydag.dig` to run the workflow. Enjoy!
出来上がったファイルを見てみる。
$ cd mydag
$ ls
mydag.dig
中身を見てみる。
timezone: UTC
+setup:
echo>: start ${session_time}
+disp_current_date:
echo>: ${moment(session_time).utc().format('YYYY-MM-DD HH:mm:ss Z')}
+repeat:
for_each>:
order: [first, second, third]
animal: [dog, cat]
_do:
echo>: ${order} ${animal}
_parallel: true
+teardown:
echo>: finish ${session_time}
とりあえず実行してみる。
$ digdag run mydag.dig
:
日時が出たり、dog とか cat とか出てたら成功です。
無事に実行されました。
HelloWorld的な簡単なものを作ってみる
ちょっとサンプルだけだとよくわからないので簡単なものを作ってみます。
ファイルの中身をがさっと書き換えてください。
timezone: Asia/Tokyo
+step1:
echo>: Hello World!! ${session_time}
+step2:
echo>: Fin.
実行。
$ digdag run mydig.dag
色々ログも一緒にでますが要は下記のように出ると思います。
:
Hello World!! 2019-03-26 09:00:00 +09:00
:
Fin.
:
何度か連続で動かそうと思うと何も出ないかもしれません。
実行済みのタスクになっているためです。その場合には--rerun
オプションを付けてやってみてください。
digdag run mydig.dag --rerun
です。
echo>:
で書いた文字列が順番に出るだけなのでなんとなく想像通りの動きだったかと思います。
少しだけこったものを作ってみる
せっかくなのでREST的な通信も加えたサンプルです。
timezone: Asia/Tokyo
+setup:
echo>: Hello World!! ${session_time}
+a:
http>: https://us-central1-get-simple-json.cloudfunctions.net/hello
content_type: "applicication/json"
store_content: true
+b:
_export:
date: ${JSON.parse(http.last_content).date}
msg: ${JSON.parse(http.last_content).msg}
+c:
echo>: date is ${date}, msg is ${msg} .
+teardown:
echo>: Fin.
結果こうなります(ログとかは省略)。
$ digdag run mydag.dig --rerun
:
2019-03-27 17:18:39 +0900: Digdag v0.9.35
:
Hello World!! 2019-03-26T09:00:00+09:00
:
date is Wed Mar 27 2019 08:18:59 GMT+0000 (UTC), msg is hogehoge .
:
Fin.
説明するほど複雑ではありませんが。
上から簡単に説明してみます。
-
+{label_name}
で書いたタスクが上から順に実行されます。今回はsetup
→a
→b
→c
→teardown
の順に実行されます。 -
timezone: Asia/Tokyo
でタイムゾーンを日本にしてます。 -
http>: {URL}
でREST APIをたたいてstore_content: true
で結果を保持して。 -
_export:
でDigDag内で使う変数定義が出来るのでdate: ${JSON.parse(http.last_content).date}
でdate
にJSONのパース結果を保存。 -
echo>: date is ${date}, msg is ${msg} .
で結果を出力。
次には何をする?
ここまでで簡単なチュートリアルは完了です。
あとは DigDag で検索! ということで調べながらやりたいオペレータを調べて付け加えていってください。
例えば今回使った http>:
以外にも mail>:
であったり、処理の制御を行う loop>:
if>:
や、凝った処理をRubyやPythonで行うための rb>:
py>:
などたくさんあります。
あとは良い感じでデーモン化するなりして動かしておけば処理の自動化がはかどります。