AWS EC2を作ったらこれはやっておけ〜 - サーバー初期構築 –

無断転載禁止 AWS EC2を作ったらこれはやっておけ〜 - サーバー初期構築 –
aws amazon web service

EC2でのサーバー構築手順

構築前の約束事

構築を始める前に。。。

インフラ技術者の約束ごと。
・ファイルを変更するときは、バックアップをとってから!

EC2にログイン

sudo su -l

rootアカウントのパスワード変更

$ sudo su -l
$ passwd

ローカルタイム変更

$ ll /etc/localtime*
$ cp -rp /etc/localtime /etc/localtime.org && cp -rp /usr/share/zoneinfo/Japan /etc/localtime
$ ll /etc/localtime*

———————————————————————-
時間が日本時間になっているのを確認
———————————————————————-

$ date

yum updateなどでglibcパッケージが更新されるとJSTからUTCにまた戻るので、防止設定

# ll /etc/sysconfig/clock*
# cp -rp /etc/sysconfig/clock /etc/sysconfig/clock.org && vi /etc/sysconfig/clock
ZONE="UTC"
UTC=true

を以下に変更

ZONE="Asia/Tokyo"
UTC=false
# ll /etc/sysconfig/clock*

NTP設定

時刻同期の設定

・うるう年のうるう秒対策
・時刻の後戻り防止

のためにやっておきましょう。

簡単に言うと

stepモード・・・時刻にずれが生じたら、正しい時刻に一気にあわせる
slewモード・・・時刻にずれが生じたら、徐々にあわせる

ポイントはNTPサーバよりも自分の時計が進んでしまったとき。

slewは自分の時計の進み方を遅くして、NTPサーバにあわせる。
stepは一気にあわせるので、サーバは過去の時刻に戻ってしまう。

過去の時刻に戻るとDB不整合を招くことがあるので、DBサーバはslewを強く推奨します。

NTPサーバとの距離が遠くて、時刻のずれが大きくなるような環境では
slewモードは足並みが揃うまでにかかる時間が大きいです。
が、それが問題になってslewが選択できないほど時刻のずれが大きいようならば
NTPサーバを立てるとか必要かと思います。

うるう年のうるう秒については
step・・・同じ時刻を2回刻む。
slew・・・NTPサーバが1秒進むので、徐々に追いつく

という挙動になるので、slewにしておこうということです。

同じ時刻を2回刻んだが為に、障害が発生して各地でOSが落ちまくるという悲劇が

過去のうるう年にありました。
バグフィックス済みのカーネルであれば、stepモードでも問題ないですが
slewにしておけばバグフィックス済みのカーネルになっているか、確認する手間も省けます。

時刻同期をstepモードからslewモードに変更する

# ps -ef | grep ntp | grep -v grep && echo "---" && ll /etc/sysconfig/ntpd* && echo "---" && cp -rp /etc/sysconfig/ntpd /etc/sysconfig/ntpd.org && ll /etc/sysconfig/ntpd*
ntp       2385     1  0 18:20 ?        00:00:00 ntpd -u ntp:ntp -p /var/run/ntpd.pid -g  ←まだ-gオプションのみ
---
-rw-r--r-- 1 root root  45 Feb  6 10:09 /etc/sysconfig/ntpd
-rw-r--r-- 1 root root 111 Feb  6 10:09 /etc/sysconfig/ntpdate
---
-rw-r--r-- 1 root root  45 Feb  6 10:09 /etc/sysconfig/ntpd   ←オリジナルファイル
-rw-r--r-- 1 root root 111 Feb  6 10:09 /etc/sysconfig/ntpdate
-rw-r--r-- 1 root root  45 Feb  6 10:09 /etc/sysconfig/ntpd.org ←オリジナルのコピー。バックアップとして保存
# vi /etc/sysconfig/ntpd
- OPTIONS="-g"
+ OPTIONS="-g -x"

 -xオプションを追記して保存

# ntpq -p
# service ntpd restart
# ps -ef | grep ntp
# ntpq -p

*がついたエントリがあること
再起動後は*がつくまでは少しかかる

ユーザ作成

1.グループ作成

$ groupadd -g グループID グループ名

-g・・・グループID。省略すると既存グループIDの連番。でもOS自動作成のシステムグループと分けるために
  桁数も多くしたIDを指定しておいた方がお得。

★OSがバージョンアップされると、ユーザやグループが追加されることは多いです。
ユーザやグループを作成するときにIDを小さい番号にしてしまうと、新規追加されたシステムユーザ・グループと重複してしまって
データ移行するときに面倒な手間が発生していまいます。
3桁、4桁を使用するのがオススメです。

2.ユーザ作成

$ useradd -u ユーザID -g グループ名 -d ホームディレクトリ -m -s /bin/bash -c "コメント" ユーザ名

オプションは
-u・・・ユーザID省略可。省略すると既存グループIDの連番。。省略すると既存ユーザIDの連番。グループIDと同じで指定した方がいい。
-g・・・グループ名もしくはグループID。どちらで指定もOK
-d・・・ホームディレクトリ。省略可。省略すると/home/ユーザ名になる。
-m・・・ホームディレクトリが存在しなかったら作成する。
-s・・・ユーザのシェルスクリプト。省略するとシステムデフォルトになる。AWS Linuxは/bin/bash
-c・・・コメント。省略可。省略すると空欄になる。

3.2で作成したユーザのパスワード変更

$ passwd ユーザ名

プロンプト変更

プロンプトとは、、、
sshログインしたら、白点滅でコマンド入力を待ってくれている箇所にある「$」、(rootユーザだったら「#」)
の前に表示されている文字列。

EC2だったら

[ec2-user@ip-10-0-2-240 ~]$
[root@ip-10-0-1-240 ~]#


[ec2-user@ip-10-0-2-240 ~]

[root@ip-10-0-1-240 ~]
の部分。

ここを変更します。
これ、超重要です。

単に便利だからとか、実用的だからではなく、事故を防ぐために必須なんです。

shutdownとか、rmとか、、、アプリ停止コマンドとか。プロンプトで何のサーバか判断できないところに打つのは怖くないですか??

★自分がどのサーバでコマンドを打とうとしているのか、ぱっと見で判断できるかどうか可視性を高めることは、事故を減らす為に非常に重要です。

root@hogehoge(WEB-HON)
root@hogetest(db-dev)

というように、大文字/小文字で差をつけたりして
本番か開発か、WEBかDBか、環境や用途がわかるものがオススメです。

ユーザプロファイルの「PS1」がプロンプト変数。

# ll /etc/bashrc*
# cp -rp /etc/bashrc /etc/bashrc.org && vi /etc/bashrc
----------------------------------------------------------------------
ここから35行目あたり
  # Turn on checkwinsize
  shopt -s checkwinsize
# change by prophet  ←追加
#  [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ "  ←コメントアウト
  [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h(サーバ用途) \W]\\$ " ←追加
  # You might want to have e.g. tty in prompt (e.g. more virtual machines)
----------------------------------------------------------------------

変更確認はスイッチユーザか再ログインする

# sudo su -l

swap作成

swapファイルをメモリにあわせて作成する
メモリと同等~2倍くらいがよい。
マイクロインスタンスなら1GBで。
サイズはbs(ブロックサイズ)×count(数)。下記なら1M×1024=1GBのファイルができる。

dd if=/dev/zero of=/usr/local/swapfile bs=1M count=1024

nanoだったらメモリ500MBなので、スワップ500MBで。

dd if=/dev/zero of=/usr/local/swapfile bs=4k count=128000

作成したファイルをswap用にフォーマット

mkswap /usr/local/swapfile

swapon -aでエラーにならないようにパーミッション変更しておく

chmod 0600 /usr/local/swapfile

/usr/local/swapfileをswapとして有効化

swapon /usr/local/swapfile

swap設定状態を確認

swapon -s

OS起動時自動マウント設定

cp -rp /etc/fstab /etc/fstab.org
vi /etc/fstab

下記を追加

# Add by 名前とか会社名とか
/usr/local/swapfile  swap     swap    defaults        0   0

システムファイルを変更する場合、デフォルト設定ではないことがわかるように
# Add by XXX のようにコメントを入れるようにしています。

変更前のファイルと比較すればわかることなのですが、
パラメータなんかは、チューニングしていった変更履歴がわかるように変更箇所をコピーして1行追加し、変更前はコメントアウトして残しておいたりわかりやすいように残しておきます。

◇自動swap有効化確認
いったん有効化したswapを無効にして、
/etc/fstabに記載した内容が妥当であることを確認します。

swapon/swapoffコマンド
 -aオプションで/etc/fstabに記載しているスワップを全部有効化/無効化する

swapon -s
Filename                                Type            Size    Used    Priority
/usr/local/swapfile                     file    2097148 8820    -1
※サイズは作成したファイルによって異なる

いったん無効にする
swapoff /usr/local/swapfile
swapoff -aでもOK

swapon -s
※何も出力されない

swapon -a
swapon -s
Filename                                Type            Size    Used    Priority
/usr/local/swapfile                     file    2097148 8820    -1

ftpインストール

ftpはデザイナーや外部パートナーの依頼があるときのみ、行うようにします。
通常は不要なポートやサービスを立ち上げないために、
SFTPなどを使用するようにします。

$ yum install vsftpd

———————————————————————-
設定ファイル書き換え(IPは適宜書き換え、セキュリティグループで穴をあける)
———————————————————————-

$ cp -rp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.org && vi /etc/vsftpd/vsftpd.conf

# 末尾に以下を追記

----------------------------------------------------------------------
pasv_enable=YES
pasv_addr_resolve=YES
pasv_min_port=60001
pasv_max_port=60100
pasv_address=EC2のpublicDNSを記入
----------------------------------------------------------------------

# 起動

$ service vsftpd status
$ service vsftpd start
$ service vsftpd status

# OS起動時の自動起動設定

$ chkconfig --list vsftpd

# 全てoffとなっていること確認

$ chkconfig vsftpd on
$ chkconfig --list vsftpd

# runレベル2~5がonになっていること確認
———————————————————————-
無効にする場合は

$ chkconfig vsftpd off

停止する場合は

$ service vsftpd status
$ service vsftpd stop
$ service vsftpd status

———————————————————————-

 以上!

この辺りをベースで設定しておけば、AWS EC2で再起動がかかったりしても開発者が余計な調査などを行なわなくて済むようになりますね。
これらを行なう前は、データの反映時間がずれたり、バッチ処理が正常に発動しなかったりと、サーバー再起動後の確認点が多かった気がします。
デザイン+開発+インフラ構築がセットになって、はじめて良いアプリケーションが提供できるかな〜と考えています!

Pocket
LINEで送る