[新機能]Snowflake Intelligence と Cortex Agents を予算で管理できるようになりました

[新機能]Snowflake Intelligence と Cortex Agents を予算で管理できるようになりました

2026.03.13

はじめに

2026年3月のアップデートで、Snowflake Intelligence と Cortex Agents にリソース予算(Resource Budgets)機能が追加されました。

https://docs.snowflake.com/en/release-notes/2026/other/2026-03-11-snowflake-intelligence-resource-budgets

https://docs.snowflake.com/en/release-notes/2026/other/2026-03-11-cortex-agents-resource-budgets

Snowflake Intelligence について、こちらを試してみた内容を本記事でまとめます。

アップデートの概要

本機能については以下に記載があります。

https://docs.snowflake.com/en/user-guide/snowflake-cortex/snowflake-intelligence/si-resource-budgets

Snowflake では以前より、予算として、対応する特定のオブジェクトをまとめてそのクレジット使用状況を監視できる機能が提供されていました。

今回のアップデートで、この予算の対象に Snowflake Intelligence と Cortex Agents が追加されそのクレジット消費を監視し、設定した閾値を超えたときに自動的にアクションを実行できるようになります。

特徴として、いずれも予算におけるタグベースのオブジェクト範囲指定となっています。

具体的には、事前にオブジェクトにタグを付与し、そのタグを予算に関連付けることで、Snowflake がクレジット消費を追跡し、定期的に予算制限との比較を行えます。

https://docs.snowflake.com/en/user-guide/budgets/custom-budget#using-tags-to-monitor-objects

また、2026年2月のアップデートで追加されたカスタムアクションを設定することで、実際の閾値に達した際や、閾値に到達すると予測される場合にストアドプロシージャを実行するように構成できます。これにより、以下のようなアクションを設定できます。

  • 通知:指定した割合に達した際にメール通知を送信
  • アクセス取消:指定した割合に達した際にロールへのアクセスを削除

同じタイミングで追加されたサイクル開始アクション機能も組み合わせれば、翌月になり、予算の支出がリセットされると権限を振り直すなど一連のサイクルを管理できます。

https://docs.snowflake.com/en/user-guide/budgets/cycle-start-actions

執筆時点での本機能の注意点として、以下の制限があります。

  • 遅延
    • 予算超過後の実行に最大 8 時間要する場合があり、その間にさらに支出が増加する可能性があります。タグの変更がシステムに反映されるまでも、最大 8 時間の遅延が発生します
  • 月次周期のみ対応
    • 予算は月単位で運用され、カスタム期間の設定には対応していません
  • アクセス取消はロール経由のみ
    • オブジェクトを直接ブロックする機能はなく、ロールへのアクセス取消のみが対応しています
  • 適用単位
    • 予算は Snowflake Intelligence オブジェクト全体に適用されます

https://docs.snowflake.com/en/user-guide/snowflake-cortex/snowflake-intelligence/si-resource-budgets#limitations

試してみる

ここでは以下の内容を試してみます。
以降の手順で定義するストアドプロシージャなどはドキュメントの内容を参考にしています。

  • Snowflake Intelligence オブジェクトにタグを付与
  • カスタム予算を作成し、Snowflake Intelligence オブジェクトを追加
  • 通知設定、カスタムアクションを追加
    • カスタムアクションでは、閾値に達した際に、自動的に Snowflake Intelligence(厳密には背後のエージェント)の使用権限を削除させる

前提条件

以下の環境を使用しています。

  • Snowflake Intelligence 関連のオブジェクトは作成済み
    • アカウントの Snowflake Intelligence オブジェクト
    • Cortex Agent
    • Cortex Agent がツールとして使用するセマンティックビュー など
  • 閲覧用ユーザーの権限経由で、参照ユーザーは Snowflake Intelligence 経由で問い合わせができる状態
    • 役割ロール+アクセスロールの構成で、データベースロールを継承させることで、エージェントの使用権限を役割ロール(アカウントロール)に付与

また、各種オブジェクト作成用に、以下のスキーマを事前に作成しておきます。

CREATE SCHEMA IF NOT EXISTS yasuhara_test_db.tags;
CREATE SCHEMA IF NOT EXISTS yasuhara_test_db.budgets;
CREATE SCHEMA IF NOT EXISTS yasuhara_test_db.procedures;

タグの作成と適用

はじめに、コスト管理用のタグを作成し、対象の Snowflake Intelligence オブジェクトに付与します。

-- タグの作成
CREATE TAG yasuhara_test_db.tags.yasuhara_cost_center
   ALLOWED_VALUES 'snow-intelligence'
   COMMENT = 'yasuhara cost_center tag';

-- Snowflake Intelligence オブジェクトへのタグ適用
USE ROLE ACCOUNTADMIN;
-- アカウントのSnowflake Intelligenceオブジェクトを確認
SHOW SNOWFLAKE INTELLIGENCES;

ALTER SNOWFLAKE INTELLIGENCE IF EXISTS SNOWFLAKE_INTELLIGENCE_OBJECT_DEFAULT
   SET TAG yasuhara_test_db.tags.yasuhara_cost_center = 'snow-intelligence';

予算の作成

次に、予算インスタンスを作成し、月間クレジット上限とトラッキング対象のタグを設定します。

USE SCHEMA yasuhara_test_db.budgets;

-- 予算インスタンスの作成
CREATE SNOWFLAKE.CORE.BUDGET my_snow_intelligence_budget();

-- 月間クレジット利用限度額を設定(例:10クレジット)
CALL my_snow_intelligence_budget!SET_SPENDING_LIMIT(10);

-- 予算にタグを関連付け、タグ付けされたオブジェクトの支出を追跡
CALL yasuhara_test_db.budgets.my_snow_intelligence_budget!SET_RESOURCE_TAGS(
   [
      [(SELECT SYSTEM$REFERENCE('TAG',
         'yasuhara_test_db.tags.yasuhara_cost_center',
         'SESSION',
         'applybudget')),
         'snow-intelligence']
   ],
   'UNION');

設定後、Snowsight で対象の予算の設定を確認すると下図のようになっていました。

2026-03-13_14h39_09

通知の設定

クレジット消費が閾値に達した際にメール通知を送信する設定を行います。はじめに通知統合を作成します。

USE ROLE ACCOUNTADMIN;

-- 通知統合の作成
CREATE NOTIFICATION INTEGRATION yasuhara_budgets_notification_integration
  TYPE = EMAIL
  ENABLED = TRUE
  ALLOWED_RECIPIENTS = (
    '<メールアドレス>'
  );

-- 開発用ロールと Snowflake アプリケーションへの権限付与
GRANT USAGE ON INTEGRATION yasuhara_budgets_notification_integration TO ROLE yasuhara_dev;
GRANT USAGE ON INTEGRATION YASUHARA_BUDGETS_NOTIFICATION_INTEGRATION TO APPLICATION SNOWFLAKE;

次に、予算に通知先と閾値を設定します。

-- 通知先メールアドレスを設定
CALL yasuhara_test_db.budgets.my_snow_intelligence_budget!SET_EMAIL_NOTIFICATIONS(
  'yasuhara_budgets_notification_integration',
  '<メールアドレス>'
);

-- 通知閾値を設定(支出が80%に達すると予測された時点で通知)
CALL yasuhara_test_db.budgets.my_snow_intelligence_budget!SET_NOTIFICATION_THRESHOLD(80);

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

設定後、Snowsight 上でも反映を確認できます。

2026-03-13_14h41_28

アクセス取消の設定

支出が閾値に達した際にアクセスを自動で取り消すカスタムアクションを設定します。はじめに、アクセスの取り消し/付与を行うストアドプロシージャを作成します。

-- ここでは ACCOUNTADMIN を所有者として定義
USE ROLE ACCOUNTADMIN;

-- アクセス取消用ストアドプロシージャの作成
CREATE OR REPLACE PROCEDURE yasuhara_test_db.procedures.sp_revoke_si_access(
   si_name STRING, role_name STRING
)
RETURNS STRING
LANGUAGE SQL
AS
BEGIN
   EXECUTE IMMEDIATE 'REVOKE DATABASE ROLE <DB>.AGENT_ACCESS_ROLE FROM ROLE ' || role_name;
   RETURN 'Access revoked for ' || si_name;
END;

-- アクセス付与用ストアドプロシージャの作成
CREATE OR REPLACE PROCEDURE yasuhara_test_db.procedures.sp_grant_si_access(
   si_name STRING, role_name STRING
)
RETURNS STRING
LANGUAGE SQL
AS
BEGIN
   EXECUTE IMMEDIATE 'GRANT DATABASE ROLE <DB>.AGENT_ACCESS_ROLE TO ROLE ' || role_name;
   RETURN 'Access granted for ' || si_name;
END;

-- 必要に応じて権限付与
GRANT USAGE ON PROCEDURE yasuhara_test_db.procedures.sp_revoke_si_access(STRING, STRING) TO ROLE yasuhara_dev;
GRANT USAGE ON PROCEDURE yasuhara_test_db.procedures.sp_grant_si_access(STRING, STRING) TO ROLE yasuhara_dev;

-- Snowflake アプリケーションへのアクセス権限を付与
USE ROLE SECURITYADMIN;
GRANT USAGE ON DATABASE yasuhara_test_db TO APPLICATION SNOWFLAKE;
GRANT USAGE ON SCHEMA yasuhara_test_db.procedures TO APPLICATION SNOWFLAKE;
GRANT USAGE ON PROCEDURE yasuhara_test_db.procedures.sp_revoke_si_access(STRING, STRING)
   TO APPLICATION SNOWFLAKE;
GRANT USAGE ON PROCEDURE yasuhara_test_db.procedures.sp_grant_si_access(STRING, STRING)
   TO APPLICATION SNOWFLAKE;

カスタムアクションを設定する前に、作成したストアドプロシージャの動作を確認します。

権限がある状態では、Snowflake Intelligence 経由で対象のエージェントが表示され選択できます。

2026-03-13_17h46_18

権限削除のストアドプロシージャを実行します。

CALL yasuhara_test_db.procedures.sp_revoke_si_access('SNOWFLAKE_INTELLIGENCE_OBJECT_DEFAULT', '<エージェントの使用権限を持つカスタムロール>');

画面を更新すると、下図のようにエージェントが表示されなくなり、権限取消が動作することを確認できました。

2026-03-13_17h54_40

確認後、権限を再付与しておきます。

CALL yasuhara_test_db.procedures.sp_grant_si_access('SNOWFLAKE_INTELLIGENCE_OBJECT_DEFAULT', '<エージェントの使用権限を持つカスタムロール>');

次に、実際に支出が 90% に達した時点でプロシージャを呼び出すカスタムアクションを予算に追加します。

https://docs.snowflake.com/en/user-guide/budgets/custom-actions

CALL yasuhara_test_db.budgets.my_snow_intelligence_budget!ADD_CUSTOM_ACTION(
   SYSTEM$REFERENCE('PROCEDURE',
      'yasuhara_test_db.procedures.sp_revoke_si_access(string, string)'),
   ARRAY_CONSTRUCT('SNOWFLAKE_INTELLIGENCE_OBJECT_DEFAULT', '<エージェントの使用権限を持つカスタムロール>'),
   'PROJECTED',
   90);

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

設定後、GET_CUSTOM_ACTIONS で登録内容を確認できます。設定したプロシージャ名・引数・閾値が反映されていることを確認できました。

>CALL yasuhara_test_db.budgets.my_snow_intelligence_budget!GET_CUSTOM_ACTIONS()
->> SELECT ACTION_ID, PROCEDURE_FQN,PROCEDURE_ARGS,  SPEND_STRATEGY,  THRESHOLD FROM $1;
+--------------------------------------+-------------------------------------------------------------------+--------------------------------------------+----------------+-----------+
| ACTION_ID                            | PROCEDURE_FQN                                                     | PROCEDURE_ARGS                             | SPEND_STRATEGY | THRESHOLD |
|--------------------------------------+-------------------------------------------------------------------+--------------------------------------------+----------------+-----------|
| 8f4ac7c6-0f31-4212-926e-6bc6e98f8909 | YASUHARA_TEST_DB.PROCEDURES.SP_REVOKE_SI_ACCESS(VARCHAR, VARCHAR) | [                                          | PROJECTED      |        90 |
|                                      |                                                                   |   "SNOWFLAKE_INTELLIGENCE_OBJECT_DEFAULT", |                |           |
|                                      |                                                                   |   "<カスタムロール>"                        |                |           |
|                                      |                                                                   | ]                                          |                |           |
+--------------------------------------+-------------------------------------------------------------------+--------------------------------------------+----------------+-----------+

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

Snowsight でもしばらくした後、予算の「Budget Details」より設定を確認できました。

2026-03-13_19h33_28

動作確認

カスタムアクション設定済みの予算が実行されると、GET_CUSTOM_ACTIONSLAST_TRIGGER_ATTEMPT_TIME でカスタムアクションが実際に実行されたかどうかを確認できます。

>CALL yasuhara_test_db.budgets.my_snow_intelligence_budget!GET_CUSTOM_ACTIONS()
->> SELECT PROCEDURE_FQN, PROCEDURE_ARGS, SPEND_STRATEGY, THRESHOLD, LAST_TRIGGER_ATTEMPT_TIME FROM $1;
+-------------------------------------------------------------------+--------------------------------------------+----------------+-----------+-------------------------------+
| PROCEDURE_FQN                                                     | PROCEDURE_ARGS                             | SPEND_STRATEGY | THRESHOLD | LAST_TRIGGER_ATTEMPT_TIME     |
|-------------------------------------------------------------------+--------------------------------------------+----------------+-----------+-------------------------------|
| YASUHARA_TEST_DB.PROCEDURES.SP_REVOKE_SI_ACCESS(VARCHAR, VARCHAR) | [                                          | PROJECTED      |        90 | 2026-03-13 09:11:08.000 +0000 |
|                                                                   |   "SNOWFLAKE_INTELLIGENCE_OBJECT_DEFAULT", |                |           |                               |
|                                                                   |   "<カスタムロール>"                             |                |           |                               |
|                                                                   | ]                                          |                |           |                               |
+-------------------------------------------------------------------+--------------------------------------------+----------------+-----------+-------------------------------+

また、GET_SERVICE_TYPE_USAGE_V2 で予算が追跡しているクレジット消費の実測値を確認できます。
ここでは実際の使用量が以下で、予測も指定の閾値を超えているため、アクションが実行されたようです。

>SELECT SERVICE_TYPE, ROUND(SUM(CREDITS_USED), 2) AS CREDITS_USED
FROM TABLE(yasuhara_test_db.budgets.my_snow_intelligence_budget!GET_SERVICE_TYPE_USAGE_V2(
    '2026-03', '2026-04'
))
GROUP BY SERVICE_TYPE
ORDER BY CREDITS_USED DESC;
+--------------+--------------+
| SERVICE_TYPE | CREDITS_USED |
|--------------+--------------|
| AI_SERVICES  |         7.04 |
+--------------+--------------+

https://docs.snowflake.com/ja/sql-reference/classes/budget/methods/get_service_type_usage#examples

同様の画面なのでここでは省略しますが、実際に指定の権限で Snowflake Intelligence にアクセスするとエージェントを選択することはできませんでした。

あわせて、SNOWFLAKE_INTELLIGENCE_USAGE_HISTORY ビューでも利用状況を確認できます。こちらは Snowflake Intelligence 経由での問い合わせをエージェント単位で集計しています。ここでは、指定の期間で単一のエージェントの使用量が以下で、上記の予算実測値と同様の数値となっており、Snowflake Intelligence 経由の問い合わせが正しく集計され予算管理されていると考えられます。

>SELECT 
    AGENT_DATABASE_NAME,
    AGENT_SCHEMA_NAME,
    AGENT_NAME,
    SNOWFLAKE_INTELLIGENCE_NAME,
    COUNT(*) AS request_count,
    SUM(TOKENS) AS total_tokens,
    SUM(TOKEN_CREDITS) AS total_credits
FROM SNOWFLAKE.ACCOUNT_USAGE.SNOWFLAKE_INTELLIGENCE_USAGE_HISTORY
WHERE START_TIME >= '2026-03-01' AND START_TIME < '2026-04-01'
GROUP BY 
    AGENT_DATABASE_NAME,
    AGENT_SCHEMA_NAME,
    AGENT_NAME,
    SNOWFLAKE_INTELLIGENCE_NAME
ORDER BY total_credits DESC;
+------------------------+-------------------+--------------------+---------------------------------------+---------------+--------------+---------------+
| AGENT_DATABASE_NAME    | AGENT_SCHEMA_NAME | AGENT_NAME         | SNOWFLAKE_INTELLIGENCE_NAME           | REQUEST_COUNT | TOTAL_TOKENS | TOTAL_CREDITS |
|------------------------+-------------------+--------------------+---------------------------------------+---------------+--------------+---------------|
| <DB_NAME>              | AGENTS            | XXXXXXXXXXXX_AGENT | SNOWFLAKE_INTELLIGENCE_OBJECT_DEFAULT |            32 |      3760634 |   7.036364140 |
+------------------------+-------------------+--------------------+---------------------------------------+---------------+--------------+---------------+

注意点として、現状はアカウントの Snowflake Intelligence オブジェクトは一つで、そこにエージェントを関連付けるため、予算としても各エージェントの使用量を合算で管理する形となります。

Cortex Agents 側のドキュメントに詳しく記載がありますが、Snowflake Intelligence 経由でエージェントを呼び出した場合、その使用量は Snowflake Intelligence に帰属します。そのため、エージェントにのみタグを付けた予算では Snowflake Intelligence 経由の呼び出し分は捕捉されません。Snowflake Intelligence 経由でエージェントを使用する場合は、今回のように Snowflake Intelligence オブジェクトを対象とした予算で管理します。

https://docs.snowflake.com/en/user-guide/snowflake-cortex/cortex-agents-resource-budgets#limitations

サイクル開始アクションとの組み合わせ

今回は設定していませんが、アクセス取消の設定で定義した sp_grant_si_access(権限付与)をサイクル開始アクションとして予算に設定することで、翌月に予算がリセットされるタイミングで自動的に権限を再付与できます。

さいごに

Snowflake Intelligence のリソース予算機能を試してみました。Cortex Agent の予算管理についても同様に構成できます。
予算・通知・カスタムアクションを組み合わせることで、クレジット消費の監視から自動対応まで一連の流れを構成できます。
こちらの内容がどなたかの参考になれば幸いです。

この記事をシェアする

FacebookHatena blogX

関連記事