Windows環境でVSCode + Remote - SSH + Cloud9 + SSMな環境の構築時にエラーで詰まった話

# 構築内容
**Cloud9でクラウド上に構築した開発環境にVSCodeから拡張機能を用いてSSH接続する。**

何のためにやるのか、どういう利点があるのかは以下の記事がよくまとまっていますので割愛します。

https://qiita.com/hayate_h/items/93273285cdc7372ae569#%E3%81%AF%E3%81%98%E3%82%81%E3%81%ABvs-code-%E3%81%A8-cloud9-%E3%81%AE%E4%BD%B5%E7%94%A8%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6

# 基本手順
こちらの公式ブログ（英語）を元に進めました。

https://aws.amazon.com/jp/blogs/architecture/field-notes-use-aws-cloud9-to-power-your-visual-studio-code-ide/

あくまで接続することが目的なので、途中の「Cloud9の自動停止機能をオフにする」部分はスキップしました。

# 詰まった点
クラウド上のリソースはCloudFormationのテンプレが用意されているので何一つこちらでやることもなく展開できましたが、肝心の接続部分で以下のようなエラーに遭遇し2時間ぐらい詰まりました。
```sh
...
[22:41:38.228] Terminal shell path: C:\Windows\System32\cmd.exe
[22:41:38.482] > ]0;C:\Windows\System32\cmd.exe
[22:41:38.482] Got some output, clearing connection timeout
[22:41:38.501] > CreateProcessW failed error:2
> posix_spawnp: No such file or directory
...
```

# 解決に至るまでの模索
結果だけ知りたい方は[次のセクション](#解決策)まで飛ばして大丈夫です。

## Windows特有のエラー
sshのProxyCommandで実行するshファイルを公開しているリポジトリを見てみると、Issueで全く同様の事象が報告されていました。

https://github.com/aws-samples/cloud9-to-power-vscode-blog/issues/6

詳細はリンク先に譲ります。
結果的にはスクリプトを以下のように書き換えることで解決したそうです。
```sh
Host cloud9
    IdentityFile C:/Users/myusername/.ssh/id_rsa
    User ec2-user
    HostName i-XXXXXXXXXXXXXXXXXXX
    ProxyCommand aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p
```
shファイルを実行するのではなく、aws cliのssmコマンドを直接呼び出していますね。
恐らくLinux/Macではそのまま動くんだと思いますが、シェルスクリプトの違いでWindowsではエラーになってしまう模様です。（詳しい事情までは知識不足もあり追えていません）
IssueでもWindows環境下で正常に動作するよう要望が投げられています。

## リージョン指定をしていなかった
よっしゃこいつを参考に書き換えて成功…とはならず、別のエラーが発生しました。
```shell
[22:54:30.453] > ]0;C:\Windows\System32\cmd.exe
[22:54:30.453] Got some output, clearing connection timeout
[22:54:31.431] > 
[22:54:31.441] > An error occurred (TargetNotConnected) when calling the StartSession operation: 
> i-xxxxxxxxxxxxxxxxx is not connected.
[22:54:31.514] > kex_exchange_identification: Connection closed by remote host
```
aws cli ssmコマンドの実行自体は行われた上で、うまく接続できてないようです。
Host名見直したりインスタンス側の設定を見返したり色々さらったのですが、単純に「リージョン指定していなかった」というだけのことでした。

先にCloudFormationで展開していたリソースのリージョンはus-east-1、私のデフォルトリージョンはap-northeast-1。そりゃ見つかるわけがありません。
```shell
aws ssm start-session --region us-east-1 // 諸々省略
```
今度こそ接続成功しました。

ということで最終的な対応としては、以下の通りです。

# 解決
sshのconfigファイルを以下のように書き換えます。
```~\.ssh\config
Host cloud9
  HostName i-xxxxxxxxxxxxxxxxx
  IdentityFile C:/Users/${username}/.ssh/cloud9
  User ec2-user
  ProxyCommand aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p --region us-east-1
```
繰り返しになりますがベースはあくまで公式手順にのっとったものです。
**HostName、IdentityFileのパス、リージョン等、具体的な値は適宜読み替えてください。**
また本稿は個人開発環境での私的な検証ですので、**本番開発などでの適用は各自の責任で慎重に行ってください。**

以上です。

# 直接役立った記事
https://aws.amazon.com/jp/blogs/architecture/field-notes-use-aws-cloud9-to-power-your-visual-studio-code-ide/

https://github.com/aws-samples/cloud9-to-power-vscode-blog/issues/6

https://qiita.com/hayate_h/items/93273285cdc7372ae569

# 参考にさせていただいた記事
https://miima17.com/use-vscode-on-cloud9/

https://qiita.com/M11/items/8f3caf19a3911c4449fe

https://qiita.com/Takenori-Kusaka/items/0a745151d120aa13449e#2-cloud9%E3%81%ABkey%E3%82%92%E7%99%BB%E9%8C%B2%E3%81%99%E3%82%8B

https://www.suzu6.net/posts/205-ssh-config-proxycommand-windows10/

https://qiita.com/ezaqiita/items/5c2782a8dcbf20782df8

https://kemasoft.net/?%CE%A2%C1%EB/Windows10%C9%B8%BD%E0%A4%CEssh.exe%A4%C7%C2%BF%C3%CAssh%A4%B9%A4%EB%A4%DE%A4%C7%A4%CE%C6%BB%A4%CE%A4%EA

https://qiita.com/ezaqiita/items/5c2782a8dcbf20782df8