【トラブル】【AWS】AWS Glue Job で ConnectionTimeoutError が発生する

■ はじめに

https://dk521123.hatenablog.com/entry/2021/08/30/104237

で、AWS Glue から RDS接続した際に、
Timeoutエラーになったことについて触れたが、
今回は、RDS接続ではなく(っというかRDS使ってない)
Timeoutエラーになったので、その際のトラブルシューティングについてメモ。

目次

【0】Glue Job に関するTimeoutエラー時の原因調査例
 調査手順例
【1】Case1:  "https://glue.us-west-2.amazonaws.com/" へのアクセス
 1)トラブル概要
 2)エラー内容
 3)確認した点
 4)原因
 5)解決案
【2】Case2:  "https://email.us-west-2.amazonaws.com/" へのアクセス
 1)トラブル概要
 2)エラー内容
 3)原因
 4)解決案

【0】Glue Job に関するTimeoutエラー時の原因調査例

 前回のTimeoutエラー

https://dk521123.hatenablog.com/entry/2021/08/30/104237

や今回の現象およびそれ以外に経験したTimeoutエラーを踏まえて、
もし、Glue Job で Timeout エラーになったら、
以下の手順で原因を探った方がいいと思った。

調査手順例

1)Glue Jobに紐づいているGlue connectionの確認
 ⇒ EMRを起動しようとした際のTimeoutエラーで
  Glue connectionがアタッチされていなかった
 ⇒ Glue connectionがなければ作成・アタッチ
2)Glue connectionに設定されている、
  VPC/Subnet/Security Group を確認し
  接続先(今回の場合 "https://glue.us-west-2.amazonaws.com/")へ
  アクセス可能か確認する
 (今回の場合「Security GroupのInbound/Outbound」)

【1】Case1: "https://glue.us-west-2.amazonaws.com/" へのアクセス

1)現象

 Glue Job内において、以下の boto3 API を実行した際に
Timeoutエラー(詳細は、後述「【2】エラー内容」参照)になった。
~~~~~~~
[1] get_workflow_run_properties()
[2] put_workflow_run_properties()
~~~~~~~

エラーが発生したJobスクリプト
https://dk521123.hatenablog.com/entry/2019/10/15/221931

import sys
import boto3
from awsglue.utils import getResolvedOptions

# ★意図したregion 'us-west-2' を指定
# (以下「【3】確認」の「[1] region の指定の確認」を参照)
glue_client = boto3.client("glue", region='us-west-2')

args = getResolvedOptions(sys.argv, ['WORKFLOW_NAME', 'WORKFLOW_RUN_ID'])
workflow_name = args['WORKFLOW_NAME']
workflow_run_id = args['WORKFLOW_RUN_ID']

# ★ここで例外★
workflow_params = glue_client.get_workflow_run_properties(
  Name=workflow_name,
  RunId=workflow_run_id)["RunProperties"]

2)エラー内容

ConnectTimeoutError: Connect timeout on endpoint URL:
 "https://glue.us-west-2.amazonaws.com/"

補足:"https://glue.us-west-2.amazonaws.com/"について

 "https://glue.us-west-2.amazonaws.com/" は、
AWS Glue の AWS サービスエンドポイント(※) に接続にいっている。

https://docs.aws.amazon.com/ja_jp/general/latest/gr/glue.html

より抜粋
リージョン名 リージョン エンドポイント プロトコル
米国西部 (オレゴン) us-west-2 glue.us-west-2.amazonaws.com HTTPS

AWS サービスエンドポイント について
https://docs.aws.amazon.com/ja_jp/general/latest/gr/rande.html

より抜粋
~~~~~~~
AWS のサービスにプログラムで接続するには、エンドポイントを使用します。
エンドポイントは、AWS ウェブサービスのエントリポイントの URL です。
~~~~~~~

3)確認した点

[1] region の指定の確認

glue_client = boto3.client("glue", region='us-west-2')

https://dev.classmethod.jp/articles/tsnote-awscli-couldnotconnect-001/

で指摘されている「--regionの設定に誤りがないか」についてだが
本事例では、あてはまらないことを確認。

[2] IAMロールについて

* Glue jobに指定したIAMロールは、以下のAPIで実行許可があることも確認。
 => そもそも実行権限がなければ、
  Timeoutエラーではなく実行権限エラーになるし、、、
~~~~~~~
[1] get_workflow_run_properties()
[2] put_workflow_run_properties()
~~~~~~~

4)原因

AWS サービスエンドポイント "https://glue.us-west-2.amazonaws.com/"
に接続しようと思ったが、Glue jobに指定されているGlue connectionから
アクセスできなかったため
 => 今回の場合、
  Glue connection に紐づけられている Security group の Inbound/Outbound で
  AWS サービスエンドポイント "https://glue.us-west-2.amazonaws.com/"への
  アクセスが許可されていなかったことが原因。

確認の仕方

* 以下の公式サイトに記載されている

https://aws.amazon.com/jp/premiumsupport/knowledge-center/connection-timeout-glue-redshift-rds/

より抜粋
~~~~~~~~~
接続がジョブにアタッチされていることを確認するには、次を実行します。

1. AWS Glue コンソールを開きます。
2. ジョブを選択し、[Details] タブをクリックします。
3. [Connections] パラメータを確認します。
 接続が表示されていない場合は、ジョブを編集して接続を追加します。

AWS Glue では、ジョブまたは開発エンドポイントごとに
1 つの接続をサポートしています。
ジョブで複数の接続を指定した場合、
AWS Glue は最初の接続のみを使用します。
~~~~~~~~~

5)解決案

* 今回の場合、Security GroupのInbound/Outbound に対して、
 AWS サービスエンドポイント "https://glue.us-west-2.amazonaws.com/"
 へのアクセスが許可するように修正。

【2】Case2: "https://email.us-west-2.amazonaws.com/" へのアクセス

1)トラブル概要

Glue Job から boto3 API / send_email() で Emailを送信したら
以下の「エラー内容」が表示されてしまった

https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ses.html#SES.Client.send_email

2)エラー内容

ConnectTimeoutError: Connect timeout on endpoint URL:
 "https://email.us-west-2.amazonaws.com/"

3)原因

Security group の Outbound で防止されていたため

https://docs.aws.amazon.com/ja_jp/general/latest/gr/ses.html

エンドポイント「email.us-west-2.amazonaws.com」

 他のエンドポイントと違って
「email.us-west-2.amazonaws.com」は、
AWS管理コンソール上からエンドポイントを作成できなかった
(ってゆーかー選択肢に出てこない)

4)解決案

Security group の Outbound で「0.0.0.0/0 (Port:443)」を許可

関連記事

AWS Glue ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2019/10/01/221926
AWS Glue ~ Workflows / パラメータ渡し ~
https://dk521123.hatenablog.com/entry/2019/10/15/221931
AWS Glue Job で DB timeout が発生する
https://dk521123.hatenablog.com/entry/2021/08/30/104237
Amazon VPC ~ 基本編 / VPCエンドポイント ~
https://dk521123.hatenablog.com/entry/2022/03/20/000000
Amazon VPC ~ Reachability Analyzer ~
https://dk521123.hatenablog.com/entry/2022/04/24/211107