Snowflake External Network Access ~Notion~

Snowflake External Network Access ~Notion~ | Tableau-id Press -タブロイド-
title

はじめに

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に関する記事はこちら