Argo WorkflowsのLifecycleHookを用いたSlack notification
概要
Argo WorkflowsのSlack notificationを設定する方法を解説する。
運用負荷を下げるために、通知方法は LifecycleHook を用いて、 Running, Succeeded, Failureを統一して扱えるようにした。
検証に用いたコードはすべて GitHubリポジトリ上に公開しており、簡単に各々の環境で試すことができる。
イントロダクション
通知関連はMVPとして上がることは少ないが、運用上地味に有用である。
本記事ではArgo Workflows (ArgoWF) のSlack通知を行う方法を解説する。
通知を行う方法は、大きく分けて ExitHandler を使う方法と LifecycleHook を用いる方法がある。
前者の方法はWorkflowの終了時のみトリガーされるため、後者の方法を利用し、Running, Succeeded, Failure時に通知を行う。
似た記事は他にもあるが、 ExitHandlerを用いたものだったため、本記事を書いた 参考1, 参考1, 参考3 。
Slack ApplicationでのWebhook URLの作成
これについてはいくらでも記事があると思うので、省略する。
- SlackでAppを作成する
- AppでWebhookURLを作成する。
- Webhook URLは資格情報と同様のセキュリティレベルで扱うこと。
ArgoWFのデプロイ
リポジトリ を適当にcloneした後、以下実行。
cd workflow-hook/manifests
-
cp sample.env .env
として、WebhookURLを置き換える。 kind create cluster
set -a; source .env
helmfile sync -e withought-workflow-defaults .
ARGO_TOKEN="Bearer $(kubectl get secret -n argo admin.service-account-token -o=jsonpath='{.data.token}' | base64 --decode)"
k port-forward -n argo deployments/argo-workflows-server 2746:2746
- 先のトークンをコピペしてGUIログイン
Slack通知のテスト
まず、愚直に以下のようにWorkflowTemplateにSlack通知のWorkflowを書いて実行してみる。
- GUI上のWorkflowTemplate ->
hook-slack-bot-raw
-> submit - 以下のようなWorkflowの実行結果と、Slack通知が確認できる。Hookとして Runnning と Succeeded を指定しているため、2件の通知を確認できる。
- submit時にexit codeを変えれば、エラー通知を見ることもできる
コードを説明する。
- 以下の部分でLifecycleHookを指定しており、Hookに引っかかったときに
notify-slack
Workflowをトリガーするようになっている。
-
notify-slack
Workflowは以下の部分である。- Slack通知用のコンテナとしては、 nagomiso/slackutils を拝借した。
-
inputs
としてmessage
とcolor
を受け取り、Slackに通知している。 - コメントにもあるが、
workflow.name
等を利用すると、 実行したWorkflow のデータを参照することができる。
WorkflowDefaultsを用いた共通化
Slack通知自体はできたが、上記のWorkflowをすべてのWorkflowTemplateに書くのはあまりにも大変である。
そのため、 Default Workflow spec 機能を用い、すべてのWorkflowに上記をデフォルトで設定することにする。
-
helmfile diff -e default .
とすると、先程とのdifferenceが表示される。 -
helmfile sync -e default .
で apply する。 - GUI上のWorkflowTemplate ->
sh-exit
-> として実行する。今度は exit code 1としてみる。 - 以下のようなSlack通知と実行結果を確認できる
先程に追加したのは以下の部分である。
上記を追加することによって、実行するすべてのWorkflowでデフォルトでSlack通知が設定される。
まとめ
Argo Workflows でLifecycleHook機能を用いてSlack通知を行う方法を解説した。
また、Default Workflow spec機能を用いるとすべてのWorkflowに共通する設定を抜き出すことができて便利である。
Discussion