AWS Glue からの通信を固定IPアドレスで行う方法
最終更新: 2022/10/13
背景
AWS Glueを使ってS3のファイルを取りにいく際、接続先のセキュリティー要件で、IPアドレス制限の制約をクリアする必要がありました。今回はGlue Connectorsを使って、from Glueの通信をEIP(静的IP)から行う方法を記載したいと思います。
概要
ゴールは以下のようなアーキテクチャになります。
実装の流れ
- VPCの用意
- Glueの用意
- 接続検証
いざ、実装!
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 |
ポイントはこのセキュリティーグループのインバウンドルールで、自分自身のセキュリティーグループをソースに設定することです。以下のリンクが参考になります。
続いて、Connectors(接続)を作成していきます。Connectorsは、特定のデータストア(S3やデータベースなど)に接続するための接続用パラメータをあらかじめ登録しておくものです。以下のリンクが参考になります。
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に登録します。
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