エムスリーテックブログ

エムスリー(m3)のエンジニア・開発メンバーによる技術ブログです

embulk-output-slack_messageプラグインを作ってみた

この記事はエムスリー Advent Calendar 2020 の10日目の記事です。

AI・機械学習チーム新卒1年目の丸尾 @snowhorkです。 今回は趣味で作ったslackにデータをpostするEmbulkプラグインを紹介したいと思います。 github.com

f:id:snowhork:20201210112527p:plain
こんな感じに出力されます

概要

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 %>*"
      }]
    }
  ]
}

f:id:snowhork:20201210112434p:plain
出力内容をerbテンプレートでカスタマイズできます

pluginを作った所感

手軽に作成できる

embulk new コマンドでプラグインのテンプレートを簡単に作成できます。今回のケースを例に取ると、rubyoutput プラグインを作成する場合は、次のようなコマンドになります。

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開発に取り組むギークなエンジニアを募集中です! 興味を持たれた方はぜひこちらからお願いします!

jobs.m3.com