AWS Glue
開発者ガイド

AWS Glue のエラーのトラブルシューティング

AWS Glue でエラーが発生した場合は、次の解決策を使用して問題の原因を突き止めて修正してください。

注記

AWS Glue GitHub リポジトリには AWS Glue に関するよくある質問のトラブルシューティングガイダンスの詳細が含まれています。

トピック

エラー: リソースを利用できません。

AWS Glue がリソース使用不可メッセージを返す場合は、エラーメッセージやログを表示して、問題の詳細を確認することができます。ここでは、トラブルシューティングするための一般的な方法について説明します。

  • 使用する接続および開発エンドポイントについては、クラスターに Elastic Network Interface が不足していないかどうかを確認してください。

エラー: VPC の subnetId に S3 エンドポイントまたは NAT ゲートウェイが見つかりませんでした

問題の診断に役立つメッセージのサブネット ID と VPC ID を確認します。

  • AWS Glue に必要な Amazon S3 VPC エンドポイントが設定されていることを確認してください。さらに、設定の一部である場合には、NAT ゲートウェイを確認します。詳細については、「Amazon S3 における Amazon VPC エンドポイント」を参照してください。

エラー: 必要なセキュリティグループのインバウンドルール

少なくとも 1 つのセキュリティグループのすべての受信ポートを開く必要があります。トラフィックを制限するために、インバウンドルールのソースセキュリティグループを同じセキュリティグループに制限できます。

エラー: 必要なセキュリティグループのアウトバウンドルール

少なくとも 1 つのセキュリティグループのすべての発信ポートを開く必要があります。トラフィックを制限するために、アウトバウンドルールのソースセキュリティグループを同じセキュリティグループに制限できます。

エラー: ロールにロール継承アクセス許可を付与する必要がある AWS Glue サービスが渡されているため、ジョブの実行に失敗しました

ジョブを定義するユーザーは AWS Glue の iam:PassRole のアクセス権限を持っている必要があります。

エラー: DescribeVpcEndpoints アクションが許可されていません。VPC ID vpc-id を検証できません

  • ec2:DescribeVpcEndpoints アクセス権限用に、AWS Glue に渡されたポリシーを確認してください。

エラー: DescribeRouteTables アクションが許可されていません。VPC id (vpc-id) の Subnet Id (subnet-id) を検証できません。

  • ec2:DescribeRouteTables アクセス権限用に、AWS Glue に渡されたポリシーを確認してください。

エラー: ec2:DescribeSubnets の呼び出しに失敗しました

  • ec2:DescribeSubnets アクセス権限用に、AWS Glue に渡されたポリシーを確認してください。

エラー: ec2:DescribeSecurityGroups の呼び出しに失敗しました

  • ec2:DescribeSecurityGroups アクセス権限用に、AWS Glue に渡されたポリシーを確認してください。

エラー: AZ のサブネットが見つかりませんでした

  • アベイラビリティーゾーンは、AWS Glue では使用できない場合があります。メッセージで指定されているものとは異なるアベイラビリティーゾーンに新しいサブネットを作成して使用します。

エラー: JDBC ターゲットへの書き込み時のジョブ実行の例外

JDBC ターゲットに書き込むジョブを実行すると、以下のシナリオのようにジョブでエラーが発生する可能性があります。

  • ジョブが Microsoft SQL Server テーブルに書き込む場合、テーブルに Boolean 型として定義された列がある場合には、SQL Server データベースでテーブルを事前に定義する必要があります。SQL Server ターゲットを使用して AWS Glue コンソールでジョブを定義し、[Create tables in your data target (データターゲットでテーブルを作成する)] オプションを使用する場合は、データ型が Boolean であるターゲット列にソース列をマッピングしないでください。ジョブの実行時にエラーが発生する可能性があります。

    次のようにして、エラーを回避できます。

    • [Boolean (ブール)] 列を使用して既存のテーブルを選択します。

    • ApplyMapping 変換を編集し、ソース内の [Boolean] (ブール) 列をターゲット内の数値または文字列にマップします。

    • ApplyMapping 変換を編集して、[Boolean] (ブール) 列をソースから削除します。

  • ジョブが Oracle テーブルに書き込む場合は、Oracle オブジェクトの名前の長さを調整する必要があります。Oracle の一部のバージョンでは、識別子の最大長は 128 バイトまたは 30 バイトに制限されています。この制限は、Oracle ターゲットデータストアのテーブル名および列名に影響を与えます。

    次のようにして、エラーを回避できます。

    • ご使用のバージョンの制限内で Oracle ターゲットテーブルに名前を付けます。

    • デフォルトの列名は、データのフィールド名から生成されます。列名が制限よりも長い場合は処理のために、ApplyMapping または RenameField 変換を使用して列の名前を制限内に変更します。

エラー: Amazon S3 タイムアウト

AWS Glue が接続タイムアウトエラーを返す場合は、別の AWS リージョンの Amazon S3 バケットにアクセスしようとしている可能性があります。

  • Amazon S3 の VPC エンドポイントは、AWS リージョン内のバケットにのみトラフィックをルーティングできます。他のリージョンのバケットに接続する必要がある場合、考えられる回避策は NAT ゲートウェイを使用することです。詳細については、「NAT ゲートウェイ」を参照してください。

エラー: Amazon S3 アクセスが拒否されました

AWS Glue が Amazon S3 バケットまたはオブジェクトのアクセス拒否エラーを返す場合は、提供された IAM ロールにデータストアへのアクセス権を持つポリシーがないことが原因です。

  • ETL ジョブは、ソースまたはターゲットとして使用される Amazon S3 データストアにアクセスできる必要があります。クローラは、クロールする Amazon S3 データストアにアクセスできる必要があります。詳細については、「ステップ 2: AWS Glue 用の IAM ロールを作成する」を参照してください。

エラー: Amazon S3 アクセスキー ID が存在しません

ジョブの実行中に AWS Glue がアクセスキー ID が存在しないというエラーを返す場合は、次のいずれかの理由が考えられます。

  • ETL ジョブは IAM ロールを使用してデータストアにアクセスし、ジョブの IAM ロールがジョブの開始前に削除されていないことを確認します。

  • IAM ロールには、データストアにアクセスするためのアクセス許可が含まれており、s3:ListBucket を含むアタッチされた Amazon S3 ポリシーが正しいことを確認します。

エラー: s3a:// URI を使用して Amazon S3 にアクセスするときにジョブ実行が失敗します

ジョブ実行から「XML ドキュメントをハンドラクラスで解析できませんでした」などのエラーが返された場合は、s3a:// URI を使用して数百のファイルをリストアップしようとして失敗した可能があります。代わりに s3:// URI を使用してデータストアにアクセスしてください。次の例外トレースを調べてエラーを確認できます。

1. com.amazonaws.SdkClientException: Failed to parse XML document with handler class com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser$ListBucketHandler 2. at com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser.parseXmlInputStream(XmlResponsesSaxParser.java:161) 3. at com.amazonaws.services.s3.model.transform.XmlResponsesSaxParser.parseListBucketObjectsResponse(XmlResponsesSaxParser.java:317) 4. at com.amazonaws.services.s3.model.transform.Unmarshallers$ListObjectsUnmarshaller.unmarshall(Unmarshallers.java:70) 5. at com.amazonaws.services.s3.model.transform.Unmarshallers$ListObjectsUnmarshaller.unmarshall(Unmarshallers.java:59) 6. at com.amazonaws.services.s3.internal.S3XmlResponseHandler.handle(S3XmlResponseHandler.java:62) 7. at com.amazonaws.services.s3.internal.S3XmlResponseHandler.handle(S3XmlResponseHandler.java:31) 8. at com.amazonaws.http.response.AwsResponseHandlerAdapter.handle(AwsResponseHandlerAdapter.java:70) 9. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.handleResponse(AmazonHttpClient.java:1554) 10. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeOneRequest(AmazonHttpClient.java:1272) 11. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeHelper(AmazonHttpClient.java:1056) 12. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.doExecute(AmazonHttpClient.java:743) 13. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.executeWithTimer(AmazonHttpClient.java:717) 14. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.execute(AmazonHttpClient.java:699) 15. at com.amazonaws.http.AmazonHttpClient$RequestExecutor.access$500(AmazonHttpClient.java:667) 16. at com.amazonaws.http.AmazonHttpClient$RequestExecutionBuilderImpl.execute(AmazonHttpClient.java:649) 17. at com.amazonaws.http.AmazonHttpClient.execute(AmazonHttpClient.java:513) 18. at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4325) 19. at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4272) 20. at com.amazonaws.services.s3.AmazonS3Client.invoke(AmazonS3Client.java:4266) 21. at com.amazonaws.services.s3.AmazonS3Client.listObjects(AmazonS3Client.java:834) 22. at org.apache.hadoop.fs.s3a.S3AFileSystem.getFileStatus(S3AFileSystem.java:971) 23. at org.apache.hadoop.fs.s3a.S3AFileSystem.deleteUnnecessaryFakeDirectories(S3AFileSystem.java:1155) 24. at org.apache.hadoop.fs.s3a.S3AFileSystem.finishedWrite(S3AFileSystem.java:1144) 25. at org.apache.hadoop.fs.s3a.S3AOutputStream.close(S3AOutputStream.java:142) 26. at org.apache.hadoop.fs.FSDataOutputStream$PositionCache.close(FSDataOutputStream.java:74) 27. at org.apache.hadoop.fs.FSDataOutputStream.close(FSDataOutputStream.java:108) 28. at org.apache.parquet.hadoop.ParquetFileWriter.end(ParquetFileWriter.java:467) 29. at org.apache.parquet.hadoop.InternalParquetRecordWriter.close(InternalParquetRecordWriter.java:117) 30. at org.apache.parquet.hadoop.ParquetRecordWriter.close(ParquetRecordWriter.java:112) 31. at org.apache.spark.sql.execution.datasources.parquet.ParquetOutputWriter.close(ParquetOutputWriter.scala:44) 32. at org.apache.spark.sql.execution.datasources.FileFormatWriter$SingleDirectoryWriteTask.releaseResources(FileFormatWriter.scala:252) 33. at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$org$apache$spark$sql$execution$datasources$FileFormatWriter$$executeTask$3.apply(FileFormatWriter.scala:191) 34. at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$org$apache$spark$sql$execution$datasources$FileFormatWriter$$executeTask$3.apply(FileFormatWriter.scala:188) 35. at org.apache.spark.util.Utils$.tryWithSafeFinallyAndFailureCallbacks(Utils.scala:1341) 36. at org.apache.spark.sql.execution.datasources.FileFormatWriter$.org$apache$spark$sql$execution$datasources$FileFormatWriter$$executeTask(FileFormatWriter.scala:193) 37. at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$write$1$$anonfun$3.apply(FileFormatWriter.scala:129) 38. at org.apache.spark.sql.execution.datasources.FileFormatWriter$$anonfun$write$1$$anonfun$3.apply(FileFormatWriter.scala:128) 39. at org.apache.spark.scheduler.ResultTask.runTask(ResultTask.scala:87) 40. at org.apache.spark.scheduler.Task.run(Task.scala:99) 41. at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:282) 42. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 43. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 44. at java.lang.Thread.run(Thread.java:748)

エラー: Amazon S3 サービストークンが有効期限切れです

Amazon Redshift との間でデータを移行する場合、一時的な Amazon S3 認証情報 (1 時間で有効期限が切れる) が使用されます。長時間実行するジョブがある場合は、失敗する可能性があります。長時間実行するジョブを設定して Amazon Redshift との間でデータを移行する方法の詳細については、「Amazon Redshift との間でのデータの移動」を参照してください。

エラー: ネットワークインターフェイスのプライベート DNS が見つかりません

ジョブが失敗したり、開発エンドポイントがプロビジョニングに失敗した場合は、ネットワーク設定が問題の原因である可能性があります。

  • Amazon が提供する DNS を使用している場合は、enableDnsHostnames の値を true に設定する必要があります。詳細については、「DNS」を参照してください。

エラー: 開発エンドポイントのプロビジョニングに失敗しました

AWS Glue が開発エンドポイントのプロビジョニングに失敗した場合は、ネットワーク設定が問題の原因である可能性があります。

  • 開発エンドポイントを定義すると、VPC、サブネット、およびセキュリティグループが検証され、特定の要件を満たしていることが確認されます。

  • オプションの SSH パブリックキーを指定した場合、有効な SSH パブリックキーになっていることを確認します。

  • VPC コンソールで、VPC が有効な [DHCP option set (DHCP オプションセット)] を使用していることを確認します。詳細については、「DHCP オプションセット」を参照してください。

  • クラスターが PROVISIONING 状態のままになっている場合は、AWS サポートにお問い合わせください。

エラー: ノートブックサーバー CREATE_FAILED

AWS Glue が開発エンドポイント用のノートブックサーバーの作成に失敗した場合は、次のいずれかの問題が原因である可能性があります。

  • AWS Glue は、ノートブックサーバーの設定時に Amazon EC2 に IAM ロールを渡します。IAM ロールは Amazon EC2 との信頼関係が必要です。

  • IAM ロールには、同じ名前のインスタンスプロファイルが必要です。IAM コンソールで Amazon EC2 のロールを作成すると、同じ名前のインスタンスプロファイルが自動的に作成されます。無効なインスタンスプロファイル名 iamInstanceProfile.name に関するログのエラーをチェックします。詳細については、「インスタンスプロファイルの使用」を参照してください。

  • ロールにノートブックサーバーを作成するために渡したポリシーの aws-glue* バケットにアクセスする権限があることを確認します。

エラー: ローカルノートブックの起動に失敗する

ローカルノートブックの起動に失敗し、ディレクトリまたはフォルダが見つからないというエラーが報告された場合は、次のいずれかの問題が原因である可能性があります。

  • Microsoft Windows で実行している場合は、JAVA_HOME 環境変数が適切な Java ディレクトリを指していることを確認します。この変数を更新せずに Java が更新される可能性があります。存在しなくなったフォルダを変数が指していると、Zeppelin ノートブックは起動に失敗します。

エラー: ノートブック使用エラー

Apache Zeppelin ノートブックを使用する場合、設定や環境によってエラーが発生する可能性があります。

  • ノートブックサーバーの作成時に、アタッチされたポリシーを持つ IAM ロールを提供します。ポリシーに必要なすべてのアクセス権限が含まれていない場合、assumed-role/name-of-role/i-0bf0fa9d038087062 is not authorized to perform some-action AccessDeniedException などのエラーが発生する可能性があります。IAM コンソールでノートブックサーバーに渡されるポリシーを確認します。

  • Zeppelin ノートブックがウェブブラウザで正しくレンダリングされない場合は、ブラウザサポートの Zeppelin 要件を確認してください。たとえば、Safari ブラウザに特定のバージョンと設定が必要な場合があります。ブラウザを更新するか、別のブラウザを使用する必要があります。

エラー: クローラの実行に失敗しました

AWS Glue がデータをカタログ化するためにクローラを正常に実行できなかった場合は、次のいずれかの理由が考えられます。まず、AWS Glue コンソールのクローラリストにエラーがあるかどうかを確認します。クローラ名の横に感嘆符 アイコンがあるかどうかを確認し、アイコンの上にカーソルを置いて関連するメッセージを確認します。

  • /aws-glue/crawlers の CloudWatch Logs で実行されるクローラのログを確認します。

エラー: Athena データカタログのアップグレード

Athena データカタログを AWS Glue データカタログ にアップグレードする際にエラーが発生した場合は、Amazon Athena ユーザーガイド トピックの「AWS Glue データカタログへのステップバイステップのアップグレード」を参照してください。

エラー : ジョブのブックマークが有効なときにジョブがデータを再処理しています

AWS Glue ジョブのブックマークを有効にしてあっても、以前の実行で処理したデータを ETL ジョブで再処理する場合があります。このエラーの一般的な原因を確認します。

最大同時実行数

ジョブの同時実行の最大数が 1 であることを確認します。。詳細については、「AWS Glue でジョブを追加する」の最大同時実行数に関する説明を参照してください。ジョブのブックマークのある複数の同時ジョブがあり、最大同時数が 1 に設定されている場合、ジョブのブックマークは正しく機能しません。

Job オブジェクトが見つからない

ジョブの実行スクリプトが次のコメントで終わることを確認します。

job.commit()

このオブジェクトを含めると、AWS Glue はジョブ実行のタイムスタンプとパスを記録します。同じパスでジョブを再度実行すると、AWS Glue は新しいファイルのみを処理します。このオブジェクトを含まず、ジョブのブックマークが有効になっている場合、ジョブはすでに処理されたファイルと共に新しいファイルを再処理して、ジョブのターゲットデータストアで冗長化されます。

Spark DataFrame

ジョブのデータシンクとして Apache Spark DataFrame を使用している場合、AWS Glue ジョブのブックマークは機能しません。ジョブのブックマークは、AWS Glue DynamicFrame クラス を使用する場合にのみ機能します。このエラーを解決するには、fromDF 構築を使用して DynamicFrame に切り替えます。

変換コンテキストパラメータが見つからない

変換コンテキストは、GlueContext クラスのオプションのパラメータですが、ジョブのブックマークは含めなければ機能しません。このエラーを解決するには、以下に示すように DynamicFrame を作成するときに変換コンテキストパラメータを追加します。

sample_dynF=create_dynamic_frame_from_catalog(database, table_name,transformation_ctx="sample_dynF")

入力ソース

入力ソースのリレーショナルデータベース (JDBC 接続) を使用している場合は、テーブルのプライマリキーが順番になっている場合のみジョブのブックマークが機能します。ジョブのブックマークは新しい行に対して機能しますが、更新された行に対しては機能しません。これは、ジョブのブックマークで探すプライマリキーがすでに存在しているからです。入力ソースが Amazon Simple Storage Service (Amazon S3) の場合は適用されません。

最終更新日時

Amazon S3 入力ソースの場合、ジョブのブックマークでは、ファイル名ではなくオブジェクトの最終更新日時を確認して、どのオブジェクトを再処理する必要があるのかを確認します。入力ソースデータが最後のジョブ実行以降に変更されている場合、ジョブを再度実行すると、ファイルが再度処理されます。

このページの内容: