最近、ローカルで実行していたPythonプログラムをAzureFunctionsに移設して、DataFactoryのパイプラインでスケジュール化する方法を調査していました。
どうせなら、このパイプラインの実行結果をメールで通知したいと思い、調べたところできることがわかったので紹介したいと思います。
今回は、Pythonで構築したAzureFunctionsをDataFactoryでパイプライン化し、処理結果を
Outlook365でメール通知してみます。処理結果を判断してメール通知する機能は,
AzureのLogic appsというサービスを使います。
簡単な仕様
以下の図のようにDataFactoryでAzureFunctionsのパイプラインを作成し、AzureFunctionsの実行が
正常終了の時はOK_Mailの処理が実行され、異常終了の時はNG_Mailの処理が実行されるようにします。

メールは以下のようなメールが届きます。
(正常時)

(異常時)

Azure Functionsの中身
今回はあくまで、メール通知方法についてがメインなのでほぼ、デフォルトの状態にしています。
パラメーター(name)なしの場合は、正常終了。ありの場合は異常終了するようにしています。
ちなみに、パラメータありの場合はあえて例外が発生するようにしています。
import azure.functions as func
import logging
app = func.FunctionApp(http_auth_level=func.AuthLevel.ANONYMOUS)
@app.route(route="http_trigger1")
def http_trigger1(req: func.HttpRequest) -> func.HttpResponse:
logging.info('Python HTTP trigger function processed a request.')
try:
name = req.params.get('name')
if not name:
return func.HttpResponse(f"正常終了しました。",status_code=200)
else:
raise ValueError("例外発生")
except Exception as e:
return func.HttpResponse(f"エラーが発生しました。: {str(e)}", status_code=500)
環境構築手順
今回はすでにDataFactory内にAzureFunctionsのパイプラインが登録されている状態とします。

ロジックアプリの作成
まずは、Azure上でロジックアプリを選択します。

ホスティングオプションを選択します。(今回は重量課金のプランを選択)

サブスクリプション/リソースグループをを選択して作成します。

作成完了したら[ロジックアプリデザイナー]を選択し、[トリガーの追加]を選択します。

When a HTTP request is receivedを選択します。
※検索窓にhttpを入力すると見つかります。

一旦Saveします。(URLを発行させるため)

パラメータを設定します。HTTP URLは、前の手順で保存していれば自動で入力されます。

Request Body JSON Schemaは以下の通りです。
プロパティとして以下の変数を持つようにします。
- DataFactory名(dataFactoryName)
- メッセージ(message)
- パイプライン名(pipelineName)
- 宛先(receiver)
{
"properties": {
"dataFactoryName": {
"type": "string"
},
"message": {
"type": "string"
},
"pipelineName": {
"type": "string"
},
"receiver": {
"type": "string"
}
},
"type": "object"
}
[アクションの追加]を選択します。

今回は、Office 365 Outlookのメールの送信(V2)を選択します。

Office365にサインインします。

サインインが完了すると以下の画面になります。

宛先/件名/本文を設定します。今回は先ほどプロパティで設定した内容を入れる場合は入力したい項目を選択し、⚡マークで選択ができます。

正常終了したときに通知したいメールの内容は以下のように設定しました。

上記と同じ手順で、もう一つエラー通知用のロジックアプリを作成します。(NGMail)
異常メール通知用の設定は以下の通りです。
※cloneして作成することも可能です。

DataFactoryの設定
事前に作成されていたDataFactoryのAzureFunctionsパイプラインの後続にWebアクティビティを
2つ作成します。
- 成功時(緑色)の矢印でOK_Mail(正常終了用)
- 失敗時(赤色)の矢印でNG_Mail(異常終了用)

[設定]は以下の通りです。

正常終了メールの本文には以下を入力します。
messageにはAzure Function1のresponse処理結果を返したいので
@{activity(‘Azure Function1’).output.Response}と設定します。
{"message":"@{activity('Azure Function1').output.Response}","dataFactoryName":"@{pipeline().DataFactory}","pipelineName":"@{pipeline().Pipeline}","receiver":"@{pipeline().parameters.receiver}"}
エラーの場合は、messageにはAzure Function1のエラーメッセージを設定したいので
@{activity(‘Azure Function1’).error.Message}と設定します。
{"message":"@{activity('Azure Function1').error.Message}","dataFactoryName":"@{pipeline().DataFactory}","pipelineName":"@{pipeline().Pipeline}","receiver" : "@{pipeline().parameters.receiver}"}
PipeLineのパラメータ設定
最後にPipeLineのパラメータにメールを送信する宛先(receiver)を設定します。

あとは保存してデバッグ実行するとメールが送信されるようになります。
正常終了のテスト
まずはAzureFunctionsのパラメータは無しで実行します。

パイプラインのパラメータには、名前:receiver、値にはメール通知するメールアドレスが設定されていることを確認しOKを選択します。

パイプラインが正常終了して成功時のメール通知処理が実行されます。

メールが通知されます。

異常終了のテスト
異常終了のテストも同様に行います。
AzureFunctionsのパラメータ有りでデバッグ実行し異常終了させます。

パイプラインが異常終了して失敗時のメール通知処理が実行されます。

エラーメールが通知されます。

まとめ
DataFactoryのパイプラインの処理結果をメール通知する手順をまとめると
- AzureのLogic apps(ロジックアプリ)を作成する。
- トリガーはWhen a HTTP request is receivedを追加。
- アクションはOffice 365 Outlookのメールの送信(V2)を追加(Ofiice365の場合)
- DataFactoryのWebアクティビティを利用する。
コメント