LambdaでRDS Proxy経由でAurora(MySQL)に接続する（IAM認証）

待ち望んでいた`RDS Proxy`が東京リージョンでGAされました。
https://aws.amazon.com/jp/blogs/aws/amazon-rds-proxy-now-generally-available/

早速、`Lambda`から利用する機会があったのでメモしておきます。
今回は、セキュアに接続するため、`TLS`+`IAM`認証で接続します。
上記で接続すると、`Lambda`に認証情報（具体的にはDBのパスワード）の取得コードを記載しなくて良いのがかなり良い感じです。

# 前提

`Aurora(MySQL)`は存在していること

# 手順

1. `Secrets Manager`設定
2. `RDS Proxy`作成
3. `Lambda`から接続

## `Secrets Manager`設定

マネジメントコンソールから`Secrets Manager`に移動して、認証情報を入力し、シークレットを作成します。

![スクリーンショット 2020-08-29 10.39.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/27d1a006-f8b4-ad73-9833-5c370cf53dde.png)

![スクリーンショット 2020-08-29 9.52.20.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/b62a67ad-e17d-5fe1-fe63-a9a2d5bc99ad.png)

![スクリーンショット 2020-08-29 9.53.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/8b450941-0b37-e6b4-9abf-a0bdcc6f4d0d.png)

## `RDS Proxy`作成

マネジメントコンソールから`RDS`に移動しメニューから`Proxies` ->「プロキシを作成」ボタンクリックで`RDS Proxy`を作成していきます。

![スクリーンショット 2020-08-29 9.56.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/8637a681-629a-fcea-015d-99829fef67d0.png)

TLSを有効にし、

![スクリーンショット 2020-08-29 10.43.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/e2df1086-ac1a-d87b-ffe3-8a889e72ed90.png)

IAM認証を必須に設定します。

![スクリーンショット 2020-08-29 9.57.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/c0dc24e8-4d42-c4d3-d91f-367ade9f8118.png)

`Proxy`のエンドポイントは後で利用するので、メモっておきます。

![スクリーンショット 2020-08-29 10.46.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/e396428f-6bb3-9937-7d6e-adb312b0a464.png)

## `Lambda`から接続

`Node.js`でデフォルト設定で作成していきます。

![スクリーンショット 2020-08-29 10.02.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/b597135f-65a8-888d-feb6-7bf0c898fec1.png)

`Lambda`は`VPC`リソースの`Aurora`にアクセスするため、`VPC`のアタッチが必要になります。
なので、まず`Lambda`にロールを付与する必要があります。
ここでは、`EC2FullAccess`を付与しています。

![スクリーンショット 2020-08-29 10.04.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/22fdb964-e66e-a263-6ad5-c66283b70937.png)

次に接続したい`Aurora`が存在する`VPC`を`Lambda`にアタッチします。

![スクリーンショット 2020-08-29 10.14.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/7910abbd-4bea-a32d-7265-d4aff240fd5c.png)

次に、`Lambda`に作成した`RDS Proxy`を`Lambda`に追加します。

![スクリーンショット 2020-08-29 10.44.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/160d97fc-8213-2dc6-90e1-21a9741c520b.png)

## プログラム

上記で全ての設定が完了したので、プログラムを記載していきます。

※ サンプルコード全量
https://github.com/Thirosue/aws-lambda-sample/blob/master/rds_proxy/index.js

MySQL clientが必要なので、npmパッケージを含めて、zipでアップロードしてください。
手っ取り早く試したい方は以下コマンドでzipを作成し、アップロードしてください。 ※ yarnかnpmがインストールされている前提です。

```bash
$ git clone git@github.com:Thirosue/aws-lambda-sample.git # サンプルコードをclone
$ cd aws-lambda-sample/rds_proxy/ # 対象ディレクトリに移動
$ yarn # もしくは npm install
$ zip -r src.zip index.js node_modules/ # アップロード用のzip作成
```

```node.js
let AWS = require('aws-sdk');
const mysql2 = require('mysql2/promise');

let connection;
const username = 'admin'; // 接続ユーザを設定してください。

exports.handler = async(event) => {
	console.log("Starting query ...\n");
	console.log("Running iam auth ...\n");

	const signer = new AWS.RDS.Signer({
	    region: 'ap-northeast-1',
	    hostname: process.env['proxy_endpoint'], // メモしておいたプロキシエンドポイントを設定します。ここでは環境変数から取得しています。
	    port: 3306,
	    username
	});

	const token = signer.getAuthToken({
	  username
	});
	console.log(token);
	console.log ("IAM Token obtained\n");
	
	const connectionConfig = {
	  host: process.env['proxy_endpoint'], // メモしておいたプロキシエンドポイントを設定します。
	  user: username,
	  database: 'mysql', // データベース名を設定してください。
	  ssl: 'Amazon RDS',
	  password: token,
	  authPlugins: { mysql_clear_password: () => () => signer.getAuthToken() }
	};

	connection = await mysql2.createConnection(connectionConfig);	
	const [rows, fields] = await connection.query("SELECT 1");
	console.log(rows);
};
```

アップロード後、テストイベントを作成して、コンソールからテストすると正常に接続できていることが確認できます。

![スクリーンショット 2020-08-29 11.30.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/73176/ff2dc50b-9baa-3c81-047a-a3fff23c3e1c.png)

# 参考リンク

- AWS公式
  - https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-database.html 
  - https://aws.amazon.com/jp/blogs/compute/using-amazon-rds-proxy-with-aws-lambda/