注目の記事

Amazon VPCを使ったミニマム構成のサーバ環境を構築する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

よく訓練されたアップル信者、都元です。AWSにおいては、ネットワーク環境をあまり気にせず、数クリックで簡単にサーバを構築できるのは一つのメリットだと言えます。しかし、本格的に運用するシステムに関しては、ネットワーク環境をコントロールする需要も出てきます。AWS Virtual Private Cloud (VPC)を使えば、AWS上に仮想ネットワークを定義し、その上に各種サーバを配置することができます。

深く考えずに非VPC環境に構築してしまったAWSサーバ環境は、簡単にはVPC環境に移行することはできません。従って弊社では、小さなシステムであっても、最初からVPC環境にシステムを構築することを推奨しています。「非VPCが許されるのは小学生までだよねー」とボスが申しておりました。かといって、ネットワークの構成をゼロから考えて構築するのもひと苦労であるため、本エントリーでは、システムの初期段階でテンプレートとして活用できる、ミニマムなシステム構成をご紹介します。

ミニマム構成図

minimum-vpc

左の図で表したのは、障害耐性や冗長化、負荷分散、オートスケール等の機能は完全に割り切った、ミニマムなVPC構成です。AWS上でVPCと呼ばれる仮想ネットワーク構築基盤の上に、アプリケーションサーバとDBサーバを各1つずつ立てています。それぞれ、Amazon LinuxサーバとRDSのMySQLサーバとします。

VPCの中には、サブネットを2つ作成します。上側のサブネットは、インターネットとやり取りするため「public subnet」と呼びます。アプリケーションサーバはインターネットとやり取りをするため、このpublic subnetに配置します。また、ユーザからのリクエストを受け付ける為に、Elastic IPによってグローバルIPを付与します。ミニマムと言いながら、一つだけ贅沢をしています。アプリケーションのデータファイルや、インストールするアプリケーション自身を配置するために、EBS(外部ディスクのようなもの)を1つ取り付けています。これは、下記の手順を一つ省略するだけで、簡単に「真のミニマム」にできます。

下側のサブネットは、インターネットからは遮断されており、内部のネットワークとのみやりとりをするため「private subnet」と呼びます。DBサーバはアプリケーションサーバからアクセスされるだけなので、private subnetに配置します。

この構成で、まずはアプリケーションを運用できることはお分かり頂けると思います。

構築手順

能書きはこのくらいにして、実際の構築手順に入りましょう。

VPC環境の構築

まずはVPCのManagement Consoleを開きます。VPC Wizardというものを使えば、ある程度のひな形を一発で作ってくれるのですが、ここはひとつ、VPCの中身を少し深く理解するために、要素を1つ1つ作って行こうと思います。左カラムのメニューから「Your VPCs」を選択し「Create VPC」ボタンをクリックします。出て来たウィンドウに、今回作成するネットワーク全体を表すCIDRを入力します。ここでは 10.0.0.0/16 とします。TenancyはDefaultにしておきましょう。 create-vpc 作成されたVPCのID(vpc-xxxxxxxx)は確認しておいてください。

次にサブネットを作成します。左メニューより「Subnets」を選択し「Create Subnet」をクリックします。出て来たウィンドウで、先ほど作ったVPCのID、AZ、及びこのサブネットのCIDRを入力します。この操作は3回繰り返し、VPC内に3つのサブネットを作成します。 create-public-subnet

  • 1つ目はpublic subnetです。ネットワークは10.0.0.0/24としAZはどこでも構いません。
  • 2つ目はprivate subnetです。ネットワークは10.0.1.0/24としAZはどこでも構いません。
  • 3つ目は、最初の図には示しませんでしたが、後ほど必要になるprivate subnetです。ネットワークは10.0.2.0/24としAZは2つ目のサブネットと異なるAZを選択してください。

3つ目のサブネットは、RDSのMulti-AZ構成で利用するものです。本エントリの構成では、RDSを単一AZ構成で構築しますので、このサブネットは実際には利用しません。

次に、Internet Gateway というものを作成します。Internet Gatewayは、VPC内のサーバが、インターネットと接続するための口です。このゲートウェイを設置しなければ、完全にインターネットから遮断された状態となり、VPN接続のみで利用するような用途のネットワーク(本エントリーの解説範囲外)を構築できます。左メニューより「Internet Gateways」を選択し「Create Internet Gateway」をクリックします。ウィンドウがポップアップしますが、とくに設定項目はありません。そのまま「Yes, Create」で作成します。 create-internet-gateway

作成したInternet GatewayをVPCと紐付けます。「Attach to VPC」をクリックし、VPCのIDを選択します。 internet-gateway-attach-to-vpc

次に、Route Tableを確認しましょう。Route Tableは、各サブネットに仮想的に配置されるルータのルーティングテーブルだと思ってください。サブネットの一覧を確認すると、デフォルトでRoute Tableが自動で作成されており(図の例では rtb-*****196 各環境でIDは異なる)、全てのsubnetが同じ設定になっているはずです。 route-table

Route Tableは、public subnetにおいてはインターネットに出て行く口(Internet Gateway)が必要で、private subnateには不要です。従って、まず自動作成されたRoute Tableをそのままprivate subnet用として利用しましょう。 route-table-for-private-subnet

次に、新しくRoute Tableを作り、それをpublic subnet用とします。「Create Route Table」ボタンからRoute Tableを新規作成(図では rtb-****13b4)し、Destination 0.0.0.0/0 を先ほど作成したInternet Gatewayに向けるよう設定します。 setup-route-table-for-public-subnet

最後に、今作成したRoute Table(rtb-****13b4)をpublic subnetに設定します。左カラムの「Subnets」のページからpublic subnet(10.0.0.0/24のサブネット)を選び、その下の方にある (replace) というリンクをクリックします。ポップアップしたウィンドウで新しいRoute Table(rtb-****13b4)を設定します。 setup-public-subnet-for-route-table

RDSからVPCを利用するための設定

RDSのManagement Consoleを開きます。左メニューより「DB Subnet Groups」を選択して「Create DB Subnet Group」をクリックします。ポップアップしたウィンドウで、VPCのID、及び2つのprivate subnet(10.0.1.0/24と10.0.2.0/24)を指定します。 create-db-subnet-group

以上で、VPCのセットアップは完了です。では続いて、このネットワークの上に、サーバを構築していきましょう。

DBサーバの構築

RDSのManagement Consoleより、「Launch DB Instance」をクリックします。DBの種類はMySQLを選択してください。 launch-db-1

通常通り、サイズやDBユーザ/パスワードの設定等を行います。 launch-db-2

大したことはないのですが、このページがRDS on VPCのキモです。Choose a VPC及びDB Subnet Groupの欄で先ほど作成したVPCとDB Subnet Groupを選択します。 launch-db-3

この後の設定は、通常のRDSと変わりありません。特に要件がなければ、デフォルトのまま進んで構いません。以上で、数分待機すると、MySQLサーバがprivate subnetに起動します。Management Consoleから確認できます。VPC ID欄にVPCのIDが表示されているため、通常のRDSインスタンスとは異なることが分かると思います。詳細のEndpointの項にあるホスト名で、アプリケーションサーバからDBに接続します。 db-launched

続きまして、アプリケーションサーバの構築

サクサクいきましょう。EC2のManagement Consoleより、「Launch Instance」をクリックします。 launch-ec2-1

Classic WizardからAmazon Linux AMI 2012.09(またはそれ以降)を選択してください。 launch-ec2-2

次がキモです。Launch infoのタブでEC2ではなくVPCを選択し、起動先のサブネット(public subnetの10.0.0.0/24)を選択します。画像中ではMediumインスタンスを起動していますが、ここはシステムの要求に合わせて適切に設定しましょう。 launch-ec2-3

次の画面はデフォルトのまま。 launch-ec2-4

この画面で、EBSボリュームを設定します。デフォルトでシステム用のRootディスクとして8GBのEBSが利用されます。これに加えて、10GBの外部ディスクとしてのEBSを作成します。右下の「Edit」をクリックしてください。 launch-ec2-5

この画面で、EBS Volumesのタブを選び、ディスクの情報を入力します。ここではディスク容量を10GBとしました。システム要件に合わせて変更して構いません。このディスクを、/dev/sdf として認識するように設定しました。情報を入れ終わったら右下のAddをクリックし、下のドライブリストに追加されたことを確認してください。 launch-ec2-6

EBSの接続先は/dev/sdf〜sdpの範囲が推奨されています。/dev/sda1はRoot deviceで予約済み、/dev/sdb〜sdeはinstance storeで利用が推奨、/dev/sdf〜sdpがEBSでの利用が推奨されています。この段階で/dev/sdf以外にEBSを接続した場合、後半で解説するフォーマット等のコマンドが変わりますので注意してください。

あとはKey PairやSecurity Groupの設定等、通常のEC2と同じ設定です。80番と22番のポートを開けておきましょう。また、1つのVPCにつきdefaultというSecurity Groupが自動的に1つ作成されています。このSecurity Groupは、VPC内のインスタンス同士が自由に通信するためのものですので、設定しておきましょう。ウィザードを完了するとEC2インスタンスがpublic subnetに立ち上がります。public subnetとは言え、まだローカルIPアドレスしか持っていないため、外からこのサーバにアクセスすることはできません。アプリケーションサーバに付与するためのグローバルIPアドレスとしてElastic IPを確保しましょう。左メニューから「Elastic IPs」を選択し、Allocate New Addressボタンをクリックします。この設定では、EIP used in VPCとしてください。 create-eip

続いて、確保したEIPを、アプリケーションサーバに割り当てます。今確保したEPIを選択し、「Associate Address」ボタンをクリックします。設定では、付与対象のインスタンスを選択します。割り当てたIPアドレスは控えておいてください。 eip-association

アプリケーションサーバに入り、少々のセットアップをする

アプリケーションサーバにSSH接続します。

EBSボリュームをマウントする

まずは、追加で作ったEBSを使えるようにしてみましょう。新規に作成したEBSはフォーマットされていないため、すぐにはマウントできません。以下の手順でフォーマットを行い、/mnt/dataにマウントしてみます。

$ sudo yum -y install xfsprogs
$ sudo fdisk -l

ディスク /dev/xvda1: 8589 MB, 8589934592 バイト
ヘッド 255, セクタ 63, シリンダ 1044
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000


ディスク /dev/xvdf: 10.7 GB, 10737418240 バイト
ヘッド 255, セクタ 63, シリンダ 1305
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

$ sudo mkfs.ext3 -b 4096 /dev/xvdf
$ sudo mkdir /mnt/data
$ sudo mount /dev/xvdf /mnt/data

$ mount
/dev/xvda1 on / type ext4 (rw,noatime)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
/dev/xvdf on /mnt/data type ext3 (rw)

マウントできましたね。ただし、サーバを再起動してしまうとマウントが解除されてしまいます。それを避けるため、以下の設定をしておきます。これにより、起動時に自動的にEBSが /mnt/data にマウントされるようになります。

$ sudo sh -c 'echo "/dev/xvdf /mnt/data ext3 noatime 0 0" >>/etc/fstab'

上記は、root権限で /etc/fstab ファイルの末尾に「/dev/xvdf /mnt/data ext3 noatime 0 0」という記述を追加するコマンドです。vi等で編集しても構いません。

アプリケーションサーバからMySQLにアクセスしてみる

先ほど起動したRDSのMySQLは、グローバルIPを持たないため、外部から直接のアクセスができません。しかしアプリケーションサーバ内からは、アクセス可能なはずです。試してみましょう。

$ sudo yum -y install mysql
$ mysql -h ********.********.ap-northeast-1.rds.amazonaws.com -u ******** -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 18
Server version: 5.5.27-log Source distribution

Copyright (c) 2000, 2012, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> exit

問題なくアクセスできますね。

httpdのインストール

アプリケーションサーバにhttpdをインストールし、外部からのHTTPリクエストを受け付けられるようにしましょう。

$ sudo yum -y install httpd
$ sudo chkconfig httpd on
$ sudo service httpd start
Starting httpd: httpd: apr_sockaddr_info_get() failed for ip-10-0-0-115
httpd: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName
                                                           [ OK ]

おっと、何やら警告が出ました。この件に関しては VPC内のEC2インスタンスに複数IPアドレスを割り当てるを参照してください。

httpdが起動したら、ブラウザからEIPのIPアドレスにアクセスしてみましょう。 welcome

お疲れ様でした!! 以上で、セットアップは完了です。