初めまして!CREとしてエンジニアをやってますkazuです🦌
業務では、社内システム自動化プロジェクトに携わってましてその中でLambdaから RDSへのアクセスがなぜできないのかという疑問が湧いてきたので、それぞれの役割と関係性について調べました。
そもそも、LambdaからRDSに接続することになったワケ
本プロジェクトは、要件定義から開発まで一貫して担当しているプロジェクトであり、これまで社内において手動でやっていたのものを自動化する事が目的です。最終的にはLambdaからRDSにアクセスをし、本番DBの値を更新する事でその結果をSlackに通知する事を目指しています。
正直なところAWSに関する知識は乏しく、「Lambdaを呼び出して実行すれば、本番DBを更新できるだろう」と考えていました。
しかし、インフラ構成図をもとにフィードバックを受ける中で、LambdaからRDSへのアクセスが簡単ではないことを知り、その理由について疑問が湧いてきたので調べることにしました。
なぜ、LambdaからRDSへ接続ができないのか
RDSの作成場所がVPC内であること
VPCに接続するには、同じVPCのプライベートサブネット空間にLambdaを配置する必要がある
RDSの作成場所がVPC内であること
Auroraなどの RDSは、基本的にVPC内のプライベートサブネットに配置されます。これは、セキュリティ面を考慮して、外部から直接アクセスできないようにするためです。パブリックネットワークに露出させないことで、外部からの不正アクセスリスクを低減し、安全性を確保しています。これにより、データベースを社内や関連システムからのみアクセス可能な状態に保つ事ができます。
VPCに接続するには、同じVPCのプライベートサブネット空間にLambdaを配置する必要がある
VPC内のプライベートサブネットにある RDSに接続するためには、Lambdaも同じVPCのプライベートサブネット内に配置する必要があります。Lambdaの配置場所は、パブリックサブネットとプライベートサブネットのどちらかを選択する事が可能ですが、RDSとの接続を前提とする場合は、プライベートサブネット内にLambdaを置きます。
Lambdaがインターネットと接続できない
ここで、一つ問題があります。Lambdaをプライベートサブネット内に配置することで、RDSへのアクセスは可能になりましたが、インターネットとの接続ができません。
プライベートサブネット内にあるLambdaが外部のAPIやインターネットリソースにアクセスする必要がある場合、以下のような方法を使ってインターネット接続を実現する事ができます。
NATゲートウェイを使う
NAT(Network Address Translation)ゲートウェイは、プライベートサブネット内のリソースがインターネットに接続できるようにするAWSのサービスです。 NATゲートウェイをパブリックサブネットに配置し、プライベートサブネット内のLambdaからインターネットにリクエストを送ると、そのリクエストはNATゲートウェイを通じてインターネットに出ていきます。これにより、プライベートサブネット内にあるLambdaが安全に外部通信を行えるようになります。
NATゲートウェイは一方向の通信を許可する仕組みであり、インターネットからの直接アクセスはできないため、セキュリティを保ちつつインターネット接続する事が可能になりました。