AWS LambdaでMySQL(RDS)に接続する

AWS LambdaでMySQL(RDS)に接続できるか試してみた。

テストスクリプト

※あいかわらずlambchop使ってます。超便利!

test.js

#!/usr/bin/env lambchop
/*
function_name: test
role: arn:aws:iam::123456789012:role/lambda_exec_role
handler: test.handler
*/
var mysql = require("mysql");

exports.handler = function(event, context) {
  var conn = mysql.createConnection({
    host: "xxx.xxx.ap-northeast-1.rds.amazonaws.com",
    user: "root",
    password: "..."
  });

  conn.query(
    "SHOW DATABASES",
    function (err, rows, fields) {
      if (err) throw err;
      console.log(rows);
    }
  );

  conn.end(function() {
    context.done();
  });
};

ファイル構成

.
├── node_modules/
│   ├── mysql/
│   └── node-mysql/
└── test.js

実行結果

おもむろにtest.jsを実行。

$ ./test.js
Function was uploaded:
{
  "function_name": "test",
  "function_arn": "arn:aws:lambda:us-east-1:123456789012:function:test",
  "configuration_id": "89f31ed1-2a88-4c5d-93db-5757f26d8ed6",
  "runtime": "nodejs",
  "role": "arn:aws:iam::123456789012:role/lambda_exec_role",
  "handler": "test.handler",
  "mode": "event",
  "code_size": 234754,
  "description": "",
  "timeout": 3,
  "memory_size": 128,
  "last_modified": "2014-11-24 13:34:24 +0900"
}
Node modules:
[
  "mysql",
  "node-mysql"
]
...

別のターミナルからイベントを送る。

$ echo '{}' | lambchop-cat test

正常にMySQLに接続できていることを確認。

...
START RequestId: 6dea0f18-7393-11e4-8193-1b72ed395815
2014-11-24T04:36:13.884Z  6dea0f18-7393-11e4-8193-1b72ed395815  [ { Database: 'information_schema' },
  { Database: 'innodb' },
  { Database: 'mysql' },
  { Database: 'performance_schema' } ]
END RequestId: 6dea0f18-7393-11e4-8193-1b72ed395815
REPORT RequestId: 6dea0f18-7393-11e4-8193-1b72ed395815    Duration: 1178.26 ms    Billed Duration: 1200 ms   Memory Size: 128 MB    Max Memory Used: 13 MB

IAMでうまくセキュリティを制御できれば、応用範囲が広がりそう。