LightsailにSSMエージェントを導入する。

#はじめに
LightsailにSSMエージェントを入れてセッションマネージャーで接続できるようにしてみました。
ちょっとつまづいたところもあったのでそこら辺の流れも一緒に記載してます。

# 環境
一応、今回対応した環境情報を記載しておきます。
AWS：Lightsail
インスタンスイメージ：Redmine Bitnami 認定 4.0.5
OS：Ubuntu 16.04.6 LTS


# IAMサービスロールの作成
まずは以下の内容で信頼ポリシーを作成しテキストファイルに保存します。ファイル保存時は、必ずファイル拡張子 (.json) を付けることを忘れずに。
ちなみにここでは SSMService-Trust.json というファイルにしています。

```text:SSMService-Trust.json
{
  "Version": "2012-10-17",
  "Statement": {
    "Effect": "Allow",
    "Principal": {"Service": "ssm.amazonaws.com"},
    "Action": "sts:AssumeRole"
  }
}
```

保存したテキストファイルを元にIAMロールを作成します。

```bash:create-role
$ aws iam create-role --role-name SSMServiceRole --assume-role-policy-document file://SSMService-Trust.json
{
    "Role": {
        "Path": "/",
        "RoleName": "SSMServiceRole",
        "RoleId": "AROA2ZM2YJEL3NN5MIHKZ",
        "Arn": "arn:aws:iam::777777777777:role/SSMServiceRole",
        "CreateDate": "2020-02-05T01:25:23Z",
        "AssumeRolePolicyDocument": {
            "Version": "2012-10-17",
            "Statement": {
                "Effect": "Allow",
                "Principal": {
                    "Service": "ssm.amazonaws.com" 
                },
                "Action": "sts:AssumeRole" 
            }
        }
    }
}
```

```bash:attach-role-policy
$ aws iam attach-role-policy --role-name SSMServiceRole --policy-arn --policy-arn arn:aws:iam::aws:policy/AmazonSSMManagedInstanceCore
```

# アクティベーションコードの作成
次にアクティベーションコードの作成を行います。

```bash:create-activation
$ aws ssm create-activation \
>   --default-instance-name redmineLightsail \
>   --iam-role SSMServiceRole \
>   --registration-limit 5 \
>   --region ap-northeast-1 \
>   --tags "Key=Environment,Value=Production"
{
    "ActivationId": "511f4a9c-23b2-4d03-a59e-8123977917c3",
    "ActivationCode": "JhVFOpJgb6n1gSrENEvP"
}
```
作成がうまくいくと ActivationId と ActivationCode が返ってくるのでメモしておきます。


# SSMエージェントのインストール

それではエージェントのインストールを行います。

```bash:mkdir
$ mkdir /tmp/ssm
```

```bash:amazon-ssm-agent.deb（download）
$ curl https://s3.amazonaws.com/ec2-downloads-windows/SSMAgent/latest/debian_amd64/amazon-ssm-agent.deb -o /tmp/ssm/amazon-ssm-agent.deb
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 30.1M  100 30.1M    0     0  4492k      0  0:00:06  0:00:06 --:--:-- 5889k
```

```bash:amazon-ssm-agent.deb（install）
$ sudo dpkg -i /tmp/ssm/amazon-ssm-agent.deb
Selecting previously unselected package amazon-ssm-agent.
(Reading database ... 117121 files and directories currently installed.)
Preparing to unpack /tmp/ssm/amazon-ssm-agent.deb ...
Preparing for install
-> Systemd detected
active
amazon-ssm-agent  2.3.672.0  1480  stable/…  aws*        classic
-> Amazon-ssm-agent is installed in this instance by snap, please use snap to update or uninstall.
dpkg: error processing archive /tmp/ssm/amazon-ssm-agent.deb (--install):
 subprocess new pre-installation script returned error exit status 1
Errors were encountered while processing:
 /tmp/ssm/amazon-ssm-agent.deb
```

ん？何やら既にインストールされているというエラーが。。。`snap`という文字が見えるのでどうやらsnapパッケージが既にインストールされているようです。

```bash:snap.amazon-ssm-agent（list）
$ sudo snap list amazon-ssm-agent
Name              Version    Rev   Tracking  Publisher  Notes
amazon-ssm-agent  2.3.672.0  1480  stable/…  aws✓       classic
```
確認してみたところやはりインストールされていました。
そういうことなのでとりあえずこのまま続けてみます。

```bash:snap.amazon-ssm-agent（stop）
$ sudo systemctl stop snap.amazon-ssm-agent.amazon-ssm-agent.service
```

```bash:snap.amazon-ssm-agent（status）
$ sudo systemctl status snap.amazon-ssm-agent.amazon-ssm-agent.service
● snap.amazon-ssm-agent.amazon-ssm-agent.service - Service for snap application amazon-ssm-agent.amazon-ssm-agent
   Loaded: loaded (/etc/systemd/system/snap.amazon-ssm-agent.amazon-ssm-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Mon 2020-02-03 15:40:55 UTC; 1 day 10h ago
 Main PID: 1151 (amazon-ssm-agen)
    Tasks: 8
   Memory: 9.1M
      CPU: 4.090s
   CGroup: /system.slice/snap.amazon-ssm-agent.amazon-ssm-agent.service
           └─1151 /snap/amazon-ssm-agent/1480/amazon-ssm-agent

Feb 03 16:15:59 redmine-hengjiu amazon-ssm-agent.amazon-ssm-agent[1151]: 2020-02-03 16:15:58 ERROR Health ping failed with error - AccessDeniedException: User: a
Feb 03 16:15:59 redmine-hengjiu amazon-ssm-agent.amazon-ssm-agent[1151]:         status code: 400, request id: eeed9ec8-0836-4e32-8d24-9f6609332ac3
Feb 03 17:15:58 redmine-hengjiu amazon-ssm-agent.amazon-ssm-agent[1151]: 2020-02-03 17:15:58 INFO Backing off health check to every 2400 seconds for 7200 seconds
Feb 03 17:15:59 redmine-hengjiu amazon-ssm-agent.amazon-ssm-agent[1151]: 2020-02-03 17:15:58 ERROR Health ping failed with error - AccessDeniedException: User: a
Feb 03 17:15:59 redmine-hengjiu amazon-ssm-agent.amazon-ssm-agent[1151]:         status code: 400, request id: 0df4b870-a371-45e3-9bd9-2288298b9598
Feb 03 19:15:58 redmine-hengjiu amazon-ssm-agent.amazon-ssm-agent[1151]: 2020-02-03 19:15:58 INFO Backing off health check to every 3600 seconds for 10800 second
Feb 03 19:15:59 redmine-hengjiu amazon-ssm-agent.amazon-ssm-agent[1151]: 2020-02-03 19:15:58 ERROR Health ping failed with error - AccessDeniedException: User: a
Feb 03 19:15:59 redmine-hengjiu amazon-ssm-agent.amazon-ssm-agent[1151]:         status code: 400, request id: 8e31b497-d38c-4804-a5f5-1fc19b548236
Feb 03 22:15:58 redmine-hengjiu amazon-ssm-agent.amazon-ssm-agent[1151]: 2020-02-03 22:15:58 ERROR Health ping failed with error - AccessDeniedException: User: a
Feb 03 22:15:58 redmine-hengjiu amazon-ssm-agent.amazon-ssm-agent[1151]:         status code: 400, request id: 5729d8d5-3162-4b74-85d2-3a9bcb504f30
```

何やらここでもエラーが発生しているようです。
ですがそもそも何もしていない状況で起動してたらエラーは出ますよね。とりあえずこのままアクティベートしてみます。

```bash:snap.amazon-ssm-agent（register）
$ sudo /snap/amazon-ssm-agent/current/amazon-ssm-agent -register -code "JhVFOpJgb6n1gSrENEvP" -id "511f4a9c-23b2-4d03-a59e-8123977917c3" -region "ap-northeast-1" 
2020/02/05 01:45:59 Failed to load instance info from vault. RegistrationKey does not exist.
Error occurred fetching the seelog config file path:  open /etc/amazon/ssm/seelog.xml: no such file or directory
Initializing new seelog logger
New Seelog Logger Creation Complete
2020-02-05 01:46:00 ERROR Error adding the directory to watcher: no such file or directory
2020-02-05 01:46:00 INFO Successfully registered the instance with AWS SSM using Managed instance-id: mi-3c475554443332111
```

ERRORが気になりますが、最終的にSuccessfullyと出てるのでOKかなと思ったのですがダメでした。
管理コンソールに登録はされているのですが、接続ができない状況でした。
ということでやはり、一旦削除して入れ直すことにします。

```bash:snap.amazon-ssm-agent（remove）
$ sudo snap remove amazon-ssm-agent
amazon-ssm-agent removed
```

今度はsnapパッケージではなく.debパッケージでインストールします。

```bash:.amazon-ssm-agent.deb（install）
$ sudo dpkg -i /tmp/ssm/amazon-ssm-agent.deb
(Reading database ... 117121 files and directories currently installed.)
Preparing to unpack /tmp/ssm/amazon-ssm-agent.deb ...
Preparing for install
-> Systemd detected
active
Failed to stop amazon-ssm-agent.service: Unit amazon-ssm-agent.service not loaded.
Unpacking amazon-ssm-agent (2.3.842.0-1) ...
Setting up amazon-ssm-agent (2.3.842.0-1) ...
Starting agent
Created symlink from /etc/systemd/system/multi-user.target.wants/amazon-ssm-agent.service to /lib/systemd/system/amazon-ssm-agent.service.
Processing triggers for ureadahead (0.100.0-19.1) ...
```

今度はちゃんとインストールされました。

```bash:amazon-ssm-agent.deb（status）
$ sudo service amazon-ssm-agent status
● amazon-ssm-agent.service - amazon-ssm-agent
   Loaded: loaded (/lib/systemd/system/amazon-ssm-agent.service; enabled; vendor preset: enabled)
   Active: active (running) since Wed 2020-02-05 02:17:58 UTC; 38s ago
 Main PID: 28330 (amazon-ssm-agen)
   CGroup: /system.slice/amazon-ssm-agent.service
           └─28330 /usr/bin/amazon-ssm-agent

Feb 05 02:17:58 redmine-hengjiu systemd[1]: Started amazon-ssm-agent.
Feb 05 02:17:58 redmine-hengjiu amazon-ssm-agent[28330]: Error occurred fetching the seelog config file path:  open /etc/amazon/ssm/seelog.xml: no such file or d
Feb 05 02:17:58 redmine-hengjiu amazon-ssm-agent[28330]: Initializing new seelog logger
Feb 05 02:17:58 redmine-hengjiu amazon-ssm-agent[28330]: New Seelog Logger Creation Complete
Feb 05 02:17:58 redmine-hengjiu amazon-ssm-agent[28330]: 2020-02-05 02:17:58 INFO Entering SSM Agent hibernate - AccessDeniedException: User: arn:aws:sts::666877
Feb 05 02:17:58 redmine-hengjiu amazon-ssm-agent[28330]:         status code: 400, request id: e2ebf98a-40d8-4a58-81eb-9f18123aa733
Feb 05 02:17:58 redmine-hengjiu amazon-ssm-agent[28330]: 2020-02-05 02:17:58 INFO Agent is in hibernate mode. Reducing logging. Logging will be reduced to one lo
```

では、いよいよアクティベートします。

```bash:amazon-ssm-agent.deb（stop）
$ sudo service amazon-ssm-agent stop
```

先ほど作成したアクティベーション情報を使って実行します。

```bash:amazon-ssm-agent.deb（register）
$ sudo amazon-ssm-agent -register -code "JhVFOpJgb6n1gSrENEvP" -id "511f4a9c-23b2-4d03-a59e-8123977917c3" -region "ap-northeast-1" 
Error occurred fetching the seelog config file path:  open /etc/amazon/ssm/seelog.xml: no such file or directory
Initializing new seelog logger
New Seelog Logger Creation Complete
2020-02-05 02:18:52 ERROR Registration failed due to error registering the instance with AWS SSM. RegistrationLimitExceeded: 
    status code: 400, request id: f7fd3939-3fb7-418d-85c7-1494f4fe742f
bitnami@redmine-hengjiu:~$ sudo amazon-ssm-agent -register -code "EFGt8VfQ/b3WIeacWd0w" -id "2e202742-2340-467e-b7aa-24cae9391956" -region "ap-northeast-1" 
Error occurred fetching the seelog config file path:  open /etc/amazon/ssm/seelog.xml: no such file or directory
Initializing new seelog logger
New Seelog Logger Creation Complete
2020-02-05 02:20:41 INFO Successfully registered the instance with AWS SSM using Managed instance-id: mi-3c475554443332111
```

Successfullyということで成功したみたいなので起動させてみます。

```bash:amazon-ssm-agent.deb（start）
$ sudo service amazon-ssm-agent start
```

今回はコンソールからちゃんと接続できました。
それではcliで接続したいと思います。

```bash:start-session
$ aws ssm start-session --target mi-3c475554443332111

SessionManagerPlugin is not found. Please refer to SessionManager Documentation here: http://docs.aws.amazon.com/console/systems-manager/session-manager-plugin-not-found
```

どうやらcliでセッションマネージャーを使うには SessionManagerPlugin というのをインストールする必要があるみたいです。


# SessionManagerPluginのインストール
cliで接続するためのpluginをインストールします。今回はmac環境です。

```bash:sessionmanager-bundle（download）
$ curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip" 
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 4680k  100 4680k    0     0  1782k      0  0:00:02  0:00:02 --:--:-- 1782k
```

```bash:sessionmanager-bundle（unzip）
$ unzip sessionmanager-bundle.zip
Archive:  sessionmanager-bundle.zip
   creating: sessionmanager-bundle/
   creating: sessionmanager-bundle/bin/
  inflating: sessionmanager-bundle/seelog.xml.template  
  inflating: sessionmanager-bundle/VERSION  
  inflating: sessionmanager-bundle/LICENSE  
  inflating: sessionmanager-bundle/install  
  inflating: sessionmanager-bundle/bin/session-manager-plugin  
```

```bash:sessionmanager-bundle（install）
$ sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
Password:
Creating install directories: /usr/local/sessionmanagerplugin/bin
Creating Symlink from /usr/local/sessionmanagerplugin/bin/session-manager-plugin to /usr/local/bin/session-manager-plugin
Installation successful!
```
インストールが成功したかは以下のコマンドで確認できます。

```bash:session-manager-plugin
$ session-manager-plugin

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
```

ということで改めてコマンドを実行してみます。

```bash:start-session
$ aws ssm start-session --target mi-3c475554443332111

Starting session with SessionId: kohei-3c475554443332111
```

無事接続できました。


# おわりに
Lightsailは手軽に利用できてすごく助かるのですが、ファイアウォールがポートレベルでの制御となるのがちょっと難点でした。
ですが、セッションマネージャを使うことでその難点を解消できるだけでなく、IP制御すらしなくて済んでしまいました。

---
[参考]
・ステップ 2: ハイブリッド環境の IAM サービスロールを作成する
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-service-role.html
・ステップ 4: ハイブリッド環境のマネージドインスタンスのアクティベーションを作成する
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-managed-instance-activation.html
・ステップ 6: ハイブリッド環境に SSM エージェント をインストールする (Linux)
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-install-managed-linux.html
・Linux インスタンスから SSM エージェント をアンインストールする
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/sysman-uninstall-agent.html
・macOS で Session Manager Plugin をインストールおよびアンインストールする
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html#install-plugin-macos
・AWS CLI Command Reference - start-session
https://docs.aws.amazon.com/cli/latest/reference/ssm/start-session.html#start-session