【AWS初学者】EC2インスタンスへのSSH接続（ログイン）を簡単にしよう！



# はじめに

最近、オリジナルプロダクトのデプロイの練習として、Railsで作ったアプリをAWSを用いてデプロイする機会がありました。
その際、AWSのEC2インスタンスにログインするコマンドが長かったため、短いコマンドでログインできないかと調べたので、その内容についてまとめていきたいと思います:writing_hand:

![undraw_secure_login_pdn4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117662/71c4febf-7d02-8fb9-7fa4-c26f467e3bee.png)


# 前提条件
* AWSにてVPC作成が完了している
* EC2インスタンスの起動が完了している
* パブリックIPアドレスとElasticIPアドレスの紐づけが完了している

# １. SSHとは
AWSのEC2インスタンスへのログインするには、一般的に`SSH`を使用します。
`SSH`とは何なのでしょうか？
SSHとはSecure Shellの略で、コンピュータネットワーク上でデータ通信を暗号化するためのプロトコルの一つで、TCPポート番号は22です。
SSHは以下の特徴があるためリモートコンピュータに安全に接続して操作するなど広く使用されています。

<details><summary><strong>SSHの特徴<strong></summary>

1. <font color=blue>**安全性**</font>
   SSHは全ての通信（コマンド、パスワード、ファイルなど）を`暗号化`します。
これにより、悪意を持った人がネットワーク上でデータが盗聴しようとしても、その情報を読み取ることはできません。


2. <font color=blue>**認証機能**</font>
   SSHは強力な認証機能を提供します。最も一般的な方法は、パスワードベースの認証と`公開鍵認証`です。
   EC2インスタンスの認証は公開鍵と秘密鍵を用いた公開鍵認証となっており、具体的には`秘密鍵がクライアント`に保管され、`公開鍵はサーバー（ここではEC2インスタンス）`に配置されています。そして接続時にクライアントは公開鍵に対応する秘密鍵を持っていることを証明することによりログインできます。

3. <font color=blue>**完全性**</font>
   SSHはネットワーク上でデータが改ざんされていないことを保証します。
   この完全性を保証するためにSSHは`ハッシュ関数`を使用しており、SSHを通じて送信されるデータパケットから固定長の文字列（ハッシュ）を生成し、元のデータが少しでも変わると生成されるハッシュも大きく変わるため、ハッシュが受信側と送信側で一致しない場合は、データが破棄されます。

</details>


# 2. 通常ログイン方法
EC2インスタンスを作成する際に、AWSはSSHのキーペア（公開鍵と秘密鍵）を作成し、秘密鍵はクライアント側の安全な場所に保存する必要があります。なぜなら、このキーペアは、インスタンスにログインするための認証情報として使用されるからです。
そこで、ここからの説明では秘密鍵は`「~/.ssh」ディレクトリ`に保存されていることを前提に説明を進めます。

* SSHで接続
以下のコマンドを実行すると、インスタンスと接続することができます
```bash:ターミナル | SSH接続
ssh -i ~/.ssh/秘密鍵の名前.pem ec2-user@Elastic IPアドレス
```

:::note info
**コマンド説明**
* **ssh**
ネットワーク上の他のコンピュータにログインしたり、コマンドを実行したりするためのプログラム
* **-i ~/.ssh/秘密鍵の名前.pem**
「-i」オプションは秘密鍵へのパスを指定
* **ec2-user**
リモートサーバー上でログインするユーザー名
(EC2インスタンスのデフォルトユーザー名はAMIによりますが、Amazon Linuxでは通常「ec2-user」 となっている)
* **＠Elastic IPアドレス**
「＠」の後ろは接続したいサーバーのIPアドレスまたはホスト名を指定
:::


# 3. 簡略版ログイン方法
毎回、インスタンスに接続する度に長いIPアドレスやDNS名を打ち込んだり、ElasticIPアドレスの値を覚えておくのは、見返したりメモしておけば大丈夫ですが、何回もとなると面倒ですよね、、、、
そこで、`「ssh サービス名」`（例えば「ssh rails_app」など）とコマンドを打つだけで接続できるようにしていきます！
具体的には以下の通り`SSHの設定ファイル`をあらかじめに設定することで接続を簡単にします:sunglasses:

## (1) SSH設定ファイルの編集準備
「~/.ssh/config」ファイルがSSHのクライアント設定を記述するファイルなので、まず次のコマンドで設定ファイルを開きます。

```bash:ターミナル | 設定ファイル開く
vi ~/.ssh/config
```

## (2) 接続情報を設定ファイルへ追加
Vimエディタでconfigファイルが開かれるので、書き込みを行う`i`を押し`INSERTモード`に変更します。
その後、下記のコードを入力します。

```zsh:ターミナル | 設定ファイル編集
Host 【サービス名】
    HostName 【Elastic IPアドレス】
    User ec2-user
    IdentityFile ~/.ssh/秘密鍵の名前.pem
```
:::note info
**編集内容について**
* **Host 【サービス名】**
【サービス名】は任意で、これがSSHコマンドで使用する名前になります。
アプリの名前やプロジェクトの名前などにしておくと分かりやすいでしょう。
* **HostName 【Elastic IPアドレス】**
ここで接続するEC2インスタンスを指定するためElastic IPアドレスを入力します。
* **IdentityFile  ~/.ssh/秘密鍵の名前.pem**
SSHキーペアの秘密鍵へのパスを指定します。
:::

## (3) 設定ファイル保存・設定完了
入力が完了したら、`Escキー`を入力し、`NORMALモード`に戻ります。
ファイルを保存するため`:w`コマンドで上書き保存し、Vimエディタを終了するため`:q`コマンドを入力します。
ここまでで設定完了です！！

## (4) 接続確認
以下の簡略版コマンドでSSH接続します。
補足ですが、このコマンドを打つ際はカレントディレクトリを`.ssh`にする必要がなく、嬉しいことにどのディレクトリにいても実行可能です:tada:
```bash:ターミナル | SSH接続
ssh サービス名
```

私は試しに`rails_app`というサービス名で`configファイル`を設定し、SSH接続できるか試してみました。
![スクリーンショット 2023-07-08 10.45.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3117662/e606ef88-941e-8d86-3e6d-d72036b529d8.png)

無事、簡略版コマンドでも接続できました:smile:


# 4. おわりに

サービスをデプロイするにあたっていろいろな設定項目があったり、インフラ関係の知識が必要になってきて大変になると思いますが、こういった作業で少しでも楽になったり速くなったりする知識を増やしていくことで、メインとなる業務に時間をかけることができ、好循環を生むのではないかなと思います:wink:

こうした豆知識的なことも積極的に取り入れて、自分自身の成長に繋げていきたいですね:seedling:

# 5. 参考文献

https://pikawaka.com/rails/ec2_deploy