【初心者】AWS Systems Manager Session Managerを使ってみた

# はじめに
AWS Systems Manager Session Manager(以下SSMセッションマネージャー)でEC2インスタンスにコンソールから接続してみたので、接続手順や詰まったところなどを、簡単に紹介します。



# 動機
SSMセッションマネージャーを利用した動機が2点あります。
1つ目はEC2インスタンスにSSH接続するアプリをインストールする手間を省きたかったためです。
2つ目は資格勉強で気になったためです。
AWS Certified SysOps - Associateの勉強中にSSMセッションマネージャーに関する問題がよく出題されており、サービスの説明にあったEC2インスタンスに接続するときに鍵の管理やセキュリティグループにSSH接続のためのポートを開く必要がないというメリットがいいなと思い、一回利用してみたいと考えました。



# AWS Systems Manager Session Manager　とは
AWS Systems Managerの機能の一つで、EC2インスタンス、エッジデバイス、オンプレミスサーバー、仮想マシン等を管理することできます。
最大の特徴としては、EC2インスタンスに接続する場合ではないでしょうか。
SSMセッションマネージャーは接続するときにセキュリティグループのインバウンドポートを開く必要がなく、かつ認証をIAMポリシー(に紐づくIAMユーザーやIAMロール)で行えるためSSHキー等の管理が必要ありません。
そのため**セキュリティ面**や**運用面**で有用と考えられます。
専用のアプリをインストールする必要がなく、ブラウザから手軽にEC2インスタンスに接続できるというのもいいですね。



ここからは実際にEC2インスタンスからSSMセッションマネージャーを利用してコンソールからアクセスする手順を紹介します！



# 作成手順

:::note info
始める前に
* VPC・サブネット・セキュリティグループなどの作成手順は本筋ではないため、今回は省略させていただきます。
* 今回は**パブリックサブネット**へ接続を行います。そのため、プライベートサブネットに接続する場合と接続方法が異なります。
（プライベートサブネットから行う場合はVPCエンドポイント等を利用することになり、パブリックサブネットの場合よりも手順が複雑です。)
:::

## 必要になる権限
IAMユーザー:EC2の操作、IAMロールの作成、SSMセッションマネージャーの操作　などなど(詳細は省略)
IAMロール:EC2インスタンスからSSMセッションマネージャーに接続


## 手順一覧
1. EC2インスタンスからSSMセッションマネージャーに接続するためのIAMロールの作成
2. EC2インスタンスの作成
3. SSMセッションマネージャーとEC2が接続できていることを確認
(1)EC2側から確認
(2)SSMセッションマネージャー側から確認
4. EC2インスタンスにコンソールから接続



### 1. EC2インスタンスからSSMセッションマネージャーに接続するためのIAMロールの作成

* IAM>ロールから「ロールを作成」を選択
![IAMロール①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743289/e174be66-9ee7-2fc5-0ef7-ace833e1a6a7.png)

* 下記の設定を選択
![IAMロール②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743289/fdd9c16d-2bed-be5e-587e-953059486414.png)

* 許可ポリシーで「AmazonSSMManagedInstanceCore」を検索して選択
![IAMロール③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743289/d66c17c8-3e9f-6fc0-9ffd-276719654737.png)

* ロール名を設定
今回は「AmazonSSMManagedInstanceCore」にしました。
ロール名を設定したら「作成する」を選択して作成完了です。
![IAMロール④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743289/74942a94-d7d7-61b3-e117-7f646d495ce4.png)

* IAMロールが完成しました！
![IAMロール⑤.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743289/f9281b3b-16fd-588c-a27c-e04a8643be1c.png)



### 2.EC2インタンスの作成
以下作成したときの設定値です。
* インスタンス名:test-ssm-instance
* OS:Amazon Linux2
* サブネット:パブリックサブネット
* IAMロール:AmazonSSMManagedInstanceCore
* セキュリティグループ:インバウンド・アウトバウンドともにポートをすべて閉じたものを使用
:::note warn
補足
本来EC2インスタンスからAWS Systems Manager（セッションマネージャー含む）に接続するためにはIAMロールのほかに、インスタンスに**AWS Systems Manager Agent**(通称SSMエージェント)をインストールする必要があります。
しかしAmazon Linux2など一部のAMIにはあらかじめインストールしてあるため、今回はSSMエージェントのインストールは不要です。
参考:https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/ami-preinstalled-agent.html
:::

* EC2インスタンスの設定値
![EC2①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743289/cac4f044-3cab-94eb-bfa1-e64b2aa18fff.png)
![EC2②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743289/5b0c2da2-6775-dd31-d483-b1b049778b6e.png)

* セキュリティグループ
![EC2③.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743289/623a3749-25ab-b07e-8a11-eb7e5e13f356.png)


### 3. SSMセッションマネージャーとEC2が接続できていることを確認

(1)EC2側から確認
* 対象のEC2インスタンスを選択して、「接続」を選択
![EC2接続①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743289/037881fc-e3e6-e439-40d2-356e3d30ba9e.png)

* 「セッションマネージャー」のタブを選択して、「接続」
![EC2接続②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743289/27ef6836-ff25-c77a-5eac-64c7f1772683.png)

(2)SSMセッションマネージャー側から確認
* 「AWS Systems Manager」 を検索
![SSM接続①.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743289/4191698d-d13b-7068-ce1e-51ea79dedef0.png)

* 「セッションマネージャー」を選択
![SSM接続②.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743289/8bc23820-c67e-e0d4-a55c-21b7806d3cb2.png)

* 「ターゲットインスタンス」に作成した「インスタンス名」が表示され、接続できることを確認
![SSM接続④.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743289/da299470-2660-2f0d-91c2-f3c6c48c7b63.png)

無事EC2インスタンスとSSMセッションマネージャーが接続できたことを確認できました！

### 4. EC2インスタンスにコンソールから接続
実際に接続してみます。
![接続結果.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2743289/069d7c5d-b0bd-3fcf-00fd-46611ef428c5.png)
```
sh-4.2$ whoami
ssm-user
sh-4.2$ pwd
/usr/bin
sh-4.2$ cd
sh-4.2$ pwd
/home/ssm-user
sh-4.2$ dir
sh-4.2$
```

下記のことが確認できました！
ユーザー名:ssm-user
最初に接続する階層:/usr/bin
ホームディレクトリ:/home/ssm-user


# 詰まったところ
実際に初めて作成したとき、詰まった部分を紹介します。

#### ・新規にIAMロールを作成する必要がある！
初めて接続したときは、AWS側でIAMロールがすでに用意されているものと思っていました。
そのため既存のIAMロールをアタッチしようとして見つからず、探し回ったのはいい思い出です。

#### ・EC2インスタンス作成後にIAMロールをアタッチした場合は、EC2インスタンスの再起動が必要になる！
一番最初に接続を行ったときは、EC2インスタンス作成後、かつ起動中にIAMロールのアタッチを行いました。
それからいくら待っても接続される様子がなく、おかしいなと思って試しにEC2インスタンスを再起動してみたら、接続されました。
そう、IAMロールをEC2インスタンスに後付けする場合はEC2インスタンスの**停止中にアタッチして起動**するか、EC2インスタンスの**再起動**を行わなくては、IAMロールが適用されなかったのです・・・。
AWSの資格勉強中にも出てきた知識だったので、見事に引っかかったのは悔しかったです。



# IAMロールにつけるIAMポリシー
今回はEC2インスタンスからSSMセッションマネージャーに接続するために、IAMポリシーは「AmazonSSMManagedInstanceCore」を利用しました。
一番オーソドックスなデフォルトポリシーですね。

内容は以下になります。

``` AmazonSSMManagedInstanceCore
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm:DescribeAssociation",
                "ssm:GetDeployablePatchSnapshotForInstance",
                "ssm:GetDocument",
                "ssm:DescribeDocument",
                "ssm:GetManifest",
                "ssm:GetParameter",
                "ssm:GetParameters",
                "ssm:ListAssociations",
                "ssm:ListInstanceAssociations",
                "ssm:PutInventory",
                "ssm:PutComplianceItems",
                "ssm:PutConfigurePackageResult",
                "ssm:UpdateAssociationStatus",
                "ssm:UpdateInstanceAssociationStatus",
                "ssm:UpdateInstanceInformation"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssmmessages:CreateControlChannel",
                "ssmmessages:CreateDataChannel",
                "ssmmessages:OpenControlChannel",
                "ssmmessages:OpenDataChannel"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2messages:AcknowledgeMessage",
                "ec2messages:DeleteMessage",
                "ec2messages:FailMessage",
                "ec2messages:GetEndpoint",
                "ec2messages:GetMessages",
                "ec2messages:SendReply"
            ],
            "Resource": "*"
        }
    ]
}
```

しかし利用用途によってはこのデフォルトポリシーは権限が強すぎることや、ほかのIAMポリシーと組み合わせたいこともあると思います。
その場合は自身でカスタムしてIAMポリシー作成することも可能です。
以下公式サイトなどぜひ参考にしてみてください。

* 既存のIAMロールに許可を追加
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/getting-started-add-permissions-to-existing-profile.html
* カスタムIAMロールの作成
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/getting-started-create-iam-instance-profile.html

ぜひAWSのベストプラクティスに従って、**最小の権限**で運用していきましょう！

# SSMセッションマネージャーを使ってみた感想
メリットであるセキュリティグループを全閉じでもEC2インスタンスに接続できるという点が、実際に行ってとても感動しました。手軽かつセキュリティ面でも管理が減ることはとても良いと思います。
デメリットは個人的には操作感が悪かったことです。
設定でどうにかできるのかもしれませんが、コピー&ペーストでショートカットキーを使えなかったり、キーボード操作の反映が遅いという点で、ほかのツールでSSH接続するほうが動かしやすいと思いました。

# おわりに
今回はEC2インスタンスにコンソールから接続するだけの簡単な紹介でしたが、実際接続してみるとメリットを自身で感じることができ、楽しいと思います。
ぜひみなさんもSSMセッションマネージャーをつかってみてください！