AWS SSM Parameter StoreのString型とStringList型はどう違う?

2022.07.25

パラメーターを保存する AWS SSM Parameter Store はタイプとして、以下の3種類が存在します。

  • String
  • StringList
  • SecureString

SecureString はKMSで暗号化して機密データを管理するためにあります。

ドキュメントを読んだ限りでは、残り2つの StringStringList の違いがわかりにくかったため、違いを確認しました

3行まとめ

  • String も StringList も参照時の動作は同じ
  • StringListの場合、更新時にセパレーター(,)で分けた上でバリデーション可能
  • StringListの場合、AWSコンソールのテキストエリアで編集すると、改行がセパレーター(,)に変換される

StringListタイプはほぼStringタイプだけど一部挙動が異なる

ドキュメントから String タイプと StringList タイプの定義を確認します。

String

By default, String parameters consist of any block of text you enter. For example:

abc123

Example Corp

<img src="images/bannerImage1.png"/>

StringList

StringList parameters contain a comma-separated list of values, as shown in the following examples.

Monday,Wednesday,Friday

CSV,TSV,CLF,ELF,JSON

AWS Systems Manager Parameter Store - AWS Systems Manager

StringList タイプはコンマで区切られた文字列というのはわかりましたが、そのコンマ区切りの文字列を String タイプとして管理しても良さそうに思えます。

参照時には、値を文字列としてまるっと取得できるだけのため、違いはありません。 しかし、更新時には、微妙な差異があります。

コンマ分割後の文字列に対してバリデーション

パラメーターを追加・更新する場合、 SSM:PutParameter API を利用します。

このAPI には AllowedPattern オプションがあり、値の文字列パターンをバリデートできます。

String タイプの場合、値全体に対してバリデートするのに対して、 StringList タイプの場合、コンマで分割後の各文字列に対してバリデートします。

この動作を確認します。

値は文字列だけで構成されるべき(--allowed-pattern="^\d+$)とします。

123 を String タイプで登録します。

$ aws ssm put-parameter \
  --name "foo" \
  --value "123" \
  --allowed-pattern="^\d+$" \
  --type String \
  --overwrite

{
    "Version": 1,
    "Tier": "Standard"
}

成功です。

数字でない文字(,)を含んだ 123,456 を String タイプで登録します。

$ aws ssm put-parameter \
  --name "foo" \
  --value "123,456" \
  --allowed-pattern="^\d+$" \
  --type String \
  --overwrite

An error occurred (ParameterPatternMismatchException) when calling the PutParameter operation: 
 Parameter value, cannot be validated against allowedPattern: ^\d+$

バリデーションに引っかかりました。

この値を StringList タイプで登録してみましょう。

$ aws ssm put-parameter \
  --name "foo" \
  --value "123,456" \
  --allowed-pattern="^\d+$" \
  --type StringList \
  --overwrite

{
    "Version": 2,
    "Tier": "Standard"
}

登録成功です。

123,456 をコンマで分割し、 123, 456 それぞれに対してバリデートしているからです。

AWS コンソール利用時は改行がコンマとして扱われる

AWSコンソールのテキストエリアで値を編集している場合は注意が必要です。

StringList タイプの場合、保存時にテキストエリアの改行が ,に変換されます。

例えば、テキストエリアに

123
456

と入力して保存すると、123,456 として登録されます。

コンソールの編集画面で開くと、コンマが改行に変換されることなく、初期状態は文字列そのままです。

123,456

SDK を使い、改行を含んだ値を StringList タイプとして登録してみましょう。

import boto3
ssm_client = boto3.client('ssm')
ssm_client.put_parameter(
  Name='bar',
  Overwrite=True,
  Value="123\n456",
)

パラメーターの値としては 123\n456 として保存されます。

このパラメーターをコンソールの編集画面で開くと、

123
456

というようにテキストエリアに改行が反映されます。

このまま保存を実行すると、先に紹介した仕様の通り、改行がコンマに変換され、 123,456 として登録されます。

編集画面を一切弄らずに保存しただけなのに、違う値として更新されました。

最後に

AWS SSM Parameter Storeの String タイプと StringList タイプの細かすぎて伝わりにくい違いについて解説しました。

違いは以下の2点です

  • StringList はコンマ分割後の文字列に対してバリデートされる
  • StringList はコンソール編集時に改行がコンマに変換される

パラメーターにコンマ区切りの文字列を登録しており、バリデート機能を活用したい場合は StringList タイプ、それ以外の場合では、コンソールの編集画面と保存される値が一致する String タイプが余計な混乱を招かず向いているかもしれません。

それでは。