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経由
- 構成イメージは以下
AtheanコンソールからSnowflakeにクエリ実行したイメージ
セットアップ
1. SnowflakeのID・PasswordをAWS Secrets Managerに登録
AWS Secret ManagerでSnowflakeのログインIDとパスワードを登録しておく
- シークレットタイプは「その他のシークレットのタイプ」
- キーはそれぞれ username、password
- 値はSnowflakeのログイン情報
2.AWS Serverless Application RegistoryからAthenaコネクタを検索してデプロイ
Athena snowflakeで検索すると出てくる「AnthenaSnowflakeConnector」を選択
- 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コンソールからもアプリケーションおよび関数に追加される
3. Snowflakeコネクタ(Lambda関数)のIAM ROLE修正
- IAM ROLEのポリシーに
SecretManagerReadWrite
を追加する - 編集対象のIAM ROLEは追加したLambda関数の設定から確認できる
4. Snowflakeコネクタ(Lambda関数)の環境編集修正
- 環境変数にキー
athenasnowflake_connection_string
として値にdefaultキーと同じものを追加 - Athenaのデータカタログ接続に必要
- この指定がない場合に、後で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コネクタの関数を指定する
クエリ実行
参考)
最後に
- Athenaデータコネクタを利用すると、AWS以外のサービスへも事前データコピーなくライブデータアクセスができる
- クエリパフォーマンス面を考えると、Amazon AppFlowやAWS Glueなどを利用してS3へ集約した方が良いが、ちょっとした外部データへのアクセス要件などには有益
- 注意点としてはLambdaが仲介するため、Lambda固有の制約(実行時間最大15分など)も考慮が必要