概要
AWS Secrets Manager は、データベースの認証情報、API キー、OAuth トークンなどのシークレット(機密情報)を安全に保存・取得・ローテーションするためのマネージドサービスです。アプリケーションのソースコードや設定ファイルにシークレットをハードコードする必要がなくなり、セキュリティリスクを低減できます。
シークレットの管理は多くの組織で課題となっています。設定ファイルに平文で認証情報を記載したり、環境変数に API キーを設定したりする運用は、情報漏洩のリスクを高めます。Secrets Manager を利用することで、シークレットを一元管理し、アクセス制御とローテーションを自動化できます。
本記事では、Secrets Manager にシークレットを保存し、AWS CLI で取得する方法、および自動ローテーションの設定までを体験します。

この記事のメリット
- AWS Secrets Manager の基本的な仕組みとユースケースを理解できる
- シークレットの作成・保存・取得の手順を習得できる
- シークレットのバージョニングの仕組みを理解できる
- 自動ローテーションの設定方法を体験できる
- Systems Manager Parameter Store との使い分けを把握できる
執筆者とキャラクター紹介
執筆者:土肥(とひ)
株式会社ジェニュインの代表であり元エンジニア。これまでオンプレミスと AWS 環境のインフラ業務を担当。AWS 認定資格の学習で得た知識を、ハンズオンとともに解説するのが得意。直近では新人の教育も行っており、これから技術を学ぶ方が納得できる解説を心がけています。基礎編・Cloud Practitioner の記事では、解説役としても登場します。

クラウドおさる
クラウドおさるはじめましてでござる。弊猿はクラウドおさる。IT インフラが異常に発達した猿山から、雲に乗って地上の AWS を学びに降りてきたのでござる。



基礎編や Cloud Practitioner の記事では、とひさんに素朴な疑問をぶつける役でござるな。Security - Specialty などの記事では、要所でワンポイントや注意点をひとこと添えるでござる。



猿山にもデータセンターや監視当番があって、地上で起きることはだいたい猿山にも同じ仕組みがあるのでござる。例え話がつい猿山に寄るのは、弊猿の癖でござる。
技術解説



とひさん、AWS Secrets Manager ってどんなサービスなんですか?
Secrets Manager は、シークレットのライフサイクル全体を管理するサービスだよ。シークレットの保存時には AWS KMS で暗号化されて、取得時にはアクセス権限を持つプリンシパルだけが復号できるんだ。



似たようなサービスで Parameter Store っていうのも聞いたことがあるんですけど、何が違うんですか?
いい質問だね。AWS にはシークレットを管理するサービスとして、Secrets Manager のほかに Systems Manager Parameter Store があるんだ。比較するとこんな感じだよ。
| 項目 | Secrets Manager | Parameter Store |
|---|---|---|
| 自動ローテーション | 組み込みサポート | Lambda で独自実装が必要 |
| 料金 | シークレットあたり月額 0.40 USD + API コール課金 | Standard パラメータは無料 |
| クロスアカウント共有 | リソースベースポリシーで可能 | Advanced パラメータのみ AWS RAM で共有可能 |
| 暗号化 | KMS による暗号化(必須) | KMS による暗号化(SecureString のみ) |
| バージョニング | 組み込みサポート(ステージングラベル) | 組み込みサポート |
| 最大サイズ | 65,536 バイト(64 KB) | 4 KB(Standard)/ 8 KB(Advanced) |



なるほど、ローテーションとクロスアカウント共有が大きな違いなんですね!
そうだね。データベース認証情報のように定期的なローテーションが必要なシークレットには Secrets Manager が適しているよ。設定値の管理やコストを抑えたい場合は Parameter Store が適しているんだ。



シークレットの値を更新したとき、前の値はどうなるんですか?
Secrets Manager では、シークレットの値を更新すると自動的にバージョンが作成されるんだ。各バージョンにはステージングラベルが付与されるよ。
| ステージングラベル | 説明 |
|---|---|
AWSCURRENT | 現在アクティブなバージョン。デフォルトで取得されるバージョン |
AWSPREVIOUS | 1 つ前のバージョン。ロールバックに使用可能 |
AWSPENDING | ローテーション中の新しいバージョン。ローテーション完了後に AWSCURRENT になる |





前のバージョンも残るから、何かあったときにロールバックできるんですね。
その通りだよ。次に自動ローテーションについて説明するね。Secrets Manager は、Lambda 関数を使用してシークレットを自動的にローテーションできるんだ。Amazon RDS、Amazon Redshift、Amazon DocumentDB のデータベース認証情報については、Secrets Manager が Lambda 関数を自動的に作成・設定してくれるよ。



ローテーションって具体的にどういう流れで進むんですか?
ローテーションのプロセスは以下の 4 つのステップで構成されるんだ。
- createSecret: 新しいバージョンのシークレットを作成し、
AWSPENDINGラベルを付与 - setSecret: データベースなどのサービス側で新しい認証情報を設定
- testSecret: 新しい認証情報でアクセスできることをテスト
- finishSecret:
AWSPENDINGをAWSCURRENTに変更し、古いバージョンをAWSPREVIOUSに変更



テストまで自動でやってくれるんですね!安心感がありますね。



ところで、複数のアカウントでシークレットを共有したい場合はどうすればいいんですか?
Secrets Manager では、シークレットにリソースベースポリシーを設定することで、他の AWS アカウントからのアクセスを許可できるんだ。これにより、マルチアカウント環境でシークレットを安全に共有できるよ。



なるほど、リソースベースポリシーでクロスアカウントのアクセスを制御できるんですね。
実践
前提条件
- リージョン:
ap-northeast-1(東京) - Secrets Manager を操作できる IAM 権限があること
- AWS CLI がインストール済みで、認証情報が設定されていること
作成するリソース一覧
| リソース種別 | リソース名 | 用途 |
|---|---|---|
| シークレット | handson/db-credentials | データベース認証情報を格納するシークレット |
| シークレット | handson/api-key | API キーを格納するシークレット |
ステップ1: シークレットの作成(キー/値ペア)
AWS マネジメントコンソールにログインし、リージョンが ap-northeast-1(東京)であることを確認します。
上部の検索バーに Secrets Manager と入力し、表示された「Secrets Manager」を選択します。
「新しいシークレットを保存する」をクリックします。シークレットの保存ウィザードは 4 ステップ構成です。
ステップ 1: シークレットのタイプを選択
- シークレットのタイプ:
その他のシークレットのタイプ(API キー、OAuth トークン、その他。)を選択
キー/値のペア
「キー/値」タブが選択された状態で、以下のキー/値ペアを入力します。
- キー:
username/ 値:admin
「+ 行を追加」をクリックしてもう 1 つ追加します。
- キー:
password/ 値:MySecurePassword123!
「暗号化キー」はデフォルト(aws/secretsmanager)のままにします。


「次」をクリックします。
ステップ 2: シークレットを設定
- シークレットの名前:
handson/db-credentials - 説明 – オプション:
ハンズオン用のデータベース認証情報
「タグ」「リソースのアクセス許可」「シークレットをレプリケート」はデフォルトのままにします。


「次」をクリックします。
ステップ 3: ローテーションを設定する(オプション)
今回はローテーションを後のステップで確認するため、「自動ローテーション」は無効のまま「次」をクリックします。
ステップ 4: レビュー
設定内容を確認し、「保存」をクリックします。
一覧画面に戻り、上部に「シークレットは正常に保存されました handson/db-credentials。」と表示されます。一覧に反映されていない場合は、一覧右上の更新アイコンをクリックします。フィルター欄に handson と入力すると作成したシークレットだけを表示できます。


ステップ2: シークレットの詳細を確認する
作成した handson/db-credentials をクリックして詳細画面を開きます。
「シークレットの詳細」で以下の情報を確認します。
- シークレットの名前:
handson/db-credentials - シークレットの ARN: シークレットの Amazon リソースネーム(末尾に 6 文字のランダムな接尾辞が付きます)
- 暗号化キー:
aws/secretsmanager(AWS マネージドキー) - シークレットの説明: 入力した説明
「ローテーション」タブでは、ローテーションステータスが 無効 であることが確認できます。
「概要」タブの「シークレットの値」セクションで「シークレットの値を取得する」をクリックすると、保存したキー/値ペアが復号されて表示されます。


ステップ3: AWS CLI でシークレットを取得する
アプリケーションからシークレットを取得するケースを想定して、AWS CLI でシークレットの値を取得します。
aws secretsmanager get-secret-value \
--secret-id handson/db-credentials \
--region ap-northeast-1
以下のようなレスポンスが返ります。
{
"ARN": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:handson/db-credentials-xxxxxx",
"Name": "handson/db-credentials",
"VersionId": "xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
"SecretString": "{\"username\":\"admin\",\"password\":\"MySecurePassword123!\"}",
"VersionStages": [
"AWSCURRENT"
],
"CreatedDate": "2026-03-23T..."
}
SecretString フィールドにシークレットの値が JSON 形式で格納されています。VersionStages が AWSCURRENT であることから、現在のアクティブなバージョンであることがわかります。
シークレットの値だけを取得する場合は、--query オプションを使用します。
aws secretsmanager get-secret-value \
--secret-id handson/db-credentials \
--query SecretString \
--output text \
--region ap-northeast-1
ステップ4: シークレットの値を更新する
シークレットの値を更新し、バージョニングの動作を確認します。
aws secretsmanager update-secret \
--secret-id handson/db-credentials \
--secret-string '{"username":"admin","password":"NewPassword456!"}' \
--region ap-northeast-1
更新後、コンソールでシークレットの詳細画面を開き(表示中ならブラウザを再読み込みし)、「シークレットの値」セクションで「シークレットの値を取得する」をクリックすると、パスワードが NewPassword456! に更新されていることを確認できます。「バージョン」タブでは、AWSCURRENT と AWSPREVIOUS の 2 つのバージョンが確認できます。
バージョンの確認
AWS CLI で、以前のバージョンのシークレットを取得します。
aws secretsmanager get-secret-value \
--secret-id handson/db-credentials \
--version-stage AWSPREVIOUS \
--region ap-northeast-1
AWSPREVIOUS を指定することで、更新前のパスワード MySecurePassword123! が取得できます。
ステップ5: プレーンテキストのシークレットを作成する
API キーのように単一の値を保存する場合は、プレーンテキスト形式でシークレットを作成できます。
コンソールのシークレット一覧で「新しいシークレットを保存する」をクリックします。
- シークレットのタイプ:
その他のシークレットのタイプ - 「キー/値のペア」で「プレーンテキスト」タブを選択し、以下の値を入力します
sk-handson-api-key-1234567890abcdef
「次」をクリックします。
- シークレットの名前:
handson/api-key - 説明 – オプション:
ハンズオン用の API キー
「次」→「次」→「保存」をクリックします。
AWS CLI で作成する場合は、以下のコマンドでも同じ結果になります。
aws secretsmanager create-secret \
--name handson/api-key \
--description "ハンズオン用の API キー" \
--secret-string "sk-handson-api-key-1234567890abcdef" \
--region ap-northeast-1
ステップ6: シークレットのローテーション設定
シークレットの自動ローテーション設定を確認します。
handson/db-credentials シークレットの詳細画面を開き、「ローテーション」タブを選択します。
「ローテーション構成」セクションで「ローテーションを編集」をクリックします。
「ローテーション設定を編集する」ダイアログが表示されます。
- 自動ローテーション: トグルを有効にします
- ローテーションスケジュール: 「スケジュール式ビルダー」で時間単位(時間 / 日)と間隔を指定します。
cron()やrate()の「スケジュール式」で指定することもできます - ウィンドウ期間: ローテーションを実行してよい時間幅(オプション)
- ローテーション関数: 「Lambda ローテーション関数」でローテーション用の Lambda 関数を選択します
「その他のシークレットのタイプ」では Lambda 関数を自動作成するオプションはなく、「作成機能」リンクから自分で Lambda 関数を用意する必要があります。Amazon RDS などサポートされたデータベースの認証情報では、シークレット作成時に Secrets Manager が Lambda 関数を自動作成できます。


本ハンズオンでは、ローテーション用の Lambda 関数やデータベースは用意していないため、設定画面の確認のみとします。実際にローテーションを動作させるには、対象のデータベースとローテーション用の Lambda 関数が必要です。
「Cancel」をクリックして設定画面を閉じます。
ステップ7: リソースベースポリシーの設定
シークレットにリソースベースポリシーを設定して、アクセス制御を確認します。
handson/db-credentials シークレットの詳細画面(「概要」タブ)で「リソースのアクセス許可 – オプション」セクションの「許可を編集」をクリックします。
「リソースのアクセス許可を編集する」画面のポリシーエディタに雛形が入っているので、内容を以下のポリシーに置き換えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<アカウントID>:root"
},
"Action": "secretsmanager:GetSecretValue",
"Resource": "*"
}
]
}
<アカウントID> は自身の AWS アカウント ID に置き換えてください。エディタ右下の「エラー: 0」を確認します。


「保存」をクリックします。詳細画面の「リソースのアクセス許可」に保存したポリシーが表示されます。
このポリシーにより、指定したアカウントからシークレットの値を取得できるようになります。クロスアカウントアクセスを設定する場合は、Principal に別のアカウント ID を指定します。
まとめ
- AWS Secrets Manager はシークレットの保存・取得・ローテーションを行うマネージドサービスである
- シークレットは KMS で暗号化され、IAM で取得権限を制御できる
- キー/値ペアまたはプレーンテキスト形式でシークレットを保存できる
- バージョニングにより、シークレットの更新履歴を管理し、
AWSPREVIOUSで前のバージョンを取得できる - Lambda 関数を使用した自動ローテーションにより、定期的にシークレットを更新できる
- リソースベースポリシーにより、クロスアカウントでのシークレット共有が可能である
- Parameter Store と比較して、自動ローテーションとクロスアカウント共有が組み込みでサポートされている











