Cloud9へVSCodeのRemote-SSHを使ってアクセスする with SessionManager+aws-vault

# はじめに
Cloud9は優秀なIDEではあるもののVSCodeの自由度には勝てない。
やっぱVSCodeで開発してなんぼだろう。
ただ、パブリックIP経由でSSHアクセスなんて恐くてできないし、アクセスキーもなるべく暗号化して取り扱いたい
となると
![vsc-c9.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262854/af16668f-5cdd-1272-3f68-603eec2d8cfc.png)
のようにアクセスしつつアクセスキーは暗号化して管理したい

そんなニッチな目的を持つ人向けの記事

# TL;DL
~/.ssh/configの設定でProxyCommandを使用する
https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-getting-started-enable-ssh-connections.html

# 前提
* クライアントPCはWindows(試したのはWindows11)
* Cloud9はSSM経由アクセス設定で作成済み
https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/ec2-ssm.html
* アクセス用IAMユーザと最小権限は設定済み

# 詳細

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

## 1. SSH keyを設定する

VSCode上でgitbash terminalを開き以下を実行する  

1. SSH key作成
```sh
$ ssh-keygen -b 4096 -C 'VS Code Remote SSH user' -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/c/Users/user/.ssh/id_rsa): vsc9
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in vsc9
Your public key has been saved in vsc9.pub
The key fingerprint is:
SHA256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx VS Code Remote SSH user
The key's randomart image is:
+---[RSA 4096]----+
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
+----[SHA256]-----+
```

2. 公開鍵確認
```sh
$ cat ~/.ssh/vsc9.pub
ssh-rsa xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx= user@DESKTOP-0000000
```
表示された公開鍵はメモっておく

## 2. Cloud9にkeyを登録する

1. Cloud9をマネジメントコンソールから開く
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262854/a0a86b1a-4b6a-601b-bee6-8617455c8c0a.png)

2. 左上の設定からHome直下を見えるようにする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262854/e9217281-405d-b82f-4b78-1d5adb5446ea.png)

3. ~/.ssh/authorized_keysを開き公開鍵を追加する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262854/9b6fd339-8a8b-550f-8854-ec4b2cd8aa30.png)

4. シャットダウン時のスクリプト処理を変更する

```sh
$ sudo mv ~/.c9/stop-if-inactive.sh ~/.c9/stop-if-inactive.sh-SAVE
$ curl https://raw.githubusercontent.com/aws-samples/cloud9-to-power-vscode-blog/main/scripts/stop-if-inactive.sh -o ~/.c9/stop-if-inactive.sh
$ sudo chown root:root ~/.c9/stop-if-inactive.sh
$ sudo chmod 755 ~/.c9/stop-if-inactive.sh
```

## 3. aws-vaultを設定する

[ToDo: MFAやスイッチロール対応]

1. [Chocolateyをインストールする](https://www.suzu6.net/posts/297-chocolatey-windows/)
```powershell
Set-ExecutionPolicy Bypass -Scope Process -Force; [System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072; iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
```

2. [aws-vaultをインストール](https://github.com/99designs/aws-vault)する
```powershell
choco install aws-vault
```

3. aws-vaultにProfile追加

事前に登録済みのIAMユーザに紐づくアクセスキー/シークレットアクセスキーを登録する
```powershell
> aws-vault add vsc9
Enter Access Key Id: ABDCDEFDASDASF
Enter Secret Key: %%%
```
これでWindows資格情報に登録され、暗号化された状態で管理される
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262854/2136625a-545b-ccda-280a-648de5b220d1.png)
aws-vault:aws-vault:vsc9

4. Profileを追加する
~/.aws/configに以下を追加する
```
[profile vsc9]
tregion=us-east-1
output=yaml
```

コマンドで追加
```sh
echo -n -e "\n[profile vsc9]\nregion=us-east-1\noutput=yaml\n" >> ~/.aws/config
```

直接編集する場合の参考

## 4. ssh接続先を設定する

~/.ssh/configに以下を追加する
```
Host vsc9
  ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe "aws-vault exec awscliuser -- aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p"
  HostName i-00000000000000000
  User ec2-user
  IdentityFile ~/.ssh/vsc9
```
i-00000000000000000は接続先Cloud9のインスタンスID

コマンドで追加
```sh
echo -n -e "\nHost vsc9\n  ProxyCommand C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe \"aws-vault exec awscliuser -- aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters portNumber=%p\"\n  HostName i-00000000000000000\n  User ec2-user\n  IdentityFile ~/.ssh/vsc9\n" >> ~/.ssh/config
```

## 5. VisualStudioCodeのRemote-SSHでvsc9から接続する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/262854/b5dabe0c-934f-a994-2795-7ec2afc63a0c.png)

## おわりに

実際に活用しようとすると、MFAやスイッチロールの対応、Cloud9の環境構築自動化などが必要になりそう
追ってアップデートしていきたい