【AWSサービス 基礎編】AWS Secrets Manager でシークレットを安全に保存しローテーションする

目次

概要

AWS Secrets Manager は、データベースの認証情報、API キー、OAuth トークンなどのシークレット(機密情報)を安全に保存・取得・ローテーションするためのマネージドサービスです。アプリケーションのソースコードや設定ファイルにシークレットをハードコードする必要がなくなり、セキュリティリスクを低減できます。

シークレットの管理は多くの組織で課題となっています。設定ファイルに平文で認証情報を記載したり、環境変数に API キーを設定したりする運用は、情報漏洩のリスクを高めます。Secrets Manager を利用することで、シークレットを一元管理し、アクセス制御とローテーションを自動化できます。

本記事では、Secrets Manager にシークレットを保存し、AWS CLI で取得する方法、および自動ローテーションの設定までを体験します。

AWS Secrets Manager でシークレットを保存し、アプリケーションから取得・自動ローテーションする流れの図解
AWS Secrets Manager でシークレットを保存し、アプリケーションから取得・自動ローテーションする流れの図解

この記事のメリット

  • 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 ManagerParameter 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現在アクティブなバージョン。デフォルトで取得されるバージョン
AWSPREVIOUS1 つ前のバージョン。ロールバックに使用可能
AWSPENDINGローテーション中の新しいバージョン。ローテーション完了後に AWSCURRENT になる
シークレットのバージョニングとステージングラベルの遷移図
シークレットのバージョニングとステージングラベルの遷移図
クラウドおさる

前のバージョンも残るから、何かあったときにロールバックできるんですね。

土肥

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

クラウドおさる

ローテーションって具体的にどういう流れで進むんですか?

土肥

ローテーションのプロセスは以下の 4 つのステップで構成されるんだ。

  1. createSecret: 新しいバージョンのシークレットを作成し、AWSPENDING ラベルを付与
  2. setSecret: データベースなどのサービス側で新しい認証情報を設定
  3. testSecret: 新しい認証情報でアクセスできることをテスト
  4. finishSecret: AWSPENDING を AWSCURRENT に変更し、古いバージョンを AWSPREVIOUS に変更
クラウドおさる

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

クラウドおさる

ところで、複数のアカウントでシークレットを共有したい場合はどうすればいいんですか?

土肥

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

クラウドおさる

なるほど、リソースベースポリシーでクロスアカウントのアクセスを制御できるんですね。

新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方を募集しています。プログラミング未経験から入社して活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

実践

前提条件

  • リージョン: ap-northeast-1(東京)
  • Secrets Manager を操作できる IAM 権限があること
  • AWS CLI がインストール済みで、認証情報が設定されていること

作成するリソース一覧

リソース種別リソース名用途
シークレットhandson/db-credentialsデータベース認証情報を格納するシークレット
シークレットhandson/api-keyAPI キーを格納するシークレット

ステップ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 マネージドキー)
  • シークレットの説明: 入力した説明

「ローテーション」タブでは、ローテーションステータスが 無効 であることが確認できます。

「概要」タブの「シークレットの値」セクションで「シークレットの値を取得する」をクリックすると、保存したキー/値ペアが復号されて表示されます。

シークレットの値を表示した画面(username と password が表示されている状態)
シークレットの値を表示した画面(username と password が表示されている状態)

ステップ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 と比較して、自動ローテーションとクロスアカウント共有が組み込みでサポートされている

参照先

キャリア相談
クラウドおさる

独学の先に、AWS の仕事がある ── ジュニアおさるのキャリア相談

CLF には受かったけれど、次に何をすればいいのか分からない。独学で AWS を学ぶジュニアおさるの相談に、株式会社ジェニュイン代表の土肥が答えています。

  • ✓資格はゴールか、CLF の次に何から手を付けるか
  • ✓EC2 の次に作ってみる構成と、IaC・コスト管理
  • ✓実務経験ゼロでも、面接で話せる「これまで」の作り方
新卒・未経験の方へ
クラウドおさる

AWS を仕事にしたい方へ ── 新卒・未経験から

この記事を書いているのは、AWS の設計・構築を仕事にしている現役エンジニアです。運営元の株式会社ジェニュインでは、新卒・未経験の方を募集しています。プログラミング未経験から入社して活躍しているメンバーもいます。

  • ✓システム開発・WEB エンジニア / インフラ構築などの職種で、未経験から応募できます
  • ✓未経験から入社した社員の声を含む社員アンケートを掲載
  • ✓応募フォームから 1 分で応募できます

この記事が気に入ったら
フォローしてね!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

株式会社ジェニュイン(https://genuine-pt.jp)の代表取締役.

2018年〜インフラエンジニアとしてキャリアをスタートし、オンプレミスのネットワーク・サーバ環境で3年半、クラウド環境で4年半の8年間エンジニアとして従事。
2021年に佐藤氏の創業した株式会社Luxyを引き継ぎ、代表に就任。
その後アガルートグループ内の株式会社ジェニュインと合併。
合併後同社代表に就任。

目次