Azure Blockchain Workbenchでコントラクトアクション実行イベントを検知してSlackに通知する

# 概要
コントラクトの作成やコントラクトアクションの実行を検知して、別の後続処理に繋げることが可能です。
Blockchain Workbench作成時に作られるEventGridがこの役目を担います。
今回はHelloBlockchainアプリケーションのコントラクトアクションをEventGridが検知、それをトリガーにLogic Appsが動作して、Slackに通知することをやってみようと思います。

Workbenchのバージョンは1.6.0です。

## 関連記事
[Azure Blockchain WorkbenchでHello Blockchain!](https://qiita.com/shingo_kawahara/items/6acceac42ec2701bf336)
[Azure Blockchain WorkbenchのメッセージングAPIを使ってコントラクトを作成する](https://qiita.com/shingo_kawahara/items/e6080e5a08ae4d7e072d)
[Azure Blockchain WorkbenchのメッセージングAPIを使ってコントラクトアクションを実行する](https://qiita.com/shingo_kawahara/items/c0b77cc4b96dafef35d0)

# 構成
EventGridをトリガーにして、Logic Appsで各種処理を制御していきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/7f277256-91fe-68b3-2f53-1cae64ef36a5.png)
 
# Logic Apps作成

* Logic Appsを作成します。

* ロジックアプリデザイナーで、[空のロジックアプリ]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/6b4f6e62-002c-ebad-03db-929a1000678b.png)

* [Azure Event Grid]→[When a resource event occurs]トリガーを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/59b5a91a-08b9-5fae-15ba-e0b28a0cb7af.png)

* AADテナントが正しいことを確認し、サインインします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/389747b3-7096-89d4-f27d-d0122231074c.png)

* 該当のサブスクリプションを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/f47997b9-1d5a-4b52-f476-9fc0af5ea7a2.png)

* Resource Typeは[Microsoft.EventGrid.Topics]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/71b8fde2-db31-cfb3-59ad-b6f7c843da76.png)

* Resource NameはBlockchain Workbench作成時に作られたEventGridを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/38c5a083-318e-cba0-2930-a5a75893d818.png)

* 次のステップで、[制御]→[条件]アクションを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/102f66ae-93bd-961a-c58b-04f0d675354b.png)

* EventGridの動的コンテンツ「Subject」を使って、以下のような条件にします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/83fcdf97-5082-0098-ab42-da0c4ecc92cf.png)

* falseの場合の[アクションの追加]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/ff2fe6f6-ec58-b558-9445-631c4f5ae536.png)

* [制御]→[終了]アクションを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/a50f2ca5-5ec4-c698-f21b-4586f7a0dc12.png)

* 状態を[取り消し済み]に変更します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/a61521b5-9d71-bd3f-2926-d21f9a7d967b.png)

* 一旦この状態で[保存]します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/34d40ea3-6931-ce75-d9c5-227d33ecd2e5.png)

* Logic Appsの[概要]画面に戻ります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/9d3579f7-3940-de2f-033d-79302e879be1.png)

* 実行履歴の箇所を見て、「取り消し済み」という結果が記録され始めていればOKです。まだ自分で作ったHelloBlockchainアプリケーションでイベントは発生していませんが、EventGridではイベントを常に検知しています。これはEthereumのマイニングもイベントとして刻まれている為だと思われます。これらのイベントは不要なのでLogic Appsの制御で取り消し済みにしています。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/a570dcad-a25d-9e81-8f63-b714efd84d07.png)

* それではコントラクトアクションを実行します。HelloBlockchainアプリケーションでリクエストもしくはレスポンスアクションを実行してください。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/68006627-6181-955c-5cbd-dabad08f7da4.png)

* Logic Appsの実行履歴を見ると、「成功」となっているイベントがあると思います。これが自分で実行したコントラクトアクションのイベントです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/77e2a657-7b23-aa3b-9c72-4cfda89f1898.png)

* 実行履歴を選択すると以下のような結果画面に遷移するので、[When a resource event occurs]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/0c34fa18-b334-1626-68e0-5124dc2817d6.png)

* 「本文」に書かれている内容を保存しておきます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/0f81b885-5e9d-6d20-f097-8ffb5e02fcb4.png)

* ロジックアプリデザイナーに戻って、trueの場合の[アクションの追加]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/19e57c56-2ce7-bb46-d715-95192e7f33b6.png)

* [データ操作]→[JSONの解析]アクションを選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/3209308f-f745-0e9a-f897-dee9bf3052c7.png)

* コンテンツに、EventGrid動的コンテンツの「本文」を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/79857e02-cdd6-a60e-e98b-4d0caac7ff3e.png)

* [サンプルのペイロードを使用してスキーマを生成する]を選択します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/6d58b689-ae37-f27f-aa1d-f12c16994a65.png)

* 先程コピーした「本文」を貼り付けます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/f00ae5fd-dcf5-4922-d0e5-d34a2e746d37.png)

* スキーマが作られます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/8a4aa2d4-0588-ee04-2ee2-dd23a33f5c4e.png)

* 次のアクションはなんでもよいのですが、今回はSlackに通知するのみにします。以下のように作りました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/db1c51d8-c62c-dda3-cdb9-fcb665967bc7.png)

# 実行結果確認
* コントラクトアクションを実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/1479c7c3-3b25-6341-b7f6-91a761e97eb3.png)

* こんな感じでSlackに通知されればOKです。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/58ec35af-b9ef-d550-298e-03536bf29b1a.png)

* テストが終わったらLogic Appsは[無効]にしておいてください。マイニング含む全イベントが発生するのでLogic Apps課金対象となります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/180335/7bd64b76-8ad0-06d6-d1a3-bcf9391c7382.png)

# まとめ
例えば次のアクションの実行者にSlack通知するなどすればワークフローで承認する仕組みなんかも実現できそうです。
今回はSlack通知だけですが、Functionsを呼び出すこともできるので汎用性が高いですね。
ただ、注意点は、マイニング含む全イベントを検知してしまいます。一応Logic Appsで自分のアプリケーションだけに制御していますが、Logic Appsのトリガーは動いちゃってるので課金対象となります。
計算するとLogic Appsだけで月1万円くらいは掛かりそう。ここどうにかいい方法ないかなぁ。