AWS Glue ジョブが失敗し、"Unable to execute HTTP request... connect timed out" エラーが発生します。
簡単な説明
接続がアタッチされた状態で AWS Glue ジョブを実行すると、別のサービスエンドポイントに接続を試行する際、そのジョブは失敗する可能性があります。たとえば、Amazon Simple Storage Service (Amazon S3)、AWS Key Management Service (AWS KMS) などのサービスエンドポイントへの接続試行が当てはまります。このサービスエンドポイントへのネットワークルートが AWS Glue 接続で使用されるサブネットにない場合に、ジョブは失敗します。AWS Glue ジョブのログには、エラーメッセージ "Unable to execute HTTP request" または "failed: connect timed out" が表示されます。
このエラーは、次の要因で発生します。
- AWS Glue 接続で設定されたサブネットにインターネットゲートウェイが含まれている場合。または、障害が発生したサービスエンドポイントのルートテーブルにルートが含まれていない場合。
- AWS Glue ジョブを実行すると、AWS Glue API と通信が行われます。この通信は、AWS Glue Data Catalog テーブルの一覧表示、新しいテーブルの作成、またはテーブルからの読み取りを必要とする操作を使用する場合に発生します。ジョブは、AWS Glue API にアクセスする必要がある場合に HTTP REST API リクエストを送信します。同様に、Amazon S3、Amazon Simple Notification Service (Amazon SNS)、または AWS Secrets Manager に対して他のサービス API コールが行われる場合もあります。API コールを行うと、ジョブはこれらのサービスエンドポイントに接続しようとしますが、リクエストは失敗し、タイムアウトエラーが発生します。ジョブはリクエストを送信できるものの、タイムアウト期間内に応答を受信できなかったことが原因で、このエラーが発生します。
AWS Glue は、AWS Glue 接続で指定されたサブネットに Elastic ネットワークインターフェイスを作成します。詳細については、「データストアへのネットワークアクセスを設定する」を参照してください。
AWS Glue ジョブのリソースにはプライベート IP アドレスのみが割り当てられます。したがって、これらのジョブは、他のリソースへの接続にはインターネットゲートウェイを使用できません。AWS Glue ジョブはパブリック AWS サービスエンドポイントにリクエストを送信しようとしますが、これらのリクエストはプライベート IP アドレスから送信されるため、エンドポイントは応答を返すことができず、ジョブは失敗し、エラーメッセージ "connect timed out" が表示されます。
解決策
ログにはユースケースに応じて、次の例に類似したエラーメッセージが表示されます。
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 仮想プライベートクラウド (Amazon VPC) コンソールを使用して、エラーが発生したサービスにインターフェイス VPC エンドポイントを作成します。たとえば、AWS Glue API にアクセスしようとした際、AWS Glue ジョブが失敗してエラーが発生する場合は、AWS Glue 接続に設定した VPC サブネットと同じサブネットに AWS Glue のインターフェイスエンドポイントを作成します。この方法では、AWS Glue エンドポイントに接続すると想定されるトラフィックが、このインターフェイスを使用して接続していることを確認できます。
- Amazon VPC コンソールを開きます。
- ナビゲーションペインで [エンドポイント] を選択します。
- [エンドポイントを作成] を選択します。
- [サービスカテゴリ] で [AWS サービス] を選択します。
- [サービス名] で接続先のサービスを選択します。詳細については、「AWS PrivateLink と統合される AWS サービス」を参照してください。
- [VPC] で AWS サービスへのアクセス元となる VPC を選択します。
- Amazon S3 にインターフェイスエンドポイントを作成するには、[追加設定] と [DNS 名を有効にする] を選択解除する必要があります。Amazon S3 は、インターフェイス VPC エンドポイントではプライベート DNS をサポートしていないため、この設定が必要です。
- [サブネット] では、AWS サービスへのアクセス元となるアベイラビリティーゾーン (AZ) ごとに 1 つのサブネットを選択します。
- [セキュリティグループ] では、エンドポイントのネットワークインターフェイスに関連付けるセキュリティグループを選択します。セキュリティグループのルールは、VPC エンドポイントを使用するリソースを許可する必要があります。VPC エンドポイントは AWS サービスと通信し、その AWS サービスがエンドポイントのネットワークインターフェイスと通信します。
- [ポリシー] で [フルアクセス] を選択します。この設定を行うと、すべてのプリンシパルによるすべての操作は、VPC エンドポイント経由で許可されます。または、[カスタム] を選択して VPC エンドポイントのポリシーをアタッチします。このポリシーにより、プリンシパルが VPC エンドポイント経由でリソースに対してアクションを実行するのに必要な権限を制御します。このオプションは、使用するサービスが VPC エンドポイントポリシーをサポートしている場合のみ使用できます。詳細については、「VPC エンドポイントポリシー」を参照してください。
- (オプション) タグを追加する場合は、[新しいタグを追加] を選択し、タグキーとタグ値を入力します。
- [エンドポイントを作成] を選択します。
NAT ゲートウェイを使用する
AWS NAT ゲートウェイは、プライベートネットワークを使用してリソースの非公開かつ安全な接続を行います。プライベートサブネットを作成し、AWS Glue 接続をプライベートサブネットに向けます。同時に、AWS Glue VPC 内のいずれかのパブリックサブネットに NAT ゲートウェイを作成します。AWS Glue 接続のルートテーブルで設定を行い、トラフィックがインターネットにルーティングされる場合は、この NAT ゲートウェイ経由でルーティングを行います。詳細については、「Amazon VPC 内のプライベートサブネットに NAT ゲートウェイを設定する方法を教えてください」および「NAT ゲートウェイ」を参照してください。
注: NAT ゲートウェイを使用する場合、サービスへのトラフィックはインターネットを経由します。
その他のトラブルシューティング
- 接続のセキュリティグループとサブネットのネットワーク ACL は、API リクエストを行う際、AWS Glue がトラフィックを送信できるよう設定されていることを確認します。
- 接続の問題をテストするには、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 におけるエラーのトラブルシューティング