クラウド開発環境構築（メモ）

# はじめに
本記事は、「Ｗｅｂサービス開発のため」の仮想マシン構築（AWS）～クラウド開発環境構築（Cloud9）までの手順を自分用にまとめたものです。

# 前提条件
* クライアントはWindows環境
* クラウドはAWS利用（AWSアカウント作成済み）
* AWSの基礎知識有

　基礎知識が足りない場合`@Futo23`さんの記事が大変参考になりましたのでそちらを参照してください。
> 引用：[AWS素人がインフラ設計/構築を理解するために、まず最初におさえるべきキーワード15選](https://qiita.com/Futo23/items/318d89eccdbf5697f8bf)


# 手順
## 仮想マシン構築
### 管理コンソールサイトへアクセス
（ [マネージメントコンソール](https://signin.aws.amazon.com/signin?redirect_uri=https%3A%2F%2Fconsole.aws.amazon.com%2Fconsole%2Fhome%3Fstate%3DhashArgs%2523%26isauthcode%3Dtrue&client_id=arn%3Aaws%3Aiam%3A%3A015428540659%3Auser%2Fhomepage&forceMobileApp=0)）
### 管理コンソールへログイン
### テンプレートから仮想マシンを作成
1. 「ソリューション構築」＞「仮想マシンを起動する」を選択
2. 「Amazon Linux AMI 2018.03.0 (HVM), SSD Volume Type」を選択
3. 「確認と作成」を選択
4. 「新しいキーペア名」を入力して「キーペアのダウンロード」を選択
5. 「インスタンスの作成」を選択

### インターネット利用のためのＩＰアドレス割当

1. 「サービス」＞「EC2」を選択
2. 「ネットワーク＆セキュリティ」＞「Elstatic IP」を選択
3. 「新しいアドレスの割当」を選択
4. 「IPv4 アドレスプール」を「Amazonプール」に設定（デフォルト）
5. 「割り当て」を選択
6. 「閉じる」を選択
7. 「アクション」＞「アドレスの関連付け」を選択
8. 対象の「インスタンス」と「プライベートIPアドレス」を設定して「関連付け」を選択
9. 「閉じる」を選択

### アクセス制限

1. 「ネットワーク＆セキュリティ」＞「セキュリティグループ」を選択
2. 仮想マシンと関連付けられている「セキュリティグループ」を選択して「アクション」＞「インバウンドのルールの編集」を選択
3. 「ルール追加」を選択
4. 「カスタムTCP」を「HTTP」へ変更して「保存」を選択
5. 「ルール追加」を選択
6. 「カスタムTCP」の「ポート」に「20022」を入力して「保存」を選択

### SSH接続確認

1. ターミナルソフト起動（TeraTerm、Putty等）
2. SSH接続：`「Elastatic IP」、「新しいキーペア」`を指定
3. 結果確認

![aws-ssh-open.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531775/642b6e0f-d085-4b2c-6749-0c957d463af9.png)

### IAM設定

1. 「サービス」＞「IAM」を選択
2. 「ダッシュボード」＞「ユーザー」を選択
3. 「ユーザーを追加」を選択
4. 「ユーザー名」の入力と「プログラムによるアクセス」にチェックを入れて「次のステップ：アクセス権限」を選択
5. 「既存のポリシーを直接アタッチ」を選択
6. 「AdministratorAccess」にチェックを入れて「次のステップ：タグ」を選択
7. 「キー名」を入力して「次のステップ：確認」を選択
8. 「ユーザーの作成」を選択
9. 「アクセスキーID」「シークレットアクセスキー」をメモに控える


## 仮想マシン起動後の初期設定
### ソフトウェアの最新化

```shell-session
$ sudo yum update -y
```
### タイムゾーンの変更（日本時間）

```shell-session
$ sudo ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
```

タイムゾーンの結果を確認（UTC→JST）。

```shell-session
$ date
Tue Nov 12 13:23:56 JST 2019
```

再起動後も日本時間にする。

```shell-session:/etc/sysconfig/clockファイルの修正
$ vim /etc/sysconfig/clock
【変更前】
ZONE="UTC"
UTC=true
【変更後】
ZONE="Asia/Tokyo"
UTC=false

【注意事項：読取り専用のため強制的に保存する】
:w !sudo tee %
:q!
```
### 日本語環境へ変更

```shell-session:/etc/sysconfig/i18nファイルの修正
$ sudo sh -c "echo 'LANG=ja_JP.UTF-8' > /etc/sysconfig/i18n"
$ sudo yum install -y man-pages-ja

【日本語表示反映の為、一旦再起動】
$ sudo shutdown -r now
```
### `root`のパスワード設定（セキュリティ強化）

```shell-session
$ sudo su -
$ passwd

ユーザー root のパスワードを変更。
新しいパスワード:
新しいパスワードを再入力してください:
passwd: すべての認証トークンが正しく更新できました。
```

### `ec2-user（デフォルト）`の代替ユーザー作成（セキュリティ強化）

```shell-session:ユーザー作成
# useradd -g wheel ユーザー名
```

```shell-session:sudo権限付与
# echo 'ユーザー名 ALL = NOPASSWD: ALL' >> /etc/sudoers.d/cloud-init
【注意事項】
「NOPASSWD」設定により、sudo実行時にパスワード入力が不要となります。
セキュリティ上のリスクがあるのでお気を付けください。
```

```shell-session:authorized_keysのコピーとパーミッション設定
# rsync -a ~ec2-user/.ssh/authorized_keys ~ユーザー名/.ssh/
# chown -R ユーザー名:wheel ~ユーザー名/.ssh
# chmod -R go-rwx ~ユーザー名/.ssh
```
新しいユーザーで`sshログイン`と`sudo権限`が利用できる事を確認したら削除します。

```shell-session:sudo動作確認
$ sudo -s
```

```bash:ec2-user削除
$ sudo userdel ec2-user
```

### 不要コンソール起動を無効化（サーバー資源節約）

```shell-session:/etc/sysconfig/initファイルの修正
# vim /etc/sysconfig/init

【変更前】
ACTIVE_CONSOLES=/dev/tty[1-6]
【変更後】
ACTIVE_CONSOLES=/dev/tty1
```

### SSHのデフォルトポート変更（セキュリティ強化）

```shell-session:/etc/ssh/sshd_configファイルの修正
$ sudo vim /etc/ssh/sshd_config

【追加】
Port 22
Port 22022
```

```shell-session:設定ファイル再読み込み
$ sudo service sshd reload

sshd を再読み込み中:                                       [  OK  ]
```

```shell-session:20022ポートの確認
$ sudo netstat -anp | grep sshd

tcp        0      0 0.0.0.0:22                  0.0.0.0:*                   LISTEN      15543/sshd
tcp        0      0 0.0.0.0:20022               0.0.0.0:*                   LISTEN      15543/sshd
```

### ＡＷＳコマンド利用準備

```shell-session:インストール確認
$ aws --version

aws-cli/1.16.102 Python/2.7.16 Linux/4.14.146-93.123.amzn1.x86_64 botocore/1.12.92
```

```shell-session:アクセスキー等の設定
$ aws configure

AWS Access Key ID [None]: XXXXXXXXXXXX
AWS Secret Access Key [None]: XXXXXXXXXXXXXXXXXXXXXXXXXXXX
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

AWS Access Key ID [None]:アクセスキーID
AWS Secret Access Key [None]: シークレットアクセスキー
Default region name [None]: Tokyoリージョン（ap-northeast-1）
Default output format [None]: "text","json","table"のどれかを指定

```shell-session:アクセスキー等の設定

$ aws ec2 describe-instance-status
{
    "InstanceStatuses": [
        {
            "InstanceId": "i-0c7f2cff2082514c9",
            "InstanceState": {
                "Code": 16,
                "Name": "running"
            },
            "AvailabilityZone": "ap-northeast-1a",
            "SystemStatus": {
                "Status": "ok",
                "Details": [
                    {
                        "Status": "passed",
                        "Name": "reachability"
                    }
                ]
            },
            "InstanceStatus": {
                "Status": "ok",
                "Details": [
                    {
                        "Status": "passed",
                        "Name": "reachability"
                    }
                ]
            }
        }
    ]
}
```

### Cloud9用の環境インストール（Python、Node.js）
> 引用：[AWS Cloud9 SSH 開発環境 ホスト要件](https://docs.aws.amazon.com/ja_jp/cloud9/latest/user-guide/ssh-settings.html)

```shell-session:pythonインストール状況確認
$ python --version

Python 2.7.16
```

```shell-session:node.jsインストール状況確認
$ node -v

-bash: node: command not found
```

```shell-session:node.jsインストール下準備
$ sudo yum -y install gcc-c++ git

【メッセージ省略】
Installed:
  gcc-c++.noarch 0:4.8.5-1.22.amzn1        git.x86_64 0:2.14.5-1.60.amzn1

Dependency Installed:
  cpp48.x86_64 0:4.8.5-28.142.amzn1
  gcc.noarch 0:4.8.5-1.22.amzn1
  gcc48.x86_64 0:4.8.5-28.142.amzn1
  gcc48-c++.x86_64 0:4.8.5-28.142.amzn1
  glibc-devel.x86_64 0:2.17-260.175.amzn1
  glibc-headers.x86_64 0:2.17-260.175.amzn1
  kernel-headers.x86_64 0:4.14.146-93.123.amzn1
  libgcc48.x86_64 0:4.8.5-28.142.amzn1
  libgomp.x86_64 0:6.4.1-1.45.amzn1
  libmpc.x86_64 0:1.0.1-3.3.amzn1
  libstdc++48.x86_64 0:4.8.5-28.142.amzn1
  mpfr.x86_64 0:3.1.1-4.14.amzn1
  perl-Error.noarch 1:0.17020-2.9.amzn1
  perl-Git.noarch 0:2.14.5-1.60.amzn1
  perl-TermReadKey.x86_64 0:2.30-20.9.amzn1

Complete!
```

```shell-session:nvmダウンロード
$ git clone https://github.com/creationix/nvm.git ~/.nvm

remote: Enumerating objects: 24, done.
remote: Counting objects: 100% (24/24), done.
remote: Compressing objects: 100% (20/20), done.
remote: Total 7573 (delta 7), reused 16 (delta 4), pack-reused 7549
Receiving objects: 100% (7573/7573), 2.51 MiB | 2.56 MiB/s, done.
Resolving deltas: 100% (4779/4779), done.
```

```shell-session:nvmへのパス設定
$ source ~/.nvm/nvm.sh
```

```shell-session:nvmコマンドへのパス設定
$ vim ~/.bash_profile

【追記】
# nvm
if [[ -s ~/.nvm/nvm.sh ]] ; then
        source ~/.nvm/nvm.sh ;
fi
```

```shell-session:Node.jsインストール
$ nvm install node

Downloading and installing node v13.1.0...
Downloading https://nodejs.org/dist/v13.1.0/node-v13.1.0-linux-x64.tar.xz...
######################################################################### 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v13.1.0 (npm v6.12.1)
Creating default alias: default -> node (-> v13.1.0)
```

```shell-session:Node.jsのバージョン確認
$ node -v

v13.1.0
```

```shell-session:Node.jsの使用バージョン指定
$ nvm use v13.1.0

Now using node v13.1.0 (npm v6.12.1)
```

```shell-session:Node.jsのバイナリパス控え
$ which node
~/.nvm/versions/node/v13.1.0/bin/node
```

```shell-session:cloud9用のルートディレクトリ作成
$ mkdir ~/cloud9
```

## クラウド開発環境構築（Cloud9）
### AWS Cloud9
1. 「サービス」＞「Cloud9」を選択
2. 「Create environment」を選択
3. 「Name」を入力して「Next Step」を選択
4. 「Environment type」を「Connect and run in remote server (SSH)」に変更して下記を入力して「Next Step」を選択

    | 入力項目名 | 説明 |
    |:--------|:--------|
    | User | SSH接続ユーザー名 |
    | Host | EC2のグローバルIPアドレス |
    | Port | 20022 |
    | Environment path - Optional | ~/cloud9 |
    | Node.js binary path - Optional | ~/.nvm/versions/node/v13.1.0/bin/node |

5. AWSの仮想マシンにログイン
6. 「Copy key to clipboard」を選択（クリップボードへコピー）
7. 公開鍵の登録

    ```shell-session:キーファイルへの追記
    $ vim ~.ssh/authorized_keys

    【追記内容例：クリップボードの内容】
    ssh-rsa AAAAB3NzaC1yc2EAAAADAQA（省略）XXXXXXXXXXXX== XXXXXXXX@cloud9.amazon.com

    ```
8. 「Next step」を選択
9. 「Create Environment」を選択
10. 「Next」を選択
11. 「Next」を選択
12. 「y」を入力して「Enter」実行
13. 「Next」を選択
14. 「Finish」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/531775/46d898ca-e16a-a30f-db2e-bfded5b3798c.png)