AWS Secrets Manager
データベースパスワードや API キーなどのシークレットを安全に保存・取得・自動ローテーションするサービスで、ハードコードされた認証情報を排除する
概要
AWS Secrets Manager は、アプリケーションが使用するシークレット (データベースパスワード、API キー、OAuth トークンなど) を安全に保存し、プログラムから取得するためのサービスです。シークレットは KMS で暗号化されて保存され、IAM ポリシーでアクセスを制御します。最大の特徴は自動ローテーション機能で、RDS (MySQL、PostgreSQL、Oracle、SQL Server、MariaDB)、Redshift、DocumentDB のパスワードを、Lambda 関数を使用して自動的にローテーションできます。ローテーション間隔は 1 日から 365 日の範囲で設定可能です。
自動ローテーションの仕組み
Secrets Manager の自動ローテーションは、Lambda 関数が 4 つのステップで実行します。createSecret ステップで新しいパスワードを生成し、Secrets Manager に AWSPENDING ラベルで保存します。setSecret ステップでデータベースのパスワードを新しい値に変更します。testSecret ステップで新しいパスワードでデータベースに接続できることを確認します。finishSecret ステップで AWSPENDING ラベルを AWSCURRENT に変更し、古いパスワードを AWSPREVIOUS に移動します。RDS の場合、AWS が提供するローテーション用 Lambda 関数テンプレートを使用すれば、カスタムコードを書く必要はありません。ローテーション中のダウンタイムを防ぐため、マルチユーザーローテーション戦略 (2 つのユーザーを交互に使用) も提供されています。
Parameter Store との使い分け
Secrets Manager と Systems Manager Parameter Store はどちらもシークレットを保存できますが、用途が異なります。Secrets Manager は自動ローテーションが必要なシークレット (データベースパスワード、API キー) に最適です。料金はシークレット 1 件あたり月額 0.40 USD + API 呼び出し 10,000 件あたり 0.05 USD です。Parameter Store の SecureString は、ローテーション不要な設定値やシークレットに適しています。標準パラメータは無料で 10,000 件まで保存でき、高度なパラメータは有料ですがシークレットあたりの料金は Secrets Manager より安価です。実務では、RDS のパスワードは Secrets Manager で自動ローテーション、環境変数や設定値は Parameter Store、という使い分けが一般的です。Azure の対応サービスは Azure Key Vault で、同様にシークレットの保存とローテーションを提供します。
実務での活用パターン
Secrets Manager の最も重要な活用は、ソースコードからハードコードされた認証情報を排除することです。アプリケーションは起動時に Secrets Manager API を呼び出してシークレットを取得し、メモリ上で使用します。ECS のタスク定義では、環境変数の値として Secrets Manager の ARN を指定でき、コンテナ起動時に自動的にシークレットが注入されます。Lambda も同様に、環境変数として Secrets Manager のシークレットを参照できます。CloudFormation のテンプレートでも、動的参照 (resolve:secretsmanager:secret-id) を使用してシークレットの値を安全に参照できます。Secrets Manager の基礎から応用まで、書籍 (Amazon)で体系的に学べます。