
Snowflakeアカウントのアカウント予算にカスタムアクションによる通知を追加する
データ事業本部の鈴木です。
Snowflakeアカウント全体の予算管理にはアカウント予算が使えますが、今のSnowsightからは予算ピッタリの通知のみ設定できるように見えます。
ただ、複数の閾値で通知したい場合もあると思います。
SQLを使うとカスタムアクションの設定が可能ですので試してみました。
Snowflakeの予算管理について
アカウント予算とカスタム予算
アカウント予算およびカスタム予算を使って、予算額と閾値に対して通知が設定可能です。
アカウント予算は、アカウント内のすべてのクレジットの使用状況を監視します。
SnowsightからはCost Managementの+Budgetから作成できます。

カスタム予算は予算管理対象として何かしらリソースやタグを設定する必要があるため、基本的にはアカウント予算より狭い範囲のコスト管理に使うこととなります。
▼ カスタム予算の対象設定

各予算の通知設定
Snowsightからだとアカウント予算の場合は予算ピッタリ超過時の通知のみが設定できます。

カスタム予算の場合は、上記通知に加えて、閾値を設定してのカスタムアクションが設定できます。

ただし調べてみると、ガイドによるとアカウント予算の場合は、SQLからであればカスタムアクションが設定できることが分かります。
You can add multiple custom actions to the account budget or to a custom budget, but you can’t add more than 10 custom actions to the same budget.
一方で、具体的なSQLによる設定例が書いてあるガイドもなかったため、この記事ではこの方法でアカウント予算にカスタムアクションを追加して通知が可能か確認してみます。
通知設定の追加
0. アカウント予算の作成
まずは先に紹介したSnowsightの動線から、1クレジットのアカウント予算を作成しました。
なお、少し話が脱線しますが、SQLからも以下の方法で作成できました。
-- アカウント予算のアクティベート
CALL SNOWFLAKE.LOCAL.ACCOUNT_ROOT_BUDGET!ACTIVATE();
-- 予算額の設定
CALL SNOWFLAKE.LOCAL.ACCOUNT_ROOT_BUDGET!SET_SPENDING_LIMIT(1);
-- 通知先の設定
CALL SNOWFLAKE.LOCAL.ACCOUNT_ROOT_BUDGET!SET_EMAIL_NOTIFICATIONS(
'costadmin@example.com, budgetadmin@example.com'
);
Snowsightで各コマンドで何が起きるのか確認すると、まずACTIVATEでアカウント予算がアクティベートされました。

SET_SPENDING_LIMITで予算額の設定ができました。
※ 初回の検証後に改めてスクショを撮っているので、この時点では予算を超過していますが気にしないでください。

この時点で、通知先は未設定です。

この後、SET_EMAIL_NOTIFICATIONSで通知先が設定できました。
1. 通知統合の作成
メール通知用の通知統合を作成しました。
USE ROLE ACCOUNTADMIN;
CREATE NOTIFICATION INTEGRATION IF NOT EXISTS budget_email_int
TYPE = EMAIL
ENABLED = TRUE
ALLOWED_RECIPIENTS = ('costadmin@example.com');
-- 通知を行うロールへUSAGEを付与する。今回はSYSADMIN。
GRANT USAGE ON INTEGRATION budget_email_int TO ROLE SYSADMIN;
なお、今回はACCOUNTADMINを使っていますが、CREATE INTEGRATIONアカウント権限が作成に必要です。
ALLOWED_RECIPIENTSに設定するメールアドレスはSnowflakeアカウントで検証しておく必要があります。
検証しないメールアドレスを使う場合は、Amazon SNSとの統合などを使うとよいかもしれません。
2. カスタムアクション用のストアドプロシージャの作成
カスタムアクションに設定するストアドプロシージャを作成しました。
ストアドプロシージャは以下のADD_CUSTOM_ACTIONで追加します。
ストアドプロシージャからは以下のどちらかの通知機能でメール通知します。
今回は以下のようにSYSTEM$SEND_EMAILを使ったストアドプロシージャを作成しました。
USE ROLE SYSADMIN;
CREATE DATABASE IF NOT EXISTS app_db;
CREATE SCHEMA IF NOT EXISTS app_db.ops;
CREATE OR REPLACE PROCEDURE app_db.ops.send_budget_alert(
integration_name STRING,
recipients STRING,
subject STRING,
body STRING
)
RETURNS STRING
LANGUAGE PYTHON
RUNTIME_VERSION = '3.11'
PACKAGES = ('snowflake-snowpark-python')
HANDLER = 'send_budget_alert'
COMMENT = 'Budget の Custom Action から SYSTEM$SEND_EMAIL で通知する'
EXECUTE AS OWNER
AS
$$
def send_budget_alert(session, integration_name, recipients, subject, body):
if not integration_name or not str(integration_name).strip():
raise Exception("budget email failed: integration_name is required")
if not recipients or not str(recipients).strip():
raise Exception("budget email failed: recipients is required")
if not subject or not str(subject).strip():
raise Exception("budget email failed: subject is required")
if not body or not str(body).strip():
raise Exception("budget email failed: body is required")
try:
session.sql(
"""
CALL SYSTEM$SEND_EMAIL(?, ?, ?, ?, 'text/plain')
""",
params=[integration_name, recipients, subject, body],
).collect()
except Exception as err:
raise Exception(f"budget email failed: {err}") from err
return "sent"
$$;
GRANT USAGE ON DATABASE app_db
TO APPLICATION SNOWFLAKE;
GRANT USAGE ON SCHEMA app_db.ops
TO APPLICATION SNOWFLAKE;
GRANT USAGE ON PROCEDURE app_db.ops.send_budget_alert(STRING, STRING, STRING, STRING)
TO APPLICATION SNOWFLAKE;
以下のように単体で通知が可能か確認しておきました。
CALL app_db.ops.send_budget_alert(
'budget_email_int',
'<recipient@example.com>',
'[Snowflake] Monthly budget alert test',
'This is a manual test of the budget email procedure.'
);
ちゃんと届いていました。いいかんじです。

3. アカウント予算への登録
では作成した通知用ストアドプロシージャをアカウント予算へ登録しました。<recipient@example.com>は自身の通知先メールアドレスに置き換えてください。
-- 予測消費が予算上限の 75% に達したときにアラート通知する。
CALL snowflake.local.ACCOUNT_ROOT_BUDGET!ADD_CUSTOM_ACTION(
SYSTEM$REFERENCE(
'PROCEDURE',
'app_db.ops.send_budget_alert(string, string, string, string)'
),
ARRAY_CONSTRUCT(
'budget_email_int',
'<recipient@example.com>',
'[Snowflake] Monthly budget alert 75%',
'Projected credit consumption reached 75% of the monthly budget limit.'
),
'ACTUAL',
75
);
実際に75%に達したときにアラート通知するよう、ACTUALとしています。
4. アラート通知の確認
少しSnowflakeを使っておいて、消費クレジットを増やし、アラートを発火させてみました。

以下のように通知がされました。
▼ 75%超過の通知

▼ 100%超過の通知

予算超過自体は5時間前くらいにしていましたが、通知は少し間が開いて2件ともまとめて通知されました。
これは予算の更新間隔が最大6.5時間あるためだと考えられます。
実際運用する際には通知の閾値の間にはもっとクレジット数があるはずなので、特に問題ないと思います。
最後に
Snowflakeアカウントのアカウント予算にカスタムアクションによる通知を追加する例でした。
アカウント予算にカスタムアクションが設定できることは文面としてはガイドに記載があるのですが、意外と具体例がなかったため、動作を確認できてよかったです。
参考になりましたら幸いです。






