ぶろとよ

ネットワーク系クラウドエンジニア(AWS)の技術ブログ。自動化に興味があるためAWS CLIを勉強&アウトプット中。

AWS CLI: PowerShellでパラメータストアの作成/変更/中身だけ出力/比較確認

こちらの記事の続きとなります。

blog.toyokky.com

前回はSystems Manager-パラメータストアを中身を個別ファイル化するだけでしたが、本記事ではパラメータストアの作成/変更も含む内容になっています。


EC2のCloudWatchエージェント設定をSystems Manager-パラメータストアに置いているのですが、実務で40台分ほどのパラメータストア変更があり、流石に手作業での変更は時間とミス防止から無理でしたので、AWS CLIで実行しました。
時間も短縮できましたし、パラメータストア変更前後の中身をWinMergeで比較表示までCLIで出来たため、かなり楽に作業を実施することが出来ました。

目次

検証環境

  • 検証日: 2022/06/19
  • PC環境:
    • Windows10 Home Ver21H1
      • PowerShell: Ver7.1.5
      • AWS CLI: aws-cli/2.1.34 Python/3.8.8 Windows/10 exe/AMD64 prompt/off
        • -- profile default : 読み取り専用
        • -- profile aws_RW : 書き込み権限あり
          • ※ 誤操作防止のため、変更操作時のみ-- profileオプション付与。
        • -- profile aws_PF : SystemsManagerポートフォワーディング用

注意事項

  • 本記事の内容はWindows PowerShellで検証しています。
  • AWS CLIはバージョン2を使用しています。
    • 本記事のコマンド出力でYAMLを使用してますが、これはバージョン2の機能です。
  • コマンド内の変数やパラメータやは検証で使用したものを記載しています。ご自身の環境に合わせ、書き換えて使用してください。
  • 個人で検証しているため実行結果に責任は持てません。必ずご自身でも検証してから使用してください。


1. 事前準備

1.1 jq のインストール

AWSCLIでパラメータストアの中身を書き出すと、改行やTAB等が正規表現でテキスト化されてしまうため、「jq -r」を使用して正規表現から戻します。そのためjqが必要。
公式サイトからexeファイルを落として、リネーム後にPATHが通っているフォルダへ格納すれば使えます。

  1. 公式サイトからWindows用のexeファイルをDownloadする
    • https://stedolan.github.io/jq/
      • 「Download jq 1.6」 > 「Windows(64bit)」の順にクリック
      • ファイル「jq-win64.exe」がDownloadフォルダに格納される
  2. Downloadしたファイルのリネーム
    • 「jq-win64.exe」 > 「jq.exe」
  3. PATHが通っているフォルダへ「jq.exe」を格納する
    • 例: C:\Windows


1.2. WinMerge のインストール

WinMerge 日本語版のサイトからインストーラをダウンロードしてインストールします。

「WinMerge日本語版のサイト > 64bit版ダウンロード > 画面遷移して自動ダウンロードされる」

winmergejp.bitbucket.io


1.3 ファイル出力フォルダの作成

ファイル出力するフォルダを作成します。
C:\#work\AWSCLI\YYYYMMDD-hhmmss\ParameterStore

${LogDir} = "C:\#work\AWSCLI\$(Get-Date -Format yyyyMMdd-HHmmss)" + "\ParameterStore"
New-Item "${LogDir}" -type directory -Force ; Invoke-Item "${LogDir}"

# ※好きなフォルダを指定する場合は「${LogDir}」の中身を変えます。
# `${LogDir} = "C:\Users\aws"`


2. パラメータストアの新規作成

2.1 テスト用のJSONファイル作成

# パラメータストア名、「a-zA-Z0-9_.-」を利用可能。
${param_name} = "Test-param_01"
${parama_version} = "v1"

# インデントをTABにしたいのですが、ヒアドキュメントはTABを削除してしまうため、TABを「`t」にして出力しています。
${json_content} = @"
{
`t"Version": "01",
`t"Content": [
`t`t{
`t`t`t"Key1": "Vlaue1",
`t`t`t"Key2": "Vlaue2"
`t`t}
`t]
}
"@
Write-Output ${json_content} | Out-File -Encoding ascii ${LogDir}\${param_name}_${parama_version}.json


2.2 パラメータストアの作成

${profile} = "aws_RW"

aws ssm put-parameter `
    --profile ${profile} `
    --description "Test Parametor Store." `
    --name "${param_name}" `
    --type "String" `
    --value file://${LogDir}\${param_name}_${parama_version}.json `
    --tags "Key=Name,Value=${param_name}" `
            "Key=Env,Value=Test"


2.3 作成したパラメータストアの中身をJSONファイルで出力する

パラメータストアの中身のみを個別にテキストファイル化(JSON)します。
ファイル名はパラメータストア名です。
AWSCLIで中身を書き出すと、改行やTAB等が正規表現でテキスト化されてしまうため、「jq -r」を使用して正規表現から戻します。

中身に日本語が無いことを想定していますが、日本語を含む場合は文字コードの調整が必要です。

  • 日本語無し(今回): Out-File -Encoding ascii
  • shift-jis: Out-File -Encoding default
  • utf-8(BOM付き): Out-File -Encoding utf8
${param_create} = "${LogDir}\${param_name}_1-create.json"
aws ssm get-parameter --name ${param_name} --output json `
    | jq -r .Parameter.Value `
    | Out-File -Encoding ascii ${param_create}


3. パラメータストアの変更

3.1 変更用のJSONファイル作成

# 既存パラメータストア名を指定。Versionはv2。
${param_name} = "Test-param_01"
${parama_version} = "v2"

# インデントをTABにしたいのですが、ヒアドキュメントはTABを削除してしまうため、TABを「`t」にして出力しています。
${json_content} = @"
{
`t"Version": "02",
`t"Content": [
`t`t{
`t`t`t"Key1": "Vlaue1",
`t`t`t"Key2": "Vlaue2",
`t`t`t"Key3": "Vlaue3"
`t`t}
`t]
}
"@
Write-Output ${json_content} | Out-File -Encoding ascii ${LogDir}\${param_name}_${parama_version}.json


3.2 パラメータストアの変更

${profile} = "aws_RW"

# 上書きはオプション「--overwrite」が必要。
# 変更するオプションを記載する。今回は中身のみ変えるので「--value」を記載。
aws ssm put-parameter `
    --profile ${profile} `
    --name "${param_name}" `
    --overwrite `
    --value file://${LogDir}\${param_name}_${parama_version}.json


3.3 変更したパラメータストアの中身をJSONファイルで出力する

${param_after} = "${LogDir}\${param_name}_2-after.json"
aws ssm get-parameter --name ${param_name} --output json `
    | jq -r .Parameter.Value `
    | Out-File -Encoding ascii ${param_after}


4. WinMergeで作成時と変更後のJSONファイルを比較する

これまでの手順で作成時と変更後で、パラメータストアのJSONファイルを出力していますので、これらの比較確認をWinMergeで行います。

${param_create} = 出力ファイル名: Test-param_01_1-create.json
${param_after} = 出力ファイル名: Test-param_01_2-after.json

# JSONファイルの変数はこれまでの手順で入ってます。

# WinMerge.exe のフルパスを指定。
# インストール型はこのままでOK、ポータブル型は環境に合わせて修正。
${winmerge_exe} = "C:\Program Files\WinMerge\WinMergeU.exe"

# JSONファイルを指定してGUIのWinMergeを開きます。
# 左ペインが作成時、右ペインが変更後。
Start-Process `
    -FilePath "${winmerge_exe}" `
    -ArgumentList "/wl /wr `"${param_create}`" `"${param_after}`""


GUIのWinMergeが開いて、差分を表示します。