待ち望んでいたRDS Proxy
が東京リージョンでGAされました。
https://aws.amazon.com/jp/blogs/aws/amazon-rds-proxy-now-generally-available/
早速、Lambda
から利用する機会があったのでメモしておきます。
今回は、セキュアに接続するため、TLS
+IAM
認証で接続します。
上記で接続すると、Lambda
に認証情報(具体的にはDBのパスワード)の取得コードを記載しなくて良いのがかなり良い感じです。
前提
Aurora(MySQL)
は存在していること
手順
-
Secrets Manager
設定 -
RDS Proxy
作成 -
Lambda
から接続
Secrets Manager
設定
マネジメントコンソールからSecrets Manager
に移動して、認証情報を入力し、シークレットを作成します。
RDS Proxy
作成
マネジメントコンソールからRDS
に移動しメニューからProxies
->「プロキシを作成」ボタンクリックでRDS Proxy
を作成していきます。
TLSを有効にし、
IAM認証を必須に設定します。
Proxy
のエンドポイントは後で利用するので、メモっておきます。
Lambda
から接続
Node.js
でデフォルト設定で作成していきます。
Lambda
はVPC
リソースのAurora
にアクセスするため、VPC
のアタッチが必要になります。
なので、まずLambda
にロールを付与する必要があります。
ここでは、EC2FullAccess
を付与しています。
次に接続したいAurora
が存在するVPC
をLambda
にアタッチします。
次に、Lambda
に作成したRDS Proxy
をLambda
に追加します。
プログラム
上記で全ての設定が完了したので、プログラムを記載していきます。
※ サンプルコード全量
https://github.com/Thirosue/aws-lambda-sample/blob/master/rds_proxy/index.js
MySQL clientが必要なので、npmパッケージを含めて、zipでアップロードしてください。
手っ取り早く試したい方は以下コマンドでzipを作成し、アップロードしてください。 ※ yarnかnpmがインストールされている前提です。
$ 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作成
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);
};
アップロード後、テストイベントを作成して、コンソールからテストすると正常に接続できていることが確認できます。