MySQL
AWS
RDS
lambda

AWS LambdaでRDS(MySQL)に接続してみた

More than 3 years have passed since last update.

はじめに

AWS Lambdaに登録したfunction内からRDSのMySQLに接続できるか試してみる。

Lambdaでは各種ライブラリも含めてZipファイルとしてまとめてアップロードすることでこれらを利用することができます。
※ただし、pure javascriptでないと実行環境の違いで失敗するかも知れません(未検証)

というわけで今回はpure JavaScriptで書かれたMySQL接続用ライブラリのnode-mysqlを使ってRDSに接続してみます。

事前準備

まずは接続先となるRDSインスタンスを用意しておくがこちらの手順は割愛。
ポイントとしてはセキュリティグループで接続元を0.0.0.0/0からのアクセスを許可しておくこと。

RDSインスタンスが作成できたらあらかじめテーブルとかを用意しておく。今回はlambdaというDBを用意してsampleというテーブルを作成した。
作成したRDSインスタンスに手元の開発環境から接続する。

$ mysql -u lambda -h lambda.xxxxxxxxxxxx.us-east-1.rds.amazonaws.com -p

接続したら作成済のlambdaというDBにスイッチした後、テーブルを作成し1件だけデータを入れておく。

mysql> use lambda;
Database changed
mysql> show tables;
Empty set (0.17 sec)
mysql> create table lambda.sample (id int, value varchar(10));
Query OK, 0 rows affected (0.22 sec)
mysql> show tables;
+------------------+
| Tables_in_lambda |
+------------------+
| sample           |
+------------------+
1 row in set (0.18 sec)
mysql> insert into sample values(1,"test");
Query OK, 1 row affected (0.30 sec)
mysql> select * from sample;
+------+-------+
| id   | value |
+------+-------+
|    1 | test  |
+------+-------+
1 row in set (0.28 sec)

Lambda functionの実装

続いてLambda functionのコード部分を実装する。
その前に適当なディレクトリを作成して、移動した後node-mysqlをインストールしておく。

$ mkdir lambda-mysql-sample
$ cd lambda-mysql-sample/
$ npm install mysql
mysql@2.5.3 node_modules/mysql
├── require-all@0.0.8
├── bignumber.js@1.4.1
└── readable-stream@1.1.13 (isarray@0.0.1, inherits@2.0.1, string_decoder@0.10.31, core-util-is@1.0.1)

実際のソースは以下のような感じで用意する。

sample.js
var mysql = require('mysql');


exports.handler = function(event,context){

    var connection = mysql.createConnection({
      host     : 'lambda.xxxxxxxxxxxx.us-east-1.rds.amazonaws.com', //RDSのエンドポイント
      user     : 'user', //MySQLのユーザ名
      password : 'password', //MySQLのパスワード
      database : 'lambda'
    });

    connection.connect();

    connection.query('select * from sample', function(err, rows, fields) {
      if (err) throw err;

      console.log(rows);
      console.log(fields);
    });

    connection.end(function(err) {
        context.done();
    });

}

次にこのコードに加えてnode-mysqlそのものを含めてzipファイル形式にまとめます。
コツとしてディレクトリが含まれないフラットな形でZipファイルにまとめる必要があります
今回はディレクトリに移動した状態で以下のコマンドを実行しています。

zip -r lambda-mysql-sample.zip .

あとは普通にLambda functionを新規で作成し、コードをインラインエディタで記述するのではなく作成したZipファイルをアップロードします。
ファイル名は今回の場合だとsample.jsとし、handler名はhandlerになります。
作成が完了したら早速実行してみてください。

結果確認

今回はマネージメントコンソール上で作成したLambda functionのEdit/Test画面でInvokeして試します。

Screen Shot 2014-11-25 at 7.25.07 PM.png

ここで実行した結果は画面下部で確認できます。というわけで無事に接続できてselect文の実行もできています。

Screen Shot 2014-11-25 at 7.28.39 PM.png

最後に

こんな感じでできるにはできるけれども現状ではRDS側のセキュリティグループでソースをanyで接続を許可しなくてはならないので実際のところ利用する機会はないかと思われます。。。

免責
こちらは個人の意見で、所属する企業や団体は関係ありません。