Snowflake 外部関数(AWS Lambda連携) で ダミーの個人情報取得

Snowflake 外部関数(AWS Lambda連携) で ダミーの個人情報取得 | Tableau-id Press -タブロイド-
external-functions

truestar工房の三村です。Snowflakeの外部関数で、AWS Lambda関数を呼び出してみました♪

以下のサイトを参考に、FakerPythonライブラリをSnowflakeクエリから直接呼び出して、ダミーの個人情報を取得しました。
https://github.com/jamesweakley/flaker
(以下、このサイトを手順サイトと呼びます。)

手順サイトにやり方は詳しく書かれていたのですが、やっぱり躓きました…。
やったことを忘れないうちに、ここにまとめます。
【大まかな流れ】ダミーの個人情報を取得するソースをGitHabから取得  → AWS にアップロード → Snowflakeから呼び出す

①Pythonのインストール

ダミーの個人情報を取得する関数 が Python で作成されているので、マシンに Python をインストールします。手順サイトには python3.8 とありますが、それ以降のものであれば大丈夫だと思います。今回は python 3.9.7 をインストールしました。
参考サイト:https://www.python.jp/install/windows/install.html

②Node.js と ServerlessFramework のインストール

AWSの設定を自分のマシンからコマンドで行うために、ServerlessFramework(サーバーレス)というプログラムを使います。(ServerlessFramework は Node.js で作成されています。)
ServerlessFramework は npm というコマンドで獲得できます。
まずは npmを使えるようにするために Node.js をマシンにインストールします。
今回は v14.17.6 をインストールしました。
参考サイト:https://qiita.com/echolimitless/items/83f8658cf855de04b9ce

次に、ターミナル(PowerShell)で 以下のコマンドを実行して ServerlessFramework をインストールします。

npm install -g serverless

③AWS で IAMユーザーとアクセスキーの作成

AWS Lambda にアクセスする資格情報を作成するために、AWSアカウントを作成し(AWSアカウントID獲得)、IAMユーザーとアクセスキー(API Key&Secret)を作成します。
参考サイト:https://www.serverless.com/framework/docs/providers/aws/guide/credentials

④ServerlessFramework の設定

AWS API Key&Secret を使用するように ServerlessFramework の設定を行います。

コマンドプロンプトで 次のコマンドを実行して、AWSプロファイルにクレデンシャルを設定します。

serverless config credentials –provider aws –key 【API Key】 –secret 【Secret】

 

⑤serverless-python-requirements プラグインのインストール

Python のパッケージを使いたい場合は、Lambda 関数の Python ファイルと同じディレクトリにパッケージをインストールして、それを sls deploy でパッケージ化&デプロイ しなくてはならないのですが、それをしなくてもよくしてくれる プラグイン(らしい)です。
参考サイト:https://engineering.mobalab.net/2018/01/14/how-to-deploy-python-based-lambda-function-that-uses-packages/

手順サイトではいきなり インストールしていますが、私の環境ではエラーになってしまいました。
そのため以下の手順でやってみたところ、うまくいきました。
コマンドプロンプトで次のコマンドを実行して、サービスを作成します。【】内にはサービスを作成するディレクトリを指定します。

serverless create –template aws-nodejs –name 【my-special-service】 –path 【my-special-service】

作成したサービスのディレクトリに移動して

cd 【my-special-service】

serverless-python-requirements をインストールします。

sls plugin install -n serverless-python-requirements

【my-special-service】配下に node_modules が作成されたのを確認します。

⑥Githubからソースをダウンロード

上記の【my-special-service】配下に 、手順サイトからソースをダウンロードします。

⑦デプロイ

手順サイトではいきなりデプロイしていますが、serverless-initial.yml を開いてを見ると plugins で serverless-pseudo-parameters も参照していたので、それもインストールします。

sls plugin install -n serverless-pseudo-parameters

※plugins のパスは編集できます。node_modulesがいろんなところに散らばっちゃった場合はこの方法で指定します。
例)plugins:- C:\Users\XXX\my-special-service\node_modules\serverless-python-requirements

コマンドプロンプトで次のコマンドを実行して、デプロイします。【】内は AWS の region を入力してください。

serverless deploy –config serverless-initial.yml –region 【your aws region

デプロイしたら、次を実行して、SnowflakeExternalFunctionRoleendpoints の値を獲得します。

serverless info -v –config serverless-initial.yml –region 【your aws region】

SnowflakeExternalFunctionRole:arn:aws:iam::・・・:role/SnowflakeExternalFunctionExecutionRole

endpoints:POST – https://・・・.amazonaws.com/dev

⑧Snowflake で API統合(integration) を作成

この単元は Snowflake のワークシートで行います。

【重要】ACCOUNTADMIN ロールの権限を持つ方のみ create integration できます。
また、OWNERSHIPまたはUSAGE特権を持つSnowflakeロールのみが、API統合を直接使用できるので、
API統合を作成するDBの権限を確認しましょう。

integration 名は FLAKER_LAMBDA で作成します。

create or replace api integration FLAKER_LAMBDA
api_provider = aws_api_gateway
api_aws_role_arn = ‘arn:aws:iam::・・・:role/SnowflakeExternalFunctionExecutionRole‘ ← SnowflakeExternalFunctionRoleを指定してください
enabled = true
api_allowed_prefixes = (‘https://・・・.amazonaws.com/dev’); ← endpoints を指定してください

 

次のコマンドで、API_AWS_IAM_USER_ARNAPI_AWS_EXTERNAL_ID を獲得します。

describe integration FLAKER_LAMBDA;

 

⑨SnowflakeIAMユーザーを信頼するようにAWSインフラストラクチャを更新

SnowflakeExternalFunctionExecutionRole の 信頼関係のファイルを更新します。

【重要】この作業は、AWSのAdminグループに所属するユーザーのみができます。
コマンドプロンプトで次のコマンドを実行します。
serverless deploy –region 【your aws region】 –snowflake_user_arn 【API_AWS_IAM_USER_ARN】 –snowflake_external_id 【API_AWS_EXTERNAL_ID
ここで 再度 endpoints の値を獲得します。前に獲得した値の後ろに / がついていたりします。次の単元では、この endpoints を使います。

⑩Snowflake で外部関数を作成

この単元は Snowflake のワークシートで行います。

create or replace external function FAKE(locales varchar,provider varchar,parameters varchar)
returns variant
VOLATILE
api_integration = FLAKER_LAMBDA
MAX_BATCH_ROWS = 10000
as ‘【endpoints】’
;
create or replace external function FAKE(locales varchar,provider varchar)
returns varchar
VOLATILE
api_integration = FLAKER_LAMBDA
MAX_BATCH_ROWS = 10000
as ‘【endpoints】’
;
これで、設定終了です。
Snowflake で確認してみましょう。
select FAKE(‘ja_JP’,’address’) as FAKE_ADDRESS
from table(generator(rowcount => 100))

Tableau DeskTop の カスタムSQL からも 呼び出すことができます。
今回はPuthon のFaker を展開しましたが、独自の関数もAWSに設定して Snowflake から呼び出せるので、いろんなことができそうですね!