Amazon S3 バケットのデータを Azure Data Explorer へ取り込む (ingest into コマンド編)

2022.08.27

いわさです。

Azure Data Explorer では.ingest into コマンドを使ってクラウドストレージからデータを取り込むことが出来ます。
今回、この機能で Amazon S3 URL がサポートされました。
これによって Amazon S3 バケットから.ingest intoコマンドを使ってデータを取り込むことが出来るようになりました。

従来までは Azure Data Factory などを使って ETL の仕組みを用意する必要がありましたが、ingest into コマンドが Amazon S3 に対応したのでアドホックに S3 バケットのデータを取り込んでログなどの分析を行えるようになりました。

Azure Data Explorer とは

Azure Data Explorer (ADX) は Azure のフルマネージドなビッグデータ分析プラットフォームです。
様々な形式のデータを取り込み Kusto Query Language (KQL) を使ってクエリを実行します。

AWS でいうと様々なデータに構造に対してクエリを発行出来るといえば Amazon Athena が近いイメージですが、Azure Data Explorer の場合はクラスターをプロビジョニングしその稼働時間に応じて料金が発生します。
クラスターはエンジンノードとデータ管理ノードで構成されており、またデータ保持期間などの応じての追加の料金も発生します。
価格の詳細は以下をご確認ください。

もうひとつ Athena との違いとして、データの実体も Azure Data Explorer にある形なのでクエリ前にデータの取り込みが必要です。

やってみる

流れとしては、S3 バケットへアクセス権を持つ IAM ユーザーを作成しアクセスキーとシークレットを使って Azure Data Explorer から ingest します。
本日時点ではアクセスキーを指定する方法のみとなっています。
実際に利用する際は一時的な認証情報を発行したり、後述の難読化が必要になるかなと思います。
本日は IAM ユーザーのアクセスキーをそのまま使います。

Amazon S3 と IAM ユーザーを用意

Amazon S3 には適当な CSV データを格納しておきました。

上記 S3 バケットへアクセス出来る IAM ユーザーを作成し、アクセスキーとシークレットを取得しておきます。

AWS 側の対応はこれだけです。

Azure Data Explorer クラスターとデータベース作成

次は Azure 側で作業をしていきます。
前述のとおり Azure Data Explorer は実行基盤のクラスターが必要なので、それをまずプロビジョニングします。
設定出来る項目は多くなくて、ワークロードのタイプとサイズを指定するくらいなので難しくないです。これに応じて従量課金の単価と性能が変わります。

クラスターを作成出来たら、データベースを作成します。
Azure Data Explorer ではクラスターの中に複数のデータベースが存在する構造となっています。

保持期間はデータがクエリに使用できることが保証される取り込まれてからの日数です。
キャッシュ期間はクエリを最適化するために SSD/RAM で頻繁にクエリされるデータを保存する日数となっています。

作成出来たら、データベースの Web UI を開きます。
Web UI から新しいテーブルを作成しましょう。

Source type に応じて自動でスキーマ構造を判定してくれるようにも見えるのですが、今回は「なし」を選択し、CSV の構造に応じて列を定義しました。

これで、データの取り込みを行う先を用意することが出来ました。

取り込み

さて、それではクエリエディターから取り込み用のクエリを発行してみましょう。
今回はHogeAwsテーブルへ取り込みますので以下のような形となります。
S3 URL とアクセスキー、シークレットを結合しています。

.ingest into table HogeAws (
    'https://hoge0825foradx.s3.ap-northeast-1.amazonaws.com/hoge-2021-10.csv;AwsCredentials=AKIAIOSFODNN7EXAMPLE,wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'
)

正直いうと、アクセスキーをクエリに埋め込んでいる点にだいぶ拒絶反応が起きますね。
秘匿情報の難読化機能について後述していますので、その点は必ず抑えておきましょう。

取り込みが成功しました。
次に取り込んだデータを取得するクエリを実行してみます。

HogeAws
| take 10

おお、取得されましたね。テーブル構造で確認することが出来ました。
ただし、CSV のヘッダーも取り込まれてしまいましたね。

ingest intoはいくつかのオプションがあってwithで指定することが出来ます。
ここではヘッダーを無視して取り込みを行いたいのでignoreFirstRecordを有効化します。

.clear table HogeAws data

一度取り込んだレコードを削除したのちに、また取り込みをしてみましょう。

.ingest into table HogeAws (
    'https://hoge0825foradx.s3.ap-northeast-1.amazonaws.com/hoge-2021-10.csv;AwsCredentials=AKIAIOSFODNN7EXAMPLE,wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'
) with (ignoreFirstRecord=true)

今度は正しくデータを取り込むことが出来ましたね。

難読化

難読化の機能があるので必ず実施しましょう。

Azure Data Explorer では管理者など権限を有しているユーザーであれば他者が実行したクエリの履歴を確認することが出来ます。

.show commands

確認してみると以下のようにingest intoの履歴も表示されます。
さらにアクセスキーとシークレットも表示されています。これは非常に良くないですね。

そこで、秘匿情報部分にhを付与することで難読化することが出来るようで、推奨されています。
試してみましょう。

.ingest into table HogeAws (
    h'https://hoge0825foradx.s3.ap-northeast-1.amazonaws.com/hoge-2021-10.csv;AwsCredentials=AKIAIOSFODNN7EXAMPLE,wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY'
) with (ignoreFirstRecord=true)

このように、実行履歴上でアクセスキーとシークレットがマスクされました。

さいごに

本日は Azure Data Explorer の ingest into コマンドが Amazon S3 に対応したので使ってみました。

従来のような ETL が不要になったわけではなく、複雑な取り込みの仕組みが不要であればそのあたりを用意せずにさっと S3 からデータを連携出来るようになったという形なので、使い分けが必要そうですね。
アクセスキーは使わずを得ないので、難読化は必須かなというところですね。
また、難読化に加えて、Azure Data Explorer に対して SDK を使って ingest into を行う場合は AWS 側から一時的な認証情報を取得して使うように独自で実装したほう良さそうだなという感じました。