Snowflake で設定したアラート通知を Amazon SNS 経由で受け取る

Snowflake で設定したアラート通知を Amazon SNS 経由で受け取る

Clock Icon2025.01.23

とーかみです。

Snowflake の監視設定をするにあたって、アラート通知を Amazon SNS 経由で受け取るための事前設定手順を記載します。

Snowflake から SYSTEM$SEND_EMAIL ストアドプロシージャを使用して直接 E メール通知を行うこともできますが、今回は AWS 側での監視と合わせて通知先を管理するために別途 SNS トピックを作成する方式を対象にしています。

SYSTEM$SEND_EMAIL ストアドプロシージャについては公式ドキュメントの以下のページを参考にしてください。

https://docs.snowflake.com/ja/user-guide/email-stored-procedures#label-email-notification-send

概要

以下の流れで手順を記載します。

  • 通知先の SNS トピックと SNS サブスクリプションを作成する
  • Snowflake と Amazon SNS 間の通知統合を設定する
  • アラートを作成し、アクションとして通知用のプロシージャを呼びだす

https://docs.snowflake.com/ja/user-guide/tasks-errors-aws

SNS トピックと SNS サブスクリプションを作成する

AWS にて通知に使用する SNS トピックと確認用の SNS サブスクリプションを設定しておきます。

事前設定として SNS トピックを作成しメール通知の設定をしておきました。

注意 : SNS トピックのタイプはスタンダードのみ

公式ドキュメントの以下の記載の通り、 SNS トピックのタイプは「スタンダード(標準)」で作成する必要があります。

SNS の標準トピックのみをサポートしています。エラー通知で使用する SNS FIFO (先入れ先出し)トピックは作成しないでください。現在、 FIFO トピックに送信されたエラー通知は警告なしで失敗します。

SNS との通知統合を作成する

以下の手順で行います。

  • IAM ポリシーおよび IAM ロールを作成する
  • 通知統合を作成する

IAM ポリシーおよび IAM ロールを作成する

公式ドキュメントの記載の通り、以下の JSON で IAM ポリシーを作成します。
<sns_topic_arn> 部分は通知先の SNS トピックの ARN に置き換えてください。

{
    "Version": "2012-10-17",
    "Statement": [
      {
         "Effect": "Allow",
         "Action": [
             "sns:Publish"
         ],
         "Resource": "<sns_topic_arn>"
      }
    ]
 }

作成したポリシーをアタッチした IAM ロールを作成します。
Snowflake 側の AWS アカウント ID と外部キーは Snowflake で通知統合を作成した後で更新するため、仮の値を入れて作成します。

  • 信頼されたエンティティタイプ : AWS アカウント
  • AWS アカウント ID : 「別の AWS アカウント」を選択し、仮の値として 12 桁のアカウント ID を入れておく(後で更新する部分)
    • ロールを作成する AWS アカウントの ID で OK です
  • 「外部 ID を要求する」のチェックをオン
  • 外部 ID : 000 など仮の値を入れておく(後で更新する部分)

通知統合を作成する

以下の SQL を参考に SNS トピックのARN と IAM ロールの ARN を作成したものに置き換えて実行します。

CREATE NOTIFICATION INTEGRATION <integration_name>
  ENABLED = true
  TYPE = QUEUE
  NOTIFICATION_PROVIDER = AWS_SNS
  DIRECTION = OUTBOUND
  AWS_SNS_TOPIC_ARN = '<topic_arn>'
  AWS_SNS_ROLE_ARN = '<iam_role_arn>'
;

以下の SQL を実行し、作成した通知統合の情報を確認します。<integration_name> は作成した通知統合の名称に置き換えてください。

DESC NOTIFICATION INTEGRATION <integration_name>;

表示された結果の中の SF_AWS_IAM_USER_ARNSF_AWS_EXTERNAL_ID をもとに IAM ロールの信頼関係を更新します。

IAM ロールの信頼関係を更新する

作成時に仮の値で入れた信頼関係の設定を以下の JSON をもとに書き換えます。

<sf_aws_iam_user_arn>SF_AWS_IAM_USER_ARN の値を、
<sf_aws_external_id>SF_AWS_EXTERNAL_ID の値に書き換えて設定してください。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "AWS": "<sf_aws_iam_user_arn>"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "sts:ExternalId": "<sf_aws_external_id>"
        }
      }
    }
  ]
}

通知統合の動作確認

Snowflake で以下のような SQL を実行し、通知を送信してみます。

CALL SYSTEM$SEND_SNOWFLAKE_NOTIFICATION(
  '{"text/plain":"通知統合テストメッセージ"}',
  '{
    "<integration_name>": {}
  }'
);

メールボックスを確認すると設定した通知メッセージでメールが届いていました。

もし通知が来ない場合は以下の SQL で通知の履歴を確認しステータスを確認しましょう。
設定によっては information_schema に対してデータベース名を明示的に指定する必要があります。

select * from table(information_schema.notification_history(
  START_TIME=>dateadd('hour',-1,current_timestamp()),
  END_TIME=>current_timestamp(),
  RESULT_LIMIT=>100,
  INTEGRATION_NAME=>'<integration_name>'));

参考: 通知形式のカスタマイズ

上記の通知テストでは text/plain 形式を使用しましたが、他にも text/htmlapplication/json を指定することもできます。

詳細な設定は SYSTEM$SEND_SNOWFLAKE_NOTIFICATION のリファレンスを参照してください。

https://docs.snowflake.com/en/sql-reference/stored-procedures/system_send_snowflake_notification

アラートの中で通知統合を使用する

公式ドキュメントを参考に Snowflake アラートを設定します。
Snowflake アラートではスケジュール、条件、条件にマッチした場合のアクションを定義します。

https://docs.snowflake.com/ja/user-guide/alerts

アラートで参照するダミーテーブルを作成する

今回は以下のようなタイムスタンプと数値を持つメトリクスっぽいダミーテーブルを作成しました。

CREATE TABLE <database_name>.<schema_name>.ALART_TRIGGER_DATA 
AS SELECT current_timestamp AS ADD_DATETIME, 1 AS TRIGGER_VALUE ;

アラート作成用の権限を設定する

ACCOUNTADMIN ロールで以下のように権限を設定します。

USE ROLE ACCOUNTADMIN;

CREATE ROLE my_alert_role;  -- アラート設定用のロールを作成
GRANT EXECUTE ALERT ON ACCOUNT TO ROLE my_alert_role;  -- アラート設定権限をロールに付与
GRANT ROLE my_alert_role TO USER <my_user>; -- 設定するユーザーにロールを設定
GRANT CREATE ALERT ON SCHEMA <database_name>.<schema_name> TO ROLE my_alert_role; -- アラート作成権限をロールに付与
GRANT USAGE ON SCHEMA <database_name>.<schema_name> TO ROLE my_alert_role; -- アラート使用権限をロールに付与

以降、作成したロールを使用して Snowflake で SQL を実行するものとします。

アラートを作成する

ダミーテーブルを参照するアラートを以下の SQL で作成します。
対象期間に条件に該当するレコードが存在する場合にアクションとして通知を行うアラートです。

CREATE OR REPLACE ALERT alert_test
  WAREHOUSE = <warehouse_name>
  SCHEDULE = '5 MINUTE' -- アラートの評価スケジュールを指定(cron 式での指定も可能)
  IF (EXISTS (
      SELECT *
      FROM <database_name>.<schema_name>.ALART_TRIGGER_DATA
      WHERE ADD_DATETIME BETWEEN -- 前回実行~今回実行の期間を対象
        SNOWFLAKE.ALERT.LAST_SUCCESSFUL_SCHEDULED_TIME()
        AND SNOWFLAKE.ALERT.SCHEDULED_TIME()
      AND TRIGGER_VALUE > 2 -- しきい値を想定した条件
  ))
  THEN CALL SYSTEM$SEND_SNOWFLAKE_NOTIFICATION( -- アクションとして通知を設定
      '{"text/plain":"アラート通知メッセージ"}',
      '{
        "<integration_name>": {}
      }'
);

作成しただけでは有効化されないため、以下の SQL で有効化します。

ALTER ALERT <database_name>.<schema_name>.alert_test RESUME;  -- 有効化
-- ALTER ALERT <database_name>.<schema_name>.alert_test SUSPEND;  -- 無効化

検知用にダミーテーブルにレコードを Insert します。

INSERT INTO <database_name>.<schema_name>.ALART_TRIGGER_DATA
    (ADD_DATETIME, TRIGGER_VALUE)
    SELECT current_timestamp, 3;

しばらく待つとメール通知が届いていることが確認できました。

まとめ

通知統合と Snowflake アラートを組み合わせて監視と Amazon SNS 経由の通知を行う仕組みを設定しました。

アラートに設定する検知用 SQL やアクションの記述を変更することでリソース監視やデータ監視をはじめとしたさまざまな機能を実現することができます。
通知統合では複数の通知先に通知を送信することもできます。

別の記事では Snowflake の監視に利用できるシステムテーブルを検証したいと思います。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.