そのほか
2024/10/18
與田 龍人

SnowflakeのコストをSlackに通知する方法

Snowflakeを利用する際、コスト管理は非常に重要です。毎日の使用量や月ごとの使用量をリアルタイムで把握できることで、予算内での適切なリソース管理が可能になります。この記事では、Snowflakeの使用コストを自動的にSlackに通知する方法について、具体的な実装手順を紹介します。SlackとSnowflakeの連携により、日次・月次のコストをチーム全体で素早く確認でき、予算超過を防ぐ効果が期待できます。

はじめに

Snowflakeを利用する際、コスト管理は非常に重要です。毎日の使用量や月ごとの使用量をリアルタイムで把握できることで、予算内での適切なリソース管理が可能になります。この記事では、Snowflakeの使用コストを自動的にSlackに通知する方法について、具体的な実装手順を紹介します。SlackとSnowflakeの連携により、日次・月次のコストをチーム全体で素早く確認でき、予算超過を防ぐ効果が期待できます。

前提条件

SlackでWebhook URLを作成しておく必要があります。Slackの設定画面からWebhook URLを取得してください。



Snowflakeの管理者権限が必要です。

手順

1.Slack Webhook URLの秘密管理


まず、Webhook URLの機密情報をSnowflakeのSecretオブジェクトに保存します。これにより、コード内でURLを直接記述することなく安全にWebhookを使用できます。



CREATE OR REPLACE SECRET slack_webhook_snowflake_cost
TYPE = GENERIC_STRING
SECRET_STRING = '';
# 例: <https://hooks.slack.com/services/> の後を SECRET_STRING に入れる


2.Webhook通知インテグレーションの作成


Webhook通知を送信するためのSnowflake通知インテグレーションを作成します。



CREATE OR REPLACE NOTIFICATION INTEGRATION slack_webhook_snowflake_cost_str
TYPE = WEBHOOK
ENABLED = TRUE
WEBHOOK_URL = '<https://hooks.slack.com/services/>'
WEBHOOK_SECRET = YOUR_SCHEMA.slack_webhook_snowflake_cost
WEBHOOK_HEADERS = ('Content-type' = 'application/json');


3.コストデータをSlackに送信する


Snowflakeの使用量データをSlackに通知するストアドプロシージャを実行します。このプロシージャでは、日次および月次の使用料金を抽出し、それをSlackに送信します。



CREATE OR REPLACE PROCEDURE notify_snowflake_cost()
RETURNS STRING
LANGUAGE SQL
AS
$$
CALL system$send_snowflake_notification(
snowflake.notification.application_json(
WITH usage_data AS (
SELECT
account_name,
ROUND(SUM(usage_in_currency), 2) AS usage_in_currency,
MIN(usage_date) AS usage_start_date
FROM snowflake.organization_usage.usage_in_currency_daily
WHERE usage_date = current_date()
GROUP BY account_name
),
monthly_usage_data AS (
SELECT
account_name,
ROUND(SUM(usage_in_currency), 2) AS monthly_usage_in_currency
FROM snowflake.organization_usage.usage_in_currency_daily
WHERE EXTRACT(MONTH FROM usage_date) = EXTRACT(MONTH FROM current_date())
AND EXTRACT(YEAR FROM usage_date) = EXTRACT(YEAR FROM current_date())
GROUP BY account_name
)
SELECT
OBJECT_CONSTRUCT(
'channel', 'webhook_notifications_test',
'text', 'snowflake organization usage',
'attachments', ARRAY_CONSTRUCT(
OBJECT_CONSTRUCT(
'color', 'good',
'fields', ARRAY_CONSTRUCT(
OBJECT_CONSTRUCT(
'title', '予算額',
'value', '50000.0 USドル'
),
OBJECT_CONSTRUCT(
'title', '利用料金(本日)',
'value', usage_in_currency || ' USドル'
),
OBJECT_CONSTRUCT(
'title', '利用開始日時',
'value', usage_start_date || 'T07:00:00Z'
),
OBJECT_CONSTRUCT(
'title', '今月の利用料金',
'value', monthly_usage_in_currency || ' USドル'
)
)
)
)
)::string
FROM usage_data, monthly_usage_data
),
snowflake.notification.integration('slack_webhook_snowflake_cost_str')
);
$$;

#実行を毎日に設定する
CREATE OR REPLAC TASK daily_snowflake_cost_notification
WAREHOUSE = 'LOOKER_WH'
SCHEDULE = 'USING CRON 0 10 * * * UTC' -- 毎日UTCの午前10時、日本時間の午後19時
AS
CALL notify_snowflake_cost();


実際の通知例

このようにメッセージの形式も自由に変更可能です。


まとめ

Snowflakeのコストを把握し、Slackに通知することで、効率的なコスト管理が可能になります。この方法を使えば、特定のアカウントや組織単位で日次・月次の使用状況を簡単に確認できるようになります。また、Snowflakeの通知機能とWebhookを組み合わせることで、他のシステムとの連携もスムーズに行えます。


この手法は、コスト管理だけでなく、リソースの最適化や予算オーバー防止にも役立つため、ぜひ導入してみてください。


New call-to-action