1
0

More than 1 year has passed since last update.

Amazon Athena から Snowflake に直接クエリ:フェデレーテッドクエリ

Last updated at Posted at 2022-12-16

Amazon Athenaはデータコネクタを利用することでAWS以外の様々なサービスにライブデータアクセス(フェデレーテッドクエリ)できる。

Snowflake コネクタを利用してAthenaからSnowflakeへのライブデータアクセスしてみた

構成概要

  • Athenaデータコネクタはlambda関数で実現される
  • コネクタはAWS Serverless Application Registoryから検索して簡単にデプロイできる
  • Snowflakeへの接続はLambdaコネクタからNAT経由で接続(Business Critical Edition以上ならPrivateLink接続もあるがここでは省略)
  • Snowflake接続の認証情報(ID・Password)はAWS Secrets Managerで管理し、Lambdaのコネクタから呼ぶ
  • 処理した結果はLambdaのコネクタ経由で指定したS3バケットに出力する
  • Secrets ManagerとS3への接続経路はVPC EndpointからNAT経由
  • 構成イメージは以下
    image.png

AtheanコンソールからSnowflakeにクエリ実行したイメージ
image.png

セットアップ

1. SnowflakeのID・PasswordをAWS Secrets Managerに登録

AWS Secret ManagerでSnowflakeのログインIDとパスワードを登録しておく

  • シークレットタイプは「その他のシークレットのタイプ」
  • キーはそれぞれ username、password
  • 値はSnowflakeのログイン情報

スクリーンショット 2022-12-12 21.57.38.png

2.AWS Serverless Application RegistoryからAthenaコネクタを検索してデプロイ

Athena snowflakeで検索すると出てくる「AnthenaSnowflakeConnector」を選択
スクリーンショット 2022-12-12 21.55.38.png

以下詳細パラメータ設定
スクリーンショット 2022-12-12 22.23.02.png

  • SecretNamePrecix : SecretsManagerで登録した「シークレットの名前」
  • SpillBucket:処理結果を出力するS3バケット名(s3://の部分は不要)
  • DefaultConnectionString:Snowflakeへの接続情報
    • フォーマットはsnowflake://jdbc:snowflake://{snowflake_instance_url}/?warehouse={warehousename}&db={databasename}&schema={schemaname}&${secretname}
    • {snowflake_instance_url} はXXXXXXX.snowflakecomputing.comのようなURI
    • {secretname}はSecretsManagerで登録した「シークレットの名前」
    • 例:snowflake://jdbc:snowflake://glb37380.us-east-1.snowflakecomputing.com/?warehouse=COMPUTE_WH&db=SNOWFLAKE_SAMPLE_DATA&schema=TPCH_SF1&${snowflake-athena}
  • LambdaFunctionName:追加するLambda関数名(Snowflakeコネクタの実態)
  • SecurityGroupIds:Lambda関数に紐付けるSG。AWS SecretsManager・S3とSnowflakeへ接続するOutbound経路が必要
  • SubnetIds:Lambda関数に紐付けるサブネット。Lambda関数自体にはPublic IPがなくNAT経由の接続となるためプライベートサブネットにする。

デプロイが完了するとLambdaコンソールからもアプリケーションおよび関数に追加される
image.png

3. Snowflakeコネクタ(Lambda関数)のIAM ROLE修正

  • IAM ROLEのポリシーにSecretManagerReadWriteを追加する
  • 編集対象のIAM ROLEは追加したLambda関数の設定から確認できる

image.png

4. Snowflakeコネクタ(Lambda関数)の環境編集修正

  • 環境変数にキーathenasnowflake_connection_stringとして値にdefaultキーと同じものを追加
  • Athenaのデータカタログ接続に必要

image.png

  • この指定がない場合に、後でAthena利用時に以下のエラーが出る
    - Failed to invoke lambda function due to com.amazonaws.services.lambda.invoke. LambdaFunctionException: Catalog is not supported in multiplexer. After registering the catalog in Athena, must set 'athenasnowflake_connection_string' environment variable in Lambda. See JDBC connector README for further details.

5. Athenaでデータソースを追加

  • Athenaコンソールの「データソース」から「データソースを作成」し、下記のようにsnowflakeを選択。Lambda関数に先ほど作成したSnowflakeコネクタの関数を指定する

image.png
image.png

クエリ実行

あとはAthenaコンソールからクエリ実行するのみ
image.png

参考)

最後に

  • Athenaデータコネクタを利用すると、AWS以外のサービスへも事前データコピーなくライブデータアクセスができる
  • クエリパフォーマンス面を考えると、Amazon AppFlowやAWS Glueなどを利用してS3へ集約した方が良いが、ちょっとした外部データへのアクセス要件などには有益
  • 注意点としてはLambdaが仲介するため、Lambda固有の制約(実行時間最大15分など)も考慮が必要
1
0
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
1
0