予算のカスタムアクション¶
支出のしきい値に達したときに、ストアドプロシージャを自動的に呼び出すように予算を構成することができます。これにより、ウェアハウスの一時停止、カスタムアラートの送信、支出イベントのテーブルへのログ記録など、クレジットの消費に対応して自動アクションを実行できます。カスタムアクションは、消費量が予算の上限を超えると予想される場合にSnowflakeが送信する:doc:`通知</user-guide/budgets/notifications>`に代わるものではありません。
カスタムアクションを定義するときは、*予測*クレジット消費または*実績*クレジット消費のどちらに基づいてストアドプロシージャを呼び出すかを指定し、しきい値を設定します。予測消費量または実績消費量がしきい値に達すると、ストアドプロシージャが実行されます。
ストアドプロシージャの要件¶
カスタムアクションによって呼び出されるストアドプロシージャは、次の要件を満たしている必要があります。
プロシージャは、呼び出し元の権限ではなく、所有者の権限で実行する必要があります。詳細については、 呼び出し元権限と所有者権限のストアドプロシージャについて をご参照ください。
プロシージャの完了には30分以上かかってはなりません。
プロシージャはOUTPUT引数を持つことはできません。
Snowflakeは失敗したアクションを1回再試行するため、重複や意図しない効果を引き起こすことなく、複数回呼び出されても処理できるようにプロシージャを設計してください。
プロシージャに必要な引数は、次のいずれかのデータ型である必要があります。
これらの要件を満たすストアドプロシージャを作成したら、そのプロシージャとその親データベース/スキーマに対するUSAGE権限をSNOWFLAKEアプリケーションに付与する必要があります。例えば、ストアドプロシージャの完全修飾名が``code_db.sch1.alert_team``の場合、次のコマンドを実行します。
GRANT USAGE ON DATABASE code_db TO APPLICATION SNOWFLAKE;
GRANT USAGE ON SCHEMA code_db.sch1 TO APPLICATION SNOWFLAKE;
GRANT USAGE ON PROCEDURE code_db.sch1.alert_team(STRING, NUMBER) TO APPLICATION SNOWFLAKE;
注釈
カスタムアクションに追加した後にストアドプロシージャを更新した場合は、そのプロシージャに対するUSAGE権限をSNOWFLAKEアプリケーションに再付与する必要があります
予算へのカスタムアクションの追加¶
アカウント予算またはカスタム予算に複数のカスタムアクションを追加できますが、同じ予算に10個以上のカスタムアクションを追加することはできません。カスタムアクションは、次のコンポーネントで構成されます。
ストアドプロシージャ:呼び出されるプロシージャへの参照。
引数:ストアドプロシージャに渡す引数の配列。
しきい値:カスタムアクションをトリガーする予算制限の割合(例:75%)。
トリガータイプ:カスタムアクションを予測消費量または実績消費量のどちらに基づいてトリガーするか。
予算にカスタムアクションを追加するには、予算インスタンスの:doc:`ADD_CUSTOM_ACTION</sql-reference/classes/budget/methods/add_custom_action>`メソッドを呼び出します。例えば、次のコードは、支出が予算制限の75%を超えると予測されたときに:code:`send_email_notification`ストアドプロシージャを呼び出すカスタムアクションを追加します。
CALL budget_db.sch1.my_budget!ADD_CUSTOM_ACTION(
SYSTEM$REFERENCE('PROCEDURE', 'code_db.sch1.alert_team(string, string, string)'),
ARRAY_CONSTRUCT('admin@example.com', 'Budget Alert', 'Spending at 75% of budget limit'),
'PROJECTED',
75);
カスタムアクションによって呼び出されるストアドプロシージャの作成を含むエンドツーエンドの例については、:ref:`label-budget_custom_actions_extended_example`をご参照ください。
予算からのカスタムアクションの削除¶
予算からカスタムアクションを削除するには、予算インスタンスの:doc:`REMOVE_CUSTOM_ACTIONS</sql-reference/classes/budget/methods/remove_custom_actions>`メソッドを呼び出します。このメソッドを使用して、次を実行できます。
予算からすべてのカスタムアクションを削除します。例:
CALL budget_db.sch1.my_budget!REMOVE_CUSTOM_ACTIONS();
指定されたしきい値を持つすべてのカスタムアクションを削除します。例えば、消費量が75%に達するとトリガーされるすべてのカスタムアクションを削除するには、次のコマンドを実行します。
CALL budget_db.sch1.my_budget!REMOVE_CUSTOM_ACTIONS(75);
指定されたカスタムアクションを予算から削除します。例えば、消費量が75%に達したときに``my_sp``ストアドプロシージャを呼び出すカスタムアクションを削除するには、次のコマンドを実行します。
CALL budget_db.sch1.my_budget!REMOVE_CUSTOM_ACTIONS(75, 'code_db.sch1.my_sp');
Tip
特定のアクションを削除する場合は、:doc:`GET_CUSTOM_ACTIONS</sql-reference/classes/budget/methods/get_custom_actions>`メソッドによって返される完全修飾プロシージャ名を使用してください。
拡張例¶
次の例では、カスタムアクションによって呼び出されるストアドプロシージャを記述し、そのプロシージャに必要な権限を付与して、カスタムアクションを予算に追加する方法を示します。
:ref:`すべての要件に準拠<label-budget_custom_actions_stored_procedure>`するストアドプロシージャを作成します。
CREATE OR REPLACE PROCEDURE code_db.sch1.alert_team( integration_name string, email_list string, email_subject string, email_content string) RETURNS STRING LANGUAGE JAVASCRIPT EXECUTE AS OWNER AS $$ var sql_command = "CALL SYSTEM$SEND_EMAIL('" + INTEGRATION_NAME + "', " + "'" + EMAIL_LIST + "', " + "'" + EMAIL_SUBJECT + "'," + "'" + EMAIL_CONTENT + "'" + ");"; var statement1 = snowflake.createStatement({sqlText: sql_command}); statement1.execute(); return "alert sent"; $$;
ストアドプロシージャに対する権限をSNOWFLAKEアプリケーションに付与します。
GRANT USAGE ON DATABASE code_db TO APPLICATION SNOWFLAKE; GRANT USAGE ON SCHEMA code_db.sch1 TO APPLICATION SNOWFLAKE; GRANT USAGE ON PROCEDURE code_db.sch1.alert_team(STRING, STRING, STRING, STRING) TO APPLICATION SNOWFLAKE;
消費量が予算の支出制限の90%に達したときにトリガーされるように、カスタムアクションを予算に追加します。
CALL budget_db.sch1.my_budget!ADD_CUSTOM_ACTION( SYSTEM$REFERENCE('PROCEDURE', 'code_db.sch1.alert_team(string, string, string, string)'), ARRAY_CONSTRUCT('my_int', 'admin@example.com', 'Budget Alert', 'Spending at 90% of budget limit'), 'ACTUAL', 90);
カスタムアクションのトラブルシューティング¶
カスタムアクションが期待どおりに機能しない場合は、次の方法を使用して問題を診断してください。
カスタムアクションの実行の監視¶
Snowflakeは、タスクを使用してカスタムアクションを実行します。これらのタスクは、命名規則``BUDGET_CUSTOM_ACTION_TRIGGER_AT_%``に従います。予算インスタンスに対するすべてのカスタムアクションタスクの実行ステータスを確認するには、次のクエリを実行します。
SELECT th.*, ci.name AS budget_name
FROM SNOWFLAKE.ACCOUNT_USAGE.TASK_HISTORY th
JOIN SNOWFLAKE.ACCOUNT_USAGE.CLASS_INSTANCES ci
ON th.instance_id = ci.id
WHERE ci.class_name = 'BUDGET'
AND th.name ILIKE 'BUDGET_CUSTOM_ACTION_TRIGGER_AT_%'
AND ci.name = '<budget_name>'
ORDER BY th.completed_time DESC
LIMIT 10;
アクショントリガー履歴の表示¶
一定期間内に特定の予算からトリガーされたカスタムアクションを確認するには、以下のクエリを実行します。
SELECT th.*, ci.name as budget_name
FROM SNOWFLAKE.ACCOUNT_USAGE.TASK_HISTORY th
JOIN SNOWFLAKE.ACCOUNT_USAGE.CLASS_INSTANCES ci
ON th.instance_id = ci.id
WHERE ci.class_name = 'BUDGET'
AND th.name ILIKE 'BUDGET_CUSTOM_ACTION_TRIGGER_AT_%'
AND ci.name = '<budget_name>'
AND th.COMPLETED_TIME >= DATEADD('day', -7, CURRENT_TIMESTAMP())
ORDER BY th.completed_time DESC;
特定のカスタムアクションのトリガー履歴を確認するには、まず:doc:`GET_CUSTOM_ACTIONS</sql-reference/classes/budget/methods/get_custom_actions>`メソッドを呼び出してアクションIDを取得します。
CALL <budget_name>!GET_CUSTOM_ACTIONS();
次に、以下のクエリでアクションIDを使用します。
SELECT th.*, ci.name AS budget_name
FROM SNOWFLAKE.ACCOUNT_USAGE.TASK_HISTORY th
JOIN SNOWFLAKE.ACCOUNT_USAGE.CLASS_INSTANCES ci
ON th.instance_id = ci.id
WHERE ci.class_name = 'BUDGET'
AND th.name ILIKE 'BUDGET_CUSTOM_ACTION_TRIGGER_AT_%'
AND th.query_text ILIKE '%<action_id>%'
AND ci.name = '<budget_name>'
AND th.COMPLETED_TIME >= DATEADD('day', -7, CURRENT_TIMESTAMP())
ORDER BY th.completed_time DESC;
トリガーしないアクションのトラブルシューティング¶
カスタムアクションが期待どおりにトリガーされない場合は、次の一般的な問題を確認してください。カスタム予算は``budget_db.sch1.my_budget``であると仮定します。
ストアドプロシージャまたは権限が変更された
カスタムアクションによって呼び出されるストアドプロシージャがまだ有効であり、SNOWFLAKEアプリケーションにはまだ必要な権限があることを確認します。:doc:`CONFIRM_CUSTOM_ACTIONS_ACCESS</sql-reference/classes/budget/methods/confirm_custom_actions_access>`メソッドを呼び出して、ストアドプロシージャとアクセス制御権限を検証します。
CALL budget_db.sch1.my_budget!CONFIRM_CUSTOM_ACTIONS_ACCESS();
予算がアクティブ化されていない
アカウント予算の場合のみ、:doc:`GET_CONFIG</sql-reference/classes/budget/methods/get_config>`メソッドを呼び出して``is_active``フィールドをチェックし、予算がアクティブ化されていることを確認します。
CALL budget_db.sch1.my_budget!GET_CONFIG();
予算に支出制限がありません
予算に支出制限が構成されていない場合、カスタムアクションはトリガーされません。支出制限を確認します。
CALL budget_db.sch1.my_budget!GET_SPENDING_LIMIT();
予算はいずれのリソースも追跡していません
支出履歴をチェックして、予算がリソースを追跡していることを確認します。
CALL budget_db.sch1.my_budget!GET_SPENDING_HISTORY();
カスタムアクションが最近トリガーされました
過剰なトリガーを防ぐために、Snowflakeはカスタムアクションの実行頻度を制限しています。
クレジット消費が支出しきい値に達すると予測されるときにカスタムアクションが実行される場合、ストアドプロシージャが呼び出されるのは1日に1回までです。
クレジット消費が実績支出の制限に達したときにカスタムアクションが実行される場合、ストアドプロシージャが呼び出されるのは月に1回までです。
:doc:`GET_CUSTOM_ACTIONS</sql-reference/classes/budget/methods/get_custom_actions>`メソッドを呼び出して``LAST_TRIGGER_ATTEMPT_TIME``フィールドを確認します。