AWS GlueジョブをVPC内で実行させる

2021.08.02

AWS GlueジョブからVPC内のリソースにアクセスする方法を紹介します。

ポイント

AWS GlueジョブをVPC内で実行させるポイントは以下です。

  • コンソールメニューの「データベース→接続」でVPC設定。
  • ジョブと接続を関連付ける。
  • ENI向けセキュリティグループのインバウンドルールは自己参照させる。
  • S3のVPCエンドポイントをゲートウェイ型で作成。

  • ジョブの作成画面にはネットワーク設定がないこと
  • JDBC接続やデータベース接続しなくても、データベース接続を定義する必要があること

にご注意ください。

やってみた

今回はNATがないVPCのプライベートサブネット内でGlueジョブを実行するものとします。

1. S3用VPCエンドポイントの作成

Glueジョブはスクリプトの取得や実行結果の管理のために、S3アクセスが必要です。

VPCからS3にアクセスできるよう、S3のVPCエンドポイントをゲートウェイ型で作成します。

S3のエンドポイントは

  • ゲートウェイ型
  • インターフェイス型

の2種類が存在します。

インターフェイス型はプライベートDNS名を利用できず、VPCエンドポイント固有のDNS名を利用する必要があります。 おそらく、この制約のために、インターフェイス型エンドポイントを作成しただけでは、VPC GlueからS3にアクセスできません。 設定をシンプルにするために、ゲートウェイ型エンドポイントを作成します。

2. ジョブ実行ENI用セキュリティグループの作成

Glue ジョブをVPC内で実行する時に利用するネットワークインターフェイス(ENI)向けのセキュリティグループを作成します。

このセキュリティグループでは、自己参照型のインバウンドルール、具体的には、自分自身をソースとする任意のポートの任意のTCPを許可するルールを追加します。

タイプ プロトコル ポート範囲 ソース
すべてのTCP TCP 0-65535 自分自身のセキュリティグループID

ENIへの戻りの通信がステートレスなため、このような設定が必要なものと思われます。

3. データベース接続設定の追加

「データベース→接続」から、Glueジョブ実行用の

  • VPC
  • サブネット
  • (オプション)JDBC向けデータベース接続情報

を設定します。

接続プロパティ

JDBCを利用しない場合、「接続タイプ」に「Network」を指定します。

SparkスクリプトからJDBCでデータベース接続する場合、接続情報を定義できます。

同じAWSアカウント内のデータストアにアクセスする場合は、「接続タイプ」で Redshift などのデータベースを選択し、ウィザード形式で JDBC 接続情報を指定できます。

「接続タイプ」で「JDBC」を選択し、直接入力することもできます。

Spark からは catalog_connection 引数にこの接続情報を渡します。

datasink = glueContext.write_dynamic_frame.from_jdbc_conf(
  frame = dropnullfields,
  catalog_connection = "DATABASE_CONNECTION_NAME",
  connection_options = {"dbtable": "table_name", "database": "db_name"},
  transformation_ctx = "...")

接続アクセス

「接続アクセス」ではGlueジョブを実行するVPCやサブネットを指定します。

「セキュリティグループ」には、先程作成したセキュリティグループを指定します。

4. 接続確認

「接続」を作成後、「接続のテスト」ボタンから、作成した接続の疎通確認を行います。

「正常にインスタンスに接続されました。」と表示されれば成功です。

エラーになった場合は、次のナレッジを参考に設定を見直してください。

AWS Glue で失敗したテスト接続を解決する

5. ジョブの作成

Glue ジョブを作成し、「接続」画面で先程作成した「接続」を紐付けます。

6. ジョブの実行

ジョブを実行し「実行ステータス」が「Succeeded」となれば成功です。

7. GlueジョブのENIを確認

AWSコンソールの「EC2→ネットワークインターフェイス」からGlueジョブの ENI を確認できます。

GlueジョブのENIは説明欄が「Attached to Glue using role: arn:aws:iam::AWSアカウントID:role/GlueJobRole」となっています。

このENIは「データベース→接続」で指定したものと同じVPC・サブネット・セキュリティグループであることを確認してください。

ENIが利用されないまま一定時間が経過すると、削除されます。

インターネット通信が必要な場合

VPC内で実行するGlueジョブがインターネット通信を必要な場合の構成は次の通りです。

  • Glueジョブ用 ENI はパブリックIPが割り当てられないため、NAT を用意
  • インターネット向け通信をNATに向ける
  • インターネット経由でS3にアクセスできるため、S3 VPCエンドポイントは不要(インターネットを経由せずに AWSリソースへアクセスしたい場合は各種VPCエンドポイントを活用)

参考