UbuntuでもAWS Systems Manager Session Manager for Shell Accessをログ取得まで設定してみた

お世話になっているクラメソさんの記事(Mac向け)を見て、私のUbuntu PC環境でもいけるかなとやってみました。

dev.classmethod.jp

Ubuntu PC側作業

まずはawscliを最新に更新します。

$ sudo apt update && sudo apt install awscli
$ pip install --upgrade awscli

この時点ではstart-sessionサブコマンド打っても繋がりません。

$ aws ssm start-session --target i-xxxxxxxxxx

An error occurred (TargetNotConnected) when calling the StartSession operation: i-xxxxxxxxxx is not connected.

プラグインをインストールが必要になります。 yumdebのパッケージが提供されているみたいです。Ubuntuなんでdebを取得。

$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/ubuntu_64bit/session-manager-plugin.deb" -o "session-manager-plugin.deb"
$ sudo dpkg -i session-manager-plugin.deb

プラグインのインストール確認は以下のコマンドで可能です。

$ session-manager-plugin

Session-Manager-Plugin is installed successfully. Use AWSCLI to start a session.

$ session-manager-plugin --version
1.0.0.0

サーバー側

冒頭のクラメソさんの記事通り、AmazonEC2RoleforSSM のポリシーをロールにEC2にアタッチしておきます。

あとはssmのAgentを更新します。

$ sudo yum install -y https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/linux_amd64/amazon-ssm-agent.rpm
$ sudo systemctl restart amazon-ssm-agent

ロールの反映は amazon-ssm-agent の再起動が必要みたいです。

Shell Accessで接続

これで接続できます。

$ aws ssm start-session --target i-xxxxxx


Starting session with SessionId: yusuke.otomo-yyyyyyy

sh-4.2$ 

コマンドの仕様はこちらです。

start-session — AWS CLI 1.16.13 Command Reference

ssm-userでログオンされているので、適宜スイッチして作業しようかと思ってます。

sh-4.2$ whoami
ssm-user

sh-4.2$ sudo su - ec2-user
[ec2-user@dev ~]$

ロギング設定

設定テンプレートファイルから設定ファイルを作成します。

$ sudo cp -ai /usr/local/sessionmanagerplugin/seelog.xml{.template,}
$ cat /usr/local/sessionmanagerplugin/seelog.xml
<!--SessionManagerPlugin uses seelog logging -->
<!--Seelog has github wiki pages, which contain detailed how-tos references: https://github.com/cihub/seelog/wiki -->
<!--Seelog examples can be found here: https://github.com/cihub/seelog-examples -->
<seelog type="adaptive" mininterval="2000000" maxinterval="100000000" critmsgcount="500" minlevel="off">
    <exceptions>
        <exception filepattern="test*" minlevel="error"/>
    </exceptions>
    <outputs formatid="fmtinfo">
        <rollingfile type="size" filename="/usr/local/sessionmanagerplugin/logs/session-manager-plugin.log" maxsize="30000000" maxrolls="5"/>
        <filter levels="error,critical" formatid="fmterror">
            <rollingfile type="size" filename="/usr/local/sessionmanagerplugin/logs/errors.log" maxsize="10000000" maxrolls="5"/>
        </filter>
    </outputs>
    <formats>
        <format id="fmterror" format="%Date %Time %LEVEL [%FuncShort @ %File.%Line] %Msg%n"/>
        <format id="fmtdebug" format="%Date %Time %LEVEL [%FuncShort @ %File.%Line] %Msg%n"/>
        <format id="fmtinfo" format="%Date %Time %LEVEL %Msg%n"/>
    </formats>
</seelog>

minlevel="off" の部分を minlevel="debug" などに変えます。

$ diff -u  /usr/local/sessionmanagerplugin/seelog.xml{.template,}
--- /usr/local/sessionmanagerplugin/seelog.xml.template 2018-09-06 16:01:52.000000000 +0900
+++ /usr/local/sessionmanagerplugin/seelog.xml  2018-09-13 11:31:28.892641018 +0900
@@ -1,7 +1,7 @@
 <!--SessionManagerPlugin uses seelog logging -->
 <!--Seelog has github wiki pages, which contain detailed how-tos references: https://github.com/cihub/seelog/wiki -->
 <!--Seelog examples can be found here: https://github.com/cihub/seelog-examples -->
-<seelog type="adaptive" mininterval="2000000" maxinterval="100000000" critmsgcount="500" minlevel="off">
+<seelog type="adaptive" mininterval="2000000" maxinterval="100000000" critmsgcount="500" minlevel="debug">
     <exceptions>
         <exception filepattern="test*" minlevel="error"/>
     </exceptions>

/usr/local/sessionmanagerplugin/logs/ も ssmを実行するPC側作業ユーザの所有するディレクトリに変えます。または以下のようにPC側作業ユーザの所有にしてもいけます。

$ sudo mkdir /usr/local/sessionmanagerplugin/logs/
$ sudo chown $USER /usr/local/sessionmanagerplugin/logs/

あとはログ見ながら、実際にstart-sessionすると、出力が確認できます。

$ sudo tail -f /usr/local/sessionmanagerplugin/logs/session-manager-plugin.log

ちなみにdebugレベルのログはこんな雰囲気です。普段はinfoレベルでも良さそうな気もしますが、ログのローテーションあるので要件次第でしょうか。

2018-09-13 11:42:30 DEBUG Processing stream data message of type: output_stream_data
2018-09-13 11:42:30 DEBUG Payload length will be adjusted: %!(EXTRA uint32=0)
2018-09-13 11:42:30 DEBUG Send Acknowledge message for stream data: 0
2018-09-13 11:42:30 DEBUG Process new incoming stream data message. Sequence Number: 0
2018-09-13 11:42:30 DEBUG Sending input size data: {"cols":134,"rows":17}
2018-09-13 11:42:30 DEBUG Payload length will be adjusted: %!(EXTRA uint32=0)
2018-09-13 11:42:30 DEBUG Sending message with seq number: 0
2018-09-13 11:42:30 DEBUG Add stream data to OutgoingMessageBuffer. Sequence Number: 0
2018-09-13 11:42:30 DEBUG Processing stream data message of type: acknowledge
2018-09-13 11:42:30 DEBUG Retransmission timeout calculated in mills. AcknowledgeMessageSequenceNumber: 0, RoundTripTime: %!d(float64=9.0065270125e+07), RoundTripTimeVariation: %!d(float64=1.986945975e+07), RetransmissionTimeout: 169
2018-09-13 11:42:30 DEBUG Delete stream data from OutgoingMessageBuffer. Sequence Number: 0
2018-09-13 11:42:30 DEBUG Processing stream data message of type: output_stream_data
2018-09-13 11:42:30 DEBUG Payload length will be adjusted: %!(EXTRA uint32=0)
2018-09-13 11:42:30 DEBUG Send Acknowledge message for stream data: 1
2018-09-13 11:42:30 DEBUG Process new incoming stream data message. Sequence Number: 1

参考URL

https://docs.aws.amazon.com/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html#install-plugin-linux