ROMANCE DAWN for the new world

Microsoft Azure を中心とした技術情報を書いています。

Windows Azure Web Jobs SDK を使って SendGrid からメール送信する

// 20140811 追記 --------------------------- ↓

WebJobs SDK の 0.3.1-beta に対応したコードに変更しました。

gooner.hateblo.jp

// 20140811 追記 --------------------------- ↑

Windows Azure – 技術者でつなぐ日めくりカレンダー の 3/7 の記事です。Web Jobs SDK と SendGrid を使って、サンプルアプリを作りました。エラーが発生したら、例外のメッセージを Queue ストレージに追加すると、メールでアラートが送信され、Table ストレージにログを記録するシナリオです。

Web Jobs SDK については、しばやんさんのブログが大変分かりやすかったので、参考にさせて頂きました。

shiba-yan.hatenablog.jp

SendGrid については、先日 SendGrid Night Episode 2 に参加してきました。

eytokyo.doorkeeper.jp

Azure Store から契約すると、マーケティングメールが使えなかったり、プランの上限を超えると送信できなかったりしますが、開発中の動作確認であれば、25,000通/月のFreeプランで十分だと思います。Azure Storeからの契約でも、構造計画研究所が日本語でサポートしてくれるのは助かります。

サンプルアプリの作成

コンソールアプリを作成し、NuGet から Web Jobs と SendGrid の SDK をインストールします。

  • Install-Package Microsoft.WindowsAzure.Jobs.Host -Pre
  • Install-Package Sendgrid -Version 1.0.1

NetworkCredential には、SendGrid と契約した際の username と password を設定します。Azure ストレージの connectionString は、ポータルから Web サイトの方にも、忘れずに設定しておきます。

#Program.cs
static void Main(string[] args)
{
    new JobHost().RunAndBlock();
}
 
public static void SendAlert([QueueInput("error")] string message, [Table("ErrorLog")] IDictionary<Tuple<string, string>, object> table)
{
    // SendGridを利用して、メールでアラート通知
    var myMessage = SendGrid.GenerateInstance();
    myMessage.AddTo("tony@gmail.com");
    myMessage.From = new MailAddress("admin@gooner.com", "システム管理者");
    myMessage.Subject = "アラート";
    myMessage.Text = message;
    var credentials = new NetworkCredential("username", "password");
    var transportSMTP = SMTP.GenerateInstance(credentials);
    transportSMTP.Deliver(myMessage);
 
    // テーブルストレージにエラーログを書く
    var partitionKey = "error";
    var rowKey = String.Format("{0:D19}", DateTime.MaxValue.Ticks - DateTime.UtcNow.Ticks);
    table.Add(Tuple.Create(partitionKey, rowKey), new { Message = message });
}
#App.config
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <connectionStrings>
    <add name="AzureJobsRuntime" connectionString="DefaultEndpointsProtocol=https;AccountName=test;AccountKey=xxx"/>
    <add name="AzureJobsData" connectionString="DefaultEndpointsProtocol=https;AccountName=test;AccountKey=xxx"/>
  </connectionStrings>
</configuration>

あとは、ビルドして作成された Debug フォルダごと zip ファイルに変換して、ポータルから Web サイトの Web Jobs にアップロードして完了です。

webjobs

結果確認

Queue ストレージに「エラーが発生しました!」というメッセージを追加すると、メールが送信され、Table ストレージにログが記録されました。

errormail

errorlog

まとめ

Web Jobs SDK を利用するメリットは、アプリ本体の実装からログやアラートなどを切り離せることです。Queue ストレージのメッセージには 8KB のサイズ制限があるので、Table ストレージをトリガーにしたかったのですが、難しいようです。エラーログのアラートなら、Blob ストレージを使ってメールに添付する方法もありですが、リアルタイムではないので注意が必要です。