LambdaからセキュアにRDSに接続する


こんにちは、中の人です。

今回は、AWS Lambda Advent Calendar 2014に投稿した内容を紹介します。

昨日のAWS Lambda Advent Calendar 2014は玉川さんの非常に心温まる「ばあちゃんにひ孫の写真をAPIで印刷&郵送する」という記事でした。

今日は11日目としてLambdaからセキュアにRDSに接続してみたいと思います。

○Lambda⇒RDSへ接続するときの課題点

・node.jsにMySQLパッケージを追加が必要
・LambdaがIPアドレス固定でないので、RDSのセキュリティグループをフル開放する必要がある
といった点がポイントとなります。

前者は「AWS LambdaでRDS(MySQL)に接続してみた」で詳しく解説されておりますので、後者に対する対策を考えてみました。

cap00

○LambdaのIPアドレス用プログラムの設置

Webサーバに以下のPHPを設置します。
Lambdaから以下のプログラムにアクセスすることでLambdaのグローバルIPを取得します。

設置が難しい場合はIPアドレスを取得できるようなサービスにアクセスして取得しましょう。

○Lambdaのプログラム

Lambdaでは
1. 先ほどのプログラムからLambdaのIPアドレスを取得
2. RDSにLambdaのIPアドレスを追加
3. Lambdaから安全にアクセス
という流れになります。

まず、「AWS LambdaでRDS(MySQL)に接続してみた」を参考にMySQLのパッケージを追加します。

サーバ上で以下を実施します。

以下のプログラムをindex.jsとして保存します。

続いてindex.jsと先ほどインストールしたMySQLのパッケージのあるnode_modulesをまとめてzip化します。
圧縮ファイルの中身が

の様になっていればOKです。

lambda上にzip形式でアップして実行してみましょう。

上記のように接続でき、SecurityGroupを確認するとLambdaのIPアドレスが追加されていればOKです。
ちょっと強引な方法ですが、工夫することでLambdaからRDSにもセキュアにアクセスすることが出来ます。

※プログラム内でsleepをかけてからMySQL接続したかった(これが出来ないので若干動作が不安定です…)のとSQL実行後にSecurityGroupを削除を実装したかったのですが、setTimeoutでうまく制御出来なかったので後日挑戦したいと思います。
もし、良い方法を御存知でしたらアドバイスください!

明日は@shot6さんの「Lambdaで地味な何かつくってみますー」です。
お楽しみに!