外部ネットワークアクセスの例¶
このトピックでは、ユーザー定義関数とプロシージャから外部ネットワークロケーションにアクセスする例を示します。
PyPi にアクセスして Snowpark Containerにパッケージをインストールします。¶
外部アクセス統合を作成することで、 PyPi パッケージリポジトリにアクセスできます。Container Runtime の Notebooks ユーザーが pip install コマンドを使用して pip パッケージをインストールできるようにする場合に、このようにします。このような統合により、Snowpark Container Services にpipパッケージのインストールを許可することもできます。
この例では、 権限とコマンド で説明されている Snowflake 管理ネットワークルール snowflake.external_access.pypi_rule を使用します。
snowflake.external_access.pypi_ruleネットワークルールを使用して、外部アクセス統合を作成します。Container Runtime 上の Snowpark Containerまたは Notebooks で
pip installを使用する必要があるユーザー用にdeveloperロールを作成します。developerロールに、作成した外部アクセス統合を使用するために必要な権限を付与します。
OAuth でGoogle翻訳 API へアクセスする¶
以下のステップでは、Google翻訳 API にアクセスするための外部アクセス統合を作成するコードを示します。ステップでは、セキュリティの統合と、ステートメントの実行に必要な許可を追加します。
外部ロケーションを表すネットワークルールを作成します。
必要な権限など、外部アクセスにおけるネットワークルールのロールについては、 外部ネットワークロケーションを表すネットワークルールの作成 をご参照ください。
google_apis_network_ruleネットワークルールで指定された外部ネットワークロケーションとの認証に必要な OAuth 認証情報を保持するセキュリティ統合を作成します。必要な権限など、コマンドに関する参考情報については、 CREATE SECURITY INTEGRATION (外部 API 認証) をご参照ください。
google_translate_oauthセキュリティ統合に含まれる認証情報を表すシークレットを作成します。必要な権限など、外部アクセスにおけるシークレットのロールについては、 認証情報を表すシークレットの作成 をご参照ください。
シークレットは、 OAUTH_REFRESH_TOKEN パラメーターでリフレッシュトークンを指定する必要があります。サービスプロバイダー(この場合はGoogle Cloud Translation API サービス)からリフレッシュトークンを取得するには、プロバイダーが提供する方法を使用するか、Snowflakeのシステム関数を使用します。
リフレッシュトークンでシークレットを作成するには、以下のようにGoogle OAuth PlaygroundまたはSnowflakeシステム関数の いずれか を使用します。
Snowflakeシステム関数
CREATE SECRET を実行してシークレットを作成します。後のステップで、これをリフレッシュトークンで更新します。
SYSTEM$START_OAUTH_FLOW 関数を実行して URL を取得し、その引数に以前に作成したシークレットの名前を指定してリフレッシュトークンを取得することができます。
この関数は URL を生成し、 OAuth 同意プロセスを完了するために使用できます。
ブラウザーで、生成された URL にアクセスし、 OAuth2 同意プロセスを完了します。終了したら、ブラウザーをプロセスの最終ページで開いたままにしておきます。
ブラウザーのアドレスバーから、同意プロセスの最終ページの URL にあるクエスチョンマーク以降のテキストをすべてコピーします。
ブラウザーのアドレスバーからコピーしたパラメーターを引数に指定して、 SYSTEM$FINISH_OAUTH_FLOW 関数を実行します。
必ず SYSTEM$FINISH_OAUTH_FLOW を SYSTEM$START_OAUTH_FLOW と同じセッションで実行してください。SYSTEM$FINISH_OAUTH_FLOW は SYSTEM$START_OAUTH_FLOW で指定したシークレットを OAuth サーバーから取得したアクセストークンとリフレッシュトークンで更新します。
Google OAuth Playground
GoogleOAuth Playground で、ステップ1で指定したようにCloud Translation API を選択して認証します。
ステップ2で exchange authorization code for tokens をクリックし、 refresh token トークン値をコピーします。
CREATE SECRET を実行して、コピーしたリフレッシュトークン値を指定するシークレットを作成します。
必要な権限など、外部アクセスにおけるシークレットのロールについては、 認証情報を表すシークレットの作成 をご参照ください。
ネットワークルールとシークレットを使用して外部アクセス統合を作成します。
必要な権限など、外部アクセス統合のロールについては、 外部アクセス統合の作成 をご参照ください。
統合を使用する UDF またはプロシージャを作成する必要があるユーザーに割り当てる
developerロールを作成します。外部アクセス用のオブジェクトを使用する UDF を作成するために必要な権限を
developerロールに付与します。これには、次が含まれます。シークレットに対する READ 権限。
シークレットを含むスキーマに対する USAGE 権限。
統合に対する USAGE 権限。
指定されたテキストを指定された言語のフレーズに翻訳する UDF
google_translate_pythonを作成します。詳細については、 関数またはプロシージャでの外部アクセス統合の使用 をご参照ください。USAGE 権限を
google_translate_python関数に付与して、userロールを持つ人がその関数を呼び出せるようにします。フレーズを翻訳するには
google_translate_python関数を実行します。これは以下のような出力を生成します。
ベーシック認証による外部ラムダ関数へのアクセス¶
以下のステップでは、Snowflakeの外部ラムダ関数にアクセスするための外部アクセス統合を作成するサンプルコードを示します。この例では外部エンドポイント自体のプレースホルダーを使用していますが、例えば REST サービスエンドポイントで利用可能な関数でも構いません。
外部アクセスは ベクトル化されたPython UDF で使用され、データを含むPandas DataFrame を受け取ります。
外部ロケーション
my_external_serviceを表すネットワークルールlambda_network_ruleを作成します(ここでは、外部エンドポイントのロケーションのプレースホルダー値です)。外部アクセスにおけるネットワークルールのロールについては、 外部ネットワークロケーションを表すネットワークルールの作成 をご参照ください。
外部サービスが必要とする認証情報を表すシークレットを作成します。
この例の後のハンドラーコードは、Python用のSnowflake API を使用してシークレットから認証情報を取得します。
外部アクセスにおけるシークレットのロールについては、 認証情報を表すシークレットの作成 をご参照ください。
developerロールを作成し、そのロールにシークレットの READ 権限を付与します。このロールは、シークレットを使用する UDF またはプロシージャを作成する必要があるユーザに割り当てられます。また、ユーザが関数を呼び出すために使用するロールを作成します。
外部アクセス用のオブジェクトを使用する UDF を作成するために必要な権限を
developerロールに付与します。これには、次が含まれます。シークレットに対する READ 権限。
シークレットを含むスキーマに対する USAGE 権限。
外部アクセス統合を作成し、作成したネットワークルールとシークレットを使用して外部エンドポイントと認証情報を指定します。
必要な権限など、外部アクセス統合のロールについては、 外部アクセス統合の作成 をご参照ください。
Pandas DataFrame として受信したデータを処理するために、外部ネットワークロケーションにアクセスする ベクトル化された Python UDF
return_double_columnを作成します。UDF での外部アクセスの使用の詳細については、 関数またはプロシージャでの外部アクセス統合の使用 をご参照ください。
USAGE 権限を
return_double_column関数に付与して、userロールを持つ人がその関数を呼び出せるようにします。return_double_column関数を実行し、外部エンドポイントにリクエストを行います。以下の例のコードは、2列のテーブルを作成し、4バイト整数を含む100,000,000行を挿入します。次にコードは
return_double_column関数を実行し、外部エンドポイントによる処理のためにa列から値を渡します。
AWS IAM でAmazon S3にアクセスする¶
IAM を使って AWS S3 バケットに接続するサンプルコードを以下に示します。
AWS IAM の詳細については、 AWS ドキュメント IAM. をご参照ください。
VALUE_LIST パラメーターで指定された場所に、 AWS S3 バケットを表すネットワー クルール、
aws_s3_network_ruleを作成します。外部アクセスにおけるネットワークルールのロールについては、 外部ネットワークロケーションを表すネットワークルールの作成 をご参照ください。
aws_s3_network_ruleネットワークルールで指定された外部ネットワークロケーションとの認証に必要な AWSIAM Amazon Resource Name (ARN) 認証情報を保持するセキュリティ統合を作成します。必要な権限など、コマンドに関する参考情報については、 CREATE SECURITY INTEGRATION (AWS IAM 認証) をご参照ください。
IAM USER のために ARN と ID を入手します。
作成したセキュリティ統合で DESC コマンドを実行します。
表示された出力から、次のステップで使用するために以下のプロパティの値をコピーします。
API_AWS_IAM_USER_ARN
API_AWS_EXTERNAL_ID
IAM ユーザーにバケットへのアクセスに必要なパーミッションを付与します。
Option 1: Configure a Snowflake storage integration to access Amazon S3 のステップ 5 で説明されているようにトラスト・ポリシーを設定する際には、 ARN と ID の値を使用します。
CLOUD_PROVIDER_TOKEN 型の外部サービスが必要とする認証情報を表す シークレット を作成します。
この例の後のハンドラーコードは、 Snowflake API を使用してシークレットから認証情報を取得します。
外部アクセスにおけるシークレットのロールについては、 認証情報を表すシークレットの作成 をご参照ください。
developerロールを作成し、そのロールにシークレットの READ 権限を付与します。このロールは、シークレットを使用する UDF またはプロシージャを作成する必要があるユーザに割り当てられます。また、ユーザが関数を呼び出すために使用するロールを作成します。
外部アクセス用のオブジェクトを使用する UDF を作成するために必要な権限を
developerロールに付与します。これには、次が含まれます。シークレットに対する READ 権限。
シークレットを含むスキーマに対する USAGE 権限。
外部アクセス統合 を作成し、作成したネットワークルールとシークレットを使用して外部エンドポイントと認証情報を指定します。
必要な権限など、外部アクセス統合のロールについては、 外部アクセス統合の作成 をご参照ください。
外部アクセス統合を使用して、作成したネットワークルールで指定したAmazon S3バケットに接続する UDF を作成します。
ハンドラのコードでは、 Snowflake APIs を使用して、作成したシークレットからトークンを取得します。このトークンから、Snowflake APIs を使用して、アクセスキー ID 、シークレットアクセスキー、セッショントークンなど、Amazon S3 に接続するためのセッションを作成するために必要な値を取得できます。
UDF での外部アクセスの使用の詳細については、 関数またはプロシージャでの外部アクセス統合の使用 をご参照ください。
USAGE 権限を UDF 関数に付与して、
userロールを持つ人がその関数を呼び出せるようにします。外部エンドポイントに接続するための関数を実行します。