AWS Glue が Azure SQL Database と Azure Cosmos DB への接続をサポートしていたので使ってみた

2024.01.10

いわさです。

先日 Glue のビジュアルエディターを操作していたところ、Azure SQL と Azure Cosmos DB に関するノードが追加されていることに気がつきました。

そういえば re:Invent 直前のアップデートとしてデータアナリティクス通信で紹介されていたことを思い出しました。11 月中旬のアップデートだったようです。

公式のアップデート情報はこちらですね。ネイティブコネクタとして Azure SQL や Azure Cosmos DB などが追加されているとのこと。

ソースとターゲットどちらもサポートされているみたいですね。良さそう。
Azure リソースを AWS から操作したいシーンがたまにあったので使ってみることにしました。

Azure リソースの用意

Azure 側では Azure Cosmos DB (Core) と Azure SQL Database を用意します。
Cosmos DB ではデータベースとコンテナを作成し、データを数件作成しておきます。

SQL Database には適当なテーブルを作成しておきます。

Glue コネクションの用意

Glue のビジュアルエディターを使って構築してみたいと思います。
Glue が Azure SQL および Azure Cosmos DB にアクセスするにあたって、事前に Glue のコネクションを作成しておく必要があります。

Glue の Connection メニューから作成します。
データソースで「Azure」と検索すると Azure Cosmos と Azure SQL が使えるはずです。

Azure SQL Database 向けの接続

Azure ポータルの以下から JDBC 接続に必要な情報を取得することが出来ます。

Glue コネクションを使う場合はユーザー名とパスワードを AWS Secrest Manager のシークレット経由で取得する必要があります。
そのため、接続先は次のようにサーバー名とデータベース名を指定しました。databaseNameが標準の接続文字列と違っているので注意しましょう。

jdbc:sqlserver://hoge0110azuresql.database.windows.net:1433;databaseName=hoge0110azuresql;

ユーザー名とパスワードは次のようにキーバリュー形式で登録します。

なお、Glue 接続のオプションで VPC を構成することが出来るのですが、調べたところ Glue ジョブの接続元 IP アドレスの範囲を探して設定するのは一般的ではないようです。
Azure SQL Database にアクセスする場合はファイアーウォールの設定を行う必要がありますのでアクセス元の IP アドレスを登録する必要があります。

Azure と AWS を VPN などでプライベート接続する場合でも、インターネット経由でのアクセスをする場合でも、VPC を経由してアウトバウンドしたほうが良いのかなと思います。

Azure Cosmos DB 向けの接続

Cosmos DB の場合はキーを使ってアクセスする形となります。
Azure ポータルの「キー」メニューからエンドポイントの URI とキーを取得することが出来ます。

Glue のコネクションで Azure Cosmos DB を選択し、URI を入力します。
こちらもキー情報はシークレットへの登録が必要で、spark.cosmos.accountKeyに登録します。

Glue ジョブの作成

コネクションの準備が出来たら、ビジュアルエディターでジョブを作成してみます。
データソースに Azure Cosmos DB を選択し、先程のコネクションを選択します。
また、Azure ポータル上で確認したデータベースとコンテナ名を入力し、全件取得のカスタムクエリを入力します。Cosmos DB の場合はカスタムクエリのみサポートされているようです。

上記のようにアイテムがプレビューできていることを確認しました。
つづいてChange Schemaにて SQL Database のテーブルレイアウトにあわせてスキーマの変換や列のドロップを行いました。まぁこのあたりは適当です。

最後に Azure SQL Database をターゲットに指定しました。
ここでも先程作成したコネクションを選択し、テーブル名を指定します。

ジョブを実行し、Azure SQL Database に対してクエリを発行してみると Cosmos DB のデータが移行されていることが確認出来ました。

Cosmos DB への書き込みに失敗した

今回は Azure Cosmos DB → Azure SQL Database の方向を紹介しましたが、逆方向も一応試しています。
次のように Azure SQL Database のデータソースではデータをプレビュー出来ています。
ちなみに Azure SQL Database の場合はテーブルを指定するか、あるいはカスタムクエリを実装するか、どちらも選べます。

Azure Cosmos DB をデータターゲットに指定しました。
コネクション情報は同じものなので正しいはずです。

しかし、次のように WriteDynamicFrame に関した失敗が発生しています。

書き込み自体はサポートされているはずなので、私のどこかの実装が悪いのかなぁと思って調べているところです。
どなたか情報お餅の方は共有頂けると嬉しいです。

さいごに

本日は AWS Glue が Azure SQL Database と Azure Cosmos DB への接続をサポートしていたので使ってみました。

Glue のビジュアルエディターで、私のように専門家ではない人間でもジョブの実装がしやすくなりましたし、ネイティブコネクタが増えるのはとても良いですね。
Azure Storage も頼む。