【オンプレミスのデータだって、BigQueryだってAthenaでアクセス】Athena フェデレーテッド・クエリ で見れる未来を夢見てみた

はじめに

Re:invent 直前のアップデートで発表されたAmazon Athena のフェデレーテッド・クエリですが、あまり騒がれてもいないようなので、これでできるようになるであろう夢を夢見てみました。

なお、実際に使う内容では無いのは現在Athenaのフェデレーテッド・クエリはus-east-1 (バージニア北部)でプレビューとしての公開のためになります。プレビュー版の機能の扱いについては菊池の以下の記事を参照ください。

[AWS] re:Invent 前に理解しておくべきベータ/プレビューサービスの扱いについて #reinvent

Amazon Athena のフェデレーテッド・クエリって何?

AthenaといえばS3に配置したデータに対して標準SQLを用いての分析を行うサービスとなります。 ですが、フェデレーテッド・クエリが実装された事によって、S3である必要がなくなることになります。

これによってどういったことができることになるかというと、様々なデータソースに対して、Athenaのインターフェースからアクセスできることになります。

AWSが提供するAthenaデータソースコネクタが対応するデータソースは以下とのことです。

  • Amazon DynamoDB
  • Apache HBase
  • Amazon DocumentDB
  • Amazon Redshift
  • Amazon CloudWatch Logs
  • Amazon CloudWatch Metrics
  • JDBC 対応したリレーショナルデータ(MySQL, PostgreSQLなど)

これによって何が嬉しいのか?

今までは、Athenaからクエリを実行するには、まずS3データを配置する必要がありました。 私達が行いたいことは分析でありS3にあげることではなく、そこにあるデータを用いて分析を行うことが目的のはずです。

特に私が注目したのは対応のデータソースにDynamoDBが存在することです。 今まではDynamoDBに格納したデータを抽出するにはSDK等を用いてアクセスする必要がありましたが、 DynamoDBにアクセスするためにSDKを用いての実装が不要になることになります。

また、AthenaはJDBCドライバも公開されています。例えば、BIツールでDynamoDBのデータを分析したいと言ったケースであってもプログラミングは不要になるのではないかと思っています。

Athenaデータソースコネクタ

Athena フェデレーテッド・クエリで用いることのできるデータソースは上記に記載した以外にも、クエリを実行することができます。これができる仕掛けとしてはAthena データソースコネクタという仕組みが用意されています。

Athena データソースコネクタはアカウント内のLambda関数として動くことになります。 よって、Lambda関数でアクセスできるデータソースはすべてAthenaフェデレーテット・クエリで参照できるデータソースになることになります。

これにより、DirectConnectがつながっている環境であれば、Athena→Athenaデータソースコネクタ(Lambda) → オンプレミスのDBといった構成も取ることができ、またAthenaはInsert文もサポートされていますので、これらの結果をS3に格納することが可能になります。

たとえば、オンプレミスに格納されているデータを取り出してRedshiftで分析したいと言ったときに、まずS3に抽出することを考える必要が有りましたが、これからはAthena経由で抽出するといったことも行うことができそうです。

また、AthenaデータソースコネクタはLambda関数ですので、他のクラウドからのデータの参照とかにも用いることができそうです。 すでにBigQueryに格納されているデータソースがあったとして、それをRedshiftでも分析したいと言った要件があったとします。そういったときにもAthenaからフェデレーテッド・クエリを用いて参照して、S3にInsertさせるといったことができそうです。

Athena データソースコネクタのリポジトリを覗いてみる

AWS はサンプルとして以下のリポジトリにAthena データソースコネクタのサンプルを提供しています。

awslabs/aws-athena-query-federation

こちら見る限り一通りのサンプルは用意されていますし、JDBCといった汎用的なサンプルも実装されておりました。 また、AWS サーバーレスアプリケーションモデルを用いてのデプロイスクリプトも用意されているので、プレビューが取れた段階で確認した内容を記載したいと思います。

Athena フェデレーテッド・クエリの活用例

Athena フェデレーテッド・クエリを用いる際の一例として、以下のようなシステムが Athena データソースコネクタのリポジトリに添付されていました。

これは、Eコマースの仕組みでEコマースの各種機能(取引・支払い・注文・配送etc.)がVPC単位で分かれていて、エンドユーザーがアクセスするEコマースからは各種の仕組みがVPC Endpointでつながっています。 このような仕組みの各種のデータを抽出して分析したいとき、Athena フェデレーテッド・クエリがなかった場合、まず各々の仕組みの中からS3に上げる仕組みを用意し、 一度S3にすべて仕組みから抽出を行い、Redshift等に取り込んだ後、取り込み先に対してクエリを実行し分析を実行するといったことになるかと思います。

こういった状況をAthena フェデレーテッド・クエリを用いると、AthenaのインターフェスからAthena データソースコネクタであるLambdaが発火しデータ収集を行い、 Athenaに結果として返すことができることになります。AthenaはSQLで問い合わせをするため、各種システムのデータを結合した結果を作ることが可能になります。

このサンプルのクエリでは以下のようなことをやっていました。

  1. Redisからアクティブな注文をすべて取得します。
  2. Cloudwatchログの「WARN」または「ERROR」イベントを注文にレコードにジョインします。
  3. EC2インベントリから、「WARN」または「ERROR」を記録したホスト名を取得し、Cloudwatchログとジョインします。
  4. DocumentDBから、影響を受ける注文の顧客連絡先の詳細を取得し、 取得しているレコードとジョインします。
  5. DynamoDBから、出荷ステータスと追跡の詳細を取得し、1.で取得した注文レコードにジョインします。
  6. HBaseにジョインして、影響を受ける注文の支払いステータスを取得し、1.で取得した注文レコードにジョインしています。

複数のVPCにまたがる全く異なるシステムに配置されているデータをAthenaというインターフェースから取得していることがわかるかと思います。 また、AthenaはInsert文も対応していますので、上記の集約結果をS3に出力おくといったこともできそうですね。

まとめ

まだプレビューではありますが、Athena フェデレーテッド・クエリで見れる夢をさらっと見てみました。 プレビューがとれた段階で色々と使ってみた知見も書いてみたいと思います。