Node.jsでLambdaからAuroraに接続する


はじめに

AWS独自のSQL互換データベースのAuroraですが、
Asia Pacific 1 (Tokyo)への展開は昨年10月ということもあり、
まだまだNode.jsからRDS Auroraに接続する情報について、
日本語情報があまり見つからない状況ですので、
現時点での手順を整理しておこうと思います。

VPCのセキュリティグループの設定

まず、大事な点はRDSは必ずVPCの中にあるということ(2016年2月時点)。
古い情報などでは、RDSをVPCの外側に置けていたようですが、
現時点ではRDSを起動する際にVPCの指定は必須となります。

以下、VPCの作業を備忘録として記録しておきますが、
あれこれ試行錯誤しながらやっていたので、手順として適切かは自身がありません。

まず、事前にVPCを作成しておく必要があります。

次にルートテーブルを作ります。
送信先「0.0.0.0/0」というセキュリティ的にアウトの設定を追加します。
ターゲットは今回対象となるVPCですね。
ここはきちんと制約かけないといけないと思いますが、
LambdaのグローバルIPが固定でないので、範囲をきちんと絞る必要がありそうです。

さらにサブネットを作成して、ルートテーブルと関連付けます。
そして、そのVPCをインターネットから接続できるように
インターネットゲートウェイも作成します。

最後にセキュリティグループにインバンドとして「MySQL/Aurora」を
全てのアクセス元からアクセス可能なように設定します。

これで、VPCの設定は完了です。

RDSのセットアップ

続いてはRDS側のセットアップです。
こちらで注意するのは1点だけ、「パブリックアクセス可能」に「はい」を選択するだけ。

そしたら、ローカルからSQL Clientでアクセスして、
適当なテーブルとデータを作っておきましょう。
ここらへんは特にクセはありませんでした。

Lambda関数の実行

これでっと、Lambdaの出番です。
AuroraはSQL互換なので、mysqlモジュールを同梱してあげればアクセス可能になります。
npmでmysqlモジュールを取得して、index.jsと同じフォルダに格納して
一緒にZIP化してアップロードすればOKです。

npm install mysql

コード自体もMySQLに接続するのと何ら変わりありません。
もちろん細かなチューニング等に違いはあると思いますが、
アプリケーションの視点から見ると、さほど差異は意識しないですみそうです。
以下のサンプルではitemテーブルから全件取得しています。

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

var conn = mysql.createConnection({
    host     : 'xxx.xxx.ap-northeast-1.rds.amazonaws.com',
    user     : 'your username',
    password : 'your password',
    port     : '3306',
    database : 'your database'
});

exports.handler = function(event, context){
    console.log('Begin Process');
    conn.connect();
    console.log('Connected');
    conn.query('select * from item;', function(err, rows, fields) {
        conn.destroy();
        context.done(null, rows);
    });
};

結果はごらんの通り。

[
  {
    "sku": "1234567890123",
    "store": "us",
    "lang": "en",
    "name": "T-Shirt",
    "price": 10
  }
]

RDSをVPCの外側から見れるようにするための手間が95%くらいを占めていました。
ローカルのSQLクライアントからRDSに接続できるようになってから
上記のコードを実行してみるまでの所要時間は10分もかかりませんでした。
思った以上にスムーズに導入できそうな感じです。