😎

LambdaからSSL/TLSでRDSに接続する

2024/02/13に公開

記事の内容

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ランタイムの場合、環境に証明書がインストールされているとのことなのでこれを利用してみました。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-nodejs.html#nodejs-certificate-loading

関係する技術・ツール

  • AWS Lambda(Node.js 20)
  • RDS Postgres16
  • typescript
  • typeorm 0.3.20
  • esbuild

作業の流れ

  1. Lambda作成
  2. コード作成
  3. Lambdaの環境変数設定
  4. 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になります。

index.ts
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エンジニアブログ

Discussion