5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

AWS LambdaでPostgreSQLのRDSプロキシを使用する方法 - Node.js

Posted at

はいさい!ちゅらデータぬオースティンやいびーん。

概要

RDSデータベースへの接続を管理してくれるRDSプロキシを介して、AWSのLambda関数でPostgreSQLのデータベースに接続する方法を紹介します。

今回は、Node.js用のLambda関数を使います。

背景

Lambda関数でコネクションを張ると、パフォーマンスの問題が大きく関わってくるので、直接に接続するのは避けた方がいいです。

そこで、RDSプロキシを使用すると、Lambda関数の中で効率よくデータベースにアクセスできます。

前回の記事で、PostgreSQLのRDSプロキシの作り方を紹介しましたが、それを元に今回の記事を書いていきます。

目次

  1. Node.jsのLambda関数のソースコードを書く
  2. Lambda関数を作成する
  3. RDSプロキシを設定する
  4. 実行してみる

Node.jsのLambda関数のソースコードを書く

ローカルで作成したLambda関数のソースコードを後でアップロードしますが、まずは必要なファイルを用意しておきます。

pgをインストールする

今回のプロジェクトでは、pgというnpmパッケージが必要なので、まずは、任意のダイレクトリに入って、yarn initpackage.jsonを作ります。

cd my-project
yarn init

そして、pgをインストールする

yarn add pg

index.jsを追加し、ロジックを書く

Lambda関数のnode.jsのテンプレートを元にpgを使ったソースコードを書きます。

index.js
const pg = require("pg");
const AWS = require("aws-sdk");

exports.handler = async (event) => {
  const signer = new AWS.RDS.Signer({
    region: "ap-northeast-1", // RDSプロキシを作ったRegionに合わせる
    hostname: process.env.HOST, // 後々環境変数で設定する
    port: 5432,
    username: "master", // 前回の記事で作成したSecretのusername
  });

  const token = signer.getAuthToken({
    username: "master",
  });

  const dbConfig = {
    user: "master",
    password: token,
    port: 5432,
    database: "dev", // データベース作成時に指定したもの
    host: process.env.HOST,
    ssl: true,
  };

  const client = new pg.Client(dbConfig);

  client.connect();

  const res = await client.query("SELECT NOW();");

  await client.end();

  const response = {
    statusCode: 200,
    body: JSON.stringify(res.rows[0]),
  };
  return response;
};

aws-sdkはAWSのLambda環境で用意してもらっているので、npmからインストールする必要はないです。

このaws-sdkAWS.RDS.SignerでIAM認証に必要なパスワードを取得します。

ソースコードを圧縮します。

Lamdbaにアップロードするためには上記のソースコードを.zipファイルに圧縮する必要があります。

圧縮しておいてください。後で使います。

Lambda関数を作成する

AWSコンソールからLambdaにアクセスします。
スクリーンショット 2022-07-25 12.45.11.png
関数の作成のボタンをクリックします。
スクリーンショット 2022-07-25 12.45.48.png
以下のように関数名を入力します。
ランタイムはNode.js 16.xでOKです。
スクリーンショット 2022-07-25 12.51.23.png
詳細設定では、RDSプロキシをおいているVPNを指定するようにします。

サブネットは、np-1だと、全て入れるようにします。

また、Security Groupは、前回作ったmy-application-sgを指定します。
スクリーンショット 2022-07-25 12.52.53.png
最後に、関数を作成のボタンをクリックします。

ソースコードをアップロードする

作成が終わったら、上記で作ったソースコードをアップロードします。
スクリーンショット 2022-07-25 12.58.10.png
うまくいけば、このようにnode_modulesindex.jsが表示されます。

RDSプロキシを設定する

次は、RDSプロキシをこのLambda関数に追加します。

データベースプロキシを設定する

設定タブからデータベースプロキシのメニューを開き、そこでデータベースプロキシの追加のボタンをクリックする
スクリーンショット 2022-07-25 13.00.19.png
そして、既存のデータベースプロキシを選択し、前回作ったRDSプロキシを選ぶ
スクリーンショット 2022-07-25 13.01.10.png

環境変数を設定する

環境変数タブをクリックし、編集します。

HOSTのキーにはRDSプロキシの読み込み・書き込み用エンドポイントを代入しましょう。
スクリーンショット 2022-07-25 13.04.56.png

実行してみる

コードタブに戻り、テストボタンをクリックします。
スクリーンショット 2022-07-25 13.10.12.png
デフォルトの設定で、名前を入れるだけで大丈夫です。
スクリーンショット 2022-07-25 13.09.53.png
そして、もう一度上記のテストボタンをクリックします。

すると以下のようなテスト結果が出ます!出るはず!
スクリーンショット 2022-07-25 13.11.24.png
これでは、好きなSQLが書けますね。

まとめ

ここまで、RDSプロキシの作り方及びLambda関数での使用方法を解説してまいりましたが、いかがでしょうか?

筆者はまだまだAWSのサーバーレス経験が浅く、びっくりするばかりですが、さまざまなツールを用意してくれていてすごい力だなと日々感じています。

5
3
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
5
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?