はじめに
くどうです。
今回取り上げるのは、Azure FunctionsでWebhookを利用して
Sendgrid経由でメールを配信する手順の応用です。
背景として、DatadogのメールがHTML形式のみであるという点です。
つまりタグが邪魔、これを解消するための方法になります。
考えた結果、Datadog とAzureを連携する場合、現状Webhookでのインテグレーションが候補
・・・というかそれしかない。
そして、Azure FunctionsはWebhookをトリガーに起動することができ、
SendgridをOUTとしてメールを配信することが可能になる。
またWebhookからのメールソリューションには色々応用が可能な設定となります。
これらの設定を行うためには3つの作業が必要となります。
・SendGrid API Keyの取得
・Azure Functionsの設定
・Datadog でWebhookのインテグレーション設定
SendGrid API Keyの取得
事前にAzureポータル、もしくは個別にSendGridのアカウントを取得していることが前提となります。
左側のメニューより[Settings]>[API Keys]をクリックします。
右上部の[Create API Key]をクリックします。

API Key Nameに任意の名前を入力します。PermissionはFull Accessを選択します。
[Create & View]をクリックし新しいKeyを発行します。

作成されたKeyはコピーしておきます。あとで確認することはできません。

以上でAPI Keyの取得は完了です。
Azure Functionsの設定
事前にFunction Appを作成しておいてください。
新しい機能を追加します。
トリガーをGeneric Webhookとします。

今回は言語選択にJavaScriptを選択し、任意の名前を入力します。
(ここは正直ご自由に好きな言語選択で良いですが、以後のサンプルはJavaScriptです。)

統合の画面より最初に設定されているHTTP(req)を削除し、SendGridを追加します。

追加後、右上のSendGrind API Key App Settingの欄[新規]をクリックします。
そこで、キーには任意の名前、値には先ほど取得したAPI keyを入力し作成をクリックします。

To AddressとFrom Addressは必須なため送信先、送信元(適当)に入力し保存します。

以上で、設定は完了です。
次に、Functionのコードを書きます。
index.js
Datadogから送られてくるJSONの中身、titleとbodyをそれぞれSendGrindで送信する簡単なサンプルコードです。
var util = require('util');
module.exports = function (context, data) {
context.log('Webhook was triggered!');
context.done(null, {
message: {
subject: util.format("%s", data.title),
content: [{
type: 'text/plain',
value: util.format("%s", data.body)
}]
}
});
}
function.json
{
"bindings": [
{
"type": "httpTrigger",
"direction": "in",
"webHookType": "genericJson",
"name": "req"
},
{
"type": "sendGrid",
"name": "message",
"apiKey": "fromSendGrid",
"to": "xxx@xxxx.xxx",
"from": "xyz@xxxx.xxx",
"direction": "out"
}
],
"disabled": false
}
以下はテスト用の要求本文です。テストする前に張り付けてください。
{
"id": "xxxxxxxxxxxxxxxxxxxxxxxxxxx",
"title": "Title of the event",
"date": "1400246223000", // ms timestamp when the event happened
"last_updated": "1400248125000", // ms timestamp of the last update of the event
"event_type": "The event type", // "metric_alert" for a metric alert
"body": "@webhook-url1 Hi this is my event!",
"org": {
"id": "2",
"name": "The name of your organization"
}
}
保存し実行すると設定したTo Addressに下記のようなメールが送信されます。
受信すれば成功です。

以上で、Datadogから送られ来るフォーマットのデータをAzure Functionsで受信してSendGrind経由でメール送信する準備ができました。
次に、Datadogの設定を行います。
Datadog でWebhookのインテグレーション設定
前提としてDatadogのアカウントは既に取得していることが前提です。
Datadogの設定を行う前に、Funcrtion Appから関数の URL の取得を行います。

コピーしておきます。

Datadogへログイン後、インテグレーションの画面を開き、Webhookを選択します(インストールされていない場合は行ってください)。

最下部のnew name および new urlを入力します。
new nameはDatadog内で利用される名前になります。
new urlには先ほどコピーしたURLを貼り付けます。

以上で全ての作業は完了です。
あとはモニターを設定しアラートのNotify先に設定することでWebhook→Functions→SendGrindと経由されてメールが届くでしょう。

下記はロードアベレージによるアラートを例にした受信メールです。

まとめ
今回は、たまたまDatadogからWebhookを利用していますが、Webhookであればどのようなものでも応用は可能かと思います。
SendGrindもある程度まではFreeで利用できるのできるのでFuncrtionを利用し低コストで利用できるもの思います。
インフラ屋さんとしてはAzure Functions で利用するコード短く済むため楽でした 🙂
