SJ blog
security
A

信頼度ランク

S 公式ソース確認済み
A 成功実績多数・失敗例少数
B 賛否両論
C 動作未確認・セキュリティリスク高
Z 個人所感

Secrets Manager vs SSM Parameter Store — コスト・機能・ローテーションの使い分け

AWS Secrets ManagerとSSM Parameter Storeの機能比較、コスト差、シークレットの自動ローテーション、パラメータ階層、KMS統合、Lambda/ECS/EC2での参照パターンを解説。

一言結論

DBパスワードなど自動ローテーションが必要なシークレットにはSecrets Manager、大量の設定値の管理にはコスト効率の高いSSM Parameter Store(標準は無料)と使い分けるのが基本で、両サービスともECS・Lambda・EC2から直接参照できる。

2つのサービスの位置づけ

特徴Secrets ManagerSSM Parameter Store
主な用途データベース認証情報、APIキー設定値、パスワード、設定ファイル
自動ローテーション✅ ネイティブサポート❌ Lambda等で自前実装が必要
クロスアカウント✅ リソースポリシーで可能❌ 直接共有は不可
料金$0.40/シークレット/月 + API呼び出し料金標準: 無料、高度: $0.05/パラメータ/月
バージョン管理✅ 複数バージョン保持✅ バージョン管理あり
暗号化デフォルトでKMS標準: SSM固有、高度: KMS選択可
レプリケーション✅ マルチリージョンシークレット

SSM Parameter Storeの詳細

Standard(標準)パラメータ

# 標準パラメータ(無料、最大4KB)
aws ssm put-parameter \
  --name "/myapp/prod/db-password" \
  --value "mysecretpassword" \
  --type SecureString \
  --key-id alias/aws/ssm

# 階層型命名規則を使うと管理しやすい
/myapp/
  prod/
    db-host
    db-password
    api-key
  staging/
    db-host
    db-password

Advanced(高度)パラメータ

# 高度パラメータ($0.05/月、最大8KB、有効期限設定可)
aws ssm put-parameter \
  --name "/myapp/prod/large-config" \
  --value '{"key": "long value..."}' \
  --type SecureString \
  --tier Advanced \
  --policies '[{
    "Type": "Expiration",
    "Version": "1.0",
    "Attributes": {
      "Timestamp": "2026-12-31T00:00:00.000Z"
    }
  }]'

Secrets Managerの自動ローテーション

# RDS認証情報のローテーション設定
aws secretsmanager create-secret \
  --name "prod/myapp/rds-credentials" \
  --description "RDS credentials for prod" \
  --secret-string '{"username":"admin","password":"initial-password"}'

# ローテーション設定(30日ごと)
aws secretsmanager rotate-secret \
  --secret-id "prod/myapp/rds-credentials" \
  --rotation-lambda-arn arn:aws:lambda:ap-northeast-1:123456789012:function:SecretsManagerRotation \
  --rotation-rules AutomaticallyAfterDays=30

AWSが提供するマネージドローテーション(追加Lambda設定不要):

対応サービス:
  - Amazon RDS(MySQL, PostgreSQL, Oracle, SQL Server)
  - Amazon Redshift
  - Amazon DocumentDB
  - Amazon Aurora
  → "AWS managed rotation"を選択するだけで自動設定

アプリケーションでの参照

Lambda関数での参照(Secrets Manager)

import boto3
import json
from functools import lru_cache

# キャッシュで毎回APIを呼ばない(コスト削減)
@lru_cache(maxsize=10)
def get_secret(secret_name: str) -> dict:
    client = boto3.client('secretsmanager')
    response = client.get_secret_value(SecretId=secret_name)
    return json.loads(response['SecretString'])

def handler(event, context):
    # シークレットを取得(Lambdaの実行コンテキスト内でキャッシュ)
    db_creds = get_secret('prod/myapp/rds-credentials')
    
    conn = connect_db(
        host=db_creds['host'],
        user=db_creds['username'],
        password=db_creds['password']
    )

ECS Task DefinitionでのSSM参照

// ECSタスク定義でSSM Parameter Storeの値を環境変数として注入
{
  "containerDefinitions": [{
    "name": "app",
    "image": "my-app:latest",
    "secrets": [
      {
        "name": "DB_PASSWORD",
        "valueFrom": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/myapp/prod/db-password"
      },
      {
        "name": "API_KEY",
        "valueFrom": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:prod/api-key"
      }
    ]
  }]
}

選択基準

Secrets Manager を選ぶケース:
  - データベース認証情報(自動ローテーション活用)
  - 複数アカウントで共有が必要なシークレット
  - マルチリージョンのシークレット同期が必要
  - 定期的なキーローテーションが規制要件

SSM Parameter Store を選ぶケース:
  - 設定値(環境変数的な使い方)
  - コスト最優先(無料枠で収まるケース)
  - 階層型の設定管理(/app/env/key形式)
  - ローテーション不要のAPIキー等の静的値
  - 大量のパラメータ(Secrets Managerより安価)

試験頻出ポイント

シナリオ回答
RDSパスワードの自動ローテーションSecrets Manager
大量の設定値をコスト効率よく管理SSM Parameter Store(標準、無料)
クロスアカウントでシークレットを共有Secrets Manager(リソースポリシー)
ECS/Lambdaに安全に認証情報を渡す両方対応(ECSのsecretsフィールド)
マルチリージョンでシークレット同期Secrets Manager(マルチリージョンシークレット)

まとめ

ローテーションが必要な認証情報(DBパスワード等)にはSecrets Manager、設定値の管理にはSSM Parameter Storeと使い分けるのが基本だ。コスト観点ではSSM標準が無料で有利だが、シークレット管理の機能面ではSecrets Managerが圧倒的に高機能だ。