Snowpipeのエラー通知を有効にしてみた🔰

# はじめに
　[前回の記事](https://qiita.com/Hikaru_O/items/141b4041bd87bd1595d0)の続きで、Snowflakeの機能であるSnowpipeを実装しましたが、エラー通知機能が欲しくなったの合わせてやってみました。Snowflake×Azureを使用しています。
 　

<やりたいこと>
* ロードするファイルにエラーが含まれてロードされなかった場合にメール通知をする
　想定場面としては、ローカルにあるファイルをデータレイク（今回はAzureBlobストレージ）にアップロードすると同時にSnowpipeが動く。エラーの場合はエラー内容を含んだメールを送信する。



　以下の公式手順を参考にしています。
https://docs.snowflake.com/ja/user-guide/data-load-snowpipe-errors-azure

　
# 1. カスタムトピックの作成
 　EventGridのトピックを作成。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635659/5c7860a6-5d0f-f67e-e221-cb86c0f8877f.png)
 
 　イベントサブスクリプションを追加。エンドポイントにはファイルをアップロードする用のストレージアカウントに作成されたキューを指定（ない場合は新規作成）。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635659/cc2efccf-6677-46cb-34af-321ac7589b0f.png)

　
# 2. 通知統合作成

### ①CREATE NOTIFICATION INTEGRATION
　Snowpipe作成時と同様に、通知統合を作成します。エラー通知用です。パラメータの詳細については公式ドキュメントを確認。
https://docs.snowflake.com/ja/user-guide/data-load-snowpipe-errors-azure
```
CREATE NOTIFICATION INTEGRATION NI_4 //任意の名前
  ENABLED = TRUE
  TYPE = QUEUE
  NOTIFICATION_PROVIDER = AZURE_EVENT_GRID
  DIRECTION = OUTBOUND
  AZURE_EVENT_GRID_TOPIC_ENDPOINT = 'https://xxxxx' //1で作成したイベントサブスクリプションのエンドポイント
  AZURE_TENANT_ID = 'xxxxx'; //EntraIDから確認可能
```

　
### ②Azureストレージアカウントのアクセス制御設定をする
　以下を実行。

```
 DESC NOTIFICATION INTEGRATION NI_4;
```
　実行後、二つの値をメモしておきます。
**・AZURE_CONSENT_URL**　→新規タブに張り付ける
**・AZURE_MULTI_TENANT_APP_NAME**　→後ほど使用する

　AZURE_CONSENT_URL にあるURLをタブで開くと許可を求めるページに遷移しますので許可します。成功すると、Snowflakeのトップ画面に遷移します。この操作によりSnowflakeのアプリケーションがAzure側に登録されます。

　Azureに戻り、先ほど作成したカスタムトピックに「ロール割り当ての追加」を行います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635659/b48aaa5f-f40c-8b8f-7296-7bdf53169d24.png)

　
設定はこちら。
>ロール： EventGridデータ送信者
>メンバー：先ほどメモした AZURE_MULTI_TENANT_APP_NAME のアンダースコアの前にある文字列でヒットしたもの
>https://docs.snowflake.com/ja/user-guide/data-load-snowpipe-errors-azure

　割り当てを完了します。この操作により通知統合で指定したEventGridのトピックエンドポイントへSnowflakeがアクセスすること/通知を送ることが可能になります。

　
# 3. パイプのエラー通知を有効にする
　パイプは [前回の記事](https://qiita.com/Hikaru_O/items/141b4041bd87bd1595d0)で既に作成済みなのでパイプを更新し ERROR_INTEGRATION に新しい通知統合を指定します。

```
ALTER PIPE DB2.PUBLIC.SNOWPIPE_A
SET ERROR_INTEGRATION = NI_4; //2-①で作成したエラー通知用の通知統合
```
　
# 動作確認
　データ登録先のテーブルと項目数の合わないファイルをコンテナーにアップロードして意図的にエラーを起こします。
　以下を実行しエラー通知ができているか確認。

* エラーが発生したファイルの確認
```
SELECT * FROM TABLE(VALIDATE_PIPE_LOAD(
  PIPE_NAME=>'DB2.PUBLIC.SNOWPIPE_3',
  START_TIME=>DATEADD(DAY, -1, CURRENT_TIMESTAMP()))) //今日から1日前までの履歴を見る
  ;
```
結果
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635659/b65d5586-3a07-3b25-4e88-ea3d39f4a241.png)


　
* 該当エラーに対して通知が動作していることを確認。
```
SELECT * FROM TABLE(INFORMATION_SCHEMA.NOTIFICATION_HISTORY()); 
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635659/a8c9eb19-701a-579a-0da9-a62fe0a90f36.png)

　
　EventGridのほうも覗くと通知がキューに溜まっていました。
（メッセージの内容がSnowflakeの結果と同じことを確認済み）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635659/8cbbc141-7d23-e71c-5055-e7f86e98ec8e.png)
　

　Snowflakeでポップアップ表示でもでるのかと思っていたのでちょっと予想と違う結果となりました。。。（ただ説明を読んでいなかっただけ）
　この「メッセージテキスト」が何かに使えそうだなと思いましたが、今回は当初予定していた通りメール通知までされるような流れにしました。

　たまたま近くに[DataSpiderServista](https://www.hulft.com/software/dataspider)の検証環境があったので一連の処理を合わせてみました。オンプレとクラウドを超えて繋がります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635659/b65cf24e-c59e-91cb-0f9c-a7fd8606cc24.png)


　
　
　再度エラーファイルをローカルにセットしスクリプトを実行すると
メールが飛んできました。項目数が誤っている旨のメールが来ました。これでロードに失敗しても気づけるようになります！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3635659/3b41ef3a-e3ef-7649-850f-b876b236401d.png)


　メッセージ内容をそのまま貼るのもいいですが、見づらいのでわかりやすいように少し体裁を整えて、メール本文に出てくるようにしました。

# まとめ
　これでやっと使えそうなものになってきました！機能は単体で使うのではなく色々なものと組み合せることでより良いものになると実感しました。
 　EventGridは初めて触ったということもあり、どういう仕組みで通知がどこに送られるのか理解するのに苦労しました。。。また、キューにたまったメッセージですが、Slack通知など、何かに渡して良い感じに調理できそうとも思いました。まだまだ勉強が必要ですね。
 以上です。ありがとうございました！