<やりたいこと>
「通知統合」を使うことで、Snowpipeでエラーが発生した時に自動でエラー通知できるようになります。
今後、Snowpipeを利用する際に備えて今回の記事に「通知統合」の設定手順をまとめておこうと思いました。
「通知統合」を有効化すると、Snowpipeでエラー発生後、以下①~④の流れで、AWSのSNSを利用してエラー通知できます。
① Snowpipeでエラー発生
② エラーが「通知統合」に通知される
③ 「通知統合」がAWSのSNSトピックにエラーを通知する
④ SNSサブスクリプションによりシステム運用者にエラーをメール通知する
<前提条件>
1.SnowflakeのエディションはStandard以上であること。
2.AWSとSnowflakeが同じリージョンであること。
3.Snowpipeが利用できること。
<作業手順>
① AWSでSNSを設定します。
② AWSでSNSの利用を許可するためのIAMロールを作成します。
③ Snowflakeで通知統合を作成します。
④ Snowpipeでエラー通知を有効化します。
⑤ AWSでIAMロールの信頼関係を修正します。
① AWSでSNSを設定します。
①-1 SNSトピックを作成します。
以下の項目を指定し、その他の設定項目はデフォルトとします。
・タイプ:スタンダード
・名前:任意
・表示名:任意
①-2 SNSサブスクリプションを作成し、メール通知させるようにします。
以下の項目を指定し、その他の設定項目はデフォルトとします。
・プロトコル:Eメール
・エンドポイント:エラーの通知先メールアドレス
①-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ポリシーを紐付けます。
②-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>'
③-2 DESC NOTIFICATION INTEGRATIONをIAMユーザーのARNとExternalIDを取得します。
DESC NOTIFICATION INTEGRATIONを実行して、実行結果に表示される以下の値をメモ帳に控えます。
DESC NOTIFICATION INTEGRATION <作成した「通知統合」の名称>;
・SF_AWS_IAM_USER_ARN
・SF_AWS_EXTERNAL_ID
④ Snowpipeでエラー通知を有効化します。
④-1 GRANT USAGEを実行してSnowpipeを使用するユーザーに「通知統合」の使用権限を付与します。
GRANT USAGE ON INTEGRATION <作成した「通知統合」の名称> TO ROLE <Snowpipeを使用するSnowpflakeユーザー>;
④-2 既存のSnowpipeを再作成してエラー通知を有効にします。
既存のSnowpipeで「通知統合」を有効化させるため、一度Drop Pipeで削除した後、
Create Pipeで「通知統合」を指定して再作成します。
drop pipe <「通知統合」を有効にするSnowpipeの名称>;
create pipe <「通知統合」を有効にするSnowpipeの名称>
auto_ingest = true
error_integration = <手順③-1で作成した「通知統合」の名称>
as
copy into <Snowpipeのロード先のテーブル名>
from @<外部ステージの名称>;
⑤ AWSでIAMロールの信頼関係を修正します。
AWSのIAMコンソールを開き、「信頼関係」の以下の部分を修正します。
・Principal:手順③-2でメモ帳に控えた「SF_AWS_IAM_USER_ARN」の値
・ExternalID:手順③-2でメモ帳に控えた「SF_AWS_EXTERNAL_ID」の値
<検証>
以下①~③の手順にて意図的にSnowpipeでエラーを発生させ、「通知統合」によりエラー通知されることを検証します。
① Snowpipeのロード先のテーブル定義を確認します。
② Snowpipeのロード先のテーブル定義に一致しないテストデータを用意し、外部ステージの参照先S3バケットにファイルをアップロードします。
③ SNSからSnowpipeのエラーがメール通知されることを確認します。
① Snowpipeでファイルのロード先のテーブルの定義を確認します。
select get_ddl('table','Snowpipeでのロード先のテーブル名');
② Snowpipeのロード先のテーブル定義に一致しないテストデータを用意し、外部ステージの参照先S3バケットにファイルをアップロードします。
テーブル定義に一致しないテストデータを作成し、意図的にエラーを発生させます。
③ SNSからSnowpipeのエラーがメール通知されることを確認します。
SNSサブスクリプションで設定したメールには、エラーの原因とエラーを引き起こしたファイルが記載されます。
おわりに
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