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 をインストールします。
③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-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-python-requirements をインストールします。
【my-special-service】配下に node_modules が作成されたのを確認します。
⑥Githubからソースをダウンロード
上記の【my-special-service】配下に 、手順サイトからソースをダウンロードします。
⑦デプロイ
手順サイトではいきなりデプロイしていますが、serverless-initial.yml を開いてを見ると plugins で serverless-pseudo-parameters も参照していたので、それもインストールします。
※plugins のパスは編集できます。node_modulesがいろんなところに散らばっちゃった場合はこの方法で指定します。
例)plugins:- C:\Users\XXX\my-special-service\node_modules\serverless-python-requirements
コマンドプロンプトで次のコマンドを実行して、デプロイします。【】内は AWS の region を入力してください。
デプロイしたら、次を実行して、SnowflakeExternalFunctionRole と endpoints の値を獲得します。
SnowflakeExternalFunctionRole:arn:aws:iam::・・・:role/SnowflakeExternalFunctionExecutionRole
endpoints:POST – https://・・・.amazonaws.com/dev
⑧Snowflake で API統合(integration) を作成
この単元は Snowflake のワークシートで行います。
API統合を作成するDBの権限を確認しましょう。
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_ARN と API_AWS_EXTERNAL_ID を獲得します。
⑨SnowflakeIAMユーザーを信頼するようにAWSインフラストラクチャを更新
SnowflakeExternalFunctionExecutionRole の 信頼関係のファイルを更新します。
⑩Snowflake で外部関数を作成
この単元は Snowflake のワークシートで行います。
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】’
;
from table(generator(rowcount => 100))