AWS Secrets Managerで認証情報を安全に管理する方法|RDSパスワード自動ローテーションとEC2からの参照設計

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)AWS(Amazon Linux) > AWS Secrets Managerで認証情報を安全に管理する方法|RDSパスワード自動ローテーションとEC2からの参照設計
「DBのパスワードをconfig.iniやアプリのソースコードに直書きしてしまっている」
「AWSを使い始めたが、認証情報の管理方法がよくわからない」

GitHubのリポジトリにパスワードを含む設定ファイルが混入し、不正アクセスが発生する事故は今も後を絶ちません。Linuxサーバーの/etc/myapp/database.iniに認証情報を平文で書くのと同じリスクが、クラウド上でも発生しています。

この記事では、AWS Secrets Managerを使ったRDSパスワードの安全な管理手順と、EC2(Amazon Linux)からIAMロール経由でシークレットを取得する設計パターンを解説します。自動ローテーションの設定手順、SSM Parameter Storeとの使い分け基準まで実務視点でカバーします。

この記事のポイント

・aws secretsmanager コマンドでシークレットを作成・取得できる
・EC2にIAMロールを付与して認証情報を安全に参照する設計ができる
・RDSパスワードの自動ローテーションをLambdaなしで設定できる
・Secrets ManagerとSSM Parameter Storeの使い分け基準が判断できる


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

なぜ認証情報をコードやファイルに直書きしてはいけないのか

「動けばいい」という発想でDBのパスワードをハードコーディングしてしまうエンジニアは少なくありません。しかし、認証情報の平文保存は以下の経路で漏洩します。

Gitにpushしてしまう:.gitignoreに含め忘れた設定ファイルがリポジトリに混入する
スナップショット経由で漏洩:EC2のAMI化やEBSスナップショットを共有した際、設定ファイルごと外部に渡る
ログに出力される:デバッグ目的で環境変数をログ出力した結果、CloudWatch Logsに平文パスワードが残る
定期変更できない:コードに直書きすると、パスワードをローテーションするたびにデプロイが必要になり、結果的に変更されなくなる

AWSでは「認証情報をコードから分離する」設計を実現するための専用サービスとして、AWS Secrets Managerが用意されています。シークレット(パスワード・APIキー・証明書など)を暗号化して保存し、IAMロール経由でEC2やLambdaから動的に取得する仕組みです。

AWSでのLinuxサーバー構築全体の流れを把握したい方は、AWS(Amazon Linux)入門ガイドも合わせて参照してください。

AWS Secrets Managerの基本設計

Secrets Managerでは、保存するシークレットをシークレット名(例:prod/rds/mysql-password)で管理します。シークレットの実体はKMS(Key Management Service)で自動暗号化されて保存されます。

Secrets Managerが扱うシークレットの種類は主に3つです。

RDSデータベースの認証情報:RDSネイティブローテーションに対応。パスワードの自動変更をAWSが管理する
任意のテキスト・JSON:APIキー、OAuth TokenなどJSON形式で保存できる
Redshift・DocumentDB・その他データベース:マネージドデータベースごとに専用のローテーター(Lambda)を選択できる

シークレットの操作はAWS CLIのaws secretsmanagerサブコマンドで行います。事前にaws configureでリージョンとアクセスキーを設定しておいてください。

1. 動作確認環境

本記事は以下の環境で動作確認しています。

・Amazon Linux 2023(EC2)
・AWS CLI v2.17
・リージョン:ap-northeast-1(東京)

RDSパスワードをSecrets Managerで管理する手順

2. シークレットを作成する

まずRDSのユーザー名とパスワードをJSON形式でSecrets Managerに登録します。

# RDS認証情報をSecrets Managerに登録する aws secretsmanager create-secret --name prod/rds/mysql-password --description "Production RDS MySQL password" --secret-string '{"username":"dbadmin","password":"MySecureP@ss123"}' --region ap-northeast-1

実行結果の例です。

{ "ARN": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:prod/rds/mysql-password-AbCdEf", "Name": "prod/rds/mysql-password", "VersionId": "a1b2c3d4-5678-90ab-cdef-EXAMPLE11111" }

ARNが返されればシークレットの登録完了です。シークレット名は/でパス階層を表現できます(prod/rds/のようにプレフィックスをつけると環境・用途ごとの整理がしやすくなります)。

3. シークレットの値を取得・確認する

登録したシークレットの値をCLIで取得します。

# シークレット値を取得する(SecretStringだけ抽出) aws secretsmanager get-secret-value --secret-id prod/rds/mysql-password --query SecretString --output text

実行結果:

{"username":"dbadmin","password":"MySecureP@ss123"}

JSON形式で認証情報が取得できます。アプリ側ではこのJSONをパースして使います。

4. シークレット名の一覧を確認する

登録済みのシークレット一覧はlist-secretsで確認します。

# シークレット一覧を確認する aws secretsmanager list-secrets --query 'SecretList[].{Name:Name,LastRotated:LastRotatedDate}' --output table

実行結果:

----------------------------------------------------------- | ListSecrets | +-------------------------------+-------------------------+ | LastRotated | Name | +-------------------------------+-------------------------+ | 2026-08-15T03:10:22+09:00 | prod/rds/mysql-password| +-------------------------------+-------------------------+

EC2からシークレットを取得するIAMロール設計

EC2からSecrets Managerのシークレットを取得するには、EC2インスタンスにIAMロールを付与します。アクセスキーをEC2に埋め込む設計は避け、IAMロールで一時認証情報を使う設計が原則です。

5. IAMポリシーの最小権限設計

EC2に付与するIAMポリシーは、GetSecretValueのみを対象のシークレットARNに限定します。

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "secretsmanager:GetSecretValue", "Resource": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:prod/rds/*" } ] }

ポイントはResourceprod/rds/*のワイルドカードを使うことで、本番RDS関連のシークレットのみ取得を許可する設計です。ステージ(dev/stg/prod)ごとにIAMロールを分ければ、開発者が誤って本番シークレットを参照できない構成にできます。

6. EC2(Amazon Linux)のシェルスクリプトから参照する

IAMロールが付いたEC2インスタンスでは、以下のシェルスクリプトでDBパスワードを動的に取得してMySQLへ接続できます。

#!/bin/bash # Secrets Managerからシークレットを取得してMySQLへ接続する SECRET=$(aws secretsmanager get-secret-value --secret-id prod/rds/mysql-password --query SecretString --output text) DB_USER=$(echo "$SECRET" | python3 -c "import sys,json;print(json.load(sys.stdin)['username'])") DB_PASS=$(echo "$SECRET" | python3 -c "import sys,json;print(json.load(sys.stdin)['password'])") mysql -h db.example.internal -u "$DB_USER" -p"$DB_PASS" myapp_db

パスワード変数はスクリプト実行中のみメモリに存在し、ディスクに書き込まれません。ローテーション後も次の実行時には新しいパスワードが自動的に取得されるため、デプロイ不要でパスワード変更が完結します。

自動ローテーションを設定する

Secrets ManagerのRDSネイティブローテーションを使うと、AWSが管理するLambdaローテーターが自動でRDSパスワードを変更し、Secrets Managerの値を更新します。

7. RDS認証情報の自動ローテーションを有効化する

# RDSのシングルユーザーローテーションを設定する(30日ごと) aws secretsmanager rotate-secret --secret-id prod/rds/mysql-password --rotation-rules AutomaticallyAfterDays=30 --rotate-immediately

実行結果:

{ "ARN": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:prod/rds/mysql-password-AbCdEf", "Name": "prod/rds/mysql-password", "VersionId": "b2c3d4e5-6789-01bc-deff-EXAMPLE22222" }

--rotate-immediatelyを付けると即時ローテーションが実行されます。VersionIdが変わっていればパスワード変更が完了しています。

ローテーション後のシークレット状態はdescribe-secretで確認できます。

# ローテーション設定と最終ローテーション日時を確認する aws secretsmanager describe-secret --secret-id prod/rds/mysql-password --query '{RotationEnabled:RotationEnabled,LastRotated:LastRotatedDate,NextRotation:NextRotationDate}'

実行結果:

{ "RotationEnabled": true, "LastRotated": "2026-08-22T03:12:44.523000+09:00", "NextRotation": "2026-09-21T03:12:44.523000+09:00" }

RotationEnabled: trueになっていれば自動ローテーションが有効です。NextRotationで次回のパスワード変更予定日を確認できます。

Secrets Manager vs SSM Parameter Storeの使い分け設計

Secrets Managerと混同されやすいサービスに、AWS Systems Manager(SSM)のParameter Storeがあります。どちらも秘密情報を安全に保管できますが、用途と料金に違いがあります。

比較項目 Secrets Manager SSM Parameter Store
料金 シークレット1件あたり約$0.40/月 標準パラメータは無料(SecureStringは有料)
自動ローテーション 対応(RDS・Redshift・Lambda) 非対応(手動更新のみ)
バージョン管理 VersionId + VersionStage(AWSCURRENT/AWSPREVIOUS) バージョン番号で管理
クロスアカウント共有 対応(IAM + リソースポリシー) 非対応
適した用途 DBパスワード・定期変更が必要な認証情報 APIキー・設定値・非ローテーション系の秘密情報
判断の基準はシンプルです。定期的に変更が必要な認証情報(DBパスワード)はSecrets Manager、変更頻度が低いAPIキーや設定値はParameter Store(SecureString)を選ぶと、コストと管理の手間のバランスが取れます。

AWS環境でのLinuxサーバー構築・運用をさらに深く学びたい方は、AWS(Amazon Linux)の基礎から実践まで解説した入門ガイドもあわせて参照してください。

「AccessDeniedException」が出た時と削除操作の注意点

Secrets Managerを使い始めた際によく直面するエラーと注意事項をまとめます。

8. AccessDeniedExceptionが出た場合の対処手順

EC2からget-secret-valueを実行した際に次のエラーが返る場合、IAMロールの権限設定を確認します。

# aws secretsmanager get-secret-value 実行時のエラー例 An error occurred (AccessDeniedException) when calling the GetSecretValue operation: User: arn:aws:sts::123456789012:assumed-role/MyEC2Role/i-0abc1234def56789a is not authorized to perform: secretsmanager:GetSecretValue on resource: arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:prod/rds/mysql-password-AbCdEf

確認すべき箇所は2つです。

IAMロールのポリシーsecretsmanager:GetSecretValueのActionが付与されているか確認する
ResourceのARN:ポリシーのResourceにシークレットのARN(または*)が含まれているか確認する。シークレット名の末尾に自動付与されるランダム文字列(例:-AbCdEf)を含めるか、ワイルドカードprod/rds/*を使う設計が安全です

9. 【重要】シークレット削除は即時ではなく7~30日間の復元期間がある

delete-secretを実行しても、デフォルトでは30日間の復元期間が設けられ即時削除されません。本番環境のシークレットを削除する場合、この仕様を把握していないと「削除したはずなのに料金が発生し続ける」状態になります。

# シークレットを削除する(30日後に自動削除) aws secretsmanager delete-secret \ --secret-id prod/rds/mysql-password # 即時削除する場合は --force-delete-without-recovery を付ける(復元不可) aws secretsmanager delete-secret \ --secret-id prod/rds/mysql-password \ --force-delete-without-recovery

注意--force-delete-without-recoveryを使うと復元できません。本番環境では30日間の復元期間を維持したまま削除するのが原則です。

認証情報のハードコーディングを卒業するなら、設計の「型」を知ることが先決

Secrets Managerの使い方は調べれば分かります。でも「どのIAMポリシーで最小権限を実現するか」「ローテーションが失敗した時に何が起きるか」を説明できますか?
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、AWSを含む現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

本記事のまとめ

AWS Secrets Managerを使った認証情報管理のポイントをまとめます。
やりたいこと コマンド
シークレットを新規作成する aws secretsmanager create-secret --name prod/rds/mysql-password --secret-string '{"username":"dbadmin","password":"pass"}'
シークレットの値を取得する aws secretsmanager get-secret-value --secret-id prod/rds/mysql-password --query SecretString --output text
自動ローテーションを設定する aws secretsmanager rotate-secret --secret-id prod/rds/mysql-password --rotation-rules AutomaticallyAfterDays=30
ローテーション設定を確認する aws secretsmanager describe-secret --secret-id prod/rds/mysql-password --query '{RotationEnabled:RotationEnabled,NextRotation:NextRotationDate}'
シークレット一覧を確認する aws secretsmanager list-secrets --query 'SecretList[].Name' --output table
認証情報の管理は「動けばいい」から「安全に動き続ける」設計に変えるための最初の一手です。Secrets ManagerとIAMロールを組み合わせれば、パスワードをコードやファイルに書かずに済む設計が実現できます。自動ローテーションを設定しておけば、パスワード変更のためにデプロイを走らせる運用から解放されます。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。