AWS

RDSの認証情報をSecreteManagerに保存してみる

NEW 2026年8月19日

目次Category


はじめに

これまでRDSの設定で認証情報を”セルフマネージド”で実装していましたが、今回は”Secret Manager”でやってみたいと思います。

まずは、Secret Managerについて話していきます。

Secret Manager

パスワードやAPIキーなどの「秘密情報」を安全に保存・管理するAWSサービス

RDSでは、マスターユーザー名・パスワードをSecrets Managerに保存し、AWS側に管理してもらうことに利用しています。

今回使用するサービス

構築手順

2-0.構築するにあたって

今回、RDSの作成をやったことのある前提で進めていきます。
もし、わからない点があれば下記ブログにRDSの作成について書かれているので、
参照してください!下記ブログのRDS設定に変更を加えて、実施しています。

EC2 + RDSでTodoアプリ作成

2-1.セキュリティグループの作成

最初に、RDSとLambda、Secret ManagerのVPCエンドポイント(VE)で使用するセキュリティグループ(SG)を作成していきます。

これから作成するSGが既にある方は、ここは飛ばしてもらって大丈夫です。

作成する際は、自分のVPCを選択しているか確認してください。

・Lambda用SG

SG名:sgp-Lambda-[name]-01
【インバウンドルール】

 なし
【アウトバウンドルール】

 デフォルト (タイプ:すべてのトラフィック)

*実務環境を意識するなら必要な通信だけに絞る(アウトバウンドルールを2つ追加、デフォルト削除)

 一つ目: タイプ:MySQL/Aurora ポート:3306 送信先:RDS用SG 
 二つ目: タイプ:HTTPS ポート:443 送信先:Secret ManagerのVE用SG

 

・RDS用SG

SG名:sgp-rds-[name]-01
【インバウンドルール】

 タイプ:MySQL/Aurora ポート:3306 送信先:Lambda用SG
【アウトバウンドルール】

 デフォルト

 

・Secret ManagerのVE用SG

SG名:sgp-smve-[name]-01
【インバウンドルール】

 タイプ:HTTPS ポート:443 送信先:Lambda用SG
【アウトバウンドルール】

 デフォルト

*Lambda用SGで実務環境を意識した設定にする場合は、先にRDSとSecret ManagerのVE用をインバウンドルールの記載なしで作成してください。そのあとにLambda用を作成して、RDSとSecret ManagerのVE用にインバウンドルールを追加します。

 

2-2.RDSの作成

まずは、”Aurora and RDS”の画面を開きましょう!

”データベースの作成” -> ”フル設定”を選んでください。

下記の設定内容でRDSを作成してください。指定していない箇所はデフォルトで大丈夫です。

【エンジンオプション】
 Aurora(MySQL Compatible)

【テンプレート】
 開発/テスト

【クラスタースケーラビリティタイプ】
 プロビジョニング済み

 プロビジョニングされた設定のタイプ:バースト可能クラス
 db.t3.medium 

【設定】
 DBクラスター識別子:rds-cluster-[name]-01
 認証情報管理:AWS Secret Managerで管理
 *ここが参照ブログ①との違い:セルフマネージドを選択していた

【接続】
 VPC:自身のVPCを選択
 VPCセキュリティグループ:既存 RDS用SG(sg-rds-[name]-01)

*上記で指定した項目以外はデフォルトでOK!

2-3.Lamdbaの作成

1.zipファイル作成

今回実行するLambda関数では、AWS内のライブラリだけでは実行できないので”pyMySQL”をインストールし、Lambdaに反映させます。

CloudShellを開いて、下記のコマンドを実行していきましょう!

1.ディレクトリ作成
 mkdir lambda-package
2.移動
 cd lambda-package
3.pyMySQLインストール
 pip3 install PyMySQL -t .
4.pythonコードを作成
 nano lambda_function.py
保存操作手順
Ctrl + O
Enter
Ctrl + X
5.zipファイル作成
 zip -r lambda-package.zip .
6.CloudShell右上のアクションからダウンロートを選択
 "/home/cloudshell-user/lambda-package/lambda-package.zip"を入力

lambda_function.py

import json
import logging
import os

import boto3
import pymysql
from botocore.exceptions import ClientError


logger = logging.getLogger()
logger.setLevel(logging.INFO)


# Secrets Managerのシークレット名またはARN
SECRET_NAME = os.environ["SECRET_NAME"]

# Lambdaによって自動設定されるリージョン
AWS_REGION = os.environ["AWS_REGION"]

# RDS接続情報
DB_HOST = os.environ["DB_HOST"]
DB_PORT = int(os.environ.get("DB_PORT", "3306"))
DB_NAME = os.environ["DB_NAME"]


def get_secret() -> dict:
    """
    Secrets ManagerからRDSのユーザー名とパスワードを取得する。
    """

    client = boto3.client(
        "secretsmanager",
        region_name=AWS_REGION
    )

    try:
        response = client.get_secret_value(
            SecretId=SECRET_NAME
        )

        secret_string = response["SecretString"]
        secret = json.loads(secret_string)

        required_keys = [
            "username",
            "password"
        ]

        missing_keys = [
            key for key in required_keys
            if key not in secret
        ]

        if missing_keys:
            raise ValueError(
                f"シークレットに必要な項目がありません: {missing_keys}"
            )

        return secret

    except ClientError:
        logger.exception(
            "Secrets Managerからシークレットを取得できませんでした"
        )
        raise


def lambda_handler(event, context):
    connection = None

    try:
        logger.info("Secrets Managerから認証情報を取得します")

        # Secrets Managerからユーザー名とパスワードを取得
        secret = get_secret()

        logger.info(
            "RDSへ接続します: host=%s, port=%s, database=%s",
            DB_HOST,
            DB_PORT,
            DB_NAME
        )

        # RDSへ接続
        connection = pymysql.connect(
            host=DB_HOST,
            port=DB_PORT,
            user=secret["username"],
            password=secret["password"],
            database=DB_NAME,
            connect_timeout=10,
            read_timeout=10,
            write_timeout=10,
            charset="utf8mb4",
            cursorclass=pymysql.cursors.DictCursor
        )

        # 接続確認用SQL
        with connection.cursor() as cursor:
            cursor.execute(
                """
                SELECT
                    DATABASE() AS database_name,
                    NOW() AS db_current_datetime,
                    VERSION() AS mysql_version
                """
            )

            result = cursor.fetchone()

        logger.info("RDSへの接続に成功しました")

        return {
            "statusCode": 200,
            "body": json.dumps(
                {
                    "message": "RDSへの接続に成功しました",
                    "result": result
                },
                ensure_ascii=False,
                default=str
            )
        }

    except Exception as error:
        logger.exception("RDSへの接続に失敗しました")

        return {
            "statusCode": 500,
            "body": json.dumps(
                {
                    "message": "RDSへの接続に失敗しました",
                    "error": str(error)
                },
                ensure_ascii=False
            )
        }

    finally:
        if connection is not None:
            connection.close()
            logger.info("RDS接続を閉じました")

zipファイルの作成が完了したら、Lambdaの作成と設定に移りましょう。

 

2.Lambdaの作成と設定

Lambdaの作成

Lambdaサービスを開いたら、”関数を作成”をクリックしてください。

下記の内容で関数を作成します。

【関数名】lambda-sm-[name]-01

【ランタイム】Python 3.15  *バージョンは違う場合もあるのでPythonであればOK

作成したら、詳細を開いてコードタブ内のアップロードを押してください。
先ほど作成したzipファイルをアップロードしてください。
これでLambdaの作成はおわりで、設定をやっていきます。

Lambdaの設定

Secret Managerへのアクセス権限を付与しないといけません。
なので、Lambda関数に紐づいているIAMロールに許可ポリシーを追加します。

設定タブを開いて、サイドバーの”アクセス権限”を選んでください。そこからロール名をクリックして詳細に移動し、”許可を追加” -> “インラインポリシーを作成”で下記の内容を入力し、保存してください 

{
 "Version": "2012-10-17",
 "Statement": [
   {
	"Sid": "GetRdsManagedSecret",
	"Effect": "Allow",
	"Action": [
		"secretsmanager:GetSecretValue",
		"secretsmanager:DescribeSecret"
	],
	"Resource": "SecretManagerのARN" //Secret Managerの詳細から確認してください
   }
 ]
}

次に、コードで使用する環境変数を設定します。
同じく設定タブで、サイドバーにある環境変数を開きます。編集で以下の4つの値を追加してください。

【キー】      |【値】
—————————————————–
DB_HOST           |  RDSのエンドポイント
—————————————————–
DB_PORT            |  3306
—————————————————–
DB_NAME           |  mysql
—————————————————–
SECRET_NAME    |  シークレット名
—————————————————–

これで、Lambdaの設定は終了です。
次が最後です。

2-4.Endpointの作成

VPCサービスを開き、サイドーバーにあるエンドポイントを開いてください。
”エンドポイントの作成”を押して作成していきましょう。

下記の内容で設定しましょう。

【名前】ve-[name]-01

【タイプ】AWSのサービス

【ネットワーク設定】自分のVPC

【サービス】com.amazonaws.ap-northeast-1.secretsmanager  

* ”secret”で検索してください!

【サブネット】AZの1aと1cにあるプライベートサブネットを選択してください

【セキュリティグループ】2-1で作成したエンドポイント用SGを選択 *画像省略

すべての設定ができたら、作成を押してください。

*SGを設定する画像は省略しているので、設定し忘れに気を付けてください!!

 

2-5.動作確認

作成したLambdaの詳細画面に移ってください。
テストタブから”イベントJSON”を{}だけにして、テストを押してください。
成功と出て、パラメータに”取得できた”旨の表示が出たら動作確認終了です。

*テスト自体は、成功と出てもエラーが出ていることが多いので詳細の確認はおこなってください。

最後に

今回の内容は以上になります。

最後にお片付けとして、削除するサービスを書いておきます。
・Aurora and RDS
・VPC エンドポイント

他に作成したものは、残しても問題ないです。

この記事を書いた人

神山颯太

hayato_kamiyama

26卒の神山です。
動くことが大好きです。