こんにちは。ユニファでデータエンジニアとして修行中の浅野です。データ分析基盤の開発において、AWS Glueから異なるアカウントにあるRDS(マネージドリレーショナルデータベース)に接続したいことがあります。このようにVPCをまたいで接続する場合はVPCピアリングを利用することが一般的ではないかと思います。VPCピアリングを使ってGlueからRDSに接続するための方法はこちらに詳しく書いてあります。RDSのセキュリティグループ設定で、「Glueの(自己参照インバウンドルールを持つ)セキュリティグループからのインバウンド」を許可するところがポイントです。
ピアリングを行うVPCの数が少ないうちは上記の方法でよいのですが、ネットワークの規模が大きくなると相互接続数が多く複雑になってしまうため、代わりにTransit Gatewayを用いることが(Glueを使うかどうかに関わらず)合理的になってきます。 GlueからTransit Gatewayを経由して異なるアカウントやVPCのRDSに接続する方法については参考となりそうな情報が見当たらず、手探りで実現していくにあたって少しだけハマったので、改めて記事に残しておきたいと思います。
伝えたいこと
Transit Gatewayを使う場合、RDSのセキュリティグループで許可するのはGlueのセキュリティグループではなくGlueが属するサブネットのCIDRブロックからのインバウンドである。
以上です。分かってしまえば何てことはないのですが、VPCピアリングと同様にセキュリティグループを設定してもうまくいかないので気をつけてください。
ハマった経緯
一番伝えたいことはもう書いてしまったので、後は気楽にいきましょう。Transit Gateway経由でアカウントをまたいでVPC間通信を行うやり方はこちらに非常にわかりやすく書かれています。アタッチメント、アソシエーション、プロパゲーションといったワードが出てきますが、そのあたりの概念もこの解説記事を読むと理解できます。
これらの記事に沿って設定をすすめていけばVPC間をつなぐ道自体を開通させることは難なくできると思います。あとは関所(セキュリティグループ)の部分の設定だけですが、私は以前VPCピアリング経由でGlue接続を行った経験から、RDS側のセキュリティグループのインバウンド許可設定のところに、Glueが属するセキュリティグループを記載しました。その状態でGlue接続のテストを行うと、Check that your connection definition references your JDBC database with correct URL syntax, username, and password. Connection attempt timed out.
というエラーメッセージがでてFailしてしまいました。
何度確認しても設定に問題がないように思えたのですが、クラスメソッドのサポートの方にご協力を頂きながら、VNCフローログを利用してトラフィックを詳しく解析していった結果、GlueからのリクエストはRDSに届いてはいるもののRejectされていることが分かりました。そこからセキュリティグループの設定に問題がありそうだと当たりをつけ、Glueのセキュリティグループを記載する方法はVPCピアリングのときにのみ有効であることを知り、代わりにGlueが属するサブネットのCIDRを設定することで無事に接続が成功するようになりました。
Terraformで書きたいよね
VPCピアリングもTransit Gatewayも接続先でリクエストを自動承認できる場合は1度のterraform applyで接続を完成させることができますが、セキュリティ面を考えて自動承認を許可していないケースも多いと思います。その場合は接続リクエストを投げた後に承認を待ち、承認されたら残りの設定をするといった2段階のプロビジョニングが必要になります。このあたりもどうしたら効率的に実現できるか試行錯誤しましたが、長くなってきたのでそれについてはまた別の機会に書きたいと思います。
以上です。この記事が誰かのお役に立てば幸いです。