2019年2月16日土曜日

Logic Apps での API 接続情報エラーをチェックしてメール通知する

以前に、Microsoft Flow での接続状態チェックを行う LogicFlow を作成したことがあります。この際、Logic Apps では提供されていない管理コネクタを利用しての処理であったため、Logic Apps でのエラーチェックはできていませんでした。今回 ARM コネクタを利用してのチェックが行えたので、その方法をまとめておきます。


まず全体図としては次のようになります。


最初に行うことは、ARM コネクタを利用して「接続情報一覧を取得」することと、「プロバイダ情報を取得」することです。

接続一覧の取得は、このような形でサブスクリプションと取得条件を指定しています、Logic Apps では、API 接続情報を Microsoft.Web プロバイダによって管理されていますので、それを指定しています。

もう一つのプロバイダ情報取得ですが、後々行っている接続情報の取得の際に、利用する API のバージョン情報を指定する必要があり、そのために Microsoft.Web プロバイダの情報を取得しようとしています。Expand に条件が指定されていますが、ここは Filter とは違うようで条件指定はうまいこと動作しませんでした・・・。

そのため、取得できたプロバイダ情報に対してフィルタリングを行います。ぱっと見た目、同じ項目を指定しているようですが、微妙に異なるので CodePeek での表示も確認します。

実際の指定はこのような形です。From として処理対象となる配列を指定しますが、ここでは先ほど取得したプロバイダ情報の ResourceTypes を指定します。フィルタリング条件側では、From で指定した配列が持つ値 ResourceType を指定し、種類が connections となっているもの、これが API 接続情報を表していますのでそれに限定させます。

実際の実行結果はこのような形です。フィルタリングが動作しているのがわかります。フィルタリングされた結果から、最新の API バージョンを取得します。

ダイアログ上で入力するのは、次の関数です。

first(first(body('配列のフィルター処理'))?['apiVersions'])
フィルタリングされた結果も配列なので、first 関数を利用して最初の結果に絞り込みます。その結果には、apiVersions という配列が設定されていますので、その最初の要素を取得させています。先ほどの実行結果を見るとわかるのですが、プロバイダの API バージョン情報は、最新のものから降順に設定されているようですので、first 関数をさらに指定しての取得となります。

エラーチェックの結果を設定する、配列変数を新しく作成します。この変数に、エラーとなったものの情報を追加していく使い方です。

ここからがメイン処理となる部分です。接続情報の一覧に対して ForEach で全件チェックを行います。

その際に、ARM コネクタの Read a Resource アクションにて、接続情報の詳細を取得させるのですが、この際に以下の情報が必要になります。

  • サブスクリプション
  • リソースグループ
  • リソースプロバイダー
  • ショートリソースID
  • API バージョン
これらの値を指定する必要があります。サブスクリプションとリソースプロバイダーは、変化することもないので固定で指定しています。APIバージョンは、先に取得した値を設定します。
問題となるのが、リソースグループ、ショートリソースID ですが、これらの値は一覧として取得された接続情報から取得が可能です。

これが実際に取得した接続情報になるのですが、id の値に設定されているものから、リソースグループとショートリソースIDが抽出可能です。

{
"id": "/subscriptions/{subscription ID}/resourceGroups/{Resource Groupe}/providers/Microsoft.Web/connections/{Connection Name}",
"name": "azureeventgrid",
"type": "Microsoft.Web/connections",
"location": "westus2"
},

id は上記のような形となっています。URL 形式で、resourceGroups の後に対象となるリソースグループ名が、末尾に対象となるコネクション名が設定されているのがわかると思います。ここから必要な情報を取得するため、id の値を / で配列に分割し、特定の要素を利用します。
Split 関数で分割すると、先頭の要素は空になりますので、リソースグループ名は 5 番目、接続名は Last 関数で末尾を取得します。

Logic Flow 上では、このような形で処理を行っています。


それぞれで指定した関数は、このようにしています。リソースグループ名のところで、[4] と記載していますが、これが配列の 5 番目を直接指定する書き方です。配列は 0 から開始するので、5番目は 4 を指定する必要があります。

ARM コネクタで取得した、接続情報の詳細を JSON 解析し、後続の処理で利用しやすくします。この際のスキーマは、一度実行し、その結果を指定することで作成が可能です。

詳細情報の中には、接続が有効かどうかを表す status という値があり、そこが Connected であれば、正常な状態を表します。反対に、それ以外の値が設定されているのであれば、それは接続でエラーが発生していることとなります。
実際の判定式は次のようになります(CodePeek が利用できないので CodeView で)

Connected 出ない場合、接続エラーとして作成してある変数に追加を行います。この際、後で見やすい形に成形するために、JSON な値となるようにしています。配列変数の場合、追加する要素は Object となりますので、利用する際には関数による何らかの変換が必要となります。

直接記載していますが、エラーメッセージについては配列となっていますので、
body('接続状況の解析')?['properties']?['statuses'][0]?['error']?['message']
とダイアログ上で設定し、直接要素を参照させています。

全てのチェックを行い、エラーがあった場合に限定してメール通知を行います。作成した変数に、何かしらの値が設定されていれば、エラーがあったと判定させています。
このような形で処理を組むことで、エラーが発生している接続についてメールで通知が行われます。

Logic Apps でも、コネクタの更新や接続情報の期限切れなどで、気が付いたらエラーとなることがあります。この Logic Flow で検知、通知することで実運用でも助けとなるのではないでしょうか。





0 件のコメント:

コメントを投稿