AWSメモ > AWS LambdaからRDSに接続する
パフォーマンスが要求されるようなケースや大量のアクセスを捌く必要があるケースでは Lambda&RDSはアンチパターン である事を認識しておく。
※インスタンスが持続して残る訳ではないので、コネクションプールがあまり意味を持たない為、結局はDBへの接続コストがかかる。
(大量のアクセスを捌く場合は最大接続数も問題になる)
※コールドスタート時、VPC内に配置したLambda起動時にはENIアタッチが発生する為、Lambdaの起動に時間がかかる。
以下、ローカルでの作業
mkdir rds-access1 cd rds-access1 npm install mysql
index.js
var AWS = require('aws-sdk'); //var dynamo = new AWS.DynamoDB.DocumentClient(); var mysql = require('mysql'); const createResponse = (callback, statusCode, body) => { var res = { "statusCode": statusCode, "headers": { "Test-Headr": "1234" }, "body": JSON.stringify(body) } callback(null, res); } exports.handler = function(event,context,callback){ var connection = mysql.createConnection({ host : 'testdbinstance-cluster-1.cluster-cef24caqtt2c.ap-northeast-1.rds.amazonaws.com', user : 'example_user', password : 'example_pass', database : 'example_db' }); connection.connect(); connection.query('select * from books', function(err, rows, fields) { if (err) throw err; console.log(rows); console.log(fields); var list = JSON.stringify(rows); createResponse(callback, 200, { "list": list }); }); connection.end(function(err) { context.done(); }); }
マネージメントコンソールのIAM - ロール から以下のポリシーを持つロールを作成する。
・AmazonRDSFullAccess
・AWSLambdaFullAccess
・AmazonVPCFullAccess
作成したロールの「ロールARN」を確認しておく。
cd rds-access1 rm -rf rds-access1.zip zip -r rds-access1.zip .
aws lambda create-function \ --function-name rds-access1 \ --runtime nodejs6.10 \ --role 上記で確認したロールARN \ --handler index.handler \ --zip-file fileb://rds-access1.zip
マネージメントコンソール - API Gatewayにアクセスし、以下の通り作成する。
API 名 | rds_access |
リソース名 | rds-access |
リソースパス | /rds-access |
メソッド | GET |
統合タイプ | Lambda関数 |
Lambdaプロキシ統合の使用 | on |
Lambda リージョン | Lambda関数を作成したリージョン |
Lambda 関数 | 作成したLambda関数名 |
◆注意
Lambdaプロキシ統合の使用を on にした場合、event から 様々な httpリクストの情報が得られるが、
レスポンスデータの形式もルールに従う必要がある。
参照 : http://docs.aws.amazon.com/ja_jp/apigateway/latest/developerguide/api-gateway-set-up-simple-proxy.html#api-gateway-simple-proxy-for-lambda-output-format
作成したら、アクションの「API のデプロイ」からデプロイする。
※ステージ名は、ここではとりあえず dev とかにしておく。(このへんは運用次第)
デプロイしたら「ステージ」から対象の API を選択すると「URL の呼び出し」という箇所で APIのURLが確認できる。