---
title: 【禁断の検証？】Snowflake上でタスクエラーが発生していたら部屋のライトを赤色に点灯させる
description: SnowflakeのExternal Network AccessでSwitchBotAPIにアクセスし、タスクのエラーが発生していたら部屋のライトを赤色に点灯させる。
image: https://knowledge.insight-lab.co.jp/hubfs/pato_lamp_on_red.png
---

![INSIGHT LAB](https://knowledge.insight-lab.co.jp/hs-fs/hubfs/INSIGHT%20LAB_%E6%96%87%E5%AD%97%E3%81%AE%E3%81%BF_WHT-1.png?width=400&height=110&name=INSIGHT%20LAB_%E6%96%87%E5%AD%97%E3%81%AE%E3%81%BF_WHT-1.png)

![INSIGHT LAB](https://knowledge.insight-lab.co.jp/hs-fs/hubfs/INSIGHT%20LAB_%E6%96%87%E5%AD%97%E3%81%AE%E3%81%BF.png?width=400&height=110&name=INSIGHT%20LAB_%E6%96%87%E5%AD%97%E3%81%AE%E3%81%BF.png)

[![お問い合わせ](https://hubspot-no-cache-na2-prod.s3.amazonaws.com/cta/default/5935783/c64a7bb0-e32a-499b-851b-b4e7a66da275.png)](https://hubspot-cta-redirect-na2-prod.s3.amazonaws.com/cta/redirect/5935783/c64a7bb0-e32a-499b-851b-b4e7a66da275)

<https://knowledge.insight-lab.co.jp/snowflake/-external_network_access_switchbotapi#tmpmodule_159357067471898>

- [Snowflakeとは](https://service.insight-lab.co.jp/snowflake)
- [SNOWFLAKEナレッジ](https://knowledge.insight-lab.co.jp/snowflake)
- [お役立ち資料](https://download.insight-lab.co.jp/snowflake/download)

###### 6 分で読むことができます

# [【禁断の検証？】Snowflake上でタスクエラーが発生していたら部屋のライトを赤色に点灯させる](https://knowledge.insight-lab.co.jp/snowflake/-external_network_access_switchbotapi)

 執筆者 [uta](https://knowledge.insight-lab.co.jp/snowflake/author/uta) 更新日時 2023年12月12日

###### Topics: [snowflake](https://knowledge.insight-lab.co.jp/snowflake/tag/snowflake) [api](https://knowledge.insight-lab.co.jp/snowflake/tag/api)

![【禁断の検証？】Snowflake上でタスクエラーが発生していたら部屋のライトを赤色に点灯させる](https://knowledge.insight-lab.co.jp/hubfs/pato_lamp_on_red.png)

 目次

本記事は、[Snowflake Advent Calendar 2023](https://qiita.com/advent-calendar/2023/snowflake)の12日目の記事になります。  
アドベントカレンダーもちょうど折り返し地点に差し掛かったところなので、半分ネタで半分おもしろい（つまり全部ネタ...？）内容の記事を書いてみました！

## 前置き

【絶対に実務で使用しないでください】

元々、投稿しようと思っていた記事が、既に書かれていたため、ナレッジのネタに悩んだ末に思いついてしまったアイデアを検証しただけです。

自宅で実装した場合、タスクのエラーにいち早く気付くことができるようになる代わりに、プライベートという安寧を失うことになります。

## はじめに

本記事では、SwitchBotAPIを用いてSnowflakeタスクのエラーが発生していた場合、SwitchBot製品のライトを赤色に点灯させる仕組みをExternal Network Accessで実装します。  
![arc](https://knowledge.insight-lab.co.jp/hs-fs/hubfs/arc.png?width=820&height=455&name=arc.png)

 

## 概要

- External Network AccessにSwitchBotAPIを設定したUDF（関数）を作成
- タスクを5分間隔で実行し、タスク履歴からタスクの実行ステータス取得
- 5分以内にエラーがあった場合はライトを赤色に、エラーがなければ緑色に点灯

 

## 準備するもの

- SwitchBot製品のライト（今回使用するのは[テープライト](https://www.switchbot.jp/pages/strip-light)）
- SwitchBotアプリのインストール
- External Network Accessを使用できる環境（詳細は以前投稿した[記事](https://knowledge.insight-lab.co.jp/snowflake/-external_access_integration_notion_api)を参考にしてください）

 

## 実装

### SwitchBot

---

任意の場所にライトを設置します。  
![4F29C4CE-B60C-4A19-92C1-FEF2760C0FBD](https://knowledge.insight-lab.co.jp/hs-fs/hubfs/4F29C4CE-B60C-4A19-92C1-FEF2760C0FBD.jpeg?width=4028&height=1532&name=4F29C4CE-B60C-4A19-92C1-FEF2760C0FBD.jpeg)

SwitchBotアプリをダウンロードし、設置したライトを登録します。  
![20DC34F2-16F1-4DD1-99A5-833A6515831F](https://knowledge.insight-lab.co.jp/hs-fs/hubfs/20DC34F2-16F1-4DD1-99A5-833A6515831F.jpeg?width=750&height=577&name=20DC34F2-16F1-4DD1-99A5-833A6515831F.jpeg)

SwitchBotアプリ（プロフィール>設定>開発者向けオプション）からトークンとシークレットを取得します。  
※アプリバージョン欄を10回タップすると開発者向けオプションが表示されます  
![switchbot_app](https://knowledge.insight-lab.co.jp/hs-fs/hubfs/switchbot_app.png?width=1621&height=1288&name=switchbot_app.png)

### Snowflake

---

シークレットを作成します。

> create secret switchbot\_secret  
>     type = generic\_string  
>     secret\_string = '{  
>         "client\_secret":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"  
>         , "token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"  
>     }'  
> ;

ネットワークルールを作成します。

> create network rule switchbot\_api  
>     type = host\_port  
>         mode = egress  
>     value\_list = ('api.switch-bot.com')  
> ;

シークレットとネットワークルールを設定した外部アクセス統合を作成します。

> create external access integration switchbot\_api\_access\_integration  
>     allowed\_network\_rules = (switchbot\_api)  
>     allowed\_authentication\_secrets = (switchbot\_secret)  
>     enabled = true  
> ;

※ACCOUNTADMINかCREATE INTEGRATION権限のあるロールで実行してください。

 

#### UDF

---

以下の関数を実行し、テープライトのデバイスIDを取得（実行は手動実行の１回でOK）

> create or replace function get\_device\_list()  
> returns variant  
> language python  
> runtime\_version = 3.9  
> handler = 'main'  
> external\_access\_integrations = (switchbot\_api\_access\_integration)  
> packages = ('requests')  
> secrets = ('cred' = switchbot\_secret)  
> as
> 
> $$  
> import \_snowflake  
> import json  
> import time  
> import hashlib  
> import hmac  
> import base64  
> import uuid  
> import requests  
> import pprint
> 
> def main():
> 
>     # 認証情報  
>     credentials = json.loads(\_snowflake.get\_generic\_secret\_string('cred'), strict=False)  
>     secret = credentials\["client\_secret"\]  
>     token = credentials\["token"\]   
>       
>     # request用パラメータ  
>     secret\_key = bytes(secret, 'utf-8')  
>     t = int(round(time.time() \* 1000))  
>     nonce = str(uuid.uuid4())
> 
>     # 認証キーの取得  
>     string\_to\_sign = '{}{}{}'.format(token, t, nonce)  
>     string\_to\_sign = bytes(string\_to\_sign, 'utf-8')  
>     sign = base64.b64encode(hmac.new(secret\_key, msg=string\_to\_sign, digestmod=hashlib.sha256).digest())  
>       
>     # URL指定  
>     url = "https://api.switch-bot.com/v1.1/devices"  
>       
>     # API用ヘッダー作成  
>     headers = {  
>         "Authorization": token,  
>         "sign": sign,  
>         "t": str(t),  
>         "nonce": nonce,  
>         "Content-Type": "application/json; charset=utf-8"  
>     }  
>       
>     # requests処理  
>     response = requests.get(url,headers=headers)  
>       
>     return response.json()  
> $$  
> ;

上記関数を実行し、制御したいテープライトのデバイスIDをコピー。  
![get_device_list](https://knowledge.insight-lab.co.jp/hs-fs/hubfs/get_device_list.png?width=1631&height=583&name=get_device_list.png)

ライトを点灯させ、引数で渡されたRGB値でライトの色を変更するUDFを作成。

> create or replace function change\_color\_of\_switchbot\_tape\_light(r int,g int,b int)  
> returns string  
> language python  
> runtime\_version = 3.9  
> handler = 'main'  
> external\_access\_integrations = (switchbot\_api\_access\_integration)  
> packages = ('requests')  
> secrets = ('cred' = switchbot\_secret)  
> as
> 
> $$  
> import \_snowflake  
> import json  
> import time  
> import hashlib  
> import hmac  
> import base64  
> import uuid  
> import requests
> 
> def main(r,g,b):
> 
>     # 認証情報  
>     credentials = json.loads(\_snowflake.get\_generic\_secret\_string('cred'), strict=False)  
>     secret = credentials\["client\_secret"\]  
>     token = credentials\["token"\]
> 
>     # request用パラメータ  
>     secret\_key = bytes(secret, 'utf-8')  
>     t = int(round(time.time() \* 1000))  
>     nonce = str(uuid.uuid4())
> 
>     # 認証キーの取得  
>     string\_to\_sign = '{}{}{}'.format(token, t, nonce)  
>     string\_to\_sign = bytes(string\_to\_sign, 'utf-8')  
>     sign = base64.b64encode(hmac.new(secret\_key, msg=string\_to\_sign, digestmod=hashlib.sha256).digest())  
>       
>     # URL指定  
>     url = "https://api.switch-bot.com/v1.1/devices/{デバイスID}/commands"
> 
>     # API用ヘッダー作成  
>     headers = {  
>         "Authorization": token,  
>         "sign": sign,  
>         "t": str(t),  
>         "nonce": nonce,  
>         "Content-Type": "application/json; charset=utf-8"  
>     }  
>           
>     # テープライトをONにするコマンド  
>     turnon = json.dumps({  
>         "command": "turnOn",  
>         "parameter": f"{r}:{g}:{b}",  
>         "commandType": "command"        
>     })
> 
>     # テープライトの色を変更するコマンド  
>     setcolor = json.dumps({  
>         "command": "setColor",  
>         "parameter": f"{r}:{g}:{b}",  
>         "commandType": "command"        
>     })
> 
>     # テープライトONをリクエスト  
>     r1 = requests.post(url, data=turnon, headers=headers)  
>     # テープライトの色の変更をリクエスト  
>     r2 = requests.post(url, data=setcolor, headers=headers)
> 
>     return r1,r2  
> $$  
> ;

※最初の関数で取得したデバイスIDを{デバイスID}部分に貼り付け。

 

#### TASK

---

information\_schema.task\_historyから直近5分以内のエラーで終了したタスクを取得し、UDFを5分間隔で実行するタスク

> create task check\_task\_status  
>     schedule = '5 MINUTE'  
>     warehouse = 'demo\_wh'  
> as  
>     with  
>     get\_task\_status as (  
>         select  
>             count(\*) as error\_count  
>         from table(information\_schema.task\_history(  
>                 scheduled\_time\_range\_start=>dateadd('minute',-5,current\_timestamp()),  
>                 error\_only=>true  
>         ))  
>     )  
>     select  
>         case  
>             -- エラーが1件以上の場合-> 赤　  
>             when error\_count > 0 then change\_color\_of\_switchbot\_tape\_light(255,0,0)  
>             -- エラーが0件の場合-> 緑　  
>             else change\_color\_of\_switchbot\_tape\_light(0,255,0)  
>         end  
>     from  
>         get\_task\_status  
> ;

エラーを発生させるタスク

> create task error\_task  
>     warehouse = 'demo\_wh'  
> as  
>         -- Division by zero  
>     select 1/0

 

## 挙動確認

心臓の悪い方はここで引き返すことをおすすめします。。。

 

 

 

 

 

 

 

 

 

 

 

 

初めにタスク履歴を取得し、UDFを実行するタスクを起動させます。

> alter task check\_task\_status resume;

 

 

5分後・・・

 

エラーの起きるタスクは実行していないため、白色だった部屋のライトが緑色になります。  
![213CAFF1-F6F1-4459-9006-2122F5248BEC](https://knowledge.insight-lab.co.jp/hs-fs/hubfs/213CAFF1-F6F1-4459-9006-2122F5248BEC.jpeg?width=4032&height=3024&name=213CAFF1-F6F1-4459-9006-2122F5248BEC.jpeg)

まさに正常を表す色...落ち着きますね。

ここでエラーの発生するタスクを手動実行します。

> execute task error\_task;

 

 

5分後・・・

 

さっきまで綺麗な緑色だったライトが真っ赤になりました。  
![EA355686-EA2B-4D00-8676-DD2090AEA1E5](https://knowledge.insight-lab.co.jp/hs-fs/hubfs/EA355686-EA2B-4D00-8676-DD2090AEA1E5.jpeg?width=4032&height=3024&name=EA355686-EA2B-4D00-8676-DD2090AEA1E5.jpeg)

ホラーゲームなら確実に″出る″部屋です。

 

さらに5分後、直近5分でエラーのあったタスクは無いため、ライトは緑色に戻ります。  
![3792E41A-840E-4A9C-8CF6-8011B7E3B72E](https://knowledge.insight-lab.co.jp/hs-fs/hubfs/3792E41A-840E-4A9C-8CF6-8011B7E3B72E.jpeg?width=4032&height=3024&name=3792E41A-840E-4A9C-8CF6-8011B7E3B72E.jpeg)

このように、タスク履歴から取得されたタスクのステータスに応じたAPIがUDF（関数）で実行され、部屋の明かりの色が切り替わりました。部屋が赤くなっていたら異常が起きている可能性があるので、急ぎ対応しましょう...。![task_history](https://knowledge.insight-lab.co.jp/hs-fs/hubfs/task_history.png?width=1334&height=190&name=task_history.png)

 

## おわりに

本記事では、SnowflakeからSwitchBotAPIを呼び出し、タスク履歴の内容によってライトの色を指定して切り替える方法を紹介しました。

ですが、データ分析基盤管理において、タスクエラーを部屋ライトで検知することを推奨したものではありません。こんなものを作るより先に、dbt等のツールを導入してデータの品質を保証するなり、データパイプラインを見直すなどするほうが優先です。

ただ、SnowflakeからSwithBotAPIを用いてIoT製品にアクセスできるので、データ駆動で自宅やオフィスの家電をいろんな形で制御できると楽しいかもしれません。

あくまでこんなこともできるよ！という趣旨の記事なので、遊びの中で試してみたり、このアイデアから身近なAPIを実行して「Snowflake」を楽しんでください！

Snowflakeを体験してみませんか？

INSIGHT LABではSnowflake紹介セミナーを定期開催しています。Snowflakeの製品紹介だけでなく、デモンストレーションを通してSnowflakeのシンプルなUI操作や処理パフォーマンスの高さを体感いただけます。

[![詳細はこちら](https://hubspot-no-cache-na2-prod.s3.amazonaws.com/cta/default/5935783/0d0b0d86-fdb7-4351-ab14-d482c854defc.png)](https://hubspot-cta-redirect-na2-prod.s3.amazonaws.com/cta/redirect/5935783/0d0b0d86-fdb7-4351-ab14-d482c854defc)

- [Tweet](https://twitter.com/share)

![uta](https://knowledge.insight-lab.co.jp/hubfs/IMG_4095.jpg)

#### 執筆者 [uta](https://knowledge.insight-lab.co.jp/snowflake/author/uta)

野良猫を見かけると追わずにはいられません。

###### [前の投稿](https://knowledge.insight-lab.co.jp/snowflake/openmetadataとは)

[![](https://knowledge.insight-lab.co.jp/hubfs/omd-logo.svg)](https://knowledge.insight-lab.co.jp/snowflake/openmetadataとは)

###### [【OpenMetadata X Snowflake】でデータカタログ化](https://knowledge.insight-lab.co.jp/snowflake/openmetadataとは)

###### [次の投稿](https://knowledge.insight-lab.co.jp/snowflake/dbt-power-user-live-a-comfortable-dbt-development-life-with)

[![dbt Power Userで快適なdbt開発ライフを送る](https://knowledge.insight-lab.co.jp/hubfs/dbt5596.jpg)](https://knowledge.insight-lab.co.jp/snowflake/dbt-power-user-live-a-comfortable-dbt-development-life-with)

###### [dbt Power Userで快適なdbt開発ライフを送る](https://knowledge.insight-lab.co.jp/snowflake/dbt-power-user-live-a-comfortable-dbt-development-life-with)

RECOMMEND こちらの記事も人気です。

<https://knowledge.insight-lab.co.jp/snowflake/pricing>

###### 4 分で読むことができます。

##### [Snowflakeの料金体系｜クレジットと費用最適化のポイントをご紹介](https://knowledge.insight-lab.co.jp/snowflake/pricing)

###### 2021年 6月 28日

<https://knowledge.insight-lab.co.jp/snowflake/dbt-data-pipeline>

###### 12 分で読むことができます。

##### [【Snowflake×dbt】データパイプライン構築](https://knowledge.insight-lab.co.jp/snowflake/dbt-data-pipeline)

###### 2022年 6月 17日

<https://knowledge.insight-lab.co.jp/snowflake/snowflake-vs-treasuredata>

###### 5 分で読むことができます。

##### [【禁断の比較？】SnowflakeとTreasure Dataを比べてみました](https://knowledge.insight-lab.co.jp/snowflake/snowflake-vs-treasuredata)

###### 2021年 5月 24日

<https://knowledge.insight-lab.co.jp/snowflake/snowsight-executive-dashboard>

###### 1 分で読むことができます。

##### [Snowsightでどこまでできるか！？限界に挑戦！](https://knowledge.insight-lab.co.jp/snowflake/snowsight-executive-dashboard)

###### 2023年 12月 14日

<https://knowledge.insight-lab.co.jp/snowflake/-snowflake-streamlit-in-snowflake-introduce>

###### 5 分で読むことができます。

##### [【Snowflake】新機能「Streamlit in Snowflake」とは何者か！？](https://knowledge.insight-lab.co.jp/snowflake/-snowflake-streamlit-in-snowflake-introduce)

###### 2023年 9月 21日

<https://knowledge.insight-lab.co.jp/snowflake/-snowflake-rag-prototype>

###### 11 分で読むことができます。

##### [【Snowflake】SQLと標準関数のみでRAGシステムをサクッと構築（プロトタイプ編）](https://knowledge.insight-lab.co.jp/snowflake/-snowflake-rag-prototype)

###### 2024年 5月 28日

##### 運営会社

運営会社

- [会社概要](https://insight-lab.co.jp/about/)
- [お問い合わせ](https://contact.insight-lab.co.jp/main)

##### メニュー

メニュー

- [Snowflakeとは](https://service.insight-lab.co.jp/snowflake)
- [Snowflakeナレッジ](https://knowledge.insight-lab.co.jp/snowflake)
- [お役立ち資料](https://download.insight-lab.co.jp/snowflake/download)

[![INSIGHT LAB](https://knowledge.insight-lab.co.jp/hs-fs/hubfs/INSIGHT%20LAB_%E6%96%87%E5%AD%97%E3%81%AE%E3%81%BF_WHT-1.png?width=200&height=55&name=INSIGHT%20LAB_%E6%96%87%E5%AD%97%E3%81%AE%E3%81%BF_WHT-1.png "INSIGHT LAB")](https://www.insight-lab.co.jp/)

- [プライバシーポリシー](https://www.insight-lab.co.jp/privacy.html)

Copyright © 2020 INSIGHT LAB, Inc.

<https://twitter.com/INSIGHTLAB_INC><https://www.youtube.com/channel/UCOKNKiO4uuza4NioSZpBMhg>