この記事はエムスリー Advent Calendar 2020 の10日目の記事です。
AI・機械学習チーム新卒1年目の丸尾 @snowhorkです。 今回は趣味で作ったslackにデータをpostするEmbulkプラグインを紹介したいと思います。 github.com
概要
Embulk とはデータ転送のためでOSSで、転送元(input)と転送先(output)をRubyのGemのプラグインとして組み合わせることができます。このプラグインは種類が豊富でかつ、OSSとして盛んに開発されているプラグインも多くあります。
今回開発したプラグインは、outputとしてSlackのwebhookを対象とするプラグインです。Digdagなどのワークフローエンジン上でEmbulkでデータを転送した後、連携されたデータの中身が正しいものだったかどうかを確認するために、slackに通知させるといった使われ方を想定しています。
機能
Embulkの設定ファイルにwebhookのurlを指定するだけで、slackに各カラム名とその値がポストされます。
simple.yml.liquid
out: type: slack_message title: "New Message" webhook_url: {{ env.SLACK_WEBHOOK_URL }}
erbというRuby標準のテンプレートエンジンを用いて、slackのwebhookのpayloadをカスタマイズもできます。
using_template.yml.liquid
out: type: slack_message title: "New Message" webhook_url: {{ env.SLACK_WEBHOOK_URL }} template_file: template.json.erb
template.json.erb
{ "blocks": [ { "type": "section", "fields": [{ "type": "mrkdwn", "text": "Created Date: *<%= created_date%>*\n <%= id %>: *<%= name %>*" }] } ] }
pluginを作った所感
手軽に作成できる
embulk new
コマンドでプラグインのテンプレートを簡単に作成できます。今回のケースを例に取ると、ruby
で output
プラグインを作成する場合は、次のようなコマンドになります。
embulk new ruby-output slack_message
このコマンドによって自動でRubyファイルが作成されるので、 設定パラメーターの記述と出力の処理 を書くだけで、最低限の動作が完成します。この辺りの手軽さが、Embulkのプラグイン開発が盛んな理由の1つだと思います。
ハマったポイント
slackにメッセージをpostする際のhttpクライアントとして、faradayを用いてますが、faradayの最新のバージョンではRubyは2.4以上でなければならなく、 Embulk環境で用いられてるjrubyの環境では互換性がないという問題がありました。
これはBigqueryのoutput プラグインでも同様な問題を抱えているようです。 github.com
Embulkのプラグインが多くの言語に対応しているのはメリットがある一方で、最新バージョンへの追従が遅れてしまうというデメリットがあります。今回はfaradayの古いバージョンを強制的に利用することで解決しました。
まとめ
今回は、embulk-output-slack_messageというプラグインをサクッと作った話をまとめてみました。所要時間半日でそれなりに動くものができたので、Embulkのプラグインづくりのハードルの低さが感じられました。
We are hiring!
エムスリーでは、盛んにOSS開発に取り組むギークなエンジニアを募集中です! 興味を持たれた方はぜひこちらからお願いします!