AWS lambdaからDBアクセスも外部アクセスもできるようにする。


AWS lambdaからAWS RDSへアクセスさせるためにはRDSへアクセスできるVPCのサブネットにlambdaを追加します。
しかし、VPC内のlambdaは何もしないと外部アクセスができなくなります。

lambdaがRDSと同時に外部システムのAPIなどを利用する際に困りますので、
VPC内のlambdaから外部アクセスができるように設定します。

VPC設定

VPC内のlambdaから外部アクセスをさせる設定方法は、実はAWS公式で説明されています。
基本的にはこの手順を実行すれば良いだけです。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/internet-access-lambda-function/

手順詳細は公式ページを見ればよいので、ここではざっくりと流れを書いておきます。
①〜②はすでにあれば既存の使い回しでも良いです。

①(なければ)RDSにアクセスできるVPCを作る。
②(なければ)インターネットゲートウェイを作成して①のVPCにアタッチする。
③RDSにアクセスできるVPCにサブネットを2つ作る。(public用とprivate用)
④NATゲートウェイを新規作成し、②で作成したpublic用サブネットを紐づける。
⑤ルートテーブルを新規作成し、public用サブネットを紐付ける。
 作成したら以下のルートを追加する。

項目 設定値
宛先 0.0.0.0/0
ターゲット ③のインターネットゲートウェイ
⑥ルートテーブルをもう1つ新規作成し、private用サブネットを紐付ける。
 作成したら以下のルートを追加する。
項目 設定値
宛先 0.0.0.0/0
ターゲット ④のNATゲートウェイ

VPC設定はここまでです。
ここで作成したprivate用サブネットの方にlambdaを追加すればRDSと外部の両方にアクセスできるようになります。

lambda設定(Serverless Framework)

今回はServerless Frameworkを使ってlambdaを構築します。
Serverless Frameworkの基本的な構築については前回の記事を参照してください。

前回の記事で作成したserverless.ymlのproviderにvpc設定を追加します。

provider:
  〜省略〜
  vpc: 
    subnetIds:
      - 今回作成したprivateサブネットのID(subnet-0123456abcde)

【おまけ】
上記VPC設定では触れていませんが、もしlambdaにセキュリティグループを設定させるなら以下のようにします。

provider:
  〜省略〜
  vpc: 
    subnetIds:
      - 今回作成したprivateサブネットのID(subnet-0123456abcde)
    securityGroupIds:
      - 設定するセキュリティグループID(sg-012345abcde)