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

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

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

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

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

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

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

https://qiita.com/tronicboy/items/c982eb046907b2965d08

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

# Node.jsのLambda関数のソースコードを書く
ローカルで作成したLambda関数のソースコードを後でアップロードしますが、まずは必要なファイルを用意しておきます。
### `pg`をインストールする
今回のプロジェクトでは、<a href="https://www.npmjs.com/package/pg">pg</a>というnpmパッケージが必要なので、まずは、任意のダイレクトリに入って、`yarn init`で`package.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-sdk`の`AWS.RDS.Signer`でIAM認証に必要なパスワードを取得します。

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

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

# Lambda関数を作成する
AWSコンソールからLambdaにアクセスします。
![スクリーンショット 2022-07-25 12.45.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/e75cca72-e7f3-cb53-24bc-5f20f530bcf6.png)
`関数の作成`のボタンをクリックします。
![スクリーンショット 2022-07-25 12.45.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/db295752-e424-d4c3-bd0b-ed3ce5a61030.png)
以下のように関数名を入力します。
ランタイムは`Node.js 16.x`でOKです。
![スクリーンショット 2022-07-25 12.51.23.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/d720a0ba-6f9b-e5fa-3965-3c2012859edb.png)
`詳細設定`では、RDSプロキシをおいているVPNを指定するようにします。

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

また、Security Groupは、前回作った`my-application-sg`を指定します。
![スクリーンショット 2022-07-25 12.52.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/fea99565-45e4-1cf6-6733-b7bdcf022bf7.png)
最後に、`関数を作成`のボタンをクリックします。

## ソースコードをアップロードする
作成が終わったら、上記で作ったソースコードをアップロードします。
![スクリーンショット 2022-07-25 12.58.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/343e0933-f3d0-9916-2bb3-a3bbdbf52d92.png)
うまくいけば、このように`node_modules`と`index.js`が表示されます。

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

## データベースプロキシを設定する
`設定`タブから`データベースプロキシ`のメニューを開き、そこで`データベースプロキシの追加`のボタンをクリックする
![スクリーンショット 2022-07-25 13.00.19.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/14ab79ce-4ca5-7218-b19e-a5120cafefad.png)
そして、既存のデータベースプロキシを選択し、前回作ったRDSプロキシを選ぶ
![スクリーンショット 2022-07-25 13.01.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/a95f5a6d-0ff5-f99e-0456-fdf15763850b.png)


## 環境変数を設定する
`環境変数`タブをクリックし、編集します。

`HOST`のキーにはRDSプロキシの読み込み・書き込み用エンドポイントを代入しましょう。
![スクリーンショット 2022-07-25 13.04.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/6ae42899-f2c1-a03b-70b7-4ddb5bcd3533.png)

# 実行してみる
`コード`タブに戻り、`テスト`ボタンをクリックします。
![スクリーンショット 2022-07-25 13.10.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/f6597038-8fb0-c233-15ad-2c93506f2a4c.png)
デフォルトの設定で、名前を入れるだけで大丈夫です。
![スクリーンショット 2022-07-25 13.09.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/29342cdc-7d0f-208c-9c06-bba538d2b4b7.png)
そして、もう一度上記のテストボタンをクリックします。

すると以下のようなテスト結果が出ます！出るはず！
![スクリーンショット 2022-07-25 13.11.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/624c7a87-b8fb-c932-f571-9def39f7cfb5.png)
これでは、好きなSQLが書けますね。

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

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