踏み台サーバってなくせるの？


## はじめに

最近のAWSのセミナーで、「実は踏み台サーバって不要なんですよ。」というお話を聞いたので、本当に今の業務上の利用用途で廃止できるのかを検証してみました！

## 踏み台サーバの用途

今の職場では、踏み台サーバを以下のような使い方で利用しています。
今回はこれらのケースで本当に踏み台サーバ無しにできるかを検証します！

* AWS CLIの実行
* EC2インスタンスへのSSH接続
* EC2インスタンスとのファイル受け渡し
* ポート転送を利用したAuroraへの接続
    * （Windows上のGUIクライアントを使ってデータ操作している）

## 先に結論

踏み台サーバの役割を完全に無くすことはできなかったです。

CLIでSQL投入なら踏み台サーバはなくせそうですが、GUIのSQLクライアントを使ってAuroraに接続するケースにおいて、踏み台サーバを利用しない方法が思い浮かばず...

ただ、踏み台のユーザ管理は無くすことができたり、パブリックサブネットに配置しなくてもよくなるので、改善はできそうでした！

何か良い方法をお持ちでしたら是非ご教示頂ければと思います！

以下、思いついた代替案を紹介します！

## 代替手段の検討

### AWS CLIの実行

ローカル環境での実行は方法はいくつかありますが、いずれも環境構築が必要なので、CloudShellの使用が良いと思います。

ローカル環境で実施したい場合は、以下をおすすめします！

https://qiita.com/s_moriyama/items/14b703cc0dfa91a6f464

### EC2インスタンスへのSSH接続

#### ①AWS Systems Manager Session Manager

いくつか方法を記載しましたが、業務利用を考えたときに、SytemsManagerのその他機能の恩恵を考えて、この方法が筆頭なのかなと思いました。

マネコン、CLIどちらかでも利用可能。

* マネージメントコンソール

![スクリーンショット 2024-10-01 3.45.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/91619fb4-0b16-3a0c-71ec-c7e7daa65780.png)

* CLI

```console
$ aws ssm start-session --target i-0cea40f765b32a394 --profile xxxxx

Starting session with SessionId: chelky-spepirmuncjnq426tlfmpxowdu
sh-5.2$ sudo su - ec2-user
[ec2-user@ip-10-0-142-6 ~]$ 

```

なお、CLIを使う場合は、事前にSessionManagerPluginをインストールする必要があります！
（あわせて、Python 2.6.5 以降、または Python 3.3 以降も必要。）

https://docs.aws.amazon.com/ja_jp/systems-manager/latest/userguide/session-manager-working-with-install-plugin.html

#### ②CloudShell

2024年の6月頃から、CloudShellをVPC上に設置することができるようになりました。

https://docs.aws.amazon.com/cloudshell/latest/userguide/using-cshell-in-vpc.html

このアップデートに伴い、CloudShell上から直接Privateなリソースに接続することが可能です。
ただし、いくつか制限があるので注意です。

* IAMユーザごとに２つまで環境構築可能
* `ファイルのアップロード`、`ファイルのダウンロード`ができない。
* 30分無操作だと、ホームディレクトリが削除されてしまう
![スクリーンショット 2024-10-02 4.54.15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/3b48e222-04f1-bfa8-8ce1-0578529e0fce.png)
* 監査系（投入したコマンドの保存）ができなさそう。

#### ③EC2 Instance Connect

パブリックIPがなくても、EC2にSSH接続できる専用エンドポイントもある模様です。

https://aws.amazon.com/jp/about-aws/whats-new/2023/06/amazon-ec2-instance-connect-ssh-rdp-public-ip-address/

しかも、インタフェース型と違い、追加のコストが一切不要というところがすごいです。
本当にSSH接続したいだけであったり、個人用で利用する場合はこれが一番おすすめです！

本当のSSH接続なので、EC2のセキュリティグループにSSHのインバウンドルールを許可する必要があるのが少し気になるところ。

* マネージメントコンソール

ここから接続可能。

![スクリーンショット 2024-10-02 5.30.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/691bf2a2-21a1-8b63-4943-1280c00b8b8a.png)

* CLI

```console
% aws ec2-instance-connect ssh --instance-id i-xxxxxxxxxxxxxxxxx \
--eice-options maxTunnelDuration=3600,endpointId=eice-xxxxxxxxxxxxxxxxx \
--os-user ec2-user --profile xxxxxx
The authenticity of host '10.0.142.6 (<no hostip for proxy command>)' can't be established.
ED25519 key fingerprint is SHA256:8k6FXrHAHWHw1jVC9gMkXfFbM1ATXt4q0mR1dP/nziI.
This key is not known by any other names
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '10.0.142.6' (ED25519) to the list of known hosts.
   ,     #_
   ~\_  ####_        Amazon Linux 2023
  ~~  \_#####\
  ~~     \###|
  ~~       \#/ ___   https://aws.amazon.com/linux/amazon-linux-2023
   ~~       V~' '->
    ~~~         /
      ~~._.   _/
         _/ _/
       _/m/'
Last login: Tue Oct  1 20:25:29 2024 from 10.0.143.211
[ec2-user@ip-10-0-142-6 ~]$ 
```
#### 料金比較

EC2 Instance Connect Endpoint、Cloudshellはデータ転送を除いては無料なのですが、SessionsManagerを使う場合は、以下のいずれかの方法をとる必要があり、どちらがコスト高いのかなと思い比較です。

* NATゲートウェイを使う
* VPCエンドポイントを使う（ssm,ssmmessages,ec2messagesの３つ必要）

間違っているかもですが、東京リージョンで計算するとそれぞれ以下くらいのお金がかかります。

![スクリーンショット 2024-10-03 5.55.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/9fadccb8-9646-3c1d-36ea-e6eae4fa93fc.png)

https://calculator.aws/#/estimate?id=63f88660e53e01c14852bfbb38e957e963f1a97c

### EC2インスタンスとのファイル受け渡し

今の職場だと、踏み台からSCPコマンドを利用して受け渡ししていますが、S3を使った受け渡しで良いと思います。

ファイル受け渡し用のS3バケットを準備し、各EC2インスタンスから直接CLIコマンドで受け渡しをするイメージです。

なお、ロールはインスタンスプロファイルを使うことが望ましいと思います。

以下代表的なコマンド。

#### バケット操作
- バケット一覧表示: 
    - `aws s3 ls`
- バケット作成:
    -  `aws s3 mb s3://bucket-name`
- バケット削除:
    -  `aws s3 rb s3://bucket-name`

#### ファイル操作
- ファイル一覧表示:
    -  `aws s3 ls s3://bucket-name`
- ファイルアップロード:
    -  `aws s3 cp file.txt s3://bucket-name/`
- ファイルダウンロード:
    -  `aws s3 cp s3://bucket-name/file.txt ./`
- ファイル移動:
    -  `aws s3 mv s3://bucket-name/file.txt s3://bucket-name/new-location/`
- ファイル削除:
    -  `aws s3 rm s3://bucket-name/file.txt`

### ポート転送を利用したAuroraへの接続

今の職場だと、ポート転送機能があるSQLクライアントで接続していますが、踏み台サーバと踏み台サーバへの認証情報が必要。

このケースで、簡単に踏み台サーバをなくして接続をする方法が思い浮かびません。
ただ、SSMを使うことで認証情報を無くすことはできそうです。

#### ローカル端末からの場合

以下コマンドで、SSMのポート転送機能を設定。

```console
$aws ssm start-session \
 --target i-0cea40f765b32a394 \
 --document-name AWS-StartPortForwardingSessionToRemoteHost \
 --parameters '{"portNumber":["3306"],"localPortNumber":["13306"],"host":["database-1.cluster-cekqatjc8ryi.ap-northeast-1.rds.amazonaws.com"]}' \
 --profile chelky

Starting session with SessionId: chelky-q6lt4m2zcx4hmxywigqnwqukw4
Port 13306 opened for sessionId chelky-q6lt4m2zcx4hmxywigqnwqukw4.
Waiting for connections...

```

以降は、以下のようなコマンドで設定可能です。

```console
% mysql -h 127.0.0.1 -P 13306 -u admin -padminadmin
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 46
Server version: 8.0.32 Source distribution

Copyright (c) 2000, 2024, Oracle and/or its affiliates.

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>
```

なお、最新のMySQLClient(9.0)は認証方法(`mysql_native_password`)が利用できないのでMySQL8バージョンが必要です。

https://qiita.com/s_moriyama/items/14b703cc0dfa91a6f464

#### CloudShellからの場合

VPC上のCloudShell上からも直接接続は可能。
ただこの方法だと、GUIアプリを使った操作ができないので、ちょっとした調査用かな。

![スクリーンショット 2024-10-02 4.56.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3894042/bc210d89-1394-96f7-09e9-2d723b3e2e28.png)

### まとめ

内容が広くなってしまったので、詳細な作成手順等はあまり書けなかったのですが、実施にいろいろ試せてよかった！

VPCにVPNで接続するといった方法をとれば、残りの課題も解決できそうですが、いったん今回はここまでにします！