こんにちは、utaです。
先月公開されたミステリー映画を観てからというもの、ドラマ鑑賞にすっかりハマってしまいました...。ドラマを観つつ、先月パブリックプレビューとなったSnowflakeの外部アクセス統合(External Access Integration)を試してみたので紹介したいと思います。
Snowflakeの「外部アクセス統合」という機能をご存知でしょうか?
外部アクセス統合とは、SnowflakeのUDFやプロシージャから外部APIの実行を可能にするためのオブジェクトです。接続方法や認証情報といった制限管理も簡単かつ柔軟に行うことができ、データ取得やデータ配信をSnowflake上で完結できます。
本記事では、NotionAPIを例にNotionデータベースのデータをjson形式で取得しますが、他のAPIも実行することも可能です。各オブジェクトの簡単な説明も含めているので、皆さんのよく使うAPIで試してみてください。
↑取得するNotionデータベース(サンプル)
本ナレッジで出てくる用語のざっくりとした説明を載せておきます。
外部API認証で使用する認証情報を保存するSnowflakeオブジェクト。
(スキーマレベルオブジェクト)
https://docs.snowflake.com/ja/user-guide/api-authentication
外部ネットワークへのアクセス方法や接続先を、許可またはブロックするルールを定義したSnowflakeオブジェクト。
(スキーマレベルオブジェクト)
https://docs.snowflake.com/en/sql-reference/sql/create-network-rule
外部アクセス統合にSecretの認証情報とNetwork Ruleのアクセス方法に従い、ユーザー定義関数 (UDF) およびストアド プロシージャから外部ネットワークにアクセスを有効にすることができます。
(アカウントオブジェクト)
https://docs.snowflake.com/en/sql-reference/sql/create-external-access-integration
NotionAPIは、Notionで生成したシークレットトークンとデータベースIDでアクセスするので、typeはgeneric_stringでsecret_stringにNotionのインテグレーション作成で生成されたトークンを設定します。
設定項目 | 設定内容 |
type | 認証情報のタイプ |
secret_string | シークレットキーの文字列 |
https://docs.snowflake.com/ja/sql-reference/sql/create-secret
NotionAPIは、Snowflake側からNotionのドメインに向けてリクエストを送信してデータベース情報を取得します。typeはhost_post、value_listはドメイン、modeはegressを設定します。
設定項目 | 設定内容 |
type | 認証方式 |
value_list | 外部APIドメイン |
mode | アクセス方法 |
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
Python UDFを定義し、引数にデータベースIDを設定して、外部アクセス統合を経由してNotionへリクエストを送信し返ってきたjson形式のデータベース情報を返します。
設定項目
|
設定内容 |
handler | UDFが呼び出されたときに実行される関数 |
external_access_integrations | UDFから外部ネットワークにアクセスするために使用する外部アクセス統合 |
packages | UDFで使用するパッケージを設定(一部) |
secrets | このUDFから外部ネットワークへのアクセスで使用するシークレット |
引数に取得したいデータベースのデータベースIDを指定して関数を実行すると、json形式でデータベース情報が返ってきます。(NotionAPIから返ってくる半構造化データはかなり複雑なので展開するのは結構大変です)
↑関数の実行結果
外部アクセス統合を使用することで、これまで外部環境で実行していた外部APIをSnowflakeから実行できました。APIの実行には、ロールで管理できるスキーマレベルオブジェクトのシークレットとネットワークルールを使用しているため、安全かつ管理しやすいものとなっています。
シークレットにはトークン以外でもユーザ名+パスワードでの設定も可能です。ネットワークルールでは「外から内」だけでなく「内から外」といったアクセス設定も可能なので、利用できるAPIサービスはかなり多いと思います。
データ分析基盤を運用するうえで、APIは少なからず関わってくる要素の一つだと思うので、Snowflakeから簡単に利用できる外部アクセス統合をぜひ使ってみてください!!