AWS Cloud9をSSH接続で使うまでの手順

AWS Cloud9での環境構築には2種類の方法があります。
今回は**SSH環境**を使えるようにするまでの手順をまとめました。

- **EC2 環境** (新しいインスタンスを作成する)
- **SSH環境** (既存のインスタンスにSSHで接続する)

# EC2環境とSSH環境の違い
お手軽なのはEC2環境、玄人向けがSSH環境と言ったところです。

EC2環境は、Cloud9用のインスタンスを作成して使用します。
ユーザーが選ぶのはOSとスペックだけで、残りはAWSが準備してくれます(カスタイマイズすることも可能です)。詳細は補足にまとめました。

SSH環境は、自分でインスタンスを作成し、Cloud9で操作できるように設定します。
ユーザー自身で、必要なパッケージ等のインストール、ネットワークの設定を行う必要があります。

| 項目                            | EC2環境                              | SSH環境 |
|----------------------------|----------------------------------|--------------|
| インスタンス             |  新規作成                           | 事前に準備 |
| 設定                             | スペックとOS選択のみ   | 全て自分で行う|
| OS                               | Amazon Linux or Ubuntu    | Linux全般          |
| Cloud9以外での使用 | 想定していない                 | 使用可能            |

詳しくは[公式](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/ec2-env-versus-ssh-env.html)を参照してください。

# SSH環境のメリット
SSH環境は、EC2環境に比べて面倒が多いのです。
単にAWSのインスタンスでCloud9を使いたいだけであれば不要な存在です。
それでも用意されているということは何かしらのメリットがあるということになります。

## メリット1：AWS以外のサーバーが使える
例えば、別のクラウドサービスで使用している既存サーバーに接続して、Cloud9を使用することができます。
構築済みの既存サーバーでCloud9を用いて開発したい、AWSのインスタンスを使いたくないといったケースで有効です。

## メリット2：Cloud9以外の用途にインスタンスを使える
EC2環境の場合、Cloud9環境を削除するとインスタンスも削除されます。
SSH環境であれば、Cloud9の使用終了後も継続してインスタンスを使用することができます。
既存サーバーで一時的にCloud9を使用といったことも可能です。

また、EC2環境の場合では不要なパッケージもインストールされます。
例えば、Pythonの開発のみ行い場合であっても、その他の言語を最低限動かすためのパッケージはインストールされています。

# SSH環境を使用するための手順
今回は、デフォルトユーザーである「ec2-user」でCloud9を使用する手順を記載します。
## [1] インスタンスを用意する
### [1-1] インスタンスの作成
EC2をインスタンスを作成します。
下記のようにパブリックサブネット内にインスタンス1台という簡単な構成で作成しました。

この構成であれば、 Cloud9を使用するための特別な手順はありません。
インスタンスは下記設定としました。

| 項目                             | 値                        |
|-----------------------------|---------------------|
| OS                                | Amazon Linux 2 |
| インスタンスタイプ | t3.micro               |
| ストレージ                 | EBS, 16GB         |


### [1-2] パッケージのインストール
SSH環境としてインスタンスを使用するための用件が色々とあります。
詳しくは下記リンクに記載があります。
[AWS Cloud9 SSH 開発環境 ホスト要件](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/ssh-settings.html#ssh-settings-requirements)

#### [1-2-1] Python2.7のインストール
Amazon Linux 2であれば、Pytnon2.7はインストール済みのため何もする必要はありません。
インストールされていないサーバーであれば、yumやapt-getを用いてインストールします。

```bash
$ sudo yum install -y python
```
2.7と指定があるため、Python3がデフォルトのサーバーであれば、2.7をデフォルトに変える必要があるかもしれません。

#### [1-2-2] Node.jsのインストール
バージョンが 0.6.16 以降のNode.jsが必要条件となります。
公式に記載の通り、下記手順でインストールします。
[Amazon EC2 インスタンスでの Node.js のセットアップ](https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/setting-up-node-on-ec2-instance.html)

```bash
$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
$ . .bashrc
$ nvm install node
```
#### [1-2-3] AWS Cloud9 の起動元ディレクトリの権限変更
 Cloud9を起動時に表示されるディレクトリの権限を変更します。
AWS Cloud9 の起動元とするディレクトリには「rwxr-xr-x 」の権限が必要になります。
ホームディレクトリを起動元にする場合は、下記コマンドで変更します。

```bash![undefined.jpg](https://s3.qrunch.io/3f9e9fd53ac79d6e88e66457e1139599.png)
$ sudo chmod u=rwx,g=rx,o=rx ~
```

#### [1-2-4] AWS Cloud9インストーラの実行
AWS Cloud9インストーラをダウンロードし実行します。
AWS Cloud9 に必要なコンポーネントやその依存関係をインストールするそうです。
[AWS Cloud9 インストーラの使用](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/installer.html#installer-download-run)

インストーラ実行にgccが必要なので先にインストールしてから実行します。
インストーラが実行し終わるまでに数十分かかりました。t3.microだからかもしれません。

```bash
$ sudo yum install -y gcc
$ curl -L https://raw.githubusercontent.com/c9/install/master/install.sh | bash
```

### [1-3] ネットワークACLとセキュリティグループの設定
EC2環境ですと、AWS側でセキュリティグループを作成してくれます。
SSH環境ではAWS側で設定してくれませんので、セキュリティのことを考えると自分で設定しておいた方がよいでしょう。
インバウンドはSSHのみ許可、アウトバウンドはHTTP, HTTPSのみ許可しました。
SSHの許可はCloud9でアクセスする際にも必要になります。

#### インバウンド

| タイプ                             | プロトコル | ポート範囲 | ソース | 説明 |
|-------------------------------|----------------|----------------|-----------|-------|
| SSH                                | TCP              | 22                 | 0.0.0.0/0 |

#### アウトバウンド

| タイプ | プロトコル | ポート範囲 | ソース | 説明 |
|-----------|----------------|----------------|-----------|-------|
| HTTP    | TCP            | 80                | 0.0.0.0/0 |
| HTTPS  | TCP            | 443              | 0.0.0.0/0 |

## [2] Cloud9でSSH環境を作成する

### [2-1] SSHの接続情報を入力
Cloud9の環境作成画面でSSH接続に必要な情報を入力します。
Environment Typeは「Connect and run in remote server (SSH)」を選択します。

![02.Cloud9環境作成2.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345798/b4dbb001-9283-c374-059d-3314f251bf06.jpeg)

Userには上述の手順でCloud9で使用するためのユーザーとして設定した「ec2-user」を入力します。
HostにはEC2インスタンスのパブリックIPを入力します。

![03.Cloud9環境作成3.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345798/a79fb7f3-59e3-447f-1238-b6808fb55397.jpeg)

### [2-2] 公開鍵の設定
EC2インスタンスに公開鍵を登録します。
「Copy key to clipboard」をクリックして公開鍵をコピーします。

![04.Cloud9環境作成4.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345798/c45c8c4d-55c0-9e1a-af38-49e11cdb3049.jpeg)

EC2インスタンスにログインし、公開鍵を登録します。

```bash
$ echo "[コピーした公開鍵]" >>  ~/.ssh/authorized_keys
```
### [2-3] Advanced settings (設定不要)
公開鍵を登録したら[Next Step]をクリックします。
SSHの接続に問題がある場合にはここでエラーメッセージが表示されます。

Advanced settingsは空欄のままにします。
EC2インスタンス以外のサーバーを使用する場合には、入力の必要があるかもしれません。

![05.Cloud9の環境作成5.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345798/6339d003-23be-019b-3c55-94129fc8c636.jpeg)

### [2-4] 作成完了
次の画面に進んだら設定内容を確認し[Create environment]をクリックします。
設定に問題がなければCloud9の初期画面が表示されます。
以上で終了です。

![06.Cloud9の環境作成6.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/345798/6224565c-3dd6-c15d-820f-72ec99586c24.jpeg)

# 終わりに
SSH環境は、EC2環境に比べて設定が面倒ですが、一度分かってしまえば次回は簡単です。
私はCloudFormationを使用して環境構築をしているので、SSH環境を活用しています。

EC2環境、SSH環境それぞれにメリットがあるので、シチュエーションに応じて自分の都合の良い方を選ぶのがよいと思います。

# 補足

## 補足[1] Cloud9で環境作成時に自動で作成されるセキュリティグループ
Cloud9で使用するIPアドレスの範囲は、リージョン ごとに決まっており「ip-ranges.json」に記載されています。
下記設定は、アジアパシフィック（東京）でCloud9環境を作成した際の例です。
[AWS Cloud9 開発環境 の VPC の設定](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/ip-ranges.html)

### インバウンド

| タイプ | プロトコル | ポート範囲 | ソース | 説明 |
|-----------|----------------|----------------|-----------|-------|
| SSH | TCP | 22 | 18.179.48.128/27 |
| SSH | TCP | 22 | 18.179.48.96/27 |

### アウトバウンド

| タイプ | プロトコル | ポート範囲 | ソース | 説明 |
|-----------|----------------|----------------|-----------|-------|
| すべてのトラフィック | すべて | すべて | 0.0.0.0/0 |

## 補足[2] Advanced settingsの内容

| 設定                         | 内容                              | 備考 |
|-------------------------|------------------------------|-------|
| Environment path    | 環境パス                      | デフォルトはホームディレクトリ |
| Node.js binary path | Node.js バイナリパス | 設定しなければAWS Cloud9が推測する |
| SSH jump host        | SSH ジャンプホスト  | 踏み台サーバー経由で接続するようなケースで設定する |