「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の使い分け基準が判断できる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
なぜ認証情報をコードやファイルに直書きしてはいけないのか
「動けばいい」という発想で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"}
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/*" } ] }
Resourceにprod/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キー・設定値・非ローテーション系の秘密情報 |
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
・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 |
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:MySQLのレプリケーションをLinuxサーバー2台で構築する手順|binlogとGTIDによるソース・レプリカ設定
- この記事の属するカテゴリ:AWS(Amazon Linux)へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます