はじめに
この記事は、NTTテクノクロス Advent Calendar 2024(シリーズ 2) 13日目の記事です。
NTTテクノクロスの吉田と申します。
本記事では、AWSのLambdaとSnowflakeを試しに接続する際の手順の一例を記載させていただきます。
Snowflakeについて
Snowflakeとは、クラウド上で動くデータウェアハウスです。いくつか特徴を上げていきます。
- クラウド管理かつブラウザ上で操作するため、ハードウェアやソフトウェアの準備が不要である
- 負荷対策でのスケールアップが容易である
- 従量課金モデルのため、稼働していない時間は費用を抑えることができる
- AWSなどの各種プラットフォームとの連携のサポートドキュメントが充実している
その他の詳細については公式ドキュメントをご確認ください
AWSのlambdaとの連携
今回はLambdaで作成した関数を外部関数としてSnowflakeから呼び出してその結果を受けとるための手順を作成します。
これにより、複雑な処理が必要となった際に、Snowflake内のクエリだけでなくLambdaのjavaを使用することができるようになります。
手順
[AWS]Lambdaの作成
AWSの [Lambda > 関数] で「関数の作成」を押下して新規関数を作成する。
- 例
- 関数名:Connect_Snowflake
- ランタイム:Python 3.12
タブ「コード」にサンプル同期Lambda関数のソースコードを張り付ける
タブ「テスト」に「Lambda関数をテストする」のサンプルを「イベント JSON」に貼り付けてテストする。
- イベントアクションをテスト:新しいイベントを作成
- イベント名:hello-world
[AWS]Lambdaの作成
AWSの [IAM > ロール] で「ロールを作成」を押下して新規ロールを作成する。
[AWS]APIの作成
AWSの [API Gateway > API] でREST APIの構築を押下して、APIを作成する。
AWSの [API Gateway > API > 先ほど作成したAPI名]でメソッドを作成を押下して、メソッドを作成する
Amazon API Gatewayエンドポイントの保護にあるリソースのエンドポイントのソースをコピーして、新規作成するリソースポリシーに貼り付けてください。その後、以下の3つを置換してください。
- 12-digit-number:AWSのアカウントID(12桁)
- external_function_role:作成したIAMロール名
- method_request_ARN:メソッドリクエストのARN(API Gateway > API > 作成したリソース で作成したメソッドを押下すると表示される)
※:以下の画像は置換前の例です
AWSの「API Gateway > API > 作成したリソース」で作成したメソッドを押下し、メソッドリクエストの設定を変更する
[Snowflake]API統合の作成
Snowflakeの [プロジェクト > ワークシート] で新しいワークシートを作成し、対象のデータベースを選択後に以下のSQLを投入してAPI統合を作成する。
- api_aws_role_arn:作成したロールのARN
- api_allowed_prefixes:「API Gateway > API > 作成したAPI > ステージ」の「URL を呼び出す」
create or replace api integration test_integration
api_provider = aws_api_gateway
api_aws_role_arn = '<api_aws_role_arn>'
enabled = true
api_allowed_prefixes = ('<APIの呼び出しURL>')
;
登録状況を確認する。実行結果から以下の2つのパラメータをメモする
- API_AWS_IAM_USER_ARN
- API_AWS_EXTERNAL_ID
describe integration test_integration;
[AWS]Snowflakeの情報を追加する
AWSの「IAM > ロール > 作成したロール」の信頼関係タグで信頼ポリシーの編集を行う
以下の個所を編集すること
- AWS:Snowflakeから取得したAPI_AWS_IAM_USER_ARN
- Condition:Snowflakeから取得したAPI_AWS_EXTERNAL_ID
- 以下の通り記載して★の個所を置換すること
- "Condition": {"StringEquals": { "sts:ExternalId": "★" }}
[Snowflake]外部関数の作成
以下のクエリを作成して投入し、外部関数を作成する。
- api_integration_name:先ほど作成した統合APIの名前
- invocation_url:APIの呼び出しURL(api_allowed_prefixesに設定したURLと同じ)
create external function test_external_function(i integer, c varchar)
returns variant
api_integration = <api_integration_name>
as '<invocation_url>'
[Snowflake]外部関数の実行
以下のクエリを作成して投入することで、外部関数が実行され、lambda関数の処理が実行されます。
結果として投入した2つの引数をlambdaで一つの文字列として出力してSnowflakeに返しています
SELECT test_external_function(1234567890, 'テスト文字列') as "実行結果";
最後に
以上でLambdaで作成した関数をSnowflakeから呼び出してその結果を受けとる作業は終了となります。
Snowflakeを使用した実例があまりないため、本手順が参考になれば幸いです。