Snowpipeでエラー発生時のエラー通知

# <やりたいこと>
「通知統合」を使うことで、Snowpipeでエラーが発生した時に自動でエラー通知できるようになります。

今後、Snowpipeを利用する際に備えて今回の記事に「通知統合」の設定手順をまとめておこうと思いました。

「通知統合」を有効化すると、Snowpipeでエラー発生後、以下①～④の流れで、AWSのSNSを利用してエラー通知できます。
① Snowpipeでエラー発生
② エラーが「通知統合」に通知される
③ 「通知統合」がAWSのSNSトピックにエラーを通知する
④ SNSサブスクリプションによりシステム運用者にエラーをメール通知する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/18ffefe7-6265-618e-4ee2-9300d5dca807.png)


# <前提条件>
1.SnowflakeのエディションはStandard以上であること。
2.AWSとSnowflakeが同じリージョンであること。
3.Snowpipeが利用できること。

# <作業手順>
① AWSでSNSを設定します。
② AWSでSNSの利用を許可するためのIAMロールを作成します。
③ Snowflakeで通知統合を作成します。
④ Snowpipeでエラー通知を有効化します。
⑤ AWSでIAMロールの信頼関係を修正します。

## ① AWSでSNSを設定します。
### ①-1 SNSトピックを作成します。
以下の項目を指定し、その他の設定項目はデフォルトとします。
・タイプ：スタンダード
・名前：任意
・表示名：任意
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/08e8e6ab-3660-552a-6b11-ea8cce16e457.png)

### ①-2 SNSサブスクリプションを作成し、メール通知させるようにします。
以下の項目を指定し、その他の設定項目はデフォルトとします。
・プロトコル：Eメール
・エンドポイント：エラーの通知先メールアドレス
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/74f986a9-af31-bca4-6e02-6280b3b43bd5.png)

### ①-3 SNSトピックのARNを取得します。
SNSトピックのARNを後述の手順で使用するので、メモ帳に控えます。

## ② AWSでSNSの利用を許可するためのIAMロールを作成します。
### ②-1 SNSトピックへの通知を許可するIAMポリシーを作成します。
JSONエディターに以下のポリシーをコピー&ペーストし、「Resource」に手順①-3でメモ帳に控えたSNSトピックのARNを適用します。
```
{
    "Version": "2012-10-17",
    "Statement": [
      {
         "Effect": "Allow",
         "Action": [
             "sns:Publish"
         ],
         "Resource": "arn:aws:sns:ap-northeast-1:<AWSのアカウントID>:<SNSトピック名>"
      }
    ]
 }
```

### ②-2 IAMロールを作成します。
#### ②-2-1 信頼ポリシーを作成します。
JSONエディターにて信頼ポリシーを作成します。
以下の項目には、ダミー値を指定します。(後述の手順で修正します）

・Principal：現在ログインしているAWSアカウントの「アカウントID」
・Condition：0000
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Statement1",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::<現在ログインしているAWSアカウントのID>:root"
            },
            "Action": "sts:AssumeRole",
            "Condition": {
                "StringEquals": {
                    "sts:ExternalId": [
                        "0000"
                    ]
                }
            }
        }
    ]
}
```

#### ②-2-2 IAMロールにSNSの使用を許可するIAMポリシーを紐付けます。
手順②-1で作成したIAMポリシーを紐付けます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/1b7fc838-dd2f-d290-3c0e-764cacb59f8e.png)

### ②-3 IAMロールのARNを取得します。
IAMロールのARNを後述の手順で使用するので、メモ帳に控えます。

## ③ Snowflakeで通知統合を作成します。
### ③-1 SnowflakeのWebインターフェースにログインし、CREATE NOTIFICATION INTEGRATIONを実行して通知統合を作成します。
```
CREATE NOTIFICATION INTEGRATION <通知統合の名称>
  ENABLED = true
  TYPE = QUEUE
  NOTIFICATION_PROVIDER = AWS_SNS
  DIRECTION = OUTBOUND
  AWS_SNS_TOPIC_ARN = '<手順①-3でメモ帳に控えたSNSトピックのARN>'
  AWS_SNS_ROLE_ARN = '<手順②-3でメモ帳に控えたIAMロールのARN>'
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/4a2265de-fe8f-03b3-8008-4ce4d1cf74ed.png)

### ③-2 DESC NOTIFICATION INTEGRATIONをIAMユーザーのARNとExternalIDを取得します。
DESC NOTIFICATION INTEGRATIONを実行して、実行結果に表示される以下の値をメモ帳に控えます。
```
DESC NOTIFICATION INTEGRATION <作成した「通知統合」の名称>;
```
・SF_AWS_IAM_USER_ARN
・SF_AWS_EXTERNAL_ID
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/92d8ab4b-bf19-610f-33b0-010c1167fc52.png)

## ④ Snowpipeでエラー通知を有効化します。
### ④-1 GRANT USAGEを実行してSnowpipeを使用するユーザーに「通知統合」の使用権限を付与します。
```
GRANT USAGE ON INTEGRATION <作成した「通知統合」の名称> TO ROLE <Snowpipeを使用するSnowpflakeユーザー>;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/9d0c8178-19e0-db0d-66ba-6b101ab45ebf.png)

### ④-2 既存のSnowpipeを再作成してエラー通知を有効にします。
既存のSnowpipeで「通知統合」を有効化させるため、一度Drop Pipeで削除した後、
Create Pipeで「通知統合」を指定して再作成します。
```
drop pipe <「通知統合」を有効にするSnowpipeの名称>;

create pipe <「通知統合」を有効にするSnowpipeの名称>
  auto_ingest = true
  error_integration = <手順③-1で作成した「通知統合」の名称>
  as
  copy into <Snowpipeのロード先のテーブル名>
  from @<外部ステージの名称>;
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/16ad48a2-b838-8fdc-0e57-30306251f34a.png)

## ⑤ AWSでIAMロールの信頼関係を修正します。
  AWSのIAMコンソールを開き、「信頼関係」の以下の部分を修正します。

・Principal：手順③-2でメモ帳に控えた「SF_AWS_IAM_USER_ARN」の値
・ExternalID：手順③-2でメモ帳に控えた「SF_AWS_EXTERNAL_ID」の値
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/d9c429b6-38f9-9262-ed53-8a52c0331543.png)

# <検証>
以下①～③の手順にて意図的にSnowpipeでエラーを発生させ、「通知統合」によりエラー通知されることを検証します。
① Snowpipeのロード先のテーブル定義を確認します。
② Snowpipeのロード先のテーブル定義に一致しないテストデータを用意し、外部ステージの参照先S3バケットにファイルをアップロードします。
③ SNSからSnowpipeのエラーがメール通知されることを確認します。

### ① Snowpipeでファイルのロード先のテーブルの定義を確認します。
```
select get_ddl('table','Snowpipeでのロード先のテーブル名');
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/5802580d-7805-a16c-0fb8-edf838a8e55f.png)

### ② Snowpipeのロード先のテーブル定義に一致しないテストデータを用意し、外部ステージの参照先S3バケットにファイルをアップロードします。

テーブル定義に一致しないテストデータを作成し、意図的にエラーを発生させます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/1d0be208-ae5b-93b5-0185-391d4af05856.png)


### ③ SNSからSnowpipeのエラーがメール通知されることを確認します。
SNSサブスクリプションで設定したメールには、エラーの原因とエラーを引き起こしたファイルが記載されます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1925708/866d136b-fb00-c9e7-af49-3bd20b1e1476.png)

# おわりに
Snowpipeによりテーブルへのデータのロードが自動化できるがゆえに、エラーの発生をどのようにして検知するかが課題でした。「通知統合」によりエラー検知も可能になり、
Snowpipeの運用を考えた非常に便利な機能であると思いました。

# ご案内
株式会社ジールでは、「ITリテラシーがない」「初期費用がかけられない」「親切・丁寧な支援がほしい」「ノーコード・ローコードがよい」「運用・保守の手間をかけられない」などのお客様の声を受けて、オールインワン型データ活用プラットフォーム「ZEUSCloud」を月額利用料にてご提供しております。
ご興味がある方は是非下記のリンクをご覧ください：
https://www.zdh.co.jp/products-services/cloud-data/zeuscloud/?utm_source=qiita&utm_medium=referral&utm_campaign=qiita_zeuscloud_content-area