Snowflake Knowledge - INSIGHT LAB

【Snowflake×Notion】外部アクセス統合でSnowflakeからNotionAPIを実行しデータベース情報を取得する

作成者: uta|2023年10月11日

こんにちは、utaです。
先月公開されたミステリー映画を観てからというもの、ドラマ鑑賞にすっかりハマってしまいました...。ドラマを観つつ、先月パブリックプレビューとなったSnowflakeの外部アクセス統合(External Access Integration)を試してみたので紹介したいと思います。

はじめに

Snowflakeの「外部アクセス統合」という機能をご存知でしょうか?

外部アクセス統合とは、SnowflakeのUDFやプロシージャから外部APIの実行を可能にするためのオブジェクトです。接続方法や認証情報といった制限管理も簡単かつ柔軟に行うことができ、データ取得やデータ配信をSnowflake上で完結できます。

本記事では、NotionAPIを例にNotionデータベースのデータをjson形式で取得しますが、他のAPIも実行することも可能です。各オブジェクトの簡単な説明も含めているので、皆さんのよく使うAPIで試してみてください。

 

環境

  • snowsight(Snowflake UI)

 

事前準備

  • Notion Integration設定
  • Notion Database IDの取得


↑取得するNotionデータベース(サンプル)

 

用語

本ナレッジで出てくる用語のざっくりとした説明を載せておきます。

Secret

外部API認証で使用する認証情報を保存するSnowflakeオブジェクト。
(スキーマレベルオブジェクト)
https://docs.snowflake.com/ja/user-guide/api-authentication

Network Rule

外部ネットワークへのアクセス方法や接続先を、許可またはブロックするルールを定義したSnowflakeオブジェクト。
(スキーマレベルオブジェクト)
https://docs.snowflake.com/en/sql-reference/sql/create-network-rule

External Access Integration

外部アクセス統合にSecretの認証情報とNetwork Ruleのアクセス方法に従い、ユーザー定義関数 (UDF) およびストアド プロシージャから外部ネットワークにアクセスを有効にすることができます。
(アカウントオブジェクト)
https://docs.snowflake.com/en/sql-reference/sql/create-external-access-integration

 

使用例

 

Secretの作成

NotionAPIは、Notionで生成したシークレットトークンとデータベースIDでアクセスするので、typeはgeneric_stringでsecret_stringにNotionのインテグレーション作成で生成されたトークンを設定します。

設定項目 設定内容
type 認証情報のタイプ
secret_string シークレットキーの文字列

https://docs.snowflake.com/ja/sql-reference/sql/create-secret

 

Network Ruleの作成

NotionAPIは、Snowflake側からNotionのドメインに向けてリクエストを送信してデータベース情報を取得します。typeはhost_post、value_listはドメイン、modeはegressを設定します。

 

設定項目 設定内容
type 認証方式
value_list 外部APIドメイン
mode アクセス方法
https://docs.snowflake.com/en/sql-reference/sql/create-network-rule
 

External Access Integrationの作成

UDFからNotionAPIを呼び出すため、外部アクセス統合を作成します。さきほど作成したシークレットとネットワークルールをそれぞれ、allowed_network_rulesallowed_authentication_secrets に設定します。また、この統合を有効な状態にするためenabledはtrueに設定しています。

 

※アカウントオブジェクトのためaccountadminを使用しています

設定項目 設定内容
allowed_network_rules 外部アクセス統合に適用するネットワークルール
allowed_authentication_secrets 外部アクセス統合での接続に使用するシークレット
enabled 外部アクセス統合の有効化

https://docs.snowflake.com/en/sql-reference/sql/create-external-access-integration

 

UDFの作成

Python UDFを定義し、引数にデータベースIDを設定して、外部アクセス統合を経由してNotionへリクエストを送信し返ってきたjson形式のデータベース情報を返します。

設定項目
設定内容
handler UDFが呼び出されたときに実行される関数
external_access_integrations UDFから外部ネットワークにアクセスするために使用する外部アクセス統合
packages UDFで使用するパッケージを設定(一部)
secrets このUDFから外部ネットワークへのアクセスで使用するシークレット

 

APIの実行

引数に取得したいデータベースのデータベースIDを指定して関数を実行すると、json形式でデータベース情報が返ってきます。(NotionAPIから返ってくる半構造化データはかなり複雑なので展開するのは結構大変です)


↑関数の実行結果

 

おわりに

外部アクセス統合を使用することで、これまで外部環境で実行していた外部APIをSnowflakeから実行できました。APIの実行には、ロールで管理できるスキーマレベルオブジェクトのシークレットとネットワークルールを使用しているため、安全かつ管理しやすいものとなっています。

シークレットにはトークン以外でもユーザ名+パスワードでの設定も可能です。ネットワークルールでは「外から内」だけでなく「内から外」といったアクセス設定も可能なので、利用できるAPIサービスはかなり多いと思います。

データ分析基盤を運用するうえで、APIは少なからず関わってくる要素の一つだと思うので、Snowflakeから簡単に利用できる外部アクセス統合をぜひ使ってみてください!!