4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

NTTテクノクロスAdvent Calendar 2024

Day 13

Snowflakeとlambdaを接続してみる

Last updated at Posted at 2024-12-12

はじめに

この記事は、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

image.png

タブ「コード」にサンプル同期Lambda関数のソースコードを張り付ける
image.png

タブ「テスト」に「Lambda関数をテストする」のサンプルを「イベント JSON」に貼り付けてテストする。

  • イベントアクションをテスト:新しいイベントを作成
  • イベント名:hello-world

image.png

実行結果の例
image.png

[AWS]Lambdaの作成

AWSの [IAM > ロール] で「ロールを作成」を押下して新規ロールを作成する。

  • 信頼されたエンティティタイプ:AWSアカウント

  • AWSアカウント:Lambdaを作成した際に使用したアカウントを選択
    スクリーンショット 2024-12-10 153828.png

  • ロール名:任意の名前

[AWS]APIの作成

AWSの [API Gateway > API] でREST APIの構築を押下して、APIを作成する。
image.png

  • APIの詳細:新しいAPI
  • API名:TestAPI
  • APIエンドポイントタイプ:リージョン
    image.png

AWSの [API Gateway > API > 先ほど作成したAPI名]でメソッドを作成を押下して、メソッドを作成する

  • メソッドタイプ:POST
  • 統合タイプ:Lambda 関数
  • Lambdaプロキシ統合:on
  • Lambda関数:作成したLambda関数を設定
    image.png

APIのデプロイを行う
image.png

  • ステージ名:任意のステージ名
    image.png
    作成後に表示されるURLは保存しておいてください。
    image.png

Amazon API Gatewayエンドポイントの保護にあるリソースのエンドポイントのソースをコピーして、新規作成するリソースポリシーに貼り付けてください。その後、以下の3つを置換してください。

  • 12-digit-number:AWSのアカウントID(12桁)
  • external_function_role:作成したIAMロール名
  • method_request_ARN:メソッドリクエストのARN(API Gateway > API > 作成したリソース で作成したメソッドを押下すると表示される)
    ※:以下の画像は置換前の例です
    image.png

AWSの「API Gateway > API > 作成したリソース」で作成したメソッドを押下し、メソッドリクエストの設定を変更する

  • 認可:AWS_IAM
    image.png

[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": "★" }}

image.png

[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 "実行結果";

image.png

最後に

以上でLambdaで作成した関数をSnowflakeから呼び出してその結果を受けとる作業は終了となります。
Snowflakeを使用した実例があまりないため、本手順が参考になれば幸いです。

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?