AMLのEC2でHP開発サーバを立ち上げる（備忘録）

自分の備忘録用に。

##要件
+ Redmineでプロジェクト管理
+ 比較用にWordPressをとっかえひっかえしたい
+ そのまま本番に移行するのでセキュリティもしっかり

##EC2インスタンス
特に工夫した点はない。適切なスペックにて、「AML2」で作成。キーペアは新規作成。紛失しないように注意。

##基本パッケージセットアップ
初期ユーザは「ec2-user」、パスワードなし。キーペアを指定してssh。

パッケージアップデート

```
sudo yum update -y
```

yum-cronのインストール

```
sudo yum install yum-cron -y
```

自動有効化

```
sudo systemctl enable yum-cron
```

自動更新設定

```
sudo sed -i "s/^apply_updates.*$/apply_updates = yes/g" /etc/yum/yum-cron.conf
```

yum-cronの起動

```
sudo systemctl start yum-cron
```

##タイムゾーン

タイムゾーンの変更

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

ハードウェアクロックを【Asia/Tokyo】に変更

```
sudo vim /etc/sysconfig/clock
```

```
下記の行を削除
ZONE=”UTC”

追加：
ZONE=”Asia/Tokyo”
UTC=true
```

変更されていることを確認

```
date
Wed Apr  3 13:26:13 JST 2019
JSTになっていればOK。
```

文字コードを日本語に変更

```
sudo sed -i "s/en_US\.UTF-8/ja_JP\.UTF-8/g" /etc/sysconfig/i18n
```

##管理用ユーザの追加
sudoできるユーザを別に作る。

管理用ユーザの追加

```
sudo adduser newuser
```

管理用ユーザのパスワード設定

```
sudo passwd newuser
```

管理ユーザをwheelグループに追加

```
sudo usermod -aG wheel newuser
```

sudoersファイルの変更

```
sudo visudo

 #適当なところに追加
%newuser ALL=(ALL) NOPASSWD: ALL
```

##管理用ユーザのSSH設定
作成した管理ユーザにスイッチ

```
su newuser
```

.sshディレクトリの作成

```
cd /home/newuser
mkdir .ssh
```

ec2-userから鍵のコピー(推奨できないやり方)

```
sudo cp /home/ec2-user/.ssh/authorized_keys /home/newuser/.ssh/authorized_keys
```

suでrootになれるようにする

```
sudo vi /etc/pam.d/su
```
 #下記コメントアウトを消して可能にする
auth required pam_wheel.so use_uid

権限の変更

```
chmod 700 .ssh
sudo chown newuser:newuser .ssh/authorized_keys
chmod 600 .ssh/authorized_keys
```

##ec2-userの削除
一度ログアウトし、作成した管理ユーザでログイン出来ることを確認してから。

```
sudo userdel -r ec2-user
```

##rootユーザのパスワード変更
rootユーザにスイッチ

```
sudo su -
```

パスワード変更

```
passwd
```

##docker インストール
docker本体

```
sudo yum install -y docker
service docker start
usermod -a -G docker newuser
```

docker-compose

```
sudo curl -L "https://github.com/docker/compose/releases/download/1.9.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version
systemctl restart docker
```

ログインし直してrootでないユーザでもdockerコマンドが実行できればOK。

dockerはイメージ格納などで数GBのディスクを必要とする。
作業ディレクトリを変えたい場合は以下で行う。

dockerを停止

```
systemctl stop docker
```

/etc/docker/daemon.jsonというファイルを以下の内容で新規に作る

```
{
 "data-root": "/to/some/path"
}
```

dockerを起動

```
systemctl start docker
```

##Redminコンテナ導入
バックログも使いたいので入ったイメージを導入。
（プラグイン後付けはできなかった。）

Docker Hubから下記を導入↓
[74th/redmine-all-in-one](https://hub.docker.com/r/74th/redmine-all-in-one "Qiita")

バージョンによってはプラグインがうまく動かない場合があるので、バージョンが選べるようにすべてのTAGのイメージをpullする

```
docker pull -a 74th/redmine-all-in-one
docker run -d --name redmine --restart=unless-stopped -p 8080:80 74th/redmine-all-in-one:JP
```

##Wordpressコンテナ導入（×３）
３つの候補から選ばせるため複数立ち上げた。
以下のdockerファイルを作ってdocker-composeで立ち上げた。

```php
version: '2'

services:
   db1: #←サイトごとにユニーク名にする
     image: mysql:5.7
     container_name: askahp_mysql1 #←これがコンテナ名になる。サイトごとにユニーク名にする
     volumes:
       - /home/fantec/db_data/mysql1:/var/lib/mysql #←サイトごとに別パスにする
     restart: always
     ports:
       - "3307:3306" #←サイトごとに別ポートにする
     environment: #←全サイト同じにした
       MYSQL_ROOT_PASSWORD: xxxxxxx 
       MYSQL_DATABASE: xxxxxxx
       MYSQL_USER: xxxxxxx
       MYSQL_PASSWORD: xxxxxx

   wordpress1: #←サイトごとにユニーク名にする
     image: wordpress:latest
     container_name: askahp_wp1 #←これがコンテナ名になる。サイトごとにユニーク名にする
     depends_on:
       - db1 #←dbサービスと合わせる
     ports:
       - "81:80" #←サイトごとに別ポートにする
     restart: always
     volumes:
       - /home/fantec/html/wp1:/var/www/html #←サイトごとに別パスにする
     environment:
       WORDPRESS_DB_HOST: db1:3306 #←DBサービスと合わせる。コンテナ内部ポートであることに注意
       WORDPRESS_DB_PASSWORD: xxxxxxx #←DBサービスと合わせる。
volumes:
    db_data:
```

上記の設定からdocker-composeで起動するコマンド。

```
docker-compose -f [dockerファイル名] up -d
```

するほどでないが複数起動するので一応シェル化した。

```docker-compose-up.sh
#!/bin/sh

if [ $# -ne 1 ]; then
  echo "指定された引数は$#個です。"
  echo "実行するには1個の引数が必要です。"
  exit 1
fi

docker-compose -f $1 up -d
```

環境を作る過程で面倒だったのでWordPressコンテナを停止して削除するシェルも一応作った。

```docker-container-clear.sh
#!/bin/sh

if [ $# -ne 1 ]; then
  echo "指定された引数は$#個です。"
  echo "実行するには1個の引数が必要です。"
  exit 1
fi

docker stop askhp_wp${1}
docker rm askhp_wp${1}
docker stop askhp_mysql${1}
docker rm askhp_mysql${1}
```

##Wordpress設定
新しい投稿エディタは使いにくいのでクラシックに戻す。
プラグインにて「Classic Editor」で検索してインストールする。

##おまけ１　EFSマウント
dockerのバックアップを別インスタンスに受け渡しする際に。
割高なので受け渡し目的なら必要な時に一時的に使うのが吉。

####作成
AWSのコンソール画面から「EFS」を選択して作成可能。

####マウント
```
$sudo yum install -y amazon-efs-utils
$sudo mkdir [マウントしたいディレクトリ]
$sudo mount -t efs [ファイルシステムID]:/ [マウントしたいディレクトリ]
#ファイルシステムIDはEFSのコンソール画面からヘルプで確認できる。
```

####アンマウント
```
$sudo umount [マウントしたディレクトリ]
```

##おまけ２　EBS
####アタッチ
作成は画面コンソールのEBSで。アタッチも画面から。
アタッチすると以下のコマンドでデバイスが追加されていることがわかる

```
ls -la /dev/s*
```

####マウント

```
mkfs -t ext4 [デバイス名]
mkdir [マウント先のディレクトリ]
mount [デバイス名] [マウント先のディレクトリ]
chmod 777 [マウント先のディレクトリ]
#自動マウントを設定する。以下を/etc/fstabの末尾に追加する。
[デバイス名] [マウント先のディレクトリ] ext4 defaults 1 1
```


##おまけ３　dockerのバックアップとリストア
####バックアップ
saveしてtarで固める方法で。
docker commitでコンテナをイメージに変換

```
docker commit [コンテナ名] [イメージ名]:[タグ]
```

docker saveでイメージを保存

```
docker save [イメージ名]:[タグ] > [アーカイブ名].tar
```


####リストア

```
docker load < [アーカイブ名].tar

#新規でコンテナを作るときと同じコマンドで起動
docker run -d --name redmine --restart=unless-stopped -p 8080:80 [イメージ名]:[タグ]
```

##おまけ４　docker hubにあるイメージで利用できるタグを検索する
コマンドはないみたい。APIをたたいて取得するシェルを作ってみた。

```dockerhubls.sh
#!/bin/sh

if [ $# -ne 1 ]; then
  echo "指定された引数は$#個です。"
  echo "実行するには1個の引数が必要です。"
  exit 1
fi

TMPFILE=./.tagstmp

curl -s https://registry.hub.docker.com/v1/repositories/$1/tags > ${TMPFILE}.1

sed -e 's/},/\n/g' ${TMPFILE}.1 > ${TMPFILE}.2

cut -d ',' -f 2 ${TMPFILE}.2 | cut -d ':' -f 2 | sed -e 's/"//g' | sed -e 's/ //g' > ${TMPFILE}.3

cat ${TMPFILE}.3

rm ${TMPFILE}.*
```

##おまけ５　VSCodeでリモート編集ができるようにする。
WordPressのカスタマイズを行う際、UI的にVSCodeが優れているのでSSHリモート編集できるようにする。
クライアントはWindows10、SSHクライアントは標準で入っているOpenSSHを使用する。

OpenSSHの接続ファイルを作成する。
Windowsのログインユーザのプロファイルディレクトリ以下に.sshフォルダを作成する。

```
cd %USERPROFILE%
mkdir .ssh
```

このフォルダの中にconfigというファイルを以下の中身で作成する。

```config
Host profile_name ←プロファイル名
HostName xxx.xxx.xxx.xxx
User xxxx
Port xx
IdentityFile ~/.ssh/*****.pem
ForwardAgent yes
RemoteForward 52698 127.0.0.1:52698
```

接続できるか確認する。
VSCodeを起動し、一般ターミナルウィンドウで以下を実行し接続できればOK。

```
ssh profile_name
```

VSCodeに「SSH FS」の名前の拡張機能をインストールする。
バージョンはこの時点で最新の「1.16.2」を使った。
インストールしたらいったんリロードする。

エクスプローラで「SSH FILE SYSTEMS」のタグが追加されているので開いて、新しい設定を追加する。設定は以下とする。

```
Name：表示名なのでわかりやすい任意の文字
Merge：No
Label：Nameと同じにした
Group：空
PuTTY：空
Host：ホストアドレス
Port：22
Root：サーバのルートパス
Agent：空
Username：ログインユーザ名
Password：空
Private key：AWSのpemファイルフルパス指定
Passphrase：空
Proxy：空
```

設定したら「SSH FILE SYSTEMS」に設定名が追加されるので右クリックして接続する。正常に接続できたら緑マークになる。未設定（ワークスペース）に一覧がでるので編集できる！
※ただし検索できない。