【AWS】SessionManagerでローカル環境からSSH接続する

`SessionManager（SSM）`を使うと、AWSコンソール上から
鍵ストレス無くPrivate subnetにあるEC2インスタンスにアクセスできます

加えてローカル環境からのSSH接続も可能になります
今回はローカル環境からSSHしてRDSにアクセスする方法を記事にします

## 前提
- AWS上でVPC、EC2、RDS, SSMなどの構築は済んでいる想定
- 環境 MacOS
- AWS CLIがインストール済み
- SSMの鍵(pemファイル)を持っている
- EC2インスタンス linux
- RDBエンジン Postgresql

## ❶SessionManagerプラグインのインストール

`sessionmanager-bundle`が必要になるので下記コマンドでインストールします
[公式docはこちら](https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/install-plugin-macos-overview.html)

```shell
curl "https://s3.amazonaws.com/session-manager-downloads/plugin/latest/mac/sessionmanager-bundle.zip" -o "sessionmanager-bundle.zip"
unzip sessionmanager-bundle.zip
sudo ./sessionmanager-bundle/install -i /usr/local/sessionmanagerplugin -b /usr/local/bin/session-manager-plugin
```

## ❷aws configureを実行する
基本的なことですがハマったポイントです。忘れちゃいけない

```shell
aws configure
```
色々聞かれるので答えます

```text
    AWS Access Key ID : Hoge・・・・・・・・・・・・・・・・・・・・・・・
    AWS Secret Access Key : Huga・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・
    Default region name : YOUR-REGION
    DEfault output format : JSON
```

`AWS Access key ID` `AWS Secret Access Key`は、
AWSコンソールのスタートページから確認できます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633746/96fe8c42-b019-fed6-3721-a7d68b6eb63d.png)

:::note info

ちなみに、上記スタートページの
`Run the following commands in your terminal.`
の部分をクリックすると環境変数がコピーされるので
ターミナル上にペーストして実行すれば、`aws configure`しなくてすみます
※こっちの方が早い

```shell
export AWS_ACCESS_KEY_ID="・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・"
export AWS_SECRET_ACCESS_KEY="・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・"
export AWS_SESSION_TOKEN="・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・・"
```
:::

## ❸ sshのconfigファイルを工夫する
このステップは工夫なので必須ではないです
ssm-agent経由でログインする場合、指定するのがipではなくインスタンスIDなのですが、
インスタンスIDを実行したときはこのコマンドをプロキシして実行する設定らしいです。
※考えた人すごい

```shell
# SSH over Session Manager
host i-* mi-*
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
```

## ❹sshで接続する
いよいよ接続します！コマンドはこんな感じです
```shell
ssh -i YOUR_PEM_FILE_PATH ec2-user@YOUR_INSTANCE_ID
```
ステップ3でconfigをいじったので
こんな感じで接続できます
```shell
ssh -i ~/key/my-key.pem ec2-user@i-○○○○○○○○○○○○○○○
```
繋がりましたー
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633746/cd7286e6-a0df-0d05-5b3b-8913e1488e0c.png)

# 【めんどくさがりの人へ】　もっと楽に接続する

正直これだと結構めんどいので、できるだけ楽にします

## ❶zshrcファイルにエイリアスを登録する

`.zshrc`を開きます
```shell
vi ~/.zshrc
```

下記のようなエイリアスを追記します
今回はDev環境のインスタンスへのSSM接続と言う体で、`ssmdev`という名前にします
記述したら`escキー`→`:we`で保存してviを抜けます
```zsh
alias ssmdev="ssh -i YOUR_PEM_KEYS_PATH ec2-user@YOUR_INSTANCE_ID"
```


.zshrcを読み込む
```zsh
source ~./zshrc
```

これで、エイリアスを使ってSSH接続できるようになります！
上記のConfigureのところで説明した環境変数群をターミナルで叩いてから
エイリアスを実行しないと上手くいきません

```shell
ssmdev
```

ec2に繋がりました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633746/cd7286e6-a0df-0d05-5b3b-8913e1488e0c.png)

## ❷EC2インスタンス内にもエイリアスを仕込む（Linuxの場合）

EC2インスタンスにSSH接続した状態で、
直下のファイル構成を見るとこのようになっているはずです

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633746/469980d4-eeaa-8e7a-44ad-39b0cf6a660c.png)

`.bashrc`をいじって、またもやエイリアスを登録します

```shell
vi .bashrc
```

Postgresqlの場合はこのようになります。適宜DBの情報を入力してください
今回はRDSへの接続なので`session`という名前にします
記述したら`escキー`→`:we`で保存してviを抜けます
```bash
alias session="psql --host=YOUR_HOST --port=5432 --dbname=YOUR_DB_NAME --username=YOUR_USER_NAME --password"
```

`.bashrc`を読み込む
```bash
source ~./bashrc
```

準備はできたので、繋ぎます！

登録したエイリアスを実行
```shell
session
```
RDSのパスワードを聞かれるので答えます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633746/ddd1e01f-d88d-d02c-78ed-1c44fa5ab41c.png)

RDSに繋がりました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2633746/afa3ac88-a6ec-7818-4aa6-21c8e86e9f5c.png)

各環境ごとにEC2インスタンスがある方は`ssmstage`とか`ssmprod`とか
同じように作ればいいと思います

# おわりに
本当はTablePlusでSSH接続したいんですけどパブリックIPがないと無理なので
とりあえずこれで我慢。