ECS FargateにSSMを利用してSSH接続する(チュートリアル)

## はじめに
ECS Fargateにデプロイしたはいいけど、コンテナ内にアクセスできなくてデバッグできなくて困ることはしばしば。EC2 on ECSならばSSH接続できるけど、Fargateではどう接続すれば良いのか。。。そこで、今回はSessionManagerを利用してFargateのコンテナ内にアクセスする方法を説明します。

### SSM(Session managerとは？？)
>Session Manager はフルマネージド AWS Systems Manager 機能です。Session Manager を使って、Amazon Elastic Compute Cloud (Amazon EC2) インスタンス、エッジデバイス、オンプレミスサーバー、仮想マシン (VM) を管理できます。インタラクティブ・ワンクリック ブラウザ ベースのシェル、または AWS Command Line Interface (AWS CLI) を使用できます。Session Manager は安全かつ監査可能なノード管理を実現し、インバウンドポートを開いたり、踏み台ホストを維持したり、SSH キーの管理したりする必要はありません。また Session Manager はマネージドノードの制御されたアクセス、厳格なセキュリティプラクティス、ノードアクセス詳細がある完全監査可能なログを要件とする社内ポリシーの尊守を実現しつつ、エンドユーザーが簡単なワンクリック・クロス プラットフォームアクセスによってマネージドノードの使用を実現します。

→公式の説明を上に載せていますが、AWSのIAMロールを利用する事で、SSHポートを利用せずにSSH接続できると考えてもらえればOKです！！
![スクリーンショット 2022-06-15 18.34.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/599049/f2a638a4-237a-cae3-669c-0b459f8d4599.png)

## 全体概要
AWS-CLIにSSMのプラグインをインストールし、SSH接続します。細かい説明は下記の通りです。

### ①Pluginのダウンロード

```ssh: downloadコマンド
~/Desktop $ 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 3499k  100 3499k    0     0   143k      0  0:00:24  0:00:24 --:--:--  189k
```
:::note info
下記URLからインストールする
https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html
:::


### ②Pluginの解凍
``` 
~/Desktop $ unzip sessionmanager-bundle.zip
Archive:  sessionmanager-bundle.zip
   creating: sessionmanager-bundle/
  inflating: sessionmanager-bundle/LICENSE  
  inflating: sessionmanager-bundle/NOTICE  
 extracting: sessionmanager-bundle/VERSION  
   creating: sessionmanager-bundle/bin/
  inflating: sessionmanager-bundle/bin/session-manager-plugin  
  inflating: sessionmanager-bundle/THIRD-PARTY  
  inflating: sessionmanager-bundle/install  
  inflating: sessionmanager-bundle/README.md  
  inflating: sessionmanager-bundle/RELEASENOTES.md  
  inflating: sessionmanager-bundle/seelog.xml.template 
```

### ③Pluginのインストール
```shell
~/Desktop $ 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!
```

### ④Pluginのインストール確認
```shell
~/Desktop $ session-manager-plugin
The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
```

はい、これでSSMのプラグインは追加できました。次は実際にECSのコンテナ内に接続する手順を記載します。

## ECS(Fargate)のコンテナに接続する。

### ECSExecの有効化
ECSのコンテナに接続するには、ECSExecを有効化する必要があります。下記コマンドで有効化しましょう。
```ssh:ECSExecの有効化
aws ecs update-service --region ap-northeast-1 --cluster クラスター名 --service サービス名 --enable-execute-command
```
→はい、これで有効化できました。最後に`"enableExecuteCommand": true`と表示されていればできています。
もしも、下記エラーがでた場合はタスク定義のロールに誤りがあります。タスク定義のタスクロールを「ecsTaskExecutionRole」に変更してみてください。

```shell:エラー内容
An error occurred (InvalidParameterException) when calling the UpdateService operation: The service couldn't be updated because a valid taskRoleArn is not being used. Specify a valid task role in your task definition and try again.
```

### SSMを利用しコンテナに接続する。
```shell
aws ecs execute-command --region ap-northeast-1 --cluster クラスター名 --task タスクID --container コンテナ名 --interactive --command "/bin/sh"

The Session Manager plugin was installed successfully. Use the AWS CLI to start a session.
Starting session with SessionId: ecs-execute-command-XXXXXXXX

/app #  ←これがでていれば接続できています！！！
```

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