- AWS
Parameter Storeの使い方|Secrets Managerとの違い
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期連続の黒字決算。