#AWSlambdaでMysqlを使ってみた
用途としてWebAPIでデータベースの情報を閲覧したい
過去経験したことのメモ
目次
- lambda関数作成
- 環境変数
- モジュール
- コード
- ネットワーク
以上の5つのを説明していきたいと思います。
ちなみにcloud9
で扱っていきます。
lambda関数作成
cloud9を作成して右の縦のタブに入
みたいなマークがあります。
それを、クリックして入+
で nodejs のテンプレートapi-gateway-hello-world
を作成していきます。
環境変数
lambda では環境変数を設定できるらしいんです。
試しに変数を追記します。
追記したら lambda でみてみましょう。
exports.handler = function(event, context, callback) {
console.log(event);
const response = {
statusCode: 200,
headers: {
"x-custom-header": "My Header Value",
},
body: JSON.stringify({message: `Hello ${process.env.name}`}),
};
callback(null, response);
};
実行結果
ローカル
"body": "{\"message\":\"Hello undefined\"}"
リモート
"body": "{\"message\":\"Hello test\"}"
ここでいうローカルとは、cloud9に環境下 のことです。
リモートは、lambdaの環境下 だと思います。
process.env は、OSの環境変数を指しているので動作環境が違えば、変数は、異なってきます。
モジュール
様々な処理を行う時、外部のライブラリーを使用することは、当たり前のように行われます。
Pythonなら pip
node なら npm でインストールします。
今回は、node で進めていきます。
npm init
npm i mysql
上記のコマンドを実行すれば任意にディレクトリにnode-moduleをインストールできます。
ここでインストールしたものは、デプロイ時にlambdaの環境下にいきます。
コード
ここでは、lambdaのコードを作ります。
※データベースは、あらかじめ作成していてください
let mysql = require('mysql');
exports.handler = async(event, context, callback) => {
let connection;
connection = mysql.createConnection({
host: process.env.databaseEndpoint,
user: process.env.user,
password: process.env.password,
database: process.env.database
});
try {
const data = await new Promise((resolve, reject) => {
connection.connect((err) => {
if (err) {
console.log('error connecting: ' + err.stack);
return;
}
console.log('success');
});
connection.query('select * from sample', function(err, rows) {
if (err) { throw err; }
resolve(rows);
});
});
const response = {
statusCode: 200,
headers: {
"x-custom-header": "My Header Value",
},
body: JSON.stringify(data),
};
connection.end();
callback(null, response)
}
catch (err) {
callback(null, {
statusCode: 400,
body: err.message
})
}
};
上記のコードをデプロイするとWEBAPIとしてデータベースを見ることができます。
ネットワーク
はい、嘘つきました。
実は、説明した通りだとラムダにネットワークの設定がされていないはずなので、データベースに接続できないです。
以下の手順を踏んでください
- 関数にVPC(データベースと同一)を設定する
- ラムダ関数に付与されているロールに
AWSLambdaVPCAccessExecutionRole
を付与 - ラムダにセキュリティグループの設定を行なってください
- mysqlとのインバウンドルールを追加します(かってに追加される気がする)
あとがき
自分の経験を元に書いているので、もしかしたら何か抜けている可能性があります。
nodejsには、サーバレスのフレームワークがあったのでlambdaを作成するのであれば、それを利用する方が、簡単かもしれないです。