背景
- ひとつのEC2インスタンス上に複数の開発環境を作りたい。
- それぞれの環境に違ったIPアドレスを割り当てたい。
間違いありましたら、指摘お願い致します。
前提条件
EC2上で動くrailsアプリケーションが構築済みである事。
VPC、EC2、セキュリティグループ、サブネットの設定は既にされているものとして説明します!
大まかな手順
今回は環境1、環境2、環境3と3つの環境を作ります。
- ネットワークインターフェイス(ENI)を設定する
- 3環境分、EC2のプライベートIPアドレスを用意する
- 3環境分、グローバルIPアドレスを用意する
- プライベートIPアドレスとグローバルIPアドレスを紐付ける
- ネットワークインターフェイスをOSに認識させる
- nginxの設定(バーチャルホストの設定)
ネットワークインターフェイス(ENI)の設定
※ネットワークインターフェイスはVPC内で実行中のインスタンスでしか使用できないので注意。
EC2 > ネットワークインターフェイス > ネットワークインターフェイスの作成。
サブネットを選択すると、選択可能なセキュリティグループが表示されます。
選択完了後、[作成する]をクリックします。
作成したネットワークインターフェイスが一覧に表示されます。
作成したネットワークインターフェイスを選択して[アタッチ]をクリックします。
アタッチするEC2インスタンスを選択します。
これでネットワークインターフェイスがEC2にアタッチされました!
プライベートIPアドレスの設定
ネットワークインターフェイスにプライベートIPアドレスを追加します。
作成したネットワークインターフェイスを選択し
アクション > Manage IP Addresses を選択します。
今回は3つの環境を作成するので「新しいIPの割り当て」を3回クリックします。
「更新する」をクリックすると新しいプライベートIPアドレスが割り当てられます。
プライベートIPアドレスは未入力状態だと自動的に割り当てられます。
特に決まっていない場合は未入力で大丈夫です。
環境分のプライベートIPアドレスが取得できました!
Elastic IPの取得
今回は環境を3つる為、3つのグローバルIPを取得します。
EC2 > Elastic IP > 新しいアドレスの割り当て を選択します。
何も指定するところがないウィンドウが出てきます。
このまま[割り当て]をクリックします
一覧に作成した Elastic IPが表示されているので選択します。
アクション > アドレスの関連付け を選択します。
リソースタイプは「ネットワークインターフェイス」を選択します。
ネットワークインターフェイス、プライベートIPは作成したものを選択します。
作成したIPの数分、作業を繰り返します。
※起動中のEC2に紐づいていないElastic IPは料金が発生するので注意!
休憩
ここまではAWSのコンソール上で操作するので、スムーズにいくかと思います。
ここから先はEC2にコンソールからログインして設定を行います。
サーバの設定に慣れていないと、いろいろハマる・・・と思いますので気を引き締めていきましょう!
(実際にいろいろハマりました)
ネットワークインターフェイスをOSに認識させる
まずは、先ほど作成したプライベートIPアドレスがeth0に追加されている事を確認します。
※今回作成したプライベートIPアドレスを仮に 21.0.1.123, 21.0.1.124, 21.0.1.125 とします。
$ ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN group default qlen 1
(省略)
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc mq state UP group default qlen 1000
inet 21.0.1.201/24 brd 21.0.1.255 scope global eth0
valid_lft forever preferred_lft forever
inet 21.0.1.123/24 brd 21.0.1.255 scope global secondary eth0
valid_lft forever preferred_lft forever
inet 21.0.1.124/24 brd 21.0.1.255 scope global secondary eth0
valid_lft forever preferred_lft forever
inet 21.0.1.125/24 brd 21.0.1.255 scope global secondary eth0
valid_lft forever preferred_lft forever
(省略)
プライベートIPアドレスは登録されていますが、OSに認識されていない状態ですので
OSに認識させるためのネットワーク設定ファイルを作成します。
ファイル名ですが「ifcfg-」の後にインタフェース名を記載します。
また名前は一意である必要があります。
今回追加したネットワークインターフェイスはeth0、3つの環境を作成するのでそれぞれ番号を振っています。
$ cd /etc/sysconfig/network-scripts
$ touch ifcfg-eth0:1
$ vi ifcfg-eth0:1
(ifcfg-eth0:1に以下を設定する)
DEVICE=eth0:1
BOOTPROTO=static
BROADCAST=21.0.0.255
IPADDR=21.0.1.123
NETMASK=255.255.255.0
NETWORK=21.0.0.1
ONBOOT=yes
この設定ファイルにはプライベートIPアドレスを設定します。
同様にifcfg-eth0:2, ifcfg-eth0:3 のファイルも作成します。
設定が完了したらネットワークのサービスを再起動します。
$ sudo service network reload
Shutting down interface eth0: [ OK ]
Shutting down loopback interface: [ OK ]
Bringing up loopback interface: [ OK ]
Bringing up interface eth0:
Determining IP information for eth0... done.
Determining IPv6 information for eth0... done.
Determining if ip address 21.0.1.123 is already in use for device eth0...
RTNETLINK answers: File exists
Determining if ip address 21.0.1.124 is already in use for device eth0...
RTNETLINK answers: File exists
Determining if ip address 21.0.1.125 is already in use for device eth0...
RTNETLINK answers: File exists
[ OK ]
上記のように全OKが出れば完了です。
設定に誤りがある場合はエラーが出るので修正します。
下記はエラーの一部です(同じIPアドレスが設定されていると怒られました)
error in ifcfg-eth0:2: already seen ipaddr 21.0.1.125 in ifcfg-eth0:1
nginxの設定
uniconは環境ごとに起動する必要があります。
listenにはプライベートIPアドレスを指定します。
$ cd /etc/nginx/conf.d/
$ cat virtual.conf
upstream unicorn {
server unix:/home/test-user/app/dev1/project/tmp/sockets/unicorn.sock;
}
server {
listen 21.0.1.123;
server_name dev1;
root /home/test-user/app/dev1/project;
index index.html;
charset utf-8;
(省略)
}
upstream unicorn-dev2 {
server unix:/home/test-user/app/dev2/project/tmp/sockets/unicorn.sock;
}
server {
listen 21.0.1.124;
server_name dev2;
root /home/test-user/app/dev2/project;
index index.html;
charset utf-8;
}
upstream unicorn-dev3 {
server unix:/home/test-user/app/dev3/project/tmp/sockets/unicorn.sock;
}
server {
listen 21.0.1.125;
server_name dev3;
root /home/test-user/app/dev3/project;
index index.html;
charset utf-8;
}
listenにはプライベートIPアドレスを指定します。
大事な事なので2回書きました・・・。
グローバルIPアドレスを設定していて、悩みました。
オンプレミスでの運用が長い方はハマりやすいと思います・・・
設定が完了したらnginxを再起動します。
$ sudo service nginx restart
これで完了です!
各環境にアクセスして繋がるか確認してください!