はじめに
スタートアップ系企業に転職し、言語もPHPからPythonに変わった。
基本的にサーバレスアーキテクチャですべて構築していくスタンスなため、イチから勉強中。
Lambdaでは基本的にRDSを使っちゃいけないっていうのが、暗黙の了解っぽいんだけど、言われている通り様々な問題にぶつかっている。
今回Lambda(Python)でS3とRDSを同時に使おうとしたときにハマったのでそのメモ。
やろうとしたこと
LambdaがS3にあるファイルを取得し、その内容をRDSに保存していくといういたってシンプルなもの。
構成
-
Lambda(Python3.6)
- psycopg2
- boto3
-
RDS (public access許可、IP制限)
-
S3
構成の都合上RDSをpublicにしたかったので、IP制限(アクセス制限)で限定的に公開する形をとった。
LambdaはIPをもっていないのでVPC配下に置くことでセキュリティーグループに属することができる。
セキュリティーグループに属せれば、そのグループをRDS側で許可するという算段。
LambdaがS3にアクセスしたあと、RDSにアクセスしようとするとつながらない問題
Lambda <-> S3
Lambda <-> RDS
という単体の動作はチェック済みであり、あとはその処理を一つにまとめるだけだった。
しかし、処理を一つにするとS3から資源を取得したあと、RDSにつながらなくなる。
RDSのinboundに0.0.0.0を追加してもだめ。
すんごくハマって困った。
解決方法
もしかしたらAWSを理解している人には当たり前の話なのかもしれないが、
VPCの設定でS3にエンドポイントを設定することですんなりアクセスできるようになる。
ネットワーク関係に疎いのでこういう部分が全然わかっていない。。。
個人的見解
自分としての見解はいろいろ間違っているかもしれないが恐れずに言うと、
LambdaがS3を見に行ったタイミングで外部参照になるらしく、その後のVPC部分で問題が起きる。
S3に対してVPCのエンドポイント設定すると、Lambdaが内部参照のままになり、その後VPCも問題なく動いてRDS参照できるようになる。
という感じかなー?と今のところ勝手に理解してます。