DEFINE
SSM: AWS Systems Manager
ssm-agent: SSMの一部サービスを実行してくるagent
Run command: SSMのサービスの一つ
背景
AWSのSystems ManagerのRun Command機能を使えば、sshせずにインスタンス群にコマンドを送信できます。
Run Commandの準備(ざっくり)
- ターゲットインスタンスにssm-agentをインストール
- コンソールのManaged Instancesのところにagentがインストールされたインスタンスがオンライン(緑)になったのを確認
- インスタンスにssm-agentが必要とするIAMロールをつけます
- awsユーザーにssmを実行する権限があることを確認
- コンソール・コマンドラインなどからコマンドを実行する
Cloudwatchにルールを設定してRun Commandをトリガーする
嬉しいところ:scheduled eventを設定すればcronjobと同じことができます
例:毎晩自作サービスのログをS3にバックアップする(古い〜サービスなのでログファイル名以外中身バラバラの場合、fluentdを設定するのが大変なのでとりあえずs3にあげます)
ハマるところ
SSMのコンソールからコマンドを入力する時
ps aux
ls
cd /var/log
のようにコピペーすれば実行できますが、cloudwatchの設定画面だとうまく行きません。SSMのコンソール画面に入ってエラーメッセージを確認してみると、
渡したcommandパラメーターが間違ったのがわかりました
正しい方(SSMコンソールから設定)
{"commands":["pa aux","ls","cd /var/log",""],"executionTimeout":["3600"],"workingDirectory":[""]}
間違い方(Cloudwatchにコピペー)
{"commands":["pa aux ls cd /var/log "],"executionTimeout":["3600"],"workingDirectory":[""]}
commandsの方に全部まとめられて改行なしのメガワンラインコマンドにされました、、
解決方法
まずSSMコンソールから実行して、成功したパラメーターからcommands部分をCloudwatchに設定します