AWS利用メモ 2018年4月


Amazon Linux（RedHat6ベース）上に（自分が）必要な環境を構築するメモ。

>現状RHL7ベースのAmazon Linux2もあります。逆に他の記事を参照するときは差を意識。

## やりたいこと

* いわゆるLAMP環境を作ってLaravelが動くようにすること（PHP7.x以上が必要など）
* node.jsを利用したいので環境をつくる

## 前提

* 無料枠のインスタンスを利用している
* ログイン用の認証鍵は予め登録している

## EC2でVMを立てた際の初期状態

話はVMが起動してログインできる状態から始めます。
だいたいのお膳立てができており、yumのレポジトリも拡張されており便利。

* 初期ユーザーはec2-user
* 鍵認証のみ（rootは禁止）
* SSH用に22番ポートが開いている
* getenforceはDisabled

## ログイン

ログインします。今回は手元の鍵を利用しているので、その鍵の位置を-iで指定。

>手持ちじゃなくても、新規につくった鍵の位置を指定すればいいだけです。

```bash
ssh -i .ssh/id_rsa ec2-user@ec2-xxx-xxx-xxx.compute.amazonaws.com
```


## 初期作業

何はなくてもyum update。

### yum update

```bash
sudo yum update -y
```

### ec2-userのパスワード設定

標準ユーザーであるec2-userにパスワードを設定します。

```bash
sudo passswd ec2-user
```

### rootのパスワード設定

rootにもパスワードを設定します。

```bash
sudo passwd root
```

### ユーザの追加

作業用のユーザーを追加します。またsudoできるようwheelグループに追加しておきます。

>ec2-userで作業してもいいとは思います。

```bash
sudo useradd hoge
sudo passwd hoge
sudo gpasswd -a hoge wheel
```

### visudo

wheelグループがsudoできるように、visudoで以下をコメントイン。

```bash
%wheel  ALL=(ALL)       ALL
```

>既に作業ユーザーでログインしている場合は一度ログインしないとsudoできません。

### hogeのSSH鍵を設定

新規に追加したユーザーが証明書でログインできるようにします。
以下では、ec2-userと同じ鍵を利用することを前提としているため、コピーして利用しています。

```bash
su hoge
cd
mkdir .ssh
chmod 700 .ssh
sudo cp /home/ec2-user/.ssh/authorized_keys /home/hoge/.ssh/authorized_keys
sudo chown -R hoge:hoge .ssh
cd .ssh
chmod 600 authorized_keys
```

#### ローカル（Mac）上ほ鍵を移動する

ローカルのMacとかで使っている鍵を利用する場合はscpとかでコピーしてやります。

```bash
#@mac
cd
scp -i .ssh/id_rsa ~/.ssh/id_rsa.pub ec2-user@ec2-xxx-xxx-xxx.compute.amazonaws.com:~/authorized_keys
cp /home/ec2-user/autorized_keys /home/hoge/.ssh/authorized_keys
```

### ログイン確認とsudoできるかの確認

ec2-userとかを削除する前にかならず新規ユーザーでログインを試します。
sudoできるかもためしておきます。

```bash
ssh hoge@ec2-xxx-xxx-xxx.compute.amazonaws.com
sudo ls
```

### ec2-userの削除

必要に応じてec2-userを削除します。

```bash
sudo userdel ec2-user
```

## 日本（語）環境対応

必要に応じてローカル環境に適合させます。

### locale

```bash
sudo vi  /etc/sysconfig/i18n
LANG="ja_JP.utf8"
```

### date

dateとすると、AWSではUTCとなっている。

```bash
sudo cp /usr/share/zoneinfo/Japan /etc/localtime
```

作業後、再びdateコマンドを実行してJSTになっていることを確認します。

### システムクロック/Timezone

```bash
sudo vi /etc/sysconfig/clock
```

```bash
Zone=”Asia/Tokyo”
```

>UTF=trueはとりあえずそのまま。

ここでreboot。

##　とりあえずインストールしていたほうがいいツール

npm install時に無いと文句言われる。

### git

```bash
sudo yum install git
```

### development tools

```bash
sudo yum groupinstall "development tools"
```

## LAMPの設定

LANPのセットアップはAWSオフィシャルにも[掲載](https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/install-LAMP.html)されています。

### インストール

必要なものをとりあえず一気に入れておきます。AWSのチュートリアルにないものも入れています（主にLaravel用）。

```bash
sudo yum install -y httpd24 php71 mysql56-server php71-mysqlnd php71-mbstring php71-pdo php71-gd
```

>その他、必要なものがあれば随時追加。

### Apacheの設定

#### Indexの削除と.htaccessの許可

いろいろ書かれていますが、コメントを除けば以下の3行。Indexsを削除。AllowOverrideをAllに。

```bash
<Directory "/var/www/html">
    Options FollowSymLinks

    AllowOverride All

    Require all granted
</Directory>
```

#### Firewall（セキュリティーグループ）の開放

セキュリティーグループでインバウンドの80番を許可します。

### 起動と永続化

設定が終わればサービスを起動。問題なければ永続化を行います。

```bash
sudo service httpd configtest
sudo service httpd start
sudo chkconfig httpd on
```

### MySQLの設定

mysql_secure_installationを実行するためにとりあえず起動します。
で、mysql_secure_installationを事項します。とりあえずは全部Yes。

```bash
sudo service mysqld start
sudo mysql_secure_installation
```

キャラクタとかがLiten1になっているので、/etc/my.cnfをに下記を追加。

```bash
character_set_server=utf8
innodb_file_per_table
skip-character-set-client-handshake

innodb_buffer_pool_size = 128M
innodb_log_buffer_size = 64M
```

>innodb_buffer_pool_sizeは必要に応じて（搭載メモリの8割程度と言われています）。

設定が追われれば再起動と永続化。

```bash
sudo service mysqld restart
sudo chkconfig mysqld on
```


## Composer

Laravelに必要なcomposerをインストール。

```bash
cd
curl -sS https://getcomposer.org/installer | php
sudo mv composer.phar /usr/local/bin/composer
composer -V
```

## Laravel

composerを利用してLaravelをインストール。

```bash
composer create-project laravel/laravel laravel
```

### メモリ不足でこける（環境依存）

普通は問題なくLaravelのインストールが完了するはずですが、エラーでストップしました。
どうやら無料枠で利用できるmicroインスタンスのメモリ、swap不足によるもののようです。

```bash
[ErrorException]
  proc_open(): fork failed - Cannot allocate memory
```

取り敢えず、下記のようにしてSwap領域を追加します。

```bash
sudo /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
sudo /sbin/mkswap /var/swap.1
sudo /sbin/swapon /var/swap.1
```

```bash
chmod -R 777 storage
chmod -R 775 /bootstrap/cache
```

Sawp領域が定義されたか確認。

```bash
free -m
```

まあ、本番環境では起こらないエラーではありますが。。。

## node.js

最後に簡単にnode関係。
意外と「これ！」というインストール方法が無いですね。
私は複数バージョン管理を必要としないので（少なくとも本番サーバでは）、以下の方法でインストールします。

```bash
cd
curl --silent --location https://rpm.nodesource.com/setup_8.x | sudo bash -
sudo yum -y install nodejs
node -v
```

### expressとApacheの連携

expressでAPIを公開したりするユースケースなので、expressとApacheを連携させる方法をメモしておきます。
以下、Apache2.4での設定。httpd.confに以下のようにProxyPass /node http://localhost:3000を追加します。

>もちろんexpressを3000番portで動作させる想定です。

```bash
ServerRoot "/etc/httpd" 
ProxyPass /node http://localhost:3000 //適当な位置に追加
```
>http://localhost:3000/ とお尻にスラッシュを付けないこと。つけると、/はOKでも/api/hogeとかのアクセスでコケる。

必要なモジュールは標準で読み込まれているようです。
以下、/etc/httpd/conf.modules.d/00-proxy.confの設定。

```bash
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_http_module modules/mod_proxy_http.so
```

* https://blog.katsubemakito.net/nodejs/install_amazonlinux

### nodeプログラムの永続化

nodeプログラムは原則、コンソールを閉じてしまうと終了してしまいますので、永続化します。
いろいろツールがありますが、pm2を利用したいと思います。以下の記事を参考にさせていただきました。

* https://www.yoheim.net/blog.php?q=20170706 （基本操作）
* https://www.yoheim.net/blog.php?q=20170705 （永続化）

## その他

そん他のメモ。

### SSL（LetsEncrypt)

テスト環境等でとりあえずSSLを実装したい場合は、Let'sEncryptが便利です。
但し期限が90日なので実運用に際してはcronで更新を走らせる必要があります。

#### 準備

mod_sslが入ってないとconf.d/ssl.confファイルがありません。インストールしておきます。

```bash
sudo yum install mod24_ssl
```

#### 設定

以下の記事通りにやれば動きます。バージョン依存などがあるようなので、まめに記事をチェックしたほうがいい感じです。

* https://qiita.com/takahiko/items/a08895550727b95b6c36
* https://kohkimakimoto.hatenablog.com/entry/2016/09/15/180119 (VirtualServerでの設定）

期限が迫ると、

```bash
sudo /usr/bin/certbot-auto --debug renew --post-hook "sudo service httpd restart"
```

を実行して更新する。