JetBrains GatewayをSSM経由でEC2インスタンスに接続して、IDE(IntelliJ IDEA,PhpStorm, Go Land...)を使う

この記事は「弁護士ドットコム Advent Calendar 2021」の 4 日目の記事です。

---

## これはなに

EC2インスタンスにSession Manager経由で[JetBrains Gateway](https://www.jetbrains.com/ja-jp/remote-development/gateway/)を接続させるTipsです。  

## 前提
- AWS CLIからSSMを利用してEC2インスタンスにログインできる
- [JetBrains Gateway](https://www.jetbrains.com/ja-jp/remote-development/gateway/)がインストールされている

## （補足）JetBrains Gatewayとは

[JetBrains Fleet](https://www.jetbrains.com/ja-jp/fleet/)が発表されて話題になっていますが、裏でしれっと公開されていたツールです。リモート環境にJetBrains系IDEをHeadlessで立ち上げて、クライアントからは[Code With Me](https://www.jetbrains.com/ja-jp/code-with-me/)で接続しているような状態を実現できます。別の見方では、VSCodeのRemote SSHを使った状況に近いかもしれません。

(詳細な説明は[JetBrains Gatewayの公式ページ](https://www.jetbrains.com/ja-jp/remote-development/gateway/)を読んでもらえればと思います)

## 手順

### .ssh/configにSSM用の設定を記述する

JetBrains Gatewayが.ssh/configを解釈できるため、.ssh/configに設定を記述します。
(逆にGateway側の設定ウィザードではProxyCommandなどの細かい設定は入れられません。)

サンプルとして以下の記述を想定して進めます。

```:.ssh/config
Host hoge
    HostName xxxxxxxxxxxxxx
    User foo
    IdentityFile ~/.ssh/xxxxxxxxx
    ProxyCommand sh -c "aws --profile xxxxxx --region xxxxxxxx ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
```

ProxyCommandにはAWS CLIのコマンドを記述します。sshやAWS CLI向けのオプションは環境依存するので細かい値は違うと思いますので、いい感じに調整してください。`ssh hoge`などで対象のEC2インスタンスにログインできる状態であれば大丈夫なはずです。

#### JetBrains Gatewayを起動する

インストールした方法に応じて、起動してください。起動すると以下のような画面になると思います。

起動できたら`Connect via SSH`をクリックしてください。
![スクリーンショット 2021-12-01 22.18.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144581/8d11d525-7b46-720a-a75c-c8d0621ef0a8.png)


### SSH設定画面を開く

![スクリーンショット 2021-12-01 22.21.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144581/2c4c109d-1857-d07d-ed6b-df9d41fc5e9e.png)
![スクリーンショット 2021-12-01 22.22.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144581/bfc7fd95-fe38-e7b2-c9f2-cfb82d692746.png)


### .ssh/configに記述した項目を設定に反映する

`.ssh/config`に記述した内容の一部を入力します。

| 項目 | 値 | 補足 |
| ------ | ------ | ------ |
| Host: | hoge |　.ssh/configの値から |
| User name: | foo |　.ssh/configの値から |
| Port: | 22 |　デフォルト値がないため明示的に入力 |
| Authentication type: | OpenSSH config and authentication agent |　`Key pair`はうまくいきません[^1] |

Test Connectionを押して問題なければOKをクリックします。
![スクリーンショット 2021-12-01 22.48.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144581/f27aa87b-a274-aaf3-0a54-32d0f068bb0f.png)

---
ここからはSSMを利用しない通常のSSHと同様のフローになります。
ウィザードに従ってポチポチするだけです。

作成した設定を選択して`Check Connection and Continue`をクリックします。
![スクリーンショット 2021-12-01 22.49.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144581/e7340c49-aad8-5470-dba3-8625cb9ca395.png)

---
利用したいIDEと、IDE起動時に開きたいフォルダのパスを選択します。
選択できたら`Download and Start IDE`をクリックします。

クリックするとサーバー側にIDE関連の諸々がインストールされ、問題なければ、JetBrains Clientという名前のIDEがよろしく立ち上がり、接続完了です。
![スクリーンショット 2021-12-01 22.57.23 2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/144581/f860fd4f-3a48-4394-fb05-51f7bbd9b4a7.png)

## 最後に

JetBrains GatewayをSSM経由で利用する方法の紹介でした。

VSCodeでSSM経由でのRemoteSSHはできましたが、Gatewayでも同様に接続できるので、これからはJetBrains系IDEでも同様の開発体験が得られるかもしれません。

Fleetも控えているので今後のJetBrainsの動きが楽しみです。


明日は @datsukan さんです！






[^1]:
 名前的に動作しそうですが、2021/12/02時点では動かないようです。
 似たような状況で[Issue](https://youtrack.jetbrains.com/issue/GTW-712)が立っており、`type:Bug`となっているようなので、そのうち修正されるかもしれません。