設定値やシークレットを安全に一元管理し、EC2・Lambda から取得する
このハンズオンでは、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 |
|---|---|---|
| 料金 | 標準は無料 | $0.40/シークレット/月 |
| 自動ローテーション | なし | あり(RDS 等と連携) |
| 用途 | 設定値全般 + 簡易シークレット | 本格的なシークレット管理 |
設定値やローテーション不要のシークレットは Parameter Store、DB パスワードの自動ローテーションが必要なら Secrets Manager、というのが基本的な使い分けです。このハンズオンでは無料の Parameter Store を扱います。
パラメータ名は /環境/アプリ/項目 のようにスラッシュで階層化できます(例: /handson/app/db-host)。GetParametersByPath で /handson/app/ 配下を一括取得でき、環境ごとの設定管理に便利です。
暗号化が不要な設定値を String 型で作成します。
「パラメータの作成」をクリックします。
カンマ区切りのリストを扱う StringList も作成してみます。
DB パスワードなどの機密情報は SecureString 型で作成します。KMS で自動的に暗号化されます。
「パラメータの作成」をクリックします。
SecureString はデフォルトの AWS マネージドキー(alias/aws/ssm)で暗号化されます。コンソールの値表示はデフォルトで「●●●●」とマスクされ、「復号化された値を表示」をクリックすると平文が見えます(KMS 復号権限が必要)。本番では専用のカスタマー管理キー(CMK)を使うとアクセス制御がより細かく行えます。
CloudShell から各パラメータを取得します。
aws ssm get-parameter --name /handson/app/db-host \
--query Parameter.Value --output text
# 復号なし(暗号文のまま返る)
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 の暗号文が返ります。
aws ssm get-parameters-by-path \
--path /handson/app/ \
--recursive --with-decryption \
--query "Parameters[].{Name:Name,Value:Value}" --output table
/handson/app/ 配下のすべてのパラメータをまとめて取得できます。アプリ起動時に設定を一括ロードする用途で便利です。
実用的なパターンとして、Lambda 関数から Parameter Store の値を取得します。
AmazonSSMReadOnlyAccess をアタッチ(Parameter Store 読み取り用)handson-lambda-ssm-role → 作成SecureString を --with-decryption で取得する場合、KMS の kms:Decrypt 権限が必要です。デフォルトの alias/aws/ssm キーの場合、AmazonSSMReadOnlyAccess に加えて KMS 復号権限が暗黙的に許可されるケースが多いですが、AccessDenied が出る場合はインラインポリシーで kms:Decrypt を追加してください。
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」をクリックして保存します。
test → JSON は {} → 「テスト」"param_count": 3 と db-host の値が表示されれば成功Lambda がコードにシークレットをハードコードせずに、実行時に Parameter Store から安全に取得できました。これがシークレット管理のベストプラクティスです。
Parameter Store はパラメータの変更履歴を自動的にバージョン管理します。
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 に上がります。
aws ssm get-parameter-history \
--name /handson/app/db-host \
--query "Parameters[].{Version:Version,Value:Value,Modified:LastModifiedDate}" \
--output table
# バージョン 1 を取得
aws ssm get-parameter --name "/handson/app/db-host:1" \
--query Parameter.Value --output text
パラメータ名に :バージョン番号 を付けると過去の値を取得できます。設定変更の追跡やロールバックに使えます。コンソールでもパラメータ詳細の「履歴」タブで確認できます。
標準パラメータは無料ですが、検証用リソースを片付けます。
aws ssm delete-parameters --names \
/handson/app/db-host \
/handson/app/allowed-ips \
/handson/app/db-password
またはコンソール → パラメータストア → 該当を選択 → 「削除」
パラメータストアの一覧から /handson/app/ 配下のパラメータが消えていれば完了です。