FargateコンテナにSSH ~SSMで接続&RDSにSSHポートフォワーディング~

## 概要
- SSMでFargateコンテナに接続できるように設定してみたが、SSMでコンテナに接続すると bash ではないため操作しづらい点や、SQLDeveloper等のSQLクライアント（GUI）を利用してDBに接続できない等の問題あったため、SSMのSSH接続ポートフォワーディングによりRDSに接続することでコンテナへのログインとSQLクライアントソフトでの操作を可能にする

- Bastionサーバ等用意する必要なしに、Faragteコンテナのみで、コンテナおよびRDSへの接続が可能に

- SSMを利用することで、セキュリティグループの解放、タスク定義のポートマッピングを行うことなく安全にRDSに接続することが可能


## FargateでコンテナへのSSMでの接続
下記記事を参考にSSMによりFargateコンテナにshellアクセスが可能

- https://enokawa.hatenablog.jp/entry/2019/09/05/104545
- https://dev.classmethod.jp/cloud/aws/session-manager-launches-tunneling-support-for-ssh-and-scp

下記コマンドのようにSSMを利用してFargateコンテナに接続できることで、Mysqlクライアント等をインストールしておけばBastionサーバ不要で安全にDBに接続できるコンテナを用意することができる

```
aws ssm start-session --target mi-0d2948a092de9bf9b
```

ただし、SSMでコンテナに接続すると bash ではないため操作しづらい点や、SQLDeveloper等のSQLクライアント（GUI）を利用してDBに接続できない等の問題あったため、SSMのSSHポートフォワーディングによりRDSに接続する

- https://dev.classmethod.jp/cloud/aws/session-manager-launches-tunneling-support-for-ssh-and-scp/

## Dockerfile作成

下記記事のDockerfileにopenssh-serverを追加し、sshを起動する

- https://enokawa.hatenablog.jp/entry/2019/09/05/104545

SSH接続用に鍵を生成し公開鍵をrootユーザのauthrized_keysに登録

```
ssh-keygen -t rsa 
```

「Expose 22」 は記述するものの、セキュリティグループの解放や、タスク定義でのポートマッピングは行う必要はなくSSMを経由してのSSH接続が可能 

```:Dockerfile
FROM ubuntu:18.04

RUN apt-get update \
    && apt-get -y install sudo \
      curl \
      openssh-server \
    && curl https://s3.ap-northeast-1.amazonaws.com/amazon-ssm-ap-northeast-1/latest/debian_amd64/amazon-ssm-agent.deb -o /tmp/amazon-ssm-agent.deb \
    && dpkg -i /tmp/amazon-ssm-agent.deb \
    && cp /etc/amazon/ssm/seelog.xml.template /etc/amazon/ssm/seelog.xml

COPY docker/ssm/keys/id_rsa_ssm.pub /root/.ssh/authorized_keys
RUN chmod 600 /root/.ssh/authorized_keys

COPY docker/ssm/run.sh /run.sh
RUN chmod 755 /run.sh

CMD ["bash", "run.sh"]
```

```:run.sh
#!/bin/bash

sudo service ssh start # サービスを起動
amazon-ssm-agent -register -code "${SSM_AGENT_CODE}" -id "${SSM_AGENT_ID}" -region "us-east-1" 
amazon-ssm-agent
```

## SSMによるssh接続
SSMによるssh接続用に以下をssh configに設定する
Dockerイメージ作成時に登録した公開鍵のペアとなる秘密鍵で使用して接続するよう設定

```
Host mi-0d2948a092de9bf9b
    User root
    Port 22
    ServerAliveInterval 300
    IdentityFile ~/.ssh/id_rsa
    ProxyCommand sh -c "aws ssm start-session --target %h --document-name AWS-StartSSHSession --parameters 'portNumber=%p'"
```

sshコマンドでコンテナに接続可能にbashの了解が可能になる。ローカル環境でもFargateで起動しても動作確認が可能

```
ssh mi-0d2948a092de9bf9b
```

## ポートフォワーディングしてRDSに接続
### ssh config を設定
SSH接続先のhostにインスタンスIDを指定した際にProxy Commandを実行するように設定

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

### RDSへのトンネル作成
ssh configでの設定により、SSMを使用してSSHトンネルを作成する

```
ssh -i ~/.ssh/id_rsa root@mi-02af5c92d50025844 -L 9999:[RDSのエンドポイント]:3306
```

### RDSへ接続

作成したトンネル経由で、RDSに接続が可能。SQLクライアントソフトでも同様に接続することが可能

- https://dev.classmethod.jp/cloud/aws/rds-portforward/

```
$ mysql -u [db接続ユーザ] -h 127.0.0.1 -p -P 9999

Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 294
Server version: 5.7.26-log Source distribution

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 
```



## 参考
- https://enokawa.hatenablog.jp/entry/2019/09/05/104545
- https://dev.classmethod.jp/cloud/aws/session-manager-launches-tunneling-support-for-ssh-and-scp