本記事は
ネットワークウィーク
14日目の記事です。
💻
13日目
▶▶ 本記事 ▶▶
15日目
🌐

はじめに
こんにちは、ネットワークウィーク14日目担当の寺嶋です。
今回は、AWS GlueをVPC内で安全に実行するための構成と設定手順を紹介します。
Glueジョブの通信経路を適切に設計することで、インターネットを経由せず、AWS内部ネットワーク内で完結するセキュアなデータ基盤を構築できます。
本記事では、GlueジョブをVPCに接続し、S3やRDSなどのサービスと安全に連携するためのポイントを解説していきます。
Glueジョブの通信経路を理解しよう
Glueジョブは実行時に一時的なコンテナが立ち上がり、S3、RDS、Redshift などのデータソースへアクセスします。
このとき、どの経路で通信しているかがセキュリティ上の重要なポイントです。
もしGlueジョブをVPCに接続していない場合、Glueはインターネット経由でAWSサービスへアクセスしてしまう可能性があります。これにより、意図しない経路でデータが流出するリスクが生じます。
そこで、Glueジョブを自分のVPCに配置し、S3などのAWSサービスにはVPCエンドポイント経由で、RDSなどのVPC内リソースへはプライベートIP通信でアクセスするようにします。
こうすることで、すべての通信をAWSネットワーク内で完結でき、外部インターネットを一切経由しない、セキュアなデータ基盤を構築できます。
VPC内でGlueを動かす構成図(イメージ)
以下の構成図のように、GlueジョブをVPC内のプライベートサブネットで実行します。
このように構成することで、GlueジョブがS3やRDSにアクセスする際、
インターネットを一切経由せず、AWS内部ネットワークでのみ通信するセキュアな環境を実現できます。

セキュアな構成を作る手順
Glueジョブがインターネットを経由せず、AWS内部ネットワークだけでデータをやり取りできるようにします。
今回はGlueジョブをスクリプトで作成した場合の作成手順になります。
スクリプトで作成する場合は、Glue Connectionを使用してGlueジョブをVPCに配置します。
事前準備
①VPC作成
Glueジョブを安全に実行するためのネットワーク基盤(VPC)を作成します。
このVPC内でS3やRDSなどと通信を完結させることで、セキュアな構成を実現します。

②Private Subnetを作成
Glueジョブを配置するためのPrivate Subnetを作成します。
外部から直接アクセスされないようにするため、Public SubnetではなくPrivate Subnetを使用します。
2つのアベイラビリティゾーンで1つずつ、合計2つのPrivate Subnetを作成します。

Amazon S3へのアクセス
S3へのアクセスをインターネット経由ではなくAWS内部通信(VPCエンドポイント)経由にするため、S3 Gateway Endpointを作成します。これにより、GlueジョブがS3にアクセスしても外部インターネットへ通信が発生しなくなります。
①VPCエンドポイントを作成
<設定項目>
サービス:S3用のGateway Endpoint
VPC:Glue ジョブが動作する VPC
ルートテーブル:Glue ジョブが動作するサブネットに関連付けられているルートテーブル(わからない場合、以下のようにサブネットから確認できる)


②Glue Connectionを作成
GlueジョブがVPC内で実行できるように、NetworkタイプのConnectionを作成します。
このConnectionは「GlueジョブがどのVPC/Subnet/Security Groupで動作するか」を定義するものです。
<設定項目>
Data sources:Network
VPC:Glueジョブと同じVPC
Subnet:Private Subnet
Security Group:default
(S3 Gateway Endpoint経由の通信ではSecurity Groupは直接関与しませんが、GlueジョブのENI(Elastic Network Interface)が作成される際に紐づくため、必ず指定する必要があります。)


③Glueジョブのjob detailsからConnectionを追加
<設定項目>
Connection:②で作成したConnectionを選択

④GlueジョブにConnectionを指定
以下のように、Connections パラメータで指定することで、VPC接続設定をGlueジョブに適用できます。
import boto3
glue = boto3.client('glue')
glue.create_job(
Name='my-glue-job',
Role='GlueServiceRole',
Command={
'Name': 'glueetl',
'ScriptLocation': 's3://my-bucket/scripts/my_script.py'
},
Connections={'Connections': ['my-s3-vpc-connection']}, # ← このように指定☆
GlueVersion='4.0',
ExecutionProperty={'MaxConcurrentRuns': 1}
)
RDSへのアクセス
RDSをPrivate Subnetに配置することで、データベースがインターネットから直接アクセスされることを防ぎます。 GlueジョブとRDSが同じVPC内にあるため、VPC内通信のみで安全にデータ連携が可能になります。
①DB サブネットグループを作成
<設定項目>
VPC:Glueジョブと同じVPCを選択
アベイラビリティゾーン、サブネット:異なるAZの Private Subnet を少なくとも2つ選択(例:ap-northeast-1a と 1c)

②RDSをPrivate Subnetに配置する
<設定項目>
サブネットグループ:①で作成したDB サブネットグループを選択
パブリックアクセス:なし

③Glue Connectionを作成
GlueジョブがVPC内のリソース(RDSなど)に接続できるようにするため、Glue Connectionを作成します。
Connectionを設定すると、Glueジョブ実行時に自動的に指定したVPC・Subnet・Security Groupが利用されます。
<設定項目>
Data sources:RDSがAuroraであればAurora、MySQLやPostgreSQLであればJDBC
VPC:Glueジョブと同じVPCを選択
Subnet:Private Subnetを選択
Security Group:default

④Glueジョブのjob detailsからConnectionを追加
<設定項目>
Connection:③で作成したConnectionを選択

⑤GlueジョブにConnectionを指定
以下のように、Connections パラメータで指定することで、VPC接続設定をGlueジョブに適用できます。
import boto3
glue = boto3.client('glue')
glue.create_job(
Name='my-glue-job',
Role='GlueServiceRole',
Command={
'Name': 'glueetl',
'ScriptLocation': 's3://my-bucket/scripts/my_script.py'
},
Connections={'Connections': ['my-rds-vpc-connection']}, # ← このように指定☆
GlueVersion='4.0',
ExecutionProperty={'MaxConcurrentRuns': 1}
)
⑥Security Groupの設定
GlueジョブとRDS間の通信を許可するために、RDS側のSecurity Groupにインバウンドルールを設定します。
ここでは、最小限のルールでGlueジョブからの接続のみを許可することで、不要な外部アクセスを防ぎます。
これにより、Glueジョブ → RDS間の通信のみを許可し、他の外部通信を遮断することができます。
<RDS側 インバウンドルール>
タイプ:MySQL/Aurora(または該当するDBプロトコル)
ポート:3306
ソース:Glueジョブ実行時に使用するSecurity Group(③で設定したSecurity Group)
※Glueジョブ側のSecurity Groupは、通常アウトバウンド通信が許可されているため、RDSへの接続に問題はありません。必要に応じてアウトバウンドルールも確認してください。
おわりに
Glue の通信経路を理解しておくと、トラブル時の原因特定やセキュリティ対策にも役立ちます。 「どの経路を通ってデータが流れるか」を意識して設計することが、安全で信頼性の高いデータ基盤づくりの第一歩です。 Glueを使用する際は、ぜひ参考にしてみて下さい!