🔔

SnowflakeのWebhook Notificationsを使って組織全体のコストをSlackに通知する

2024/08/17に公開

こんにちは。 harry(@gappy50)です。

最近、SnowflakeのWebhook Notificationsという通知機能があるのを発見したので、軽く触ってみました。
今回は組織全体のコストを定期的に通知できるようにしてみたいと思います。

Snowflake Webhook Notificationsとは

その名の通り、Webhookを利用したSnowflakeに関する通知ができる機能です。
現在はSlackやTeams、PagerDutyなどで利用可能とのことです。
https://docs.snowflake.com/en/user-guide/notifications/webhook-notifications

これまでSnowflakeではAmazon SNSやGoogle Pub/Subと利用したエラー通知の他に、Snowflakeがマネージドに作成するAWS SESを通して柔軟性の高いメール通知などが可能でした。

ただし、普段の業務においてメール通知をベースに運用業務をデザインすることは即応性や情報の共有という観点ではあまり有効と言い難く、SlackやTeamsなど各企業のチャット・コミュニケーションツールへの通知機能を自前で実装する必要がありました。

この機能が実装されたところで気軽にSlackへの通知などができることが期待されます。

Webhook Notificationを作ってみる

今回はSlackのWebhookに対して、Snowflakeからの通知を行うところまでやってみます。
SlackでのWebhookの作り方はこちらを参照してください。
https://api.slack.com/messaging/webhooks#create_a_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を指定したチャンネルにコストの通知が行くはずです。

同じ金額なのは1アカウントしかなくて無理くり増幅させたからです。許してください。

あとは、Taskなり何かしらのタイミングでこれを呼べるようにすれば、どのくらいのコストになっているのかを毎日確認して安心したり、焦ったりできそうです。

最後に

jsonの文字列操作をSQLでやるのが面倒なので、ある程度形が決まっているなら WEBHOOK_BODY_TEMPLATE とか使うのもよさそうです。

とにかく簡単に通知ができるようになったので、何かにつけて通知いっぱいしていきたいですね。
こんなん、なんぼあっても良いですからね。

Snowflake Data Heroes

Discussion