目次
こんにちは、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 | アクセス方法 |
External Access Integrationの作成
UDFからNotionAPIを呼び出すため、外部アクセス統合を作成します。さきほど作成したシークレットとネットワークルールをそれぞれ、allowed_network_rules とallowed_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から簡単に利用できる外部アクセス統合をぜひ使ってみてください!!