Snowflakeアカウントのアカウント予算にカスタムアクションによる通知を追加する

Snowflakeアカウントのアカウント予算にカスタムアクションによる通知を追加する

Snowflakeのアカウント予算で複数の閾値での通知を実現したい場合、SQLを使ってカスタムアクションを追加することが可能です。この記事では、実際にカスタムアクションを設定して、通知閾値を設定した具体例をご紹介します。
2026.10.04

データ事業本部の鈴木です。

Snowflakeアカウント全体の予算管理にはアカウント予算が使えますが、今のSnowsightからは予算ピッタリの通知のみ設定できるように見えます。
ただ、複数の閾値で通知したい場合もあると思います。
SQLを使うとカスタムアクションの設定が可能ですので試してみました。

Snowflakeの予算管理について

アカウント予算とカスタム予算

アカウント予算およびカスタム予算を使って、予算額と閾値に対して通知が設定可能です。

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

アカウント予算は、アカウント内のすべてのクレジットの使用状況を監視します。
SnowsightからはCost Managementの+Budgetから作成できます。

Cost Management

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

▼ カスタム予算の対象設定

カスタム予算の対象

各予算の通知設定

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.

https://docs.snowflake.com/en/en/user-guide/budgets/custom-actions#add-a-custom-action-to-a-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アカウント権限が作成に必要です。

https://docs.snowflake.com/ja/sql-reference/sql/create-notification-integration-email

ALLOWED_RECIPIENTSに設定するメールアドレスはSnowflakeアカウントで検証しておく必要があります。
検証しないメールアドレスを使う場合は、Amazon SNSとの統合などを使うとよいかもしれません。

https://docs.snowflake.com/ja/sql-reference/sql/create-notification-integration-queue-outbound-aws

2. カスタムアクション用のストアドプロシージャの作成

カスタムアクションに設定するストアドプロシージャを作成しました。
ストアドプロシージャは以下のADD_CUSTOM_ACTIONで追加します。

https://docs.snowflake.com/en/sql-reference/classes/budget/methods/add_custom_action

ストアドプロシージャからは以下のどちらかの通知機能でメール通知します。

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

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

今回は以下のように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%超過の通知

75%超過の通知

▼ 100%超過の通知

100%超過の通知

予算超過自体は5時間前くらいにしていましたが、通知は少し間が開いて2件ともまとめて通知されました。
これは予算の更新間隔が最大6.5時間あるためだと考えられます。

https://docs.snowflake.com/en/user-guide/budgets#adjusting-the-budget-refresh-interval

実際運用する際には通知の閾値の間にはもっとクレジット数があるはずなので、特に問題ないと思います。

最後に

Snowflakeアカウントのアカウント予算にカスタムアクションによる通知を追加する例でした。
アカウント予算にカスタムアクションが設定できることは文面としてはガイドに記載があるのですが、意外と具体例がなかったため、動作を確認できてよかったです。
参考になりましたら幸いです。


Snowflakeの導入支援はクラスメソッドに!

クラスメソッドでは Snowflake の導入を支援しております。
製品の詳細や支援の内容についてお気軽にお問い合わせください。

Snowflakeの詳細を見る

この記事をシェアする

関連記事