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

バージョンによってはプラグインがうまく動かない場合があるので、バージョンが選べるようにすべての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コンテナ導入(×3)

3つの候補から選ばせるため複数立ち上げた。
以下のdockerファイルを作ってdocker-composeで立ち上げた。

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」で検索してインストールする。

おまけ1 EFSマウント

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

作成

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

マウント

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

アンマウント

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

おまけ2 EBS

アタッチ

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

ls -la /dev/s*

マウント

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

おまけ3 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 [イメージ名]:[タグ]

おまけ4 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}.*

おまけ5 VSCodeでリモート編集ができるようにする。

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

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

cd %USERPROFILE%
mkdir .ssh

このフォルダの中に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」に設定名が追加されるので右クリックして接続する。正常に接続できたら緑マークになる。未設定(ワークスペース)に一覧がでるので編集できる!
※ただし検索できない。