LoginSignup
0
2

More than 3 years have passed since last update.

AWS lambdaでMysqlを使ってみた

Posted at

AWSlambdaでMysqlを使ってみた

用途としてWebAPIでデータベースの情報を閲覧したい
過去経験したことのメモ

目次

  • lambda関数作成
  • 環境変数
  • モジュール
  • コード
  • ネットワーク

以上の5つのを説明していきたいと思います。
ちなみにcloud9で扱っていきます。

lambda関数作成

cloud9を作成して右の縦のタブにみたいなマークがあります。
それを、クリックして入+ で nodejs のテンプレートapi-gateway-hello-worldを作成していきます。

環境変数

lambda では環境変数を設定できるらしいんです。
試しに変数を追記します。
名称未設定.png
追記したら 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としてデータベースを見ることができます。

スクリーンショット 2021-04-16 0.22.34.png

ネットワーク

はい、嘘つきました。
実は、説明した通りだとラムダにネットワークの設定がされていないはずなので、データベースに接続できないです。
以下の手順を踏んでください

  1. 関数にVPC(データベースと同一)を設定する
  2. ラムダ関数に付与されているロールにAWSLambdaVPCAccessExecutionRoleを付与
  3. ラムダにセキュリティグループの設定を行なってください
  4. mysqlとのインバウンドルールを追加します(かってに追加される気がする)

あとがき

自分の経験を元に書いているので、もしかしたら何か抜けている可能性があります。
nodejsには、サーバレスのフレームワークがあったのでlambdaを作成するのであれば、それを利用する方が、簡単かもしれないです。

0
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
2