こんにちは、クラウドソリューション事業部の本田です。もうすぐGWですね。今年は人によっては10連休と長い休みだそうですね。私はこの会社に入って初めてのGWなのでどうやって過ごそうかなと考えております。前置きが長くなりましたが、今日はAWS Lambdaの話をします。
AWS Lambdaを使ってRDSに対してバッチ処理を行う、など利用シーンは色々あると思います。サーバレスで実行できるのでサーバの保守など発生しないのと、実行した分だけの請求なのでコスト的にも安くなりますよね。RDSであったり、VPC内にリソースにアクセスする際はVPC内にLambdaを配置することになるかと思います。その際に何点か注意する必要があるので、まとめておきたいと思います。
Lambda単体ではインターネットアクセスができない
LambdaにはEIPが割り当てられないので、例えばIGWを設定したパブリックサブネットに配置したとしてもインターネットアクセスをすることができません。環境変数にRDSの接続情報を書いてしまうというてもありますが、流石にセキュアな情報なのでそれは避けたいところです。となると、AWS Systems Manager Parameter Store(以後Parameter Store)やAWS Secrets Managerが候補になるかと思います。パスワードをローテーションするなどの要件がなければ、Parameter Storeで暗号化する形で問題ないかと思います。なのでこれらのサービスを利用すれば良いのですが、これらのサービスがVPC外のサービスとなるためアクセスするには、1.インターネットアクセスができるようにする、または2.VPCエンドポイントを作成し通信を許可する、の2つの方法があります。
1.インターネットアクセスができるようにする
Lambdaをプライベートサブネットに配置し、インターネットのルーティング先にパブリックサブネットに作成したNAT Gateway(NATインスタンス)を指定することで、インターネットアクセスを可能にします。この場合ですと、当然NAT Gateway(NATインスタンス)の利用コストが発生します。
2.VPCエンドポイントを作成し通信を許可する
VPCエンドポイント(AWS PrivateLink)は、VPCと他のVPC外のサービス間の通信を可能にするサービスで、例えばLambdaとParameter Store間にVPCエンドポイントを作成することで、LambdaからParameter Storeにアクセスが可能になります。インターフェイスエンドポイントとゲートウェイエンドポイントの2種類があり、前者は有料ですが後者は無料です。S3とDynamo DBではゲートウェイエンドポイントが利用できます。
例を通して考えてみる
試しに以下のような要件で、どういった構成が良いか考えてみたいと思います。
[要件]
1.LambdaからRDSへアクセスしデータを取得する
2.接続情報はparamerter storeで保存する
3.取得したデータはGCPのGCSへ送信する
1.の要件を見るとプライベートサブネットにLambdaを配置し、セキュリティグループで Lambdaから通信を許可するにするだけで良さそうです。特にその他に必要なものはなさそうです。
次に2.の要件を見ると、Parameter Storeに接続情報を保存する必要がありそちらを取得できる必要があるので、インターネットアクセスを可能にするか、VPCエンドポイントを用意すれば良さそうです。コストの面で比較すると、NAT Gatewayを利用してインターネットアクセスを可能にすると0.062USD/時かかり、VPCエンドポイントであれば0.014USD/時(片側AZの利用の場合)とVPCエンドポイントの方が優位かと思いますのVPCエンドポイントの作成で良いかと思います。(データの転送料もかかりますが割愛しています)
では最後に3の要件を見てみましょう。取得したデータをGCPのストレージサービスであるGCSへ送ります。 データ解析ではGCPのサービスを使うというケースはよくあるので、そのような用途だと思ってください。他のパブリッククラウドに送るとなるとインターネットアクセスが必要になります。この要件を満たすには、Lambdaをインターネットアクセスが可能なように、NAT Gatewayを用意する必要があります。
最終的に構成図にすると以下のような感じなるかと思います。
最後に
AWSを使っているので、Lambdaを使ってサーバレスでEC2などサーバの管理を極力減らしていきたいところです。通信の仕様などを抑えて、Lambdaをより使っていきたいところです。それでは良い連休をお過ごしください。