AWS Glue の「HTTP リクエストを実行できません... 接続がタイムアウトしました」エラーをトラブルシューティングする方法を教えてください。

所要時間2分
0

AWS Glue ジョブが「HTTP リクエストを実行できません... 接続がタイムアウトしました」というエラーで失敗します。

簡単な説明

接続がアタッチされた状態で AWS Glue ジョブを実行すると、別のサービスエンドポイントに接続しようとすると失敗することがあります。例えば、Amazon Simple Storage Service (Amazon S3) や AWS Key Management Service (AWS KMS) などのサービスエンドポイントに接続しようとする場合があります。このサービスエンドポイントへのネットワークルートが AWS Glue 接続で使用されているサブネットに見つからない場合、ジョブは失敗します。AWS Glue ジョブのログに「HTTP リクエストを実行できません」または「失敗: 接続がタイムアウトしました」というエラーメッセージが表示されます。

次のような理由からこのエラーが発生します。

  • AWS Glue 接続で設定されたサブネットには、インターネットゲートウェイが含まれているか、障害が発生したサービスエンドポイントのルートテーブルにルートがありません。
  • AWS Glue ジョブを実行すると、そのジョブは AWS Glue API とやり取りします。これは、AWS Glue データカタログテーブルの一覧表示、新しいテーブルの作成、またはテーブルからの読み取りを必要とする操作を行った場合に発生します。ジョブが AWS Glue API にアクセスする必要がある場合、HTTP REST API リクエストが送信されます。同様に、Amazon S3、Amazon Simple Notification Service (Amazon SNS)、または AWS Secret Manager に対して他のサービス API 呼び出しを行うこともできます。API 呼び出しを行うと、ジョブはこれらのサービスエンドポイントに接続しようとしますが、リクエストはタイムアウトエラーで失敗します。これは、ジョブはリクエストを送信できても、タイムアウト期間内に応答を受け取れなかったことが原因です。

AWS Glue は、AWS Glue 接続で指定されたサブネットに Elastic Network Interface を作成します。詳細については、「データストアへのネットワークアクセスを設定する」を参照してください。

AWS Glue ジョブのリソースにはプライベート IP アドレスのみがあります。つまり、ジョブはインターネットゲートウェイを使用して他のリソースに接続できません。AWS Glue ジョブはパブリックの AWS サービスエンドポイントにリクエストを送信しようとしますが、このようなリクエストはプライベート IP アドレスから送信されます。そのため、エンドポイントは応答を返すことができず、ジョブは「接続がタイムアウトしました」というエラーメッセージで失敗します。

解決方法

ログに表示されるエラーメッセージは、ユースケースによっては次のいずれかに似ています。

AWS Glue REST API:

AnalysisException: org.apache.hadoop.hive.ql.metadata.HiveException: com.amazonaws.SdkClientException: Unable to execute HTTP request: Connect to glue.ap-southeast-1.amazonaws.com:443

Amazon S3 リクエスト:

Unable to execute HTTP request: Connect to s3BucketName.us-east-1.amazonaws.com:443 [s3BucketName.s3.us-east-1.amazonaws.com/xx.xxx.xx.xxx ] failed: connect timed out

AWS KMS リクエスト:

Unable to execute HTTP request: Connect to kms.us-east-1.amazonaws.com:443 [kms.us-east-1.amazonaws.com/xx.xxx.xx.xxx ] failed: connect timed out

AWS Glue ジョブと、ジョブが API リクエストを行おうとしているサービス間のトラフィックが許可されていることを確認します。これを確認するには、仮想プライベートクラウド (VPC) エンドポイントを使用するか、NAT ゲートウェイを使用します。

VPC エンドポイントを使用する

Amazon Virtual Private Cloud (Amazon VPC) コンソールを使用して、エラーが発生したサービスのインターフェイス VPC エンドポイントを作成します。例えば、AWS Glue API にアクセスしようとしたときに、AWS Glue ジョブが失敗してエラーが発生することがあります。AWS Glue 接続用に設定されている VPC サブネットと同じ VPC サブネットに AWS Glue のインターフェイスエンドポイントを作成します。これにより、AWS Glue エンドポイントに接続するはずのトラフィックがこのインターフェイスを使用して接続していることを確認できます。

  1. Amazon VPC コンソール を開きます。
  2. ナビゲーションペインから [Endpoints] (エンドポイント) を選択します。
  3. [Create endpoint] (エンドポイントを作成) を選択します。
  4. [Service category] (サービスカテゴリー) で [AWS services] (AWS のサービス) を選択します。
  5. [Service name] (サービス名) で、接続するサービスを選択します。詳細については、「AWS PrivateLink と統合される AWS のサービス」を参照してください。
  6. [VPC] では、AWS サービスへアクセスする VPC を選択します。
  7. Amazon S3 のインターフェイスエンドポイントを作成するには、[Additional settings] (追加設定) と [Enable DNS name] (DNS 名を有効化) をクリアする必要があります。これは、Amazon S3 がインターフェイス VPC エンドポイントのプライベート DNS をサポートしていないためです。
  8. [Subnets] (サブネット) では、AWS のサービスにアクセスするアベイラビリティーゾーン (AZ) ごとに 1 つのサブネットを選択します。
  9. [Security group] (セキュリティグループ) では、エンドポイントネットワークインターフェイスに関連付けるセキュリティグループを選択します。セキュリティグループルールは、VPC エンドポイントを使用するリソースを許可する必要があります。VPC エンドポイントは AWS のサービスと通信し、次に AWS のサービスはエンドポイントのネットワークインターフェイスと通信します。
  10. [Policy] (ポリシー) では、[Full access] (フルアクセス) を選択します。これにより、VPC エンドポイント上のすべてのリソースですべてのプリンシパルによるすべての操作が可能になります。または、[Custom] (カスタム) を選択して VPC エンドポイントポリシーをアタッチします。このポリシーは、プリンシパルが VPC エンドポイント上でリソースに対してアクションを実行するために必要なアクセス許可を制御します。このオプションは、サービスが VPC エンドポイントポリシーをサポートしている場合にのみ使用できます。詳細については、「VPC エンドポイントポリシー」を参照してください。
  11. (オプション) タグを追加するには、[Add new tag] (新しいタグを追加) を選択し、タグキーとタグ値を入力します。
  12. [Create endpoint] (エンドポイントを作成) を選択します。

NAT ゲートウェイを使用する

AWS NAT Gateway は、プライベートインターネットを使用してリソースをプライベートかつ安全に接続します。プライベートサブネットを作成し、AWS Glue 接続をプライベートサブネットに向けます。同時に、AWS Glue VPC のパブリックサブネットの 1 つに NAT ゲートウェイを作成します。トラフィックがインターネットにルーティングされる場合、この NAT ゲートウェイを使用してルーティングされるように、AWS Glue 接続サブネットのルートテーブルを設定します。詳細については、「Amazon VPC でプライベートサブネット用の NAT ゲートウェイをセットアップするにはどうすればよいですか?」と「NAT ゲートウェイ」を参照してください。

: NAT ゲートウェイを使用している場合、サービスへのトラフィックはインターネットを経由します。

追加のトラブルシューティング

  1. 接続セキュリティグループとサブネットネットワーク ACL が API リクエストを行うときに AWS Glue がトラフィックを送信することを許可していることを確認します。
  2. 接続の問題をテストするには、AWS Glue 接続の作成時に使用したのと同じ VPC、サブネット、セキュリティグループで EC2 インスタンスを起動します。次に、以下のコマンドを実行して、サービスエンドポイントとの接続を確認します。
telnet <glue endpoint url> 443
dig <glue endpoint url>

例:

$ telnet glue.us-east-1.amazonaws.com 443
$ dig glue.us-east-1.amazonaws.com

関連情報

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

AWS公式
AWS公式更新しました 1年前