AWS Glue クローラーで RDS for MySQL への JDBC 接続を使った際に失敗したのでトラブルシューティング例を紹介

2022.08.24

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

いわさです。

先日、Amazon RDS に対して Glue クローラーを使う機会があったのですが、クローラー実行の際に内部エラーが発生するケースがありました。
マネジメントコンソールからの接続までは出来ていたのですがその後のクローラー設定が良くなかったです。

今回はトラブルシューティングの一例をご紹介します。

前提条件

今回は RDS の特定のデータベース・テーブルから Glue のデータカタログにテーブルを作成することを目的にしていました。
RDS では、Aurora MySQL 5.7 を使用しています。

また、暗号化は有効にしていません。

そして、今回は JDBC 接続を行おうとしており、接続のテストまでは出来ています。

クローラーの作成と実行、失敗

接続まで出来たら、あとはクローラーの構成と実行を行うことでデータカタログの反映を行うことが出来ます。
そして、当初私は以下のように構成を行っていました。

作成したクローラーを実行してみると以下のようにエラーが発生して Stopping となりました。
エラーの詳細を把握するために「ログ」を確認してみます。

ログから、エラーが発生していることがわかりますが具体的な原因については把握出来ない状態でした。

[c3f07931-b62e-45b0-b841-ca173de359e4] BENCHMARK : Running Start Crawl for Crawler hoge0822aurora
[c3f07931-b62e-45b0-b841-ca173de359e4] ERROR : Internal Service Exception
[c3f07931-b62e-45b0-b841-ca173de359e4] BENCHMARK : Crawler has finished running and is in state READY

トラブルシューティング

以下のドキュメントに案内があり、Internal Service Exception が発生した際には以下を参考にトラブルシューティングを行うことが出来ます。

データストアに応じて様々な一般的な問題が可能性としてあるそうで、JDBC の場合だと以下が考えられます。

  • AWS KMS で暗号化された JDBC データソースをクロールしている場合は、接続に使用しているサブネットをチェックします。サブネットのルートテーブルには、AWS KMS VPC エンドポイント、または NAT ゲートウェイを経由する AWS KMS エンドポイントへのルートが必要です。
  • 正しい Include パス構文を使用していることを確認します。詳細については、Defining crawlers を参照してください。
  • JDBC データストアをクロールしている場合は、SSL 接続が正しく設定されていることを確認します。SSL 接続を使用していない場合は、クローラーの設定時に [Require SSL connection] (SSL 接続が必要です) が選択されていないことを確認してください。
  • AWS Glue 接続のデータベース名が、クローラーの Include パスのデータベース名と一致していることを確認します。また、Include パスが正しく入力されていることを確認してください。詳細については、Include and exclude patterns を参照してください。
  • 使用しているサブネットが AWS Glue でサポートされているアベイラビリティーゾーンにあることを確認してください。
  • 使用しているサブネットに十分なプライベート IP アドレスがあることを確認してください。
  • 組み込みの AWS Glue JDBC ドライバーで JDBC データソースがサポートされていることを確認します。

まずはこちらを 1 つづつ見直していきましょう。
ちなみに、今回の場合だと以下が原因でした。

正しいインクルードパス構文を使用する

インクルードパスに%を指定していました。
こちら、データベース名を含むhogehoge/%に変更しました。

成功しましたね。

インクルードパス構文はエンジンによる

なぜ当初%を使っていたかというと、私は以下の記事を参考にデータカタログの抽出を行っていました。
この記事ではインクルードパスに%を指定していました。

実は、上記記事で%を指定しているのは正しいです。
私は深く考えずにそのまま MySQL へ同じ構文を適用してしまっていました。

ちなみに上記を参考に Microsoft SQL Server で実行した場合は以下のように正しく動作します。

MySQL や Oracle の場合のインクルードパスの注意点は先程のドキュメントにも記述がありますのでご一読頂くと宜しいかと思います。

さいごに

本日は、AWS Glue クローラーで RDS for MySQL への JDBC 接続を使った際に失敗したのでトラブルシューティング例を紹介しました。

クローラー実行時にInternal Service Exceptionという汎用的なエラーメッセージが出力されることがありますが、トラブルシューティング記事にしたがってひとつづつ原因を探していきましょう。
また JDBC の場合ですがデータベースエンジンによって挙動が変わる場合があるので何かを参考にクローラーを構築する際はそのあたりも意識しましょう。という話でした。