teratermでSSMセッションマネジャーを使いたい

# はじめに
AWSって何とSSMセッションマネジャーって何と言った話はここでは書きません。(自分より上手く説明してくれる人がいっぱいいるはずですので、ググってそちらを参照してください。)
SSMセッションマネジャーの初期設定についても書きません。
設定できている前提で記事を書かせていただきます。(こちらも同じく、別でググてみてください。)
AWS CLI、セッションマネジャー用プラグインは事前にインストールしておいてください。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-windows.html

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

# 読んで欲しい人
* 最近AWSを使い始めた人
* SSMセッションマネジャーを使いたい人
* teratermを使っている人

# 背景
EC2でサービス運用していると基本的にSSHは必須のツールですが、皆さんどのように接続しているでしょうか?
最近自分の身の回りではセキュリティを高めるため、踏み台サーバを使った接続から、SSMセッションマネジャーを使うようにしたいのですが、ここで問題がありまして、自分の身の回りではteratermの利用率が高いのです。
何が問題かというとteratermを普通に利用するとSSMセッションマネジャーを介した接続は基本的にできません。かと言って現状大きな問題が起きていないのに、公式がやり方を公開している、windwos向けのOpen SSHに切り替えてとはなかなか言いづらい。

公式のドキュメント
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html

# ポートフォワードで解決する
SSMはポートフォワードできるので、今回はポートフォワードすることで解決します。

公式のドキュメント
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-sessions-start.html#sessions-start-port-forwarding

# 不便
サーバ接続するたび下記のようなコマンドをコマンドプロンプトを立ち上げて入力して使うのでは不便でteratermから問題なくSSMセッションマネジャーを使えるとは言いづらい状況なので、Teratermのマクロを使いある程度自動化します。

```Bash:公式ドキュメントより
aws ssm start-session ^
    --target instance-id ^
    --document-name AWS-StartPortForwardingSession ^
    --parameters portNumber="3389",localPortNumber="56789"
```

# マクロ化
事前にAWSのコンソールからSSHするためのログインアカウントは作成しておいてください。

ログインユーザ名、鍵ファイルのパスは空なので自身の環境に合わせて入れてください。

```:.ttl
; 使用者ごとに変更が必要な変数
;============================
;鍵ファイルのパス
KEY_FILE_PATH=''
;ログインユーザ名
USERNAME = ''
;============================

; EC2リスト
strdim msg 10
msg[0] = ''

listbox 'どのEC2に接続しますか' 'ターゲット選択' msg

int2str LOCALPORT5 result

LOCALPORT = '1002'
strconcat LOCALPORT LOCALPORT5

if result == 0 then
 EC2TARGET = 'i-XXXXXXXXXXX'
endif


; AWS CLI
SSMCOMMAND = 'aws ssm start-session --target '
strconcat SSMCOMMAND EC2TARGET
strconcat SSMCOMMAND ' --document-name AWS-StartPortForwardingSession --parameters portNumber=22,localPortNumber='
strconcat SSMCOMMAND LOCALPORT
strconcat SSMCOMMAND ' --profile '
strconcat SSMCOMMAND ''

exec SSMCOMMAND
; SSH

pause 1

HOSTNAME = 'localhost'

;msg = 'Enter password for user '
;strconcat msg username
;passwordbox msg 'Get password'


SSHCOMMAND = HOSTNAME

strconcat SSHCOMMAND ':'
strconcat SSHCOMMAND LOCALPORT
strconcat SSHCOMMAND ' /ssh /2'
strconcat SSHCOMMAND ' /auth=publickey '
strconcat SSHCOMMAND '/user='
strconcat SSHCOMMAND USERNAME
strconcat SSHCOMMAND ' /keyfile='
strconcat SSHCOMMAND KEY_FILE_PATH

connect SSHCOMMAND
```

プロファイルは空欄になっているので、自身の環境に合わせて変更してくさださい。

```
strconcat SSMCOMMAND ' --profile '
strconcat SSMCOMMAND ''
```

下記の空欄にはサーバかを識別できる文字列を入れてください。
またmsg[1] = ''のような形でマクロ起動時に出る、選択できるサーバの数を増やせます。

```
msg[0] = ''
```

EC2TARGETには接続したいEC2のインスタンスIDを入れてください。
複数ある場合はif文を増やしてください。

```
if result == 0 then
 EC2TARGET = 'i-XXXXXXXXXXX'
endif

if result == 1 then
 EC2TARGET = 'i-YYYYYYYYYYY'
endif
```

# おまけ: WinSCPを使いたい
このマクロは選択肢が一番上に来るEC2インスタンスなら10020、その1つ下なら10021と連番でポートフォワードをしているマクロです。
なので、選択肢の一番上のEC2インスタンスに接続する場合はこのマクロを起動した状態でポート番号を10021、ホストをローカルホストにすることでWinSCPを使ってファイル転送をできます。