【AWS】セッションで紹介されていたpsshを使ってみた #reinvent

まいどおおきに、大阪の市田です。
下記のセッションで紹介されていたpsshというツールを試してみたのでご紹介します。

And You Thought You Knew Amazon EC2

セッション自体の内容については下記でご紹介しています。

【レポート】EC2についてあなたが考えていた事とこれから知って欲しいTIPS16個 #reinvent

psshとは

これは「EC2 Parameter Store」を操作する為のシェルを提供してくれるもので、パラメータストアの利用が楽になるツールです。

kountable/pssh: A shell for the EC2 Parameter Store

インストール

Goで作成されているのでファイルをダウンロードして実行するだけです。
下記URLより環境に応じたファイルをダウンロードします。私はMacを利用しているので「pssh-darwin-amd64」をダウンロードして、psshという名前で保存しました。

Releases · kountable/pssh

ファイルはPATHが通っている適当なディレクトリに置いて下さい。私は実行権限をつけて/usr/local/binに保存しました。
後は、適切な権限のクレデンシャルをセットアップしておきましょう。詳細は下記ページにありますので個々では割愛させて頂きます。

Configuring the AWS SDK for Go - AWS SDK for Go

使い方

UNIX系OSでお馴染みのcpやmvといったいくつかのコマンドや、インラインコマンド、バッチ処理などを実行することができます。それではそれぞれについて早速みていきましょう。

ls

パラメータをリスト表示します。パラメータ階層の場合は、レベル1の階層までの表示となります。

/>ls
AppServer/
prd.db_host
prd.db_password
stg.db_host
stg.db_password

階層のパスを指定することでその下の階層に対してリストできます。

/>ls /AppServer/User
userid

exit

psshのシェルを終了します。

$ pssh
/>ls
AppServer/
prd.db_host
prd.db_password
stg.db_host
stg.db_password
/>
/>exit

get

パラメータの値を表示します。

/>get prd.db_host
[{
  Name: "/prd.db_host",
  Type: "String",
  Value: "prddb.example.com",
  Version: 2
}]

パラメータ階層の場合はPATH指定で表示できます。

/>get /AppServer/User/userid
[{
  Name: "/AppServer/User/userid",
  Type: "String",
  Value: "hoge",
  Version: 1
}]

暗号化されているパラメータの場合は、表示も暗号化されています。

/>get prd.db_password
[{
  Name: "/prd.db_password",
  Type: "SecureString",
  Value: "AQECAHjBi8kH (中略) WvyYAuRA==",
  Version: 1
}]

decrypt

暗号化されているパラメータを復号化します。

/>decrypt prd.db_password
Decrypt is true

これで復号化は完了です。この状態でgetコマンドを実行すると復号化されたパラメータを得る事ができます。

[{
  Name: "/prd.db_password",
  Type: "SecureString",
  Value: "prodpassword",
  Version: 1
}]

put

パラメータをセットします。新規に作成する場合はName,Type,Value,descriptionを指定します。最後に空行で改行して下さい。
正常にputできたら「バージョン1」として作成できたメッセージが表示されます。

/>put
Input options. End with a blank line.
... name=/test.db_host
... value="test.example.com"
... type=String
... description="test database host"
...
Put /test.db_host version 1

既存のパラメータを更新する時はoverwrite=trueを指定します。下記のサンプルではstg.db_hostの値が更新前はVersion: 2となっています。

/>get stg.db_host
[{
  Name: "/stg.db_host",
  Type: "String",
  Value: "stgdb.example.net",
  Version: 2
}]

更新してみます。version 3として更新したメッセージが表示されます。

/>put
Input options. End with a blank line.
... name=/stg.db_host
... value="stgdb02.example.com"
... description="new staging database host"
... type=String
... overwrite=true
...
Put /stg.db_host version 3

バージョンがインクリメントされて内容も更新されていますね。

/>get /stg.db_host
[{
  Name: "/stg.db_host",
  Type: "String",
  Value: "\"stgdb02.example.com\"",
  Version: 3
}]

putは1行でインラインで行うこともできます。複数行で記載していた各値をスペースで区切って記載します。

/>put name=/test.db_host value="test.example.com" type=String description="test database host"

暗号化したパラメータを作成する時は、Type="SecureString"を指定します。

cp

パラメータをコピーします。-Rオプションで再帰的に階層全てをコピー可能です。

/>cp /Server/AppServer/userid /Server/DBServer/userid

mv

パラメータの値を違う階層に移動することができます。

/>mv /Server/DBServer/userid /Server/TestServer/userid

rm

パラメータを削除します。-Rオプションで再帰的に階層全てを削除できます。

rm -R /Server/TestServer

history

パラメータの各バージョンの内容を表示します。

/>history stg.db_host
[{
  LastModifiedDate: 2017-12-02 01:13:01 +0000 UTC,
  LastModifiedUser: "arn:aws:iam::852697527974:user/cm-ichida.yoshihisa",
  Name: "stg.db_host",
  Type: "String",
  Value: "stg-db",
  Version: 1
} {
  Description: "staging database host",
  LastModifiedDate: 2017-12-02 09:10:02 +0000 UTC,
  LastModifiedUser: "arn:aws:iam::852697527974:user/cm-ichida.yoshihisa",
  Name: "stg.db_host",
  Type: "String",
  Value: "stgdb.example.net",
  Version: 2
} {
  Description: "\"new staging database host\"",
  LastModifiedDate: 2017-12-02 21:19:25 +0000 UTC,
  LastModifiedUser: "arn:aws:iam::852697527974:user/ichida-iot-default",
  Name: "stg.db_host",
  Type: "String",
  Value: "\"stgdb02.example.com\"",
  Version: 3
}]

インラインコマンド

psshのシェル上で作業せずにインラインで実行することも可能です。psshコマンドに続けてpsshのシェルで実行したいコマンドを実行します。

$ pssh get stg.db_host
[{
  Name: "/stg.db_host",
  Type: "String",
  Value: "\"stgdb02.example.com\"",
  Version: 3
}]

バッチ

処理内容を記載したファイルを指定することで、一連の作業をバッチ処理できます。
例えば、下記のようなcommands.txtを用意します。

put name=/Server/AppServer/password/yamada value="p97mRgj" type=SecureString description="yamada password for App Server"
rm /Server/AppServer/password/tanaka

これを-fileオプションで指定することでcommands.txtの内容を実行できます。

$ pssh -file commands.txt 

最後に

AWS CLIでもできますが、psshの方がより効率的にパラメータストアを操作できる様に感じました。
必要に応じて使い分けて頂ければと思います。

以上です。