[小ネタ]パラメータストアに登録されている値を別アカウントに移行するスクリプト

2023.07.05

手動で登録した特定のパラメータストアの値を別アカウントにまとめて移行したいケースがあったので、スクリプトを作成してみました。

作成したスクリプト

移行元と移行先で実行するスクリプトを分けています。

エクスポートスクリプト

移行元で実行するスクリプトです。parameters.txtを出力します。 移行対象を絞るため、/testの名前から始まるものに絞ってるので、任意の文字列に置き換えてください。

prefix="/test" # 移行対象のプレフィックスに変更
parameters=$(aws ssm describe-parameters --query "Parameters[?starts_with(Name,'$prefix')].Name" --output text)
for parameter in $parameters; do
  param_info=$(aws ssm get-parameter --name "$parameter" --with-decryption)
  value=$(echo $param_info | jq -r ".Parameter.Value")
  type=$(echo $param_info | jq -r ".Parameter.Type")
  echo "$parameter:$type:$value" >> parameters.txt
done

インポートスクリプト

移行先で実行するスクリプトです。エクスポートスクリプトで出力したparameters.txtをもとにパラメーターストアに登録します。

while IFS=":" read -r parameter type value; do
  aws ssm put-parameter --name "$parameter" --type "$type" --value "$value" --overwrite
done < parameters.txt

やってみる

実際に作ったスクリプトを使ってみます。今回はCloudShellでやってみました。

移行元のアカウントにサンプルで以下のようなパラメータを用意しています。

移行元アカウント

移行元のアカウントへログインしてください。

CloudShellを開いて以下スクリプトを貼り付けて実行します。

prefix="/test" # 移行対象のプレフィックスに変更
parameters=$(aws ssm describe-parameters --query "Parameters[?starts_with(Name,'$prefix')].Name" --output text)
for parameter in $parameters; do
  param_info=$(aws ssm get-parameter --name "$parameter" --with-decryption)
  value=$(echo $param_info | jq -r ".Parameter.Value")
  type=$(echo $param_info | jq -r ".Parameter.Type")
  echo "$parameter:$type:$value" >> parameters.txt
done

完了すると、直下のフォルダにparameters.txtというファイルが出力されます。 CloudShell上からファイルをダウンロードするためには、右上から アクション > ファイルのダウンロード をクリックします。

ファイルのダウンロード画面が出るので、parameters.txtと入力してダウンロードします。

ダウンロードできたら移行元のアカウント作業は完了です。 ダウンロードしたparameters.txtにはパラメータ名、種類、値が:区切りで出力されます。

今回は以下のような形で出力されていました。

/test/AAA:String:AAA
/test/BBB:StringList:[B,B,B]
/test/CCC:SecureString:/test/CCC

移行先アカウント

移行先のアカウントへログインします。

CloudShellを開いて先ほどダウンロードしたファイルをアップロードします。 ダウンロードの時と同じですが、CloudShell上にファイルをアップロードするためには、右上から アクション > ファイルのアップロード をクリックします。

アップロードに成功したら、移行先スクリプトを貼り付けて実行します。

while IFS=":" read -r parameter type value; do
  aws ssm put-parameter --name "$parameter" --type "$type" --value "$value" --overwrite
done < parameters.txt

エラーが出なければ成功してるので、実際にパラメータストアを見てみます。

移行元で登録されていた状態と同じように登録することができていますね。

注意点

StringStringListSecureStringそれぞれ移行できますが、SecureStringでデフォルトのKMSキー以外を使っている場合は動作確認してません。おそらく移行先ではデフォルトのKMSキーで登録されるので注意してください。

最後に

最初SDKで1つのスクリプトにして実装しようと思ってたんですが、分けた方が汎用性高そうだなと思ったのでコマンドにしました。 誰かの作業を少しでも楽にできれば嬉しいです。

参考