LambdaからSSL/TLSでRDSに接続する
記事の内容
Lambda(Node.js)からRDSへ接続するアーキテクチャを設計することがあり、SSL/TLSで接続するためのポイントをまとめました。
AWS Lambdaはサーバーレスアプリケーションで、よく使うサービスですがVPC内にも作成することができます。
VPCに配置するユースケースの一つにRDSへのアクセスしたいケースがあると思います。
しかし、LambdaでRDS PostgresにアクセスしようとするとSSL/TLSで接続しないと、下記のようにエラーが出てしまいました。これはRDS PostgresがデフォルトでSSL/TLS接続の設定になっているためでした。
プライベートネットワークであれば、SSL/TLSで接続しなくても正直問題ないのですが、デフォルトでSSL/TLSになっているのならRDSはそのままにし、Lambda側をSSL/TLSで接続できるようにしてみました。
調べてみると、Node.jsランタイムの場合、環境に証明書がインストールされているとのことなのでこれを利用してみました。
関係する技術・ツール
- AWS Lambda(Node.js 20)
- RDS Postgres16
- typescript
- typeorm 0.3.20
- esbuild
作業の流れ
- Lambda作成
- コード作成
- Lambdaの環境変数設定
- Lambdaの実行
1. Lambda作成
Lambdaのコンソールから関数を作成します。動作確認であれば最低限下記を設定します。
RDSは作成済みの前提です。
- ランタイム・・・Node 20
- アーキテクチャ・・・x86_64
- 実行ロール・・・「AWSLambdaVPCAccessExecutionRole」をアタッチしたロール
- 詳細設定
- VPCを有効化にチェック
- VPC・・・RDSのあるVPC
- サブネット・・・RDSのあるサブネット
- セキュリティグループ・・・デフォルトのセキュリティグループ
2. コード作成
次にLambdaのコードを作成します。
DB接続へはtypeorm、コードのビルドにesbuildを使います。
パッケージは下記でインストールします。
yarn add ts-node esbuild typeorm
接続確認のためのコードを作成します。DBへの接続情報はRDS作成時の控えとコンソールで確認してください。
ポイントは接続設定のssl: true
になります。
import "reflect-metadata"
import { DataSource } from "typeorm";
const AppDataSource = new DataSource({
type: "postgres",
host: "RDSホスト名",
port: 5432,
database: "データベース名",
username: "ユーザー名",
password: "パスワード",
ssl: true
})
export const handler = () => {
AppDataSource.initialize().then(async () => {
console.log("connection succcess")
AppDataSource.destroy();
}).catch(error => console.error(error))
}
esbuildのビルド設定は下記のように設定します。
import { build } from 'esbuild';
build({
entryPoints: ['index.ts'],
bundle: true,
platform: "node",
outfile: 'dist/index.js',
});
できたら、下記のコマンドでビルドします。
yarn ts-node build.ts
すると、disフォルダにindex.jsが出来上がるので、このファイルをzip化します。
zip化したコードを、Lamndaコンソールにアップロードします。コードタブにある「アップロード元」からアップロードします。
3. Lambdaの環境変数設定
ここまでできたら、次にSSL/TLS接続するためLambdaに環境変数を設定します。
ドキュメントを読むと下記のように記載があります。
Node.js 20 以降では、Lambda がデフォルトで追加の CA 証明書をロードすることはありません。Node.js 20 ランタイムには、/var/runtime/ca-cert.pem にあるすべての Amazon CA 証明書を含む証明書ファイルが含まれています。Node.js 18 以前のランタイムと同じ動作を復元するには、NODE_EXTRA_CA_CERTS 環境変数を /var/runtime/ca-cert.pem に設定します。
つまりNode20のLambdaは環境変数を設定するだけで、証明書をロードできるようです。
設定タブの「環境変数」から下記のように設定します。
-
キー
NODE_EXTRA_CA_CERTS -
値
/var/runtime/ca-cert.pem
ここまでできたら設定は完了です。
4. Lambdaの実行
それではLambdaを実行してみましょう。Lambdaコンソールから、テストタブから実行します。
「新しいイベント」を選択して保存。「テスト」をクリックします。
実行して下記のように緑のウインドウで成功となればOKです。
作成したコード内の「connection succcess」が出力されていることが確認できます。
これで無事にLambdaからRDSでSSL/TLSで接続することができました。
以上になります。
環境変数を設定するだけで、LambdaからRDSへSSL/TLSで接続することができました。環境変数なら簡単に設定できるので活用してみてください。
NCDC株式会社( ncdc.co.jp/ )のエンジニアチームです。 募集中のエンジニアのポジションや、採用している技術スタックの紹介などはこちら( github.com/ncdcdev/recruitment )をご覧ください! ※エンジニア以外も記事を投稿することがあります
Discussion