Secrets Manager

AWS のシークレット管理サービスで、パスワードや API キーを安全に保存 / 自動ローテーションする

AWSセキュリティ

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 つの段階に分けて呼び出す形で動く。進行状況はステージングラベルというバージョンへの目印で管理される。

  1. createSecret: 新しい値を生成し、新バージョンに AWSPENDING を付ける
  2. setSecret: AWSPENDING の値をデータベースなど実体側に設定する
  3. testSecret: 新しい値で実際に認証できるかを検証する
  4. finishSecret: AWSCURRENT を新バージョンへ移す。直前のバージョンには AWSPREVIOUS が付き、最後に正常だった値が残る

利用側が既定で取得するのは AWSCURRENT なので、2 と 4 の間は実体側が新旧どちらの値でも認証できる状態になる。この重なりが切り替え中の接続失敗を防いでいる。RDS など対応サービスではこの関数が用意済みで、それ以外の対象では 4 段階を自分で実装する。テスト段階で失敗したときに実体側を元の値へ戻す処理を書き忘れると、AWSPENDING が残ったまま以降のローテーションが始められなくなる。

SSM Parameter Store との使い分け

SSM Parameter Store の SecureString も KMS で暗号化されるため、暗号の強さでは選べない。分かれ目は入れ替えを仕組みとして持つかどうかと、料金である。

観点Secrets ManagerSSM 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 キーで暗号化する必要があり、キーの作成には別途料金がかかる。設計段階でこれを決めておかないと、後から鍵の入れ替えが発生する。

体系的に学ぶなら関連書籍を参照してほしい。

この記事は役に立ちましたか?

関連用語

関連する記事