はじめに
2023年9月にSnowflakeの「External network access in AWS」がパブリックプレビューになりました♬
External network access とは、Snowflake以外のネット上のサービスに Snowflakeからアクセスできる機能です。
LambdaやSnowpipeを使わずにできます♪ 早速試してみたいと思います。
今回はSnowflakeUDFからNotionのテーブルに追加してみます。
Notion側 準備
Notionに以下のテーブルを作成します。
title と link と description の3つのカラムがあるテーブルです。
プログラムでこのテーブルに追加していきます。追加時、テーブルのIDが必要になります。
Notion URLの so/ の後ろから ?の前まで がテーブルIDになりますので、書き留めてください。
次にNotionのインテグレーションを作成します。
下記URLにアクセスします。
https://www.notion.so/my-integrations
+新しいインテグレーション を押下し、名前を入力して、送信を押下します。
内部インテグレーションシークレットを表示し、書き留めてください。
Noion画面の右上☆隣りの ・・・ を押下して、作成したインテグレーションをコネクトに追加します。
これでNotion側の準備が整いました。
Snowflake側 作業
注意:Snowflakeで行う作業は、その作業ができる権限を持つロールで行わなければなりません。
1. ネットワーク ルール作成
外部ネットワークの場所を表すネットワーク ルールを作成します。
USE ROLE sysadmin;
CREATE OR REPLACE NETWORK RULE notion_rule ← ルールの名前。何でもいいです。
MODE = EGRESS
TYPE = HOST_PORT
VALUE_LIST = (‘api.notion.com’);
2. シークレット作成
シークレットを作成するには、現在のスキーマに対する CREATE SECRET 権限を持つロールが割り当てられている必要があります。
CREATE OR REPLACE SECRET notion_secret ← シークレットの名前。何でもいいです。
TYPE = GENERIC_STRING
SECRET_STRING = ‘{"dbid":"xxxxxxxxxxxxxxxxxxxxxxxxxxx", ← Notion のデータベースIDを記載してください。
"token":"xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"}’; ← Notion のインテグレーションのシークレットを記載してください。
3. ロール作成
このロールは、シークレットを使用する UDF またはプロシージャを作成するユーザーに割り当てます。
USE ROLE USERADMIN;
CREATE OR REPLACE ROLE developer; ← 何でもいいです。
4. シークレットに対する読み取り権限付与
USE ROLE SECURITYADMIN;
GRANT READ ON SECRET database名.schema名.notion_secret TO ROLE developer;
5.外部アクセス統合作成
UDF またはプロシージャ ハンドラーから外部ネットワークの場所にアクセスするための外部アクセス統合を作成します。
このコマンドを実行するには、CREATE INTEGRATION 権限を持つロールを使用する必要があります。ACCOUNTADMIN ロールはデフォルトでこの権限を持っています。
USE ROLE ACCOUNTADMIN;
CREATE OR REPLACE EXTERNAL ACCESS INTEGRATION notion_access_integration ← アクセス結合の名前。何でもいいです。
ALLOWED_NETWORK_RULES = (notion_rule) ← 作成したネットワークルールの名前を指定します。
ALLOWED_AUTHENTICATION_SECRETS = (notion_secret)← 作成したシークレットの名前を指定します。
ENABLED = TRUE;
6.統合に対するUSAGE 権限付与
UDF 開発者がdeveloperロールを使用できるように、統合に対する USAGE 権限をロールに付与します。
GRANT USAGE ON INTEGRATION notion_access_integration TO ROLE developer;
7.ロールに対する権限付与
ここはご自分の環境に合わせて行ってください。
USE ROLE sysadmin;
GRANT USAGE ON warehouse xx TO ROLE developer;
GRANT USAGE ON database xxxxx TO ROLE developer;
GRANT ALL ON schema xxxxx.xxxxxx TO ROLE developer;
8. UDF作成
USE ROLE developer;
CREATE OR REPLACE FUNCTION mimuradb.public.notion_tbl_w(title STRING,link STRING,description STRING) RETURNS STRING LANGUAGE PYTHON RUNTIME_VERSION = 3.8 HANDLER = 'write_notion_table' EXTERNAL_ACCESS_INTEGRATIONS = (notion_access_integration) PACKAGES = ('snowflake-snowpark-python','requests') SECRETS = ('cred' = notion_secret) AS $$ import _snowflake import requests import json session = requests.Session() def write_notion_table(title,link,description): credentials = json.loads(_snowflake.get_generic_secret_string('cred'), strict=False) dbid = credentials["dbid"] token = credentials["token"] url = 'https://api.notion.com/v1/pages'; data = generateObj(dbid,title,link,description); response = session.post(url, json = data, headers={ "Content-type": "application/json", "Authorization": "Bearer " + token, "Notion-Version": '2022-06-28', }) return "" def generateObj(dbId,title,link,description): pageObj = { "parent": { "database_id": dbId, }, "properties": { "title": { "title": [{ "text": { "content": title } }] }, "link": { "rich_text": [{ "text": { "content": link } }] }, "description": { "rich_text": [{ "text": { "content": description } }] } } } return pageObj; $$;
9.呼び出し
SELECT notion_tbl_w(‘title_a’,’link_a’,’description_a’);
Notion側で確認
パラメータで指定した値が追加されました♬
さいごに
今回はパラメータ値をNotionのテーブルに挿入いたしましたが、Snowflakeのテーブル内容を挿入することもできます。
また、「External network access in AWS」では データの連携だけでなく、外部サービスの利用もできます。
Snowflake だけで 色んなことが出来そうですね♪
truestarではSnowflakeの検討、導入支援や環境構築からアプリ開発まで幅広くサポート可能です。
Snowflakeに゙興味がある、導入済みだけどもっとうまく活用したい等々ありましたら、ぜひこちらから相談ください!
これまでのSnowflakeに関する記事はこちら