🌐

AWS Glue からの通信を固定IPアドレスで行う方法

2022/10/13に公開

最終更新: 2022/10/13

背景

AWS Glueを使ってS3のファイルを取りにいく際、接続先のセキュリティー要件で、IPアドレス制限の制約をクリアする必要がありました。今回はGlue Connectorsを使って、from Glueの通信をEIP(静的IP)から行う方法を記載したいと思います。

概要

ゴールは以下のようなアーキテクチャになります。

実装の流れ

  1. VPCの用意
  2. Glueの用意
  3. 接続検証

いざ、実装!

1. VPCの用意

「VPCを作成」を押下

下の画像のように、作成するリソースを「VPCなど」に設定すると、自動的にSubnetやNAT、ルートテーブル、ENIなどを作成してくれるので便利です!今回は1AZ構成で作成します。

NATゲートウェイに紐づいているEIPが今回利用する静的IPアドレスになります。

もちろん手動で上記構成を作るでも問題ありません。その場合、Public/Privateサブネットに紐づいているルートテーブルに以下の設定があるか確認してください。(自動で作った際には作成されているはずです。なければ同様に追加してください)

Privateサブネットのルートテーブル

送信先 ターゲット
0.0.0.0/0 NATゲートウェイ

Publicサブネットのルートテーブル

送信先 ターゲット
0.0.0.0/0 インターネットゲートウェイ

上記を設定することで、Privateサブネットからの通信がPublicサブネット上にあるNATゲートウェイ向けにルーティングされ、IPアドレスがEIPに変換、その後Publicサブネットからの通信がインターネットゲートウェイを通してインターネット上へと出ていく流れになります。Privateサブネットに紐づけるGlueの通信も、上記のルーティングに従ってインターネットへ出ていくのでEIPを用いた静的IPでの通信となるのです。

2. Glueの用意

次はGlueの用意をしていきます。
まずGlue用のセキュリティーグループを作成します。

インバウンドルール

タイプ プロトコル ポート範囲 ソース
すべてのTCP TCP すべて 自身のセキュリティーグループを設定

アウトバウンドルール

タイプ プロトコル ポート範囲 送信先
すべてのトラフィック すべて すべて 0.0.0.0/0

ポイントはこのセキュリティーグループのインバウンドルールで、自分自身のセキュリティーグループをソースに設定することです。以下のリンクが参考になります。
https://docs.aws.amazon.com/ja_jp/glue/latest/dg/setup-vpc-for-glue-access.html

続いて、Connectors(接続)を作成していきます。Connectorsは、特定のデータストア(S3やデータベースなど)に接続するための接続用パラメータをあらかじめ登録しておくものです。以下のリンクが参考になります。
https://docs.aws.amazon.com/ja_jp/glue/latest/ug/connectors-chapter.html

Glue Studioから、Connectors > Create Connectionを選びます。Connection Typeには「Net Work」を選んでください。

さらに、これまでに作成したVPC、Privateサブネット、セキュリティーグループを選択します。

続いて、このConnectorsを使って処理を行うJobを作成していきます。
Glue Studioの、Jobs > Create Job (Python Shell Scrypt Editor)を開き、オプションでは「Create a new script with boilerplate code」を選択し Create を押下します。

すると以下のようなエディタが表示されますので、そのにPython Shellのコードを書いていきます。

ここで重要なのが、Job Details内にあるConnectionsの設定です。ここでは、先ほど作成したConnectorsを設定しましょう。

また、今回静的IPでインターネット上に通信しに行っているかを確認するため以下のコードをJobに登録します。

hogehoge.py
import urllib.request

url = 'https://inet-ip.info/json'
req = urllib.request.Request(url)

with urllib.request.urlopen(req) as res:
    body = res.read()
    print(body)

変数urlに代入しているURLを実際にブラウザで叩いてみると分かりますが、通信元の情報をJSON形式で返してくれます。

3. 接続検証

作成したJobをSaveして Runs からJobを実行するRUNを押下してみましょう。Jobの実行結果は「Recent job runs」に表示される「Run status」から確認することができます。「Succeeded」になるまで数分かかる場合があります。

「Succeeded」を確認したら「Recent job runs」に表示される「Cloudwatch logs」の「Output logs」のリンクからログを確認しましょう。以下のようなJson形式のログが出力されているはずです。

{
 "ipAddress": "xxx.xxx.xxx.xxx",
 "asn": {
  "AutonomousSystemNumber": xxxx,
  "AutonomousSystemOrganization": "hogehoge"
 },
 ...(以下省略)...

そのログの先頭にある"ipAddress"が今回指定したEIP(静的IP)であれば今回の検証は成功です。

おわりに

例えば接続先がS3で、ファイルを取得してくるJobを起動するのであれば、GlueのJob Details内でs3:getObjectを許可するポリシーを持ったロールを設定するなど、必要なロールをGlueに紐づける作業も忘れないようにしてくさい。

以上です。

Discussion