目次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 エンドポイント
他に作成したものは、残しても問題ないです。
同じカテゴリーの記事
同じカテゴリの記事を読む