Node.js
AWS

Vagrant Amazon Linux で Node.jsの環境構築とOSの初期設定を行う

概要

Vagrantを利用してAmazon Linux上に Node.js の実行環境を構築します。
ローカル環境での利用が前提ですが、運用時に必要なOSの基本設定等も行っています。

環境

  • Mac OS X Sierra 10.12.6
  • Vagrant 2.0.0
  • VirtualBox 5.1.30r118389

MacOS上にVagrantを使ってVirtualboxを立てその中に環境構築しています。
OSイメージはAmazon Linuxのこちらを利用。

OSの基本設定

以下の基本設定を行います。

  • OSの各パッケージの最新化(yumアップデート)
  • タイムゾーンの設定
  • ロケールの設定
  • swap領域の確保
  • ユーザの追加
  • pv6の無効化

OSの各パッケージの最新化(yumアップデート)

$ sudo yum -y update

少し時間がかかります。

タイムゾーンの設定

タイムゾーンがUTCになっているので、JST(日本時間)に変更します。
変更前を確認。

$ date
Sun Oct 29 08:06:29 UTC 2017

1.インスタンスで使用する時間帯を検索
Japanがあることを確認します。

$ ls /usr/share/zoneinfo/
Africa      Brazil   Egypt    GB-Eire    HST          Japan      Navajo    posixrules  Turkey     zone1970.tab
America     Canada   Eire     GMT        Iceland      Kwajalein  NZ        PRC         UCT        zone.tab
Antarctica  CET      EST      GMT0       Indian       Libya      NZ-CHAT   PST8PDT     Universal  Zulu
Arctic      Chile    EST5EDT  GMT-0      Iran         MET        Pacific   right       US
Asia        CST6CDT  Etc      GMT+0      iso3166.tab  Mexico     Poland    ROC         UTC
Atlantic    Cuba     Europe   Greenwich  Israel       MST        Portugal  ROK         WET
Australia   EET      GB       Hongkong   Jamaica      MST7MDT    posix     Singapore   W-SU

2.clockファイルの変更

$ sudo vi /etc/sysconfig/clock

以下でファイルを編集します。

ZONE="Japan"
UTC=true

3.インスタンスが参照するタイムゾーンファイルの参照先を指定
インスタンスが現地時間情報を参照する際に、時間帯ファイルを読み込むためシンボリックリンクをはります。

$ sudo ln -sf /usr/share/zoneinfo/Japan /etc/localtime

4.再起動

$ sudo reboot

5.日本時間になっているか確認

$ date
Sun Oct 29 17:38:05 JST 2017

ロケールの設定

初期設定では以下の通りになっています。

$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
LC_NUMERIC="en_US.UTF-8"
LC_TIME="en_US.UTF-8"
LC_COLLATE="en_US.UTF-8"
LC_MONETARY="en_US.UTF-8"
LC_MESSAGES="en_US.UTF-8"
LC_PAPER="en_US.UTF-8"
LC_NAME="en_US.UTF-8"
LC_ADDRESS="en_US.UTF-8"
LC_TELEPHONE="en_US.UTF-8"
LC_MEASUREMENT="en_US.UTF-8"
LC_IDENTIFICATION="en_US.UTF-8"
LC_ALL=

1.ja_JP.UTF-8に変更

$ sudo vi /etc/sysconfig/i18n
LANG="ja_JP.UTF-8"

2.rebootして再度確認

$ locale
LANG=ja_JP.UTF-8
LC_CTYPE="ja_JP.UTF-8"
LC_NUMERIC="ja_JP.UTF-8"
LC_TIME="ja_JP.UTF-8"
LC_COLLATE="ja_JP.UTF-8"
LC_MONETARY="ja_JP.UTF-8"
LC_MESSAGES="ja_JP.UTF-8"
LC_PAPER="ja_JP.UTF-8"
LC_NAME="ja_JP.UTF-8"
LC_ADDRESS="ja_JP.UTF-8"
LC_TELEPHONE="ja_JP.UTF-8"
LC_MEASUREMENT="ja_JP.UTF-8"
LC_IDENTIFICATION="ja_JP.UTF-8"
LC_ALL=

swap領域の確保

Amazon Linuxはデフォルトでは、swap領域が確保されていません。
Linuxは、メモリ不足でシステムが停止する恐れがある際、メモリを多く消費しているプロセスを強制的に停止するという特徴があります。(これをOOMkillerと言います。)

これが発生すると非常に面倒なので、保険として swap領域を確保しておくと良いでしょう。
どのくらい確保するかは こちら を参考にします。

※ 下記に分かりやすくまとめたてくれている記事があるのでこちらも載せておきます。
http://server.etutsplus.com/allocate-swap-space/

今回、物理メモリは1GBで作成しているので、それの2倍の2GB(2048MB)のswap領域を作成します。
swap領域はあくまでOOM Killerを動作させない為の保険です。
常にswap領域を使用しているような状態はそもそも良くないので、サーバのメモリ容量を増やすか、メモリの使用量を下げる対応を行う事が基本です。

1.swap領域の確認

$ free -m
total       used       free     shared    buffers     cached
Mem:           995        243        751          0         13        169
-/+ buffers/cache:         60        934
Swap:            0          0          0

2.swap領域の確保

$ sudo dd if=/dev/zero of=/swapfile bs=1024 count=2048k
2097152+0 records in
2097152+0 records out
2147483648 bytes (2.1 GB) copied, 2.68645 s, 799 MB/s

3.ファイルのアクセス権を変更する
パーミッションを変更しないと後述の swapon コマンドを実行した際にwarningが発生しますので、
作成したファイルに対して、600(作成者であるrootユーザのみ読み書きができる)を指定します。

$ sudo chmod 600 /swapfile

4.swap領域を作成

$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 2097148 KiB
no label, UUID=528f77eb-a23c-48e6-803d-f22c491c6438

5.swap領域の有効化
mkswapで作成しただけでは利用できないため、有効化します。

$ sudo swapon /swapfile

swap領域が作成されていれば、完了です。

$ free -m
             total       used       free     shared    buffers     cached
Mem:           995        927         67          0         15        820
-/+ buffers/cache:         91        904
Swap:         2047          0       2047

ユーザの追加

Amazon Linuxはデフォルトでec2-userが存在し、22番ポートでSSH接続が可能になっています。
これはAWSを利用している人であれば誰もが知っている事なので不正アクセスの対象になりやすい為、
セキュリティ対策として新しくユーザを作ってそのユーザでSSH接続を出来るように設定を行います。

※ この記事では vagrant を利用しているので、ec2-user は存在しませんが、
実運用の際は必ず行っておいたほうが良い手順です。

なお、新しいユーザでSSHログインを確認した後は ec2-user も削除しておいたほうがセキュリティ的には安全です。

1.新しいユーザーを追加

[ec2-user@localhost ~]$ sudo useradd newuser

2.新しいアカウントに切り替え

[ec2-user@localhost ~]$ sudo su - newuser
[newuser@localhost ~]$

3..ssh ディレクトリを作成
newuser ホームディレクトリに .ssh ディレクトリを作成し、
そのファイルのアクセス許可を 700 (所有者のみ、読み取り、書き込み、削除が可能) に変更します。

[newuser@localhost ~]$ mkdir ~/.ssh
[newuser@localhost ~]$ chmod 700 ~/.ssh

4.authorized_keysを作成
authorized_keys という名前のファイルを .ssh ディレクトリに作成し、
そのファイルのアクセス許可を 600 (所有者のみ、読み取りおよび書き込みが可能) に変更します。

[newuser@localhost ~]$ touch ~/.ssh/authorized_keys
[newuser@localhost ~]$ chmod 600 ~/.ssh/authorized_keys

5.公開鍵と秘密鍵の作成
鍵を作成する際に、パスフレーズの入力を求められます。
ここで入力したパスフレーズはSSH接続の際に必要となり、セキュリティが高まることになります。
ただし、パスフレーズを忘れてしまった場合など、二度と接続できないことになるため、
実運用では設定しないことがほとんどです。ファイヤーウォールとかの別の手段でセキュリティ強化する事が多いです。

[newuser@localhost ~]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/newuser/.ssh/id_rsa):/home/newuser/.ssh/id_rsa
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/newuser/.ssh/id_rsa.
Your public key has been saved in /home/newuser/.ssh/id_rsa.pub.
The key fingerprint is:
e1:3a:7f:e0:8b:6f:08:b1:b8:0f:00:71:7b:e1:3a:7a newuser@localhost.localdomain
The key's randomart image is:
+--[ RSA 2048]----+
|. . .            |
| o o .           |
|. . o   .        |
|.  o.  . .       |
|. o. o  S        |
| o..o  ..        |
|. E. .oo .       |
| ...  .+o .      |
|   .. .o+o       |
+-----------------+

6.生成した公開鍵を authorized_keys ファイルに設定

[newuser@localhost ~]$ cd .ssh
[newuser@localhost ~ .ssh]$ cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys

7.秘密鍵をローカルPCにダウンロードしてSSH接続

先程作成した ~/.ssh/id_rsa の中身を何らかの手段でローカルPCにコピーします。
下記のようなのファイルが生成されているので、ローカルPCの ~/.ssh ディレクトリにコピーします。

-----BEGIN RSA PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-128-CBC,0EE321561C1FA9449566B82ED286E69E

FRgRD5MK7ZjseCqph+LmBUB07qGUAKBkwnwrlVVmijvJ12F3DS8HhQ9Lp9u+8YMR
6FQPUuy70dZvXD5lDPD92D+Fw4wu2cOjPVVsDeo3aTJYaqYg1HD2C+ZHQZf5ieMW
AOK9LbvnUv6ZfQDztushRYXYdlidtq21w33WKYFk7kUUlo7Zs9Pe4N5uTTtf8F6Z
27Q+DgxcdIgEsoLchyLwSDfcCdNNZLJflGGYVdFL29c3eNIOVCPxZ9vevu3uD7XY
LwKs4uheDMV9+t3aUoCCu0WGKJZJLO2WnI88NTnfvdcRHrzYfh5v68TGYuyAhREB
ERJ/xea12jyWt7OmDS2Nj/cmXI5Avv+B4sKRGyG7he+YiobHRY/GrG0p7vNwBOte
YtBD9ruq2Aqs9KG7moQj1IPHRLvPpfQb0q1xC2HYFo6CjrQAue9qRI3yhLBDh81r
mQi7zJISvxgM+J5rdY+C4QF8SrFVSzB6HcJ/RoEeNK72ZcEtQgMU0fqZlEVT7UO2
a2Q9Ndz4/GjWzPmWw8l9Mt7NDGlzNtqgzMtEPDhdzEco82GBFdVhoS5kHsDUBSJl
7suldDqCiwhmr+DlLts34yTmoqGpkaPyiOBHqr+LHDDfvlkCPgTda8iu8rGTM+r3
mTb9smr4ElS7eyxfke+WtR6mZeya7xk528Ht7+zZtxBZUkMCFHwPvC0Y0ICjgMfx
Yetcl0yLb7IMiiu63L884m5dML9+hGWDWaKYBspN5sUFG77DZphewafx2oPny0io
FT4BAmETwcL8utl0qovcB5HyjVjRW5Z+LUcmJGqjzuYGB8BGFMbcGxkS7ptELHHf
Gr8hMhnpIu4MLrr9OSZdQCg1eujUKvlap7y2+cqhT7pZa541bEAWZVPX2AUXfL0u
/RuR5mdTzCZXjG2WoqgoG71PgLy0gNZt2wRLSITGdFMr5XBITfyvD3GU6cbJM2RU
rvbZQhPVXdoVsp6pIJYbT0ZK9e/MO/XmgJSe3iV1HP0ALv3wXkHdJcdleQ+WEGbi
2HtLfaxYht1OYDo2W3q5ZzWxJFlNTq/thNYqDMFjUeWJdw4fK6dKghxkZIUO2TE6
TXjNiDr15iiC+RZ8xJL+19YDonz4l1sfJ0Tzt0dpP+7HxSvVbhw0fXiJAzKay8RO
lR9Y7eh8rltnYZAywSRp4mzYc+e8IbptK5cN3f6k9j2IahnP7YpHtbnQ1O9RlKGR
Swr0pK7tAqXXyznv0nUmQEobS0rrodi8XM9bZLVNhbodhNyVmQjWCxuy0RI7fZYM
Vet9yxzo2gWaGe+UpVicMPaTm54fwImFWi0/J9bWNp54euiLm3mm43GHqAPx6hUC
kvDAKrwb4Yx+S3aqIw6eay2mPjUeMrH/1l23WBIfzdbSWVLZnY8mWyufnN+I0c8w
fOnoRczRg9bJzXCxCcq3Znu7fMNK6jspJgfUCOJ2YR0bXDQBqOl5By+ikKM757f6
5JiRGjVHIuJP9NjOtDZriVwweKtX5SrlBYhCIafkIcQ10Gj/mHI5p060BBDga2Dt
BcwkA3BUPK2yBiTMuuuTC9W2kzicVz672UTSYwOMyrzui0H/ZFQE5lwGXTdmlmT9
-----END RSA PRIVATE KEY-----

例えば、vagrant_ec2.pem という名前で秘密鍵をコピーして MacOSの ~/.ssh に保存します。

chmod 600 ~/.ssh/vagrant_ec2.pem を実行して権限を変更するのを忘れないようにしましょう。

以下のコマンドでSSH接続が出来るか確認を行います。

ssh -i /Users/sato/.ssh/vagrant_ec2.pem -p 2222 newuser@127.0.0.1
※ 127.0.0.1の部分は作成しているサーバのIPに合わせて下さい。

IPv6の無効化

IPv6を利用しないの前提であれば IPv6関連の機能を停止させておいたほうが良いと思います。

$ /sbin/chkconfig --list
ip6tables       0:off   1:off   2:on    3:on    4:on    5:on    6:off

1.ネットワークの設定ファイルを変更

$ sudo vi /etc/sysconfig/network
NETWORKING=yes
HOSTNAME=localhost.localdomain
NOZEROCONF=yes
NETWORKING_IPV6=no

2.IPv6をベースとしているサービスの自動起動を無効化

$ sudo chkconfig ip6tables off

Node.jsのインストール

Node.js はバージョンアップの頻度が非常に早いので、バージョンの切り替えが簡単に出来るように nodebrew というツールを利用します。

nodebrewのインストール

https://github.com/hokaccha/nodebrew
1.ヘルプに従ってインストール

$ curl -L git.io/nodebrew | perl - setup
=======================================
Export a path to nodebrew:

export PATH=$HOME/.nodebrew/current/bin:$PATH
========================================

2.nodebrewパスの追加

$ echo 'export PATH=$HOME/.nodebrew/current/bin:$PATH' >> ~/.bash_profile
$ source ~/.bash_profile

エラーとならなかったら、完了です。

nodebrew help

Node.jsのインストール

1.最新版をインストール

$ nodebrew install-binary latest

3.インスロール済みのバージョンを確認

$ nodebrew list
v9.0.0
current: none

4.有効化

$ nodebrew use v9.0.0
use v9.0.0

バージョンを確認します。エラーにならなければ、完了です。

node -v
v9.0.0

参考記事

https://qiita.com/drapon/items/2fc5b21a9cdc31ddb152
https://www.closetoyou.jp/aws/how-to-add-swap/
http://blog.genies.jp/2011/08/amazon-ec2-amazon-linux.html