Parameter Store とは、AWS Systems Manager(SSM)に含まれる、設定値やパスワードを「名前と値の組」で保管しておく機能です。 接続先のホスト名のような設定は平文の String、パスワードのような値は暗号化される SecureString として登録し、アプリやスクリプトから名前を指定して取り出します。/app/prod/db/password のようにスラッシュで区切った階層の名前を付けられるので、環境ごとの設定をまとめて取得できます。

この記事では、put-parameter・get-parameter・get-parameters・get-parameters-by-path・delete-parameter を AWS CLI と boto3 の両方で実行し、出力をそのまま載せています。 --with-decryption の有無で SecureString の値がどう変わるか、--overwrite を付け忘れたときの ParameterAlreadyExists、10 件上限のエラーなども再現しました。後半では Secrets Manager との違いを機能の比較表と判断表にまとめ、同じ値を両方の CLI で取るコマンドを並べます。

確認環境:Ubuntu 24.04、AWS CLI 1.46.1、boto3 1.43.103、Python 3.11。AWS の API をローカルで再現するツール(moto 5.2.3)で実行しました。掲載するコマンドは、ローカル向けの接続先指定を外して AWS でそのまま使える形にしています。アカウント ID は例示用の 123456789012 です。

Parameter Store の早見表(やりたいこと → CLI と boto3)

5 つの基本操作を、CLI と boto3 で並べた表です。 boto3 は ssm = boto3.client("ssm") を作った前提です。

やりたいこと AWS CLI boto3
登録する aws ssm put-parameter --name 名前 --value 値 --type String ssm.put_parameter(Name=..., Value=..., Type="String")
上書きする 上に --overwrite を足す Overwrite=True を足す
1 件取得する aws ssm get-parameter --name 名前 ssm.get_parameter(Name=...)
暗号化された値を復号して取得する 上に --with-decryption を足す WithDecryption=True を足す
値だけを取り出す --query Parameter.Value --output text ["Parameter"]["Value"]
複数の名前を指定して取得する(10 件まで) aws ssm get-parameters --names 名前1 名前2 ssm.get_parameters(Names=[...])
階層の配下をまとめて取得する aws ssm get-parameters-by-path --path /app/prod --recursive ssm.get_parameters_by_path(Path=..., Recursive=True)
過去のバージョンを取得する aws ssm get-parameter --name 名前:1 ssm.get_parameter(Name="名前:1")
履歴を見る aws ssm get-parameter-history --name 名前 ssm.get_parameter_history(Name=...)
一覧を見る(値なし) aws ssm describe-parameters ssm.describe_parameters()
1 件削除する aws ssm delete-parameter --name 名前 ssm.delete_parameter(Name=...)
複数削除する aws ssm delete-parameters --names 名前1 名前2 ssm.delete_parameters(Names=[...])

パラメータの型は 3 種類です。

型 入れるもの 保存のされ方 値の例
String 環境名、エンドポイントの URL、リソースの ID などの平文 平文 db.example.internal
StringList カンマ区切りの平文の一覧 平文(1 つの文字列) a.example.com,b.example.com
SecureString 暗号化して持ちたい設定値 AWS KMS で暗号化 S3cret-Pass!

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Parameter Storeの使い方|Secrets Managerとの違い」

登録する:put-parameter と 3 つの型

put-parameter には、名前(--name)・値(--value)・型(--type)の 3 つを渡します。 まず String から登録します。

aws ssm put-parameter --name /app/prod/db/host \
  --value db.example.internal --type String
{
    "Version": 1,
    "Tier": "Standard"
}

返ってくるのはバージョン番号と層(Tier)だけです。続けて SecureString と StringList も登録します。

aws ssm put-parameter --name /app/prod/db/password \
  --value 'S3cret-Pass!' --type SecureString

aws ssm put-parameter --name /app/prod/allowed-hosts \
  --value 'a.example.com,b.example.com' --type StringList

aws ssm put-parameter --name /app/prod/db/port \
  --value 5432 --type String --description 'DB port'

どれも同じ形の JSON("Version": 1)が返ります。SecureString は --key-id を付けなければ、アカウントに用意されている既定の KMS キー(alias/aws/ssm)で暗号化されます。

新しく作るときは --type が必須です。付け忘れると次のように止まります。

aws ssm put-parameter --name /app/prod/y --value 1
An error occurred (ValidationException) when calling the PutParameter operation: A parameter type is required when you create a parameter.

型の名前を間違えたときは、使える 3 つの値を教えてくれます。

An error occurred (ValidationException) when calling the PutParameter operation: 1 validation error detected: Value 'Secure' at 'type' failed to satisfy constraint: Member must satisfy enum value set: [SecureString, StringList, String]

標準とアドバンストの 2 つの層

出力にあった "Tier": "Standard" は、パラメータの層です。AWS Systems Manager ユーザーガイド(Managing parameter tiers)の比較を表にします。

項目 標準(Standard) アドバンスト(Advanced)
登録できる数(アカウント・リージョンごと) 10,000 100,000
値の最大サイズ 4 KB 8 KB
パラメータポリシー(期限の通知など) 使えない 使える
他の AWS アカウントとの共有 使えない 使える
料金 追加料金なし 料金がかかる

標準からアドバンストへは上げられますが、アドバンストから標準へは戻せません。まずは標準で始めるのがよい選び方です。

取得する:get-parameter と --with-decryption

get-parameter は名前を 1 つ指定して、値とメタ情報を返します。

aws ssm get-parameter --name /app/prod/db/host
{
    "Parameter": {
        "Name": "/app/prod/db/host",
        "Type": "String",
        "Value": "db.example.internal",
        "Version": 1,
        "LastModifiedDate": 1791020500.675,
        "ARN": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/app/prod/db/host",
        "DataType": "text"
    }
}

ARN は parameter のあとに名前がそのまま続く形(parameter/app/prod/db/host)です。IAM ポリシーの Resource を書くときに使います。

--with-decryption の有無で SecureString の値が変わる

SecureString は、--with-decryption を付けたときだけ元の値が返ります。 まず付けない場合です。

aws ssm get-parameter --name /app/prod/db/password
{
    "Parameter": {
        "Name": "/app/prod/db/password",
        "Type": "SecureString",
        "Value": "kms:alias/aws/ssm:S3cret-Pass!",
        "Version": 1,
        "LastModifiedDate": 1791020502.172,
        "ARN": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/app/prod/db/password",
        "DataType": "text"
    }
}

Value が登録した値と違っています。今回のローカル再現ツールは、暗号化の代わりに kms:キー名: を前に付けた文字列を返します。AWS では、ここに KMS で暗号化された文字列が入ります。どちらにしても、そのままアプリに渡すと接続できない値です。

次に --with-decryption を付けます。

aws ssm get-parameter --name /app/prod/db/password --with-decryption
{
    "Parameter": {
        "Name": "/app/prod/db/password",
        "Type": "SecureString",
        "Value": "S3cret-Pass!",
        "Version": 1,
        "LastModifiedDate": 1791020502.172,
        "ARN": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/app/prod/db/password",
        "DataType": "text"
    }
}
指定 SecureString の Value String・StringList の Value
--with-decryption なし 暗号化されたままの文字列 登録した値
--with-decryption あり 登録した値(復号済み) 登録した値(指定は無視される)

AWS CLI のリファレンスにも、このオプションは String と StringList では無視されると書かれています。型を気にせず、取得するときは常に --with-decryption を付けておくと迷いません。

値だけを取り出してシェル変数に入れる

スクリプトで使うときは、--query で値だけに絞り、--output text で引用符を外します。

aws ssm get-parameter --name /app/prod/db/password \
  --with-decryption --query Parameter.Value --output text
S3cret-Pass!
DB_PASSWORD=$(aws ssm get-parameter --name /app/prod/db/password \
  --with-decryption --query Parameter.Value --output text)

StringList は、get-parameter で取得するとカンマ区切りの 1 つの文字列("Value": "a.example.com,b.example.com")として返ります。分割はアプリ側で行います。

複数を取得する:get-parameters(名前を並べる)

get-parameters は名前を複数並べて一度に取得します。見つからなかった名前はエラーにならず、InvalidParameters に入ります。

aws ssm get-parameters \
  --names /app/prod/db/host /app/prod/db/port /app/prod/nothing
{
    "Parameters": [
        {
            "Name": "/app/prod/db/host",
            "Type": "String",
            "Value": "db.example.internal",
            "Version": 1,
            "LastModifiedDate": 1791020500.675,
            "ARN": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/app/prod/db/host",
            "DataType": "text"
        },
        {
            "Name": "/app/prod/db/port",
            "Type": "String",
            "Value": "5432",
            "Version": 1,
            "LastModifiedDate": 1791020505.132,
            "ARN": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/app/prod/db/port",
            "DataType": "text"
        }
    ],
    "InvalidParameters": [
        "/app/prod/nothing"
    ]
}

get-parameter(単数)は見つからないとエラーになりますが、get-parameters(複数)は正常終了します。名前の打ち間違いに気づけるよう、InvalidParameters が空かどうかを確認するのがおすすめです。

名前と値だけを表形式で取り出す書き方も便利です。

aws ssm get-parameters \
  --names /app/prod/db/host /app/prod/db/password --with-decryption \
  --query 'Parameters[].[Name,Value]' --output text
/app/prod/db/host   db.example.internal
/app/prod/db/password   S3cret-Pass!

階層で設計して一括取得する:get-parameters-by-path

名前を /アプリ/環境/部品/項目 のようにスラッシュで区切っておくと、環境ごと・部品ごとにまとめて取得できます。 今回の登録内容は次の階層になっています。

/app
└── /prod
    ├── allowed-hosts        (StringList)
    ├── log-level            (String)
    └── /db
        ├── host             (String)
        ├── password         (SecureString)
        └── port             (String)
階層 例 ねらい
1 段目 /app アプリやシステムの名前。IAM ポリシーでアプリ単位に絞れる
2 段目 /prod、/dev 環境。同じコードでパスの先頭だけ切り替える
3 段目 /db、/api 部品。部品ごとにまとめて取得する
4 段目 host、password 項目名。アプリの設定キーと対応させる

--recursive の有無で取れる範囲が変わる

--recursive を付けないと、指定したパスの直下だけが返ります。

aws ssm get-parameters-by-path --path /app/prod --query 'Parameters[].Name'
[
    "/app/prod/allowed-hosts",
    "/app/prod/log-level"
]

--recursive を付けると、下の階層もすべて返ります(並び順は名前順とは限りません)。

aws ssm get-parameters-by-path --path /app/prod --recursive \
  --query 'Parameters[].Name'
[
    "/app/prod/db/port",
    "/app/prod/allowed-hosts",
    "/app/prod/log-level",
    "/app/prod/db/host",
    "/app/prod/db/password"
]

--with-decryption と組み合わせて、型と値を一覧にした例です。

aws ssm get-parameters-by-path --path /app/prod/db --recursive \
  --with-decryption \
  --query 'Parameters[].[Name,Type,Value]' --output table
------------------------------------------------------------------
|                       GetParametersByPath                      |
+------------------------+---------------+-----------------------+
|  /app/prod/db/port     |  String       |  5432                 |
|  /app/prod/db/host     |  String       |  db.example.internal  |
|  /app/prod/db/password |  SecureString |  S3cret-Pass!         |
+------------------------+---------------+-----------------------+

取得した階層を環境変数にする

配下の値をまとめて export 文にするシェルの例です。項目名を大文字にして DB_ を前に付けています。

aws ssm get-parameters-by-path --path /app/prod/db --with-decryption \
  --query 'Parameters[].[Name,Value]' --output text |
while IFS=$'\t' read -r n v; do
  k=$(basename "$n" | tr 'a-z-' 'A-Z_')
  echo "export DB_$k='$v'"
done
export DB_PORT='5432'
export DB_HOST='db.example.internal'
export DB_PASSWORD='S3cret-Pass!'

更新する:--overwrite とバージョン、ラベル

すでにある名前へ put-parameter すると、--overwrite を付けない限り ParameterAlreadyExists で止まります。 うっかり上書きを防ぐための動きです。

aws ssm put-parameter --name /app/prod/db/host \
  --value db2.example.internal --type String
An error occurred (ParameterAlreadyExists) when calling the PutParameter operation: The parameter already exists. To overwrite this value, set the overwrite option in the request to true.

--overwrite を付けると更新され、バージョンが 1 つ上がります。

aws ssm put-parameter --name /app/prod/db/host \
  --value db2.example.internal --type String --overwrite
{
    "Version": 2,
    "Tier": "Standard"
}

上書きのときは --type を省いても通り、型は String のまま引き継がれました。

aws ssm put-parameter --name /app/prod/db/host \
  --value db3.example.internal --overwrite
{
    "Version": 3,
    "Tier": "Standard"
}

過去の値を見る・取り出す

名前のあとに :番号 を付けると、そのバージョンの値を取得できます。

aws ssm get-parameter --name /app/prod/db/host:1 --query Parameter.Value
"db.example.internal"

履歴の一覧は get-parameter-history です。

aws ssm get-parameter-history --name /app/prod/db/host \
  --query 'Parameters[].[Version,Value]' --output table
-------------------------------
|     GetParameterHistory     |
+---+-------------------------+
|  1|  db.example.internal    |
|  2|  db2.example.internal   |
|  3|  db3.example.internal   |
+---+-------------------------+

Parameter Store は、パラメータごとに直近 100 バージョンを保持します(AWS Systems Manager ユーザーガイド)。

バージョンに名前(ラベル)を付けておくと、番号を覚えなくても取り出せます。

aws ssm label-parameter-version --name /app/prod/db/host \
  --parameter-version 2 --labels stable
{
    "InvalidLabels": [],
    "ParameterVersion": 2
}
aws ssm get-parameter --name /app/prod/db/host:stable --query Parameter.Value
"db2.example.internal"
書き方 取得できる値
名前 最新のバージョン
名前:2 バージョン 2
名前:stable stable というラベルが付いたバージョン

一覧と削除:describe-parameters、delete-parameter

describe-parameters は、値を含まない一覧(名前・型・バージョンなど)を返します。 何が登録されているかを確かめる用途に向いています。

aws ssm describe-parameters \
  --query 'Parameters[].[Name,Type,Version,Tier]' --output table
--------------------------------------------------------------
|                     DescribeParameters                     |
+--------------------------+----------------+----+-----------+
|  /app/prod/db/port       |  String        |  1 |  Standard |
|  /app/prod/allowed-hosts |  StringList    |  1 |  Standard |
|  /app/prod/log-level     |  String        |  1 |  Standard |
|  /app/prod/db/host       |  String        |  3 |  Standard |
|  /app/prod/db/password   |  SecureString  |  1 |  Standard |
|  /app/dev/db/host        |  String        |  1 |  Standard |
+--------------------------+----------------+----+-----------+

名前の前方一致で絞り込むときは --parameter-filters Key=Name,Option=BeginsWith,Values=/app/prod/db を付けます(/app/prod/db/ 配下の 3 件だけが返りました)。

削除は delete-parameter です。成功すると何も出力しません。

aws ssm delete-parameter --name /app/dev/db/host

同じコマンドをもう一度実行すると、すでに無いので ParameterNotFound になります。

An error occurred (ParameterNotFound) when calling the DeleteParameter operation: Parameter /app/dev/db/host not found.

複数まとめて消す delete-parameters は、消せた名前を DeletedParameters、無かった名前を InvalidParameters に入れて返します。

aws ssm delete-parameters --names /app/prod/old-key /app/prod/nothing
{
    "DeletedParameters": [
        "/app/prod/old-key"
    ],
    "InvalidParameters": [
        "/app/prod/nothing"
    ]
}

boto3 で登録・取得・一括取得・削除を通す

Python からは、CLI のオプション名を「先頭大文字のキーワード引数」に置き換えると同じ操作になります(--with-decryption → WithDecryption=True)。登録から削除までを 1 つのファイルにまとめました。

import boto3
from botocore.exceptions import ClientError

ssm = boto3.client("ssm", region_name="ap-northeast-1")

# 1. 登録(put_parameter)
ssm.put_parameter(Name="/shop/prod/api/url", Value="https://api.example.com", Type="String", Overwrite=True)
ssm.put_parameter(Name="/shop/prod/api/token", Value="tok-12345", Type="SecureString", Overwrite=True)

# 2. 1件取得(get_parameter)
p = ssm.get_parameter(Name="/shop/prod/api/token", WithDecryption=True)["Parameter"]
print("1件:", p["Name"], p["Type"], p["Value"])

# 3. 複数取得(get_parameters、1回10件まで)
res = ssm.get_parameters(Names=["/shop/prod/api/url", "/shop/prod/none"], WithDecryption=True)
print("複数:", [x["Name"] for x in res["Parameters"]], "見つからない:", res["InvalidParameters"])

# 4. 階層を一括取得して辞書にする(get_parameters_by_path + paginator)
def load_config(path: str) -> dict:
    config = {}
    paginator = ssm.get_paginator("get_parameters_by_path")
    for page in paginator.paginate(Path=path, Recursive=True, WithDecryption=True):
        for x in page["Parameters"]:
            config[x["Name"].removeprefix(path).lstrip("/")] = x["Value"]
    return config

print("一括:", load_config("/shop/prod"))

# 5. 無い名前は ParameterNotFound
try:
    ssm.get_parameter(Name="/shop/prod/none")
except ClientError as e:
    print("エラー:", e.response["Error"]["Code"])

# 6. 削除(delete_parameter / delete_parameters)
ssm.delete_parameter(Name="/shop/prod/api/url")
print("削除:", ssm.delete_parameters(Names=["/shop/prod/api/token"])["DeletedParameters"])
1件: /shop/prod/api/token SecureString tok-12345
複数: ['/shop/prod/api/url'] 見つからない: ['/shop/prod/none']
一括: {'api/url': 'https://api.example.com', 'api/token': 'tok-12345'}
エラー: ParameterNotFound
削除: ['/shop/prod/api/token']

load_config のように、階層の一括取得は paginator で回しておくと、件数が増えて結果が複数ページに分かれても同じコードで全件を受け取れます。エラーの種類は e.response["Error"]["Code"] で判定します。

CLI のオプション boto3 の引数
--name / --names Name / Names(リスト)
--value / --type Value / Type
--overwrite Overwrite=True
--with-decryption WithDecryption=True
--path / --recursive Path / Recursive=True

エラーになる例と直し方

よく出会うエラーを、実際のメッセージとあわせて整理します。

エラー 出る場面 直し方
ParameterAlreadyExists すでにある名前へ put-parameter した 更新するなら --overwrite を付ける
ParameterNotFound get-parameter や delete-parameter で、無い名前を指定した 名前(先頭の /、環境名、大文字・小文字)を見直す。describe-parameters で一覧を確認
ValidationException(10 件上限) get-parameters の --names に 11 個以上並べた 10 件ずつに分ける。または階層にして get-parameters-by-path を使う
ValidationException(type is required) 新規作成で --type を付けていない --type String などを付ける
ValidationException(tags and overwrite) --tags と --overwrite を同時に指定した 作成時だけ --tags を付け、更新時は外す
AccessDeniedException(reserved parameter name) /aws で始まる名前で登録しようとした /aws 以外の名前にする
Error parsing parameter '--value' CLI が https:// で始まる値を URL として読みに行った 下の「URL を値にするとき」を参照

10 件上限(get-parameters)

--names に 11 個並べると、送信した名前の一覧つきで次のメッセージが返ります。

aws ssm get-parameters --names /p1 /p2 /p3 /p4 /p5 /p6 /p7 /p8 /p9 /p10 /p11
An error occurred (ValidationException) when calling the GetParameters operation: 1 validation error detected: Value '[/p1, /p2, /p3, /p4, /p5, /p6, /p7, /p8, /p9, /p10, /p11]' at 'names' failed to satisfy constraint: Member must have length less than or equal to 10.

ParameterNotFound(get-parameter)

aws ssm get-parameter --name /app/prod/db/nothing
An error occurred (ParameterNotFound) when calling the GetParameter operation: Parameter /app/prod/db/nothing not found.

--tags と --overwrite の同時指定

An error occurred (ValidationException) when calling the PutParameter operation: Invalid request: tags and overwrite can't be used together. To create a parameter with tags, please remove overwrite flag. To update tags for an existing parameter, please use AddTagsToResource or RemoveTagsFromResource.

/aws で始まる名前

An error occurred (AccessDeniedException) when calling the PutParameter operation: No access to reserved parameter name: /aws/x.

URL を値にするとき(AWS CLI 1.46.1 での動き)

今回の AWS CLI 1.46.1 では、--value に https:// で始まる文字列を渡すと、CLI がその URL の中身を取りに行こうとして、登録の前に止まりました。

aws ssm put-parameter --name /app/prod/allowed-origins \
  --value 'https://a.example.com,https://b.example.com' --type StringList
Error parsing parameter '--value': Unable to retrieve https://a.example.com,https://b.example.com: Could not connect to the endpoint URL: "https://a.example.com,https://b.example.com"

直し方は 2 つあり、どちらも登録できることを確かめました。

# 方法1:JSON で渡す
aws ssm put-parameter --cli-input-json \
  '{"Name":"/app/prod/site-url","Value":"https://www.example.com","Type":"String"}'

# 方法2:URL を読みに行く動きを設定で止める
aws configure set cli_follow_urlparam false
aws ssm put-parameter --name /app/prod/site-url2 \
  --value https://www.example.com --type String
aws ssm get-parameter --name /app/prod/site-url --query Parameter.Value
"https://www.example.com"

方法 2 を実行すると、設定ファイルに cli_follow_urlparam = false の 1 行が追加されます。boto3 の put_parameter は、先ほどのコードのとおり URL をそのまま値として登録できます。

IAM ポリシーで読み取りを絞る

階層で名前を付けておくと、IAM ポリシーの Resource をパスの前方一致で書けます。 AWS Systems Manager ユーザーガイド(Restricting access to Parameter Store parameters using IAM policies)の例は、次の 3 つの文で構成されています。

  • ssm:DescribeParameters は Resource を * にする
  • 値の取得(ssm:GetParameters など)は、パラメータの ARN で対象を絞る
  • SecureString を復号するために、KMS キーへの kms:Decrypt を許可する

この形を /app/prod/ 配下の読み取りに当てはめると、次のようになります。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": ["ssm:DescribeParameters"],
      "Resource": "*"
    },
    {
      "Effect": "Allow",
      "Action": ["ssm:GetParameter", "ssm:GetParameters", "ssm:GetParametersByPath"],
      "Resource": "arn:aws:ssm:ap-northeast-1:123456789012:parameter/app/prod/*"
    },
    {
      "Effect": "Allow",
      "Action": ["kms:Decrypt"],
      "Resource": "arn:aws:kms:ap-northeast-1:123456789012:key/キーのID"
    }
  ]
}

Resource の ARN は、get-parameter の出力にあった ARN(…:parameter/app/prod/db/host)と同じ形です。

同じガイドには、階層についての注意も書かれています。あるパスへのアクセスを許可されたユーザーは、その下の階層すべてにアクセスできます。 /a を許可し /a/b を個別に拒否していても、/a に対する GetParametersByPath の再帰取得では /a/b が見えます。見せたくない値は、別の階層(たとえば /app/prod-secret/)に分けて設計します。

Secrets Manager との違い

Secrets Manager は、パスワードや API キーなどの「秘密の値」に特化したサービスで、自動ローテーション(定期的な値の交換)を備えています。 AWS Systems Manager ユーザーガイドでも、データベースの認証情報・API キー・トークンには Secrets Manager を勧めています。

機能の比較表

項目 Parameter Store Secrets Manager
主な用途 設定値全般(平文も暗号化も) 秘密の値(認証情報、API キー、トークン)
型 String・StringList・SecureString シークレット(暗号化して保存)
自動ローテーション なし あり(スケジュールを設定。Lambda 関数で交換する方式は Lambda の料金がかかる)
値のサイズ上限 標準 4 KB、アドバンスト 8 KB 65,536 バイト
バージョン 番号(1, 2, 3…)とラベル。直近 100 バージョンを保持 バージョン ID とステージ(AWSCURRENT、AWSPREVIOUS)。1 シークレットあたり最大 100 バージョン
クロスアカウント アドバンスト層のパラメータで共有できる シークレットのリソースポリシーと相手側の許可ポリシーの両方で許可する。暗号化には自分で作った KMS キーが必要
別リージョンへの複製 — あり(公式の比較で Secrets Manager の特長として挙げられている)
取得の単位 名前、または階層(get-parameters-by-path) シークレットの名前や ARN
料金 標準は追加料金なし 使った分だけ課金

出典は、AWS Systems Manager ユーザーガイド(Parameter Store、Managing parameter tiers)と、AWS Secrets Manager ユーザーガイド(What is AWS Secrets Manager、quotas、Access secrets from a different account)です。

どちらを選ぶかの判断表

保管したいもの・やりたいこと 選ぶもの 理由
ホスト名、ポート、ログレベル、機能のオン・オフ Parameter Store(String) 平文で足り、階層でまとめて取得できる
環境ごとの設定を一括で読み込みたい Parameter Store get-parameters-by-path がある
値を定期的に自動で交換したい Secrets Manager 自動ローテーションがある
データベースの認証情報、API キー、トークン Secrets Manager 公式ドキュメントがこの用途に勧めている
別の AWS アカウントのアプリに秘密の値を渡したい Secrets Manager リソースポリシーで相手を指定できる
4 KB(アドバンストで 8 KB)を超える値 Secrets Manager 65,536 バイトまで入る
まず費用をかけずに暗号化して保管したい Parameter Store(SecureString、標準) 標準層は追加料金なし
設定は Parameter Store、秘密は Secrets Manager に分けつつ、取得の書き方はそろえたい 併用(下の参照パスを使う) Parameter Store の API から Secrets Manager の値を取れる

同じ値を両方の CLI で取る

同じパスワードを Secrets Manager にも登録して、取得コマンドを並べます。

aws secretsmanager create-secret --name app/prod/db/password \
  --secret-string 'S3cret-Pass!'
{
    "ARN": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:app/prod/db/password-lVMhFZ",
    "Name": "app/prod/db/password",
    "VersionId": "872cb0da-eee4-4921-b1b1-8ca27a3154c0"
}

Secrets Manager で取得:

aws secretsmanager get-secret-value --secret-id app/prod/db/password
{
    "ARN": "arn:aws:secretsmanager:ap-northeast-1:123456789012:secret:app/prod/db/password-lVMhFZ",
    "Name": "app/prod/db/password",
    "VersionId": "872cb0da-eee4-4921-b1b1-8ca27a3154c0",
    "SecretString": "S3cret-Pass!",
    "VersionStages": [
        "AWSCURRENT"
    ],
    "CreatedDate": 1791020546
}

値だけを取り出す書き方を、2 つ並べます。

# Parameter Store
aws ssm get-parameter --name /app/prod/db/password \
  --with-decryption --query Parameter.Value --output text

# Secrets Manager
aws secretsmanager get-secret-value --secret-id app/prod/db/password \
  --query SecretString --output text
S3cret-Pass!
S3cret-Pass!
項目 Parameter Store Secrets Manager
登録 aws ssm put-parameter --type SecureString aws secretsmanager create-secret
更新 put-parameter --overwrite put-secret-value
取得 get-parameter --with-decryption get-secret-value(復号の指定は不要)
値が入るキー Parameter.Value SecretString
同じ名前で再登録 ParameterAlreadyExists ResourceExistsException
無い名前を取得 ParameterNotFound ResourceNotFoundException
削除 delete-parameter(すぐ消える) delete-secret --recovery-window-in-days 7(削除予定日が返る)

Secrets Manager で値を更新すると、新しい値が AWSCURRENT、ひとつ前が AWSPREVIOUS になります。

aws secretsmanager put-secret-value --secret-id app/prod/db/password \
  --secret-string 'New-Pass-2'

aws secretsmanager list-secret-version-ids --secret-id app/prod/db/password \
  --query 'Versions[].VersionStages'
[
    [
        "AWSPREVIOUS"
    ],
    [
        "AWSCURRENT"
    ]
]

Parameter Store の API から Secrets Manager の値を取る

名前の先頭に /aws/reference/secretsmanager/ を付けると、get-parameter で Secrets Manager のシークレットを取得できます。 --with-decryption が必須です。

aws ssm get-parameter \
  --name /aws/reference/secretsmanager/app/prod/db/password \
  --with-decryption --query Parameter.Value --output text
S3cret-Pass!

--query を外すと、Type が SecureString で、SourceResult というキーに Secrets Manager 側の情報が入った JSON が返ります。AWS Systems Manager ユーザーガイド(Referencing AWS Secrets Manager secrets from Parameter Store parameters)によると、この参照には次の決まりがあります。

項目 内容
使える操作 GetParameter と GetParameters だけ(DescribeParameters、GetParametersByPath は対象外)
バージョンの指定 …/名前:バージョンID または …/名前:AWSCURRENT のようにステージを指定
権限 Secrets Manager 側のシークレットに対する IAM の許可がそのまま効く
履歴 Parameter Store 側のバージョン・履歴の機能は使えない

アプリの読み込み処理を Parameter Store の API にそろえたまま、秘密の値だけを Secrets Manager に置きたいときに使えます。

よくある質問

Q. SecureString の値が、登録したものと違う文字列で返ってきます。 A. --with-decryption(boto3 では WithDecryption=True)を付けていないと、暗号化されたままの文字列が返ります。記事中の出力のように、付けると登録した値が返ります。String や StringList ではこの指定は無視されるので、常に付けておいて問題ありません。

Q. put-parameter で ParameterAlreadyExists が出ます。 A. 同じ名前のパラメータがすでにあるためです。値を更新したいときは --overwrite を付けます。更新するとバージョンが 1 つ上がり、前の値は 名前:番号 や get-parameter-history で確認できます。

Q. get-parameters と get-parameters-by-path はどう使い分けますか? A. 取得したい名前が決まっていて 10 件以内なら get-parameters、ある階層の配下をまとめて取りたいなら get-parameters-by-path です。後者は --recursive を付けると下の階層まで、付けないと直下だけを返します。

Q. Parameter Store と Secrets Manager は併用できますか? A. できます。設定値は Parameter Store、自動で交換したい認証情報は Secrets Manager に置き、/aws/reference/secretsmanager/ の参照パスを使うと、どちらも get-parameter で取得できます。

まとめ

  • Parameter Store は「名前と値の組」で設定を保管する機能で、型は String・StringList・SecureString の 3 種類です。
  • SecureString は --with-decryption を付けたときだけ元の値が返ります。 取得時は常に付けておくと迷いません。
  • 名前を /app/prod/db/password のように階層にすると、get-parameters-by-path --recursive で一括取得でき、IAM ポリシーもパスで絞れます。
  • 更新には --overwrite が必要で、付けないと ParameterAlreadyExists になります。更新のたびにバージョンが上がります。
  • get-parameters は 1 回 10 件まで。 見つからない名前は InvalidParameters に入ります。
  • 自動ローテーション、4 KB を超える値、別アカウントへの受け渡しが要るなら Secrets Manager、平文の設定や階層での一括取得なら Parameter Store が向いています。
  • 参照パス /aws/reference/secretsmanager/名前 を使うと、Parameter Store の API から Secrets Manager の値を取得できます。

参考・出典

  • AWS Systems Manager ユーザーガイド「AWS Systems Manager Parameter Store」 https://docs.aws.amazon.com/systems-manager/latest/userguide/systems-manager-parameter-store.html
  • 同「Managing parameter tiers」 https://docs.aws.amazon.com/systems-manager/latest/userguide/parameter-store-advanced-parameters.html
  • 同「Restricting access to Parameter Store parameters using IAM policies」 https://docs.aws.amazon.com/systems-manager/latest/userguide/sysman-paramstore-access.html
  • 同「Referencing AWS Secrets Manager secrets from Parameter Store parameters」 https://docs.aws.amazon.com/systems-manager/latest/userguide/integration-ps-secretsmanager.html
  • AWS CLI コマンドリファレンス「ssm get-parameter」 https://docs.aws.amazon.com/cli/latest/reference/ssm/get-parameter.html
  • AWS Secrets Manager ユーザーガイド「What is AWS Secrets Manager?」 https://docs.aws.amazon.com/secretsmanager/latest/userguide/intro.html
  • 同「AWS Secrets Manager quotas」 https://docs.aws.amazon.com/secretsmanager/latest/userguide/reference_limits.html
  • 同「Access AWS Secrets Manager secrets from a different account」 https://docs.aws.amazon.com/secretsmanager/latest/userguide/auth-and-access_examples_cross.html

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Parameter Storeの使い方|Secrets Managerとの違い」

株式会社RJC ― SI事業・SES事業・AI駆動開発。RJCは一緒に成長を楽しめる会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?