【小ネタ】 AWS Systems ManagerのAWS-RunShellScriptで遠隔地のRaspberryPiをシャットダウンする

2020.08.21

1 はじめに

CX事業本部の平内(SIN)です。

RaspberryPiのシャットダウンを電源OFFで行うのは、リクスのある作業となります。しかし、ディスプレイやキーボードが接続されていない、多数のRaspberryPiがある場合、これををシャットダウンするのは、やや面倒です。

今回は、遠隔地にある多数のRaspberryPiをAWS Systems Manager(以下、SSM)のエージェントにより、AWS CLIでシャットダウンする作業を確認してみました。

2 環境

既にSSMエージェントがインストールされアクティベーションが終わっている環境が前提です。
参考:AWS Systems ManagerをRaspberry Piで使用してみた

下記のように、5台のRaspberryPiがオンラインとなっています。

3 AWS-RunShellScript

AWS-RunShellScriptでコマンドを実行するには、aws ssm send-commandを使用します。

参考:Walkthrough: Use the AWS CLI with Run Command

RaspberryPiのシャットダウンコマンドは、下記のように利用されますが、AWS-RunShellScriptはroot権限で実行されるため、sudoは必要ありません。

pi@raspberrypi:~ $ sudo shutdown -h now

4 シェル

AWS CLIを実行するシェルスクリプトです。idsに対象となるインスタンスIDを列挙して使用します。

raspi-shoutdown.sh

#!/bin/bash

ids=(
    "mi-0b1bf21cb921d30c3"
    "mi-05fc7778a79f6af73"
    "mi-0ff983b55d321d1ba"	
    "mi-0ac1df76fe0f72153"	
    "mi-088cb4680de05f836"
)

cmd="shutdown -h now"
profile=profileName
region=ap-northeast-1 

for id in ${ids[@]};do
    echo Instance $id
    param={"\"commands\"":[\"$cmd\"],"\"executionTimeout\"":["\"3600\""]}
    aws ssm send-command --document-name "AWS-RunShellScript" --instance-ids $id --parameters "$param" --timeout-seconds 600 --region $region --p $profile | jq .Command.CommandId
done

実行している様子です。インスタンスIDとコマンドIDが出力されています。

% ./raspi-shoutdown.sh
mi-0b1bf21cb921d30c3
"a1187563-1c31-49eb-b0ae-3be79526240b"
mi-05fc7778a79f6af73
"f17b29ee-2706-4291-bbf2-11da79e5b3a6"
mi-0ff983b55d321d1ba	
"b3c9a3aa-6bd1-dfae-5e96-9a7034747922"
mi-0ac1df76fe0f72153	
"799458c7-0d77-611d-6669-2ba41b7e201b"
mi-088cb4680de05f836
"5d115928-8460-fa88-fe3c-a96a1b7aee98"

5 最後に

今回は、遠隔地で多数運用されているRaspberryPiのシャットダウンを、SSMのエージェントにより実施する要領を試してみました。 とりあえず、離れた場所にあるRaspberryPiには、SSM入れとくと何かと便利かもしれません。