AWS Systems Manager Session Managerを用いてvscodeのRemote-SSHでEC2接続してみた

## 概要

別件で特定のRDSと同じVPC内でEC2立てて環境構築する必要が出たのですが、キーペアがなかったのでチーフに.pemを要求したところ、

**「キーペア作らないでsession managerでつなぐ方式にしてもらったほうがいいかも！」**

ということで、AWS Systems Manager Session Managerを介してEC2に接続する形にしました。以下の点だけ注意すれば、いつものEC2のインスタンスの立ち上げ方と同じでした。

- AmazonSSMManagedInstanceCoreのIAMポリシーを含んだIAMロールをEC2にアタッチする
- EC2からSystems Managerのエンドポイントにアクセスするので、EC2がインターネットあるいはVPCエンドポイントへアクセス可能にする
- せっかくSession Managerで接続するので、セキュリティグループのSSHインバウンドポートが開いてないセキュリティグループをアタッチする。このとき警告が表示されるが気にせず次に進む

参考文献）
[【まだEC2のSSHで消耗してるの？】AWS Systems Manager Session Managerのススメ](https://www.isoroot.jp/blog/2872/)

無事にEC2の立ち上げに成功すると、以下のような手順を踏むことによってSession managerで繋いでブラウザからEC2に入ることができます。SSHインバウンドを開放してないので、在宅の割合が多いこのご時世にはありがたいセキュアな環境構築が実現します。

そう、まさに...

:::note info
鉄壁の布陣です。
:::

![tech2_image1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580487/bf67a515-fd15-4556-79ee-c874401628af.png)


しかし、Session Managerを介して接続して出てくるあのブラウザのターミナルですが、、、

:::note warn
開発環境が使いづらい汗
:::

![tech2_fig2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/580487/86a6a2b0-dab7-189a-c824-2054b9c58f3e.png)

本音を言うなら、vscodeでRemote-SSHで繋いで、あのIDEで自由気ままに開発したい...でも、セキュアな開発も必要だと感じ、両方を達成できる方法がないかと模索しました。しかし、見つかった記事が古いのか僕の設定が悪いのか、うまくremote-SSHで設定することができずに苦戦しました。

今回は、AWS Systems Manager Session Manager & vscodeのRemote-SSHでEC2接続するための手順をご紹介したいと思います。

## 構築手順

### 0. 事前準備
- vscodeがインストールされている(かつ、remote-SSHがインストール済)
- EC2のインスタンスを立てたり、IAMロールを作成＆アタッチする権限がある
- aws cliのcredential設定がされている

### 1. ssm:SendCommandするためにaws_cli v2を入れる

最終目的をいきなり言いますと、自作したpublickeyをssm:SendCommandコマンドを通して立ち上げたEC2環境へ送信する必要があります。これを行ってvscodeで適切なremote-SSH設定をすることで目標を達成することができます。

しかし、ssm:SendCommandを実行するにはaws-cli v2を導入する必要性があります。ですので、v2にしてない方はローカル環境のPCにaws-cli v2を入れてください。私は以下の参考資料を参考にして更新しました。

参考資料）
[AWS公式のインストール手順](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html)
[AWS CLI v2をMacにインストールする](https://qiita.com/NorihitoYamamoto/items/badd32785078bc944089)


### 2. ローカルで適当なSSH keyを生成する
`ssh-keygen -t rsa -f 鍵の名前`などで好きな鍵を生成してください。毎回接続時にパスワードを聞かれると面倒臭いと思いますので、パスワードは設定しない方が楽だと思います。


### 3. EC2インスタンスを立てる
前述した通りのやり方でEC2インスタンスを立ち上げます。ただし、今回は以下のロールを必ずEC2に付与するようにしてください。この後のssm:SendCommandで必要になります。

- IAMロールで以下を付与
    - AmazonEC2RoleforSSM
    - AmazonSSMManagedInstanceCore
    - AmazonSSMFullAccess(こちらは、生成したpublickeyを送る必要があるので必須)

### 4. public keyをEC2へ送る

では、いよいよ生成したpublickeyを送信します。以下のような.shファイルを用意してbash hogehoge.shと実行すれば、無事にpublickeyが対象のEC2に届くと思います。もしもこれらのコマンドやremote-ssh接続時にエラーが起こるとすれば、aws configureが適切に設定されてない(regionなどが間違っている)こともあるかと思いますので、ご確認頂ければと思います。

```bash
pubkey=$(cat ~/.ssh/hogehoge.pub)
instance_id="i-hogehogefugafuga"
region="ap-northeast-1"
profile="hogehoge"

cmd=$(cat<<EOF
echo $pubkey > /home/ubuntu/.ssh/authorized_keys
)
aws ssm send-command \
--instance-ids $instance_id \
--document-name "AWS-RunShellScript" \
--parameters commands="$cmd" \
--region $region \
--profile $profile
```

参考文献）
[How To Do Remote Development With VS Code Using AWS SSM](https://pub.towardsai.net/how-to-do-remote-development-with-vs-code-using-aws-ssm-415881d249f3)

### 5. 最後にRemote-SSHの設定を行う

下記のように.ssh/configファイルを設定すれば構築完了です。あとは`command+Shift+P`のコマンドパレットでRemote-SSHを検索して、hostnameを打てば接続できるはずです！

Remote-SSHを入れてない場合はvscodeの拡張機能から検索してインストールしてください。


```bash
Host <hostname>
  User ubuntu
  HostName i-*****************
  IdentityFile ~/.ssh/id_rsa
  ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --profile <profile-name>"
```

:::note warn
ちなみに、windowsの場合は以下のように変更すれば大丈夫かと思います。
:::

```
ProxyCommand C:\Program Files\Git\usr\bin\sh.exe -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p' --profile <profile-name>"
    IdentityFile "Path\to\Your\SSH\Key"
```

参考文献）
[Visual Studio Code から SSHポート開放無しでAWSインスタンスに接続する](https://qiita.com/dairappa/items/8347fe7faf89b6ba364e)

あとは環境に入れればgitにユーザー名やメアドを設定したり、EC2環境側の.git/configでgithubの設定をしたり秘密鍵を貼り付けたりすればgit cloneも使えるようになるはずなので、このあとは今まで通りの開発ができると思います。もしエラーが起きる場合はgitの設定ミスや鍵の権限などが原因として考えられると思います(下記の文献などを参考にしてください)
[エラー: Unprotected Private Key File (保護されていないプライベートキーファイル)](https://qiita.com/leomaro7/items/662699dcb7a7adc36f40)

## まとめ
今回はAWS Systems Session Managerを利用してEC2インスタンスに接続する処理をvscodeのremote-SSHで実現するための方法を紹介しました。

また、SARAHでは「おいしい」一皿をユーザーに届けるためのサービス開発に取り組んでいます。インターンや正社員を問わず募集しておりますので、興味のある方はぜひカジュアル面談に来ていただけると嬉しいです。