目次
1.Secrets Managerとは
Secrets Manager(シークレット マネージャー)は、アプリが使う認証情報をまとめて管理する保管場所です。保存する秘密情報を「シークレット」と呼びます。
例えば、EC2上のアプリがデータベースへ接続するとき、プログラムの中にパスワードを直接書く代わりに、必要なタイミングでSecrets Managerから取得します。
保存しただけで、既存のアプリが自動的に使うわけではありません。アプリ側の取得処理、または対応サービスとの連携設定が必要です。
2. どんな情報を保存する?
| 情報 | 例 |
|---|---|
| DBの認証情報 | RDS・Aurora・Redshiftなどのユーザー名とパスワード |
| 外部サービスのAPIキー | 外部APIにアクセスするための秘密のキー |
| アプリの認証情報 | サービスアカウントのパスワード、OAuthトークンなど |
保存する内容のイメージ
シークレット名:prod/app/database。1つのシークレットに、複数の項目をJSON形式でまとめられます。以下は架空の例です。
{
"username": "app_user",
"password": "EXAMPLE_ONLY_NOT_A_REAL_PASSWORD",
"host": "db.example.internal",
"port": 5432,
"dbname": "appdb"
}
シークレット名や説明には、パスワードなどの秘密値を入れません。これらはログなどに表示される可能性があります。
3.EC2・Lambdaから使う流れ
- ① EC2のIAMロール/Lambdaの実行ロールで認証
- ② アプリがSecrets ManagerのAPIに取得要求GetSecretValue
- ③ 権限が許可されていれば、復号された秘密値をHTTPSで受け取る
- ④ 取得したユーザー名・パスワードでDBに接続
2種類の認証を区別します。
Secrets Managerに対してはIAMロールで認証し、DBに対しては取得したDBユーザー名・パスワードで認証します。EC2やLambdaに、長期のAWSアクセスキーを埋め込む必要はありません。
Secrets Managerが、通常のDB通信を中継するわけではありません。認証情報を取得したあと、アプリはDBへ直接接続します。
4.秘密情報を守る仕組み
| 仕組み | 役割 |
|---|---|
| IAM | 誰が、どのシークレットを取得・更新できるかを制御する |
| AWS KMS | 保存する秘密値を暗号化する。AWS管理キー、またはカスタマーマネージドキーを利用する |
| HTTPS/TLS | 取得時などの通信を暗号化する |
| CloudTrail | 取得などのAPI操作を監査する。秘密値そのものを記録するためのものではない |
取得の基本権限はsecretsmanager:GetSecretValueです。カスタマーマネージドKMSキーを使う場合は、対象キーのkms:Decrypt権限とキーポリシー側の許可も確認します。
5.パスワードのローテーションとは
認証情報を定期的に新しい値へ更新することです。DBパスワードなら、Secrets Manager内の値と、DB側の実際のパスワードを整合させて更新します。
- サービスによる管理ローテーション:対応する連携サービスが更新を管理する方式。
- Lambdaによるローテーション:Lambda関数がシークレットと接続先の認証情報を更新する方式。
方式や対応可否は、保存する情報と連携先によって異なります。外部サービスとの連携にも、対応した管理方式があります。
通常の取得では、現在の値を表すAWSCURRENTのバージョンが返ります。直前の値にはAWSPREVIOUSなどのラベルが使われます。
6.利用開始までの基本手順
- AWSコンソールでSecrets Managerを開き、利用するリージョンを選ぶ。
- 新しいシークレットを保存する操作から、DBの認証情報やその他のシークレットを選ぶ。
- ユーザー名・パスワードなどを入力し、暗号化に使うKMSキーを選ぶ。
- prod/app/databaseのような名前を付けて保存する。
- EC2のIAMロールやLambdaの実行ロールに、対象シークレットの取得権限を付ける。
- Secrets Managerと接続先DBへの通信経路を確認する。
- アプリに取得処理を組み込み、接続を確認する。必要に応じてローテーションを設定する。
画面の項目名は、シークレットの種類やコンソールの表示によって異なる場合があります。
7.取得するコマンド・プログラム例
AWS CLIから取得
取得権限のあるIAMロールなどで認証済みの環境で実行します。以下はLinuxのシェル用です。
aws secretsmanager get-secret-value \
--secret-id prod/app/database \
--region ap-northeast-1 \
--query SecretString \
--output text
--secret-idは取得する名前またはARN、--query SecretStringはレスポンスから文字列の秘密値だけを取り出す指定です。
Python(EC2・Lambdaなど)から取得 AWS SDK for Python(boto3)を使用する例です。秘密値は表示しません。
import json
import boto3
client = boto3.client("secretsmanager", region_name="ap-northeast-1")
response = client.get_secret_value(SecretId="prod/app/database")
secret = json.loads(response["SecretString"])
# DB接続処理へ渡す。printやログ出力はしない。
db_user = secret["username"]
db_password = secret["password"]
# この後、DBドライバーで接続する
JSON文字列として保存したシークレットを想定した基本例です。本番では、取得失敗時の処理、キャッシュ、ローテーション後の再取得なども設計します。
8.VPC・インターネットとの関係
シークレットを作成しても、秘密値がインターネット上に一般公開されるわけではありません。取得には認証と権限が必要です。
| 利用環境 | Secrets Managerへの通信 |
|---|---|
| VPCに接続していないLambda | AWSが提供する通信環境からAPIにアクセスできる。自分のVPCエンドポイントは必須ではない |
| VPC内のEC2/VPC接続Lambda | APIへ到達できる経路が必要。Interface VPCエンドポイント、またはNATなどの経路を用意する |
| インターネット経由を避けたいVPC | AWS PrivateLinkを使ったInterface VPCエンドポイントでプライベートにアクセスする |
東京リージョンのエンドポイントサービス名はcom.amazonaws.ap-northeast-1.secretsmanagerです。通信はHTTPS(TCP 443)を使い、エンドポイントのセキュリティグループやDNS設定も確認します。
DBへの経路は別途必要です。シークレットを取得できても、DB側のセキュリティグループやルーティングで接続が許可されていなければDBには接続できません。
9.KMS・Parameter Storeとの違い
| サービス | 主な役割 | 使う場面 |
|---|---|---|
| Secrets Manager | 秘密情報の保管・取得・ローテーション | DBパスワード、APIキーなどのライフサイクル管理 |
| AWS KMS | 暗号鍵の作成・管理、暗号化・復号の制御 | Secrets ManagerやS3などのデータを暗号化する基盤 |
| Systems Manager Parameter Store | 設定値の保管・取得。SecureStringで暗号化も可能 | 環境名、URL、リソースIDなどの設定管理 |
Parameter Storeにも秘密値は保存できますが、認証情報の自動ローテーションを含む管理にはSecrets Managerが適しています。KMSは、DBパスワードの保管庫そのものではありません。
10.料金と運用のポイント
主に保存するシークレットの数・期間とAPIリクエスト数に応じて課金されます。構成によって、Lambda、カスタマーマネージドKMSキー、VPCエンドポイントなどの料金も別途発生します。
最新単価はAWS公式料金ページで確認してください。
- IAM権限は、必要なシークレットと操作に絞る。
- アクセス頻度が高いアプリはキャッシュを利用し、取得回数と遅延を抑える。
- キャッシュの有効期間と、パスワード更新後の再取得方法を決める。
- CloudTrailで取得・変更などの操作を確認する。
- 秘密値をソースコード、Git、ログ、SQLファイルに直接残さない。
関連の記事
