SnowflakeのWebhook Notificationsを使って組織全体のコストをSlackに通知する
こんにちは。 harry(@gappy50)です。
最近、SnowflakeのWebhook Notificationsという通知機能があるのを発見したので、軽く触ってみました。
今回は組織全体のコストを定期的に通知できるようにしてみたいと思います。
Snowflake Webhook Notificationsとは
その名の通り、Webhookを利用したSnowflakeに関する通知ができる機能です。
現在はSlackやTeams、PagerDutyなどで利用可能とのことです。
これまでSnowflakeではAmazon SNSやGoogle Pub/Subと利用したエラー通知の他に、Snowflakeがマネージドに作成するAWS SESを通して柔軟性の高いメール通知などが可能でした。
ただし、普段の業務においてメール通知をベースに運用業務をデザインすることは即応性や情報の共有という観点ではあまり有効と言い難く、SlackやTeamsなど各企業のチャット・コミュニケーションツールへの通知機能を自前で実装する必要がありました。
この機能が実装されたところで気軽にSlackへの通知などができることが期待されます。
Webhook Notificationを作ってみる
今回はSlackのWebhookに対して、Snowflakeからの通知を行うところまでやってみます。
SlackでのWebhookの作り方はこちらを参照してください。
まず、Webhook URLをSlackのsecretに入れます。
create or replace secret slack_cost_webhook_notification_secret
type = generic_string
-- https://hooks.slack.com/services/ 以降の文字列を追加する
secret_string = 'T**********/***********/************************'
;
続いて、webhookのnotification integrationを追加してみます。
create or replace notification integration slack_cost_webhook_notification_integration
type = webhook
enabled = true
webhook_url = 'https://hooks.slack.com/services/SNOWFLAKE_WEBHOOK_SECRET'
webhook_secret = test.test.slack_cost_webhook_notification_secret
webhook_headers = ('Content-type' = 'application/json')
;
webhook_secret
はsecretを作成したDB名、スキーマ名までフルパスで指定しています。権限周りは色々とあるので、必要に応じたロールにて作成などをしてください。
そして、このNotification Integrationを利用して当月の組織全体のSnowflakeのコストを通知してみます。
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
FROM snowflake.organization_usage.usage_in_currency_daily
WHERE last_day(usage_date) = last_day(current_date())
group by 1
)
SELECT
OBJECT_CONSTRUCT(
'channel', 'webhook_notifications_test',
'text', 'snowflake organization usage',
'attachments', ARRAY_CONSTRUCT(
OBJECT_CONSTRUCT(
'color', 'good',
'fields', array_agg(
OBJECT_CONSTRUCT(
'title', account_name,
'value', usage_in_currency
)
)
)
)
)::string
from usage_data
),
snowflake.notification.integration('slack_cost_webhook_notification_integration')
);
おしゃれに色とかもつけてみました。
うまくいけば、Webhookを指定したチャンネルにコストの通知が行くはずです。
あとは、Taskなり何かしらのタイミングでこれを呼べるようにすれば、どのくらいのコストになっているのかを毎日確認して安心したり、焦ったりできそうです。
最後に
jsonの文字列操作をSQLでやるのが面倒なので、ある程度形が決まっているなら WEBHOOK_BODY_TEMPLATE
とか使うのもよさそうです。
とにかく簡単に通知ができるようになったので、何かにつけて通知いっぱいしていきたいですね。
こんなん、なんぼあっても良いですからね。
Snowlfake データクラウドのユーザ会 SnowVillage のメンバーで運営しています。 Publication参加方法はこちらをご参照ください。 zenn.dev/dataheroes/articles/db5da0959b4bdd
Discussion