Glue JobでVPC内リソースにアクセスする

# ゴール

タイトルにあるように、Glue Job をVPCに接続して、VPC内リソース（今回はOpenSearch Service）にアクセスできるように設定することが本記事のゴールです。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821799/7429c5aa-ab30-4b1a-9229-c6319f0fc4b8.png)

:::note warn
上の図は概略です。より正確なネットワーク構成は「[VPC内で実行されているわけではない](#vpc内で実行されているわけではない)」を参照してください。
:::

なお、以下の内容については本記事では触れません。
- Glue Jobの作成
- ロールのアタッチ
- OpenSearch Serviceについて
- 接続のためのJob Script

# Data Connectionsの罠

要件は、Glue Jobから、プライベートサブネット内で実行しているOpenSearch ServiceへのIAM認証を利用したアクセスを行うというものでした。

コネクションを設定すればできるとのことだったので、早速接続のために、データソースにOpenSearch Serviceを選択してGlue Connectionsを作成しようとしたところ、**Secret Managerを利用したパスワード認証を強制される**という罠にかかりました。

じゃあ、どうすればいいんだ、、、

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821799/81d2eeff-24de-4342-8ade-0010f2ef2f6d.png)


# 結論

はじめに、結論として必要な手順と内容を簡単に整理します。

1. 全ての自己参照トラフィックを許可するセキュリティグループを作成する
1. データソースに「Network」を選択して Data Connections を作成する
1. VPC内リソースにアクセスしたいGlue Jobの「Job Details」からコネクションを設定する

上記手順により、VPC 内に新しくENI（Elastic Network Interface）が作成されるようになり、プライベートIPアドレスが払い出されます。Glue Job は ENI を介してアクセスを行うため、**あたかもVPC 内で実行されているかのよう**に、VPC 内リソースにアクセスすることができます。

:::note info
ENI は Job の実行時に DPU 数分だけ作成され、Job の終了と同時に削除されます。 [^eni]
:::

## 手順1：全ての自己参照トラフィックを許可するセキュリティグループを作成する

Glue Job をVPC内で動かす場合は、セキュリティグループでTCPの自己参照を許可する必要があります。

### 自己参照とは

自己参照とは、同じセキュリティグループに属しているリソース間でのアクセスを可能にするために、自分からのインバウンドトラフィックを許可するように設定してあげることを言います。

セキュリティグループを作成した後に、インバウンドルールの編集で、
- タイプ：全てのTCP
- ポート：0-65535
- ソース：選択しているセキュリティグループ

### 自己参照が必要な理由

AWS Glue JobをSparkモードで起動している場合は、Driver と Executer という二つのコンポーネントで実現された分散処理アーキテクチャを採用しています。

- Driver：タスクを管理し、各Executerコンポーネントに処理を割り振るコンポーネント
- Executer：タスクの実行コンポーネント

同一のセキュリティグループで実行される、2つのコンポーネント間で連携をとるために、自己参照が必要になるのです。また、連携時に使用されるポートはランダムに選ばれるためすべてのTCPポートを開ける必要があります。 [^self-reference]



## 手順2：Glueの「Data Connections」からネットワークタイプのConnectionsを作成する

マネジメントコンソールからでData Connectionsを作成しようとすると、データソースの選択画面が表示されます。
そのときに、 [Data Connectionsの罠](#data-connectionsの罠) に記載しているように、最初のページに表示されているからと言ってOpenSearch Serviceを選択すると、今回の要件では失敗します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821799/f5dd06bf-3759-4541-9533-14736e44457e.png)

検索バーで、「Network」と検索してようやく正体をを表します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821799/b9460c29-391f-420b-8e3d-6a12b1b4afd8.png)

選択出来たら後は諸々設定をするだけです。


## 手順3：VPC内リソースにアクセスしたいGlue Jobの「Job Details」からコネクションを設定する

最後は、作成したData ConnectionsをJobに設定するだけで完了です。

手順にも記載しているとおり、Job Detailsを開いて下の方に行くとAdvanced 設定としてConnectionsがあるので、選択して保存して、完了です。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821799/e8b07b45-9ec2-49a5-93aa-48e7a6d77ff1.png)

# VPC内で実行されているわけではない

[結論](#結論)で話しているとおり、今回の設定は**あたかもVPC内で実行されているように見える**というのが本質です。

実際は、Glue JobがVPC内で実行されているわけではなく、実行時には、Data Connectionによって作成されるENIを通じてVPC内にアクセスする形でネットワークが構成されます。したがって、指定したサブネットがプライベートだった場合は、ENIが存在するVPC内部のリソースに接続が制限されるというのが実態です。[^blackbelt]
Glue Job自体がVPC内で実行されるわけではないという点に注意しましょう。

そのため、[ゴール](#ゴール) の図は正確でなく、正しいネットワーク構成図は以下のようになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3821799/dd68c656-3758-4b7c-a610-f4f21ccc36d5.png)


# まとめ

Glue JobをVPCに接続し、VPC内のリソースにアクセスする方法を紹介しました。
データコネクションを設定することでENIが作成され、それを経由してVPC内部のリソースにアクセスできるようになるというものです。

改めてですが、
1. すべてのTCPポートを解放した自己参照トラフィックを許可するセキュリティグループを用意する
1. データコネクション作成時のデータソースには「Network」を選択する

が今回のポイントです。

データソースの種類の罠にかかる方が1人でも減るように私は願っています。


[^eni]: https://developer.mamezou-tech.com/in-house-project/sss/glue/
[^self-reference]: https://qiita.com/22x34/items/4920cf4b80c5ba12ba95
[^blackbelt]: https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_AWS-Glue_0331_v1.pdf