Systems Manager Parameter Store ハンズオン

設定値やシークレットを安全に一元管理し、EC2・Lambda から取得する

AWS Systems Manager Parameter Store AWS KMS AWS Lambda マネコン操作 入門〜中級 所要時間 45〜60 分 v1.0

📋 概要

このハンズオンでは、AWS Systems Manager の Parameter Store を使い、アプリケーションの設定値(DB ホスト名・API エンドポイントなど)や機密情報(DB パスワード・API キー)を安全に一元管理します。通常パラメータと暗号化された SecureString の違いを学び、Lambda から取得する実用パターンを実装します。

項目内容
所要時間45〜60 分
難易度入門〜中級
主要サービスSystems Manager(Parameter Store)、KMS、Lambda
前提リソースなし
課金目安標準パラメータは無料。SecureString の KMS 復号は微小。ほぼ無料

Parameter Store と Secrets Manager の違い

項目Parameter StoreSecrets Manager
料金標準は無料$0.40/シークレット/月
自動ローテーションなしあり(RDS 等と連携)
用途設定値全般 + 簡易シークレット本格的なシークレット管理
ℹ️ 使い分け

設定値やローテーション不要のシークレットは Parameter Store、DB パスワードの自動ローテーションが必要なら Secrets Manager、というのが基本的な使い分けです。このハンズオンでは無料の Parameter Store を扱います。

🏗️ 構成図

🔐 Parameter Store(階層構造で管理)
/handson/app/db-host (String)
/handson/app/db-password (SecureString = KMS 暗号化)
↓ GetParameter(IAM 認証 + KMS 復号)
Lambda / 🖥️ EC2 / 他のサービス
✅ アプリケーションが設定値・シークレットを取得
ℹ️ 階層型の命名規則

パラメータ名は /環境/アプリ/項目 のようにスラッシュで階層化できます(例: /handson/app/db-host)。GetParametersByPath/handson/app/ 配下を一括取得でき、環境ごとの設定管理に便利です。

✅ 前提条件

🔧 ステップ 1: 通常パラメータ(String)の作成

暗号化が不要な設定値を String 型で作成します。

1-1. コンソールで作成

手順
  1. Systems Manager コンソール → 左メニュー「アプリケーション管理」→「パラメータストア」
  2. 「パラメータの作成」をクリック
設定値
名前
/handson/app/db-host
階層
標準
タイプ
String
データタイプ
text
handson-db.xxxxxx.ap-northeast-1.rds.amazonaws.com

「パラメータの作成」をクリックします。

1-2. もう 1 つ作成(StringList)

カンマ区切りのリストを扱う StringList も作成してみます。

設定値
名前
/handson/app/allowed-ips
タイプ
StringList
10.0.0.0/16,192.168.1.0/24

🔧 ステップ 2: SecureString(暗号化パラメータ)の作成

DB パスワードなどの機密情報は SecureString 型で作成します。KMS で自動的に暗号化されます。

設定値
名前
/handson/app/db-password
タイプ
SecureString
KMS キーソース
現在のアカウント
KMS キー ID
alias/aws/ssm(デフォルトの AWS マネージドキー)
P@ssw0rd-Handson-2026!

「パラメータの作成」をクリックします。

ℹ️ SecureString の暗号化

SecureString はデフォルトの AWS マネージドキー(alias/aws/ssm)で暗号化されます。コンソールの値表示はデフォルトで「●●●●」とマスクされ、「復号化された値を表示」をクリックすると平文が見えます(KMS 復号権限が必要)。本番では専用のカスタマー管理キー(CMK)を使うとアクセス制御がより細かく行えます。

コンソールで値を確認

手順
  1. パラメータ一覧 → /handson/app/db-password をクリック
  2. 「値」が暗号化表示(●●●)になっている
  3. 「復号化された値を表示」をクリックすると平文が表示される

🔧 ステップ 3: CLI でパラメータを取得

CloudShell から各パラメータを取得します。

3-1. 通常パラメータの取得

aws ssm get-parameter --name /handson/app/db-host \ --query Parameter.Value --output text

3-2. SecureString の取得(復号なし/あり)

# 復号なし(暗号文のまま返る) aws ssm get-parameter --name /handson/app/db-password \ --query Parameter.Value --output text # 復号あり(--with-decryption で平文取得) aws ssm get-parameter --name /handson/app/db-password \ --with-decryption --query Parameter.Value --output text
✅ 確認

--with-decryption を付けると P@ssw0rd-Handson-2026! が平文で返ります。付けないと Base64 の暗号文が返ります。

3-3. パスで一括取得

aws ssm get-parameters-by-path \ --path /handson/app/ \ --recursive --with-decryption \ --query "Parameters[].{Name:Name,Value:Value}" --output table

/handson/app/ 配下のすべてのパラメータをまとめて取得できます。アプリ起動時に設定を一括ロードする用途で便利です。

🔧 ステップ 4: Lambda から Parameter Store を取得

実用的なパターンとして、Lambda 関数から Parameter Store の値を取得します。

4-1. Lambda 実行ロールの作成

手順
  1. IAM → ロール → 「ロールを作成」→ ユースケース「Lambda」
  2. ポリシー AmazonSSMReadOnlyAccess をアタッチ(Parameter Store 読み取り用)
  3. ロール名: handson-lambda-ssm-role → 作成
ℹ️ SecureString 取得には KMS 権限も必要

SecureString を --with-decryption で取得する場合、KMS の kms:Decrypt 権限が必要です。デフォルトの alias/aws/ssm キーの場合、AmazonSSMReadOnlyAccess に加えて KMS 復号権限が暗黙的に許可されるケースが多いですが、AccessDenied が出る場合はインラインポリシーで kms:Decrypt を追加してください。

4-2. Lambda 関数の作成

設定
関数名
handson-read-parameters
ランタイム
Python 3.12
実行ロール
handson-lambda-ssm-role

4-3. コード

import boto3

ssm = boto3.client('ssm')

def lambda_handler(event, context):
    # パスで一括取得(SecureString も復号)
    resp = ssm.get_parameters_by_path(
        Path='/handson/app/',
        Recursive=True,
        WithDecryption=True
    )

    params = {p['Name']: p['Value'] for p in resp['Parameters']}

    # db-host は普通に使い、パスワードはログに出さない
    print('db-host =', params.get('/handson/app/db-host'))
    print('db-password = ****(マスク)')

    return {
        'statusCode': 200,
        'db_host': params.get('/handson/app/db-host'),
        'param_count': len(params)
    }

「Deploy」をクリックして保存します。

4-4. テスト実行

手順
  1. 「テスト」タブ → イベント名 test → JSON は {} → 「テスト」
  2. 実行結果に "param_count": 3 と db-host の値が表示されれば成功
  3. 「ログ出力」に db-host の値が表示され、パスワードはマスクされていることを確認
✅ 確認

Lambda がコードにシークレットをハードコードせずに、実行時に Parameter Store から安全に取得できました。これがシークレット管理のベストプラクティスです。

🔧 ステップ 5: バージョン管理と履歴

Parameter Store はパラメータの変更履歴を自動的にバージョン管理します。

5-1. パラメータ値の更新

aws ssm put-parameter \ --name /handson/app/db-host \ --value "handson-db-v2.xxxxxx.ap-northeast-1.rds.amazonaws.com" \ --type String \ --overwrite

--overwrite を付けて更新するとバージョンが 2 に上がります。

5-2. 履歴の確認

aws ssm get-parameter-history \ --name /handson/app/db-host \ --query "Parameters[].{Version:Version,Value:Value,Modified:LastModifiedDate}" \ --output table

5-3. 特定バージョンの取得

# バージョン 1 を取得 aws ssm get-parameter --name "/handson/app/db-host:1" \ --query Parameter.Value --output text
✅ 確認

パラメータ名に :バージョン番号 を付けると過去の値を取得できます。設定変更の追跡やロールバックに使えます。コンソールでもパラメータ詳細の「履歴」タブで確認できます。

🧹 クリーンアップ

標準パラメータは無料ですが、検証用リソースを片付けます。

削除手順

  1. パラメータの削除
    CloudShell で一括削除: aws ssm delete-parameters --names \ /handson/app/db-host \ /handson/app/allowed-ips \ /handson/app/db-password またはコンソール → パラメータストア → 該当を選択 → 「削除」
  2. Lambda 関数の削除
    Lambda → handson-read-parameters → 削除
  3. IAM ロールの削除
    IAM → ロール → handson-lambda-ssm-role → 削除
✅ 削除確認

パラメータストアの一覧から /handson/app/ 配下のパラメータが消えていれば完了です。