DigDagをEC2にいれてHelloWorld的なワークフローを動かしてみる

## DigDagとは？

Workflowのためのツールです。定期的に何か処理をしたいという時に使うものです。
毎日の天気をSlackに通知したいとか？そんな感じ。

要はcronとかWindowsのサービスでバッチを動かしたりするのをモダンに出来る仕組みです。

## さっそくインストールしてみる

今回はAWS EC2に入れてみます。

### Javaを8系にUpdateする

```bash
java -version
```

時と場合によるかもしれませんがEC2 LinuxではJava 1.7が入っているかもしれませんがDigDagでは8系が必要なようです。まずバージョンを確認して 1.8 になっているか確認してみてください。1.8ならOKなので次の手順は飛ばしてください。 1.7だった場合には下記手順で8系にしてください。

まずyumでインストール。

```bash
$ sudo yum install java-1.8.0-openjdk-src.x86_64
```

その後使うバージョンを`alternatives`コマンドで入れ替えます。メニューが出てくるので 1.8 を選択。

```
$ sudo alternatives --config java
```

バージョンを確認しておいてください。1.8とかになってればOKです。

```bash
$ java -version
```


### DigDagを入れる

基本は公式の通りです。
http://docs.digdag.io/getting_started.html

ただ今回は諸事情で `~/bin/diag` ではなく `/usr/local` に入れたかったのでパスを書き換えています。この辺りはお好きなところへどうぞです。

```bash
$ 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
```

入ったことを念のため確認しておきます。

```bash
$ digdag --version
0.9.35
```


### サンプルを動かしてみる

適当な場所を作って。

```bash
$ mkdir digdag_test
$ cd digdag_test
```

`init`でプロジェクトを作ってみる。

```bash
$ 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!
```

出来上がったファイルを見てみる。

```bash
$ cd mydag
$ ls
mydag.dig
```

中身を見てみる。

```digdag: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}
```

とりあえず実行してみる。

```bash
$ digdag run mydag.dig
    ：
```

日時が出たり、dog とか cat とか出てたら成功です。
無事に実行されました。

## HelloWorld的な簡単なものを作ってみる

ちょっとサンプルだけだとよくわからないので簡単なものを作ってみます。
ファイルの中身をがさっと書き換えてください。

```digdag:mydag.dig
timezone: Asia/Tokyo

+step1:
  echo>: Hello World!! ${session_time}

+step2:
  echo>: Fin.
```

実行。

```bash
$ digdag run mydig.dag
```

色々ログも一緒にでますが要は下記のように出ると思います。

```
  :
Hello World!! 2019-03-26 09:00:00 +09:00
  :
Fin.
  :
```

> 何度か連続で動かそうと思うと何も出ないかもしれません。
> 実行済みのタスクになっているためです。その場合には `--rerun` オプションを付けてやってみてください。
> `digdag run mydig.dag --rerun`　です。

`echo>:` で書いた文字列が順番に出るだけなのでなんとなく想像通りの動きだったかと思います。

## 少しだけこったものを作ってみる

せっかくなのでREST的な通信も加えたサンプルです。

```digdag
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>:` などたくさんあります。

あとは良い感じでデーモン化するなりして動かしておけば処理の自動化がはかどります。