Secrets Manager
AWS のシークレット管理サービスで、パスワードや API キーを安全に保存 / 自動ローテーションする
Secrets Manager とは
AWS Secrets Manager は、パスワード、API キー、DB 接続情報などのシークレットを保存し、取得と入れ替えを API 経由で扱うマネージドサービスである。値は KMS の鍵で暗号化して保管され、取得は IAM で認可され、API 呼び出しは CloudTrail に記録される。
このサービスの主な価値は暗号化ではなく入れ替えの自動化にある。Lambda の環境変数に認証情報を直接設定する構成でも保存時には暗号化されるが、値を変えるには設定変更と再デプロイが必要になる。Secrets Manager に置けば値の交換をアプリケーションのデプロイから切り離せる。置き場所の選び方を含む一般論は シークレット管理 を参照。
Lambda の環境変数との違い
「環境変数は平文だから危険」という説明は正確でない。Lambda は環境変数を保存時に暗号化する。それでも AWS は DB 認証情報や API キーには Secrets Manager の利用を推奨している。違いが出るのは暗号化の有無ではなく、値を入れ替える手間、監査の粒度、共有のしやすさである。
| 観点 | Lambda の環境変数 | Secrets Manager |
|---|---|---|
| 保存時の暗号化 | あり (KMS) | あり (KMS) |
| 値の入れ替え | 設定変更と再デプロイが必要 | API で差し替え。自動ローテーションも組める |
| アクセス制御 | 関数設定を読める主体は復号済みの値も読める | 取得ごとに IAM とリソースポリシーで認可 |
| 監査 | 設定操作は記録されるが、実行中の参照は記録されない | 取得のたびに CloudTrail に記録される |
| コスト | 追加費用なし | 保管の月額 + 呼び出し課金 (後述) |
そのため環境変数にはシークレットの値ではなく名前や ARN を置き、値は実行時に取得する形にする。この一手間で、漏洩時に交換する対象がシークレットストアの 1 か所に収まる。
キャッシュと有効期限
取得は呼び出し回数に応じて課金され、スロットリング上限にも数えられる。リクエストのたびに GetSecretValue を呼ぶ実装は費用と失敗率の両方で不利になるので、取得結果はメモリに保持する。Lambda なら実行環境が再利用される間はハンドラー外の変数に残るため、コールドスタート時だけ取得すれば足りる。AWS は「AWS Parameters and Secrets Lambda Extension」も提供しており、既定では取得した値を 300 秒キャッシュする。
ただし無期限に保持すると、ローテーションで値が変わった後も古い値を使い続ける。有効期限を設けることと、認証エラーを受けたらキャッシュを捨てて取得し直す経路を用意することの両方が必要である。これはローテーション側で新旧を併存させる設計と対になっている (シークレットのローテーション)。
自動ローテーションの仕組み
自動ローテーションは、Secrets Manager が Lambda 関数を 4 つの段階に分けて呼び出す形で動く。進行状況はステージングラベルというバージョンへの目印で管理される。
createSecret: 新しい値を生成し、新バージョンにAWSPENDINGを付けるsetSecret:AWSPENDINGの値をデータベースなど実体側に設定するtestSecret: 新しい値で実際に認証できるかを検証するfinishSecret:AWSCURRENTを新バージョンへ移す。直前のバージョンにはAWSPREVIOUSが付き、最後に正常だった値が残る
利用側が既定で取得するのは AWSCURRENT なので、2 と 4 の間は実体側が新旧どちらの値でも認証できる状態になる。この重なりが切り替え中の接続失敗を防いでいる。RDS など対応サービスではこの関数が用意済みで、それ以外の対象では 4 段階を自分で実装する。テスト段階で失敗したときに実体側を元の値へ戻す処理を書き忘れると、AWSPENDING が残ったまま以降のローテーションが始められなくなる。
SSM Parameter Store との使い分け
SSM Parameter Store の SecureString も KMS で暗号化されるため、暗号の強さでは選べない。分かれ目は入れ替えを仕組みとして持つかどうかと、料金である。
| 観点 | Secrets Manager | SSM Parameter Store |
|---|---|---|
| 自動ローテーション | RDS などの対応サービスは組み込みで回せる。それ以外も Lambda 関数を用意すれば指定間隔で作り替えられる | 仕組みを持たず、入れ替えは自分で組む |
| 保管の料金 | シークレット 1 件あたり $0.40/月 | 標準パラメータは無料。上級パラメータは 1 件あたり $0.05/月 |
| 取得の料金 | API 呼び出し 10,000 件あたり $0.05 | 標準パラメータの標準スループットは無料。上級パラメータと高スループット設定は 10,000 件あたり $0.05 |
| 値の上限と件数 | 1 シークレット 64 KB まで | 標準パラメータは 4 KB・1 リージョンあたり 10,000 件。上級パラメータは 8 KB・100,000 件 |
| 用途 | パスワード、API キー | 設定値、フラグ |
料金は 2026 年 8 月時点の米国東部 (バージニア北部) の公表値で、リージョンにより異なる。「無料だから Parameter Store」と即断する前に上限を確認すること。4 KB を超える値や 10,000 件を超える件数では上級パラメータが必要になり、そこから先は課金対象になる。なお上級から標準へは戻せない。
判断としては、定期的に入れ替える必要がある値 (DB 認証情報、API キー) は Secrets Manager、入れ替えを想定しない設定値 (ログレベル、機能フラグ) は Parameter Store が素直である。
他アカウントから参照する
集約用のアカウントに置いたシークレットを別のアカウントから読む構成では、許可を 2 か所に書く必要がある。シークレット側のリソースポリシーで相手のロールに取得を許可し、さらに暗号化に使っている KMS キーのキーポリシーで同じロールに復号を許可する。片方だけでは失敗するので、権限エラーが出たときはまずどちらが欠けているかを切り分ける。
ここに落とし穴がある。既定の AWS 管理キー (aws/secretsmanager) はキーポリシーを編集できないため、クロスアカウントでは使えない。自分で作成した KMS キーで暗号化する必要があり、キーの作成には別途料金がかかる。設計段階でこれを決めておかないと、後から鍵の入れ替えが発生する。
体系的に学ぶなら関連書籍を参照してほしい。
この記事は役に立ちましたか?
関連用語
シークレットローテーション
API キーやデータベースパスワードなどの秘密情報を定期的に自動更新するセキュリティプラクティス
KMS
AWS の暗号鍵管理サービスで、データの暗号化 / 復号に使う鍵を安全に管理する
IAM
AWS のアクセス管理サービスで、誰が何のリソースにどのような操作を行えるかを制御する
シークレット管理
パスワード、API キー、証明書などの機密情報を安全に保存 / 配布 / ローテーションする手法
SSM
AWS Systems Manager の略で、EC2 やオンプレミスサーバーの管理、パラメータストアを提供する
コンプライアンス
法規制や業界標準への準拠を確保し、セキュリティと信頼性を維持する取り組み