Amazon VPCを使ったミニマム構成のサーバ環境を構築する
よく訓練されたアップル信者、都元です。AWSにおいては、ネットワーク環境をあまり気にせず、数クリックで簡単にサーバを構築できるのは一つのメリットだと言えます。しかし、本格的に運用するシステムに関しては、ネットワーク環境をコントロールする需要も出てきます。AWS Virtual Private Cloud (VPC)を使えば、AWS上に仮想ネットワークを定義し、その上に各種サーバを配置することができます。
深く考えずに非VPC環境に構築してしまったAWSサーバ環境は、簡単にはVPC環境に移行することはできません。従って弊社では、小さなシステムであっても、最初からVPC環境にシステムを構築することを推奨しています。「非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にしておきましょう。 作成されたVPCのID(vpc-xxxxxxxx)は確認しておいてください。
次にサブネットを作成します。左メニューより「Subnets」を選択し「Create Subnet」をクリックします。出て来たウィンドウで、先ほど作ったVPCのID、AZ、及びこのサブネットのCIDRを入力します。この操作は3回繰り返し、VPC内に3つのサブネットを作成します。
- 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」で作成します。
作成したInternet GatewayをVPCと紐付けます。「Attach to VPC」をクリックし、VPCのIDを選択します。
次に、Route Tableを確認しましょう。Route Tableは、各サブネットに仮想的に配置されるルータのルーティングテーブルだと思ってください。サブネットの一覧を確認すると、デフォルトでRoute Tableが自動で作成されており(図の例では rtb-*****196 各環境でIDは異なる)、全てのsubnetが同じ設定になっているはずです。
Route Tableは、public subnetにおいてはインターネットに出て行く口(Internet Gateway)が必要で、private subnateには不要です。従って、まず自動作成されたRoute Tableをそのままprivate subnet用として利用しましょう。
次に、新しくRoute Tableを作り、それをpublic subnet用とします。「Create Route Table」ボタンからRoute Tableを新規作成(図では rtb-****13b4)し、Destination 0.0.0.0/0 を先ほど作成したInternet Gatewayに向けるよう設定します。
最後に、今作成したRoute Table(rtb-****13b4)をpublic subnetに設定します。左カラムの「Subnets」のページからpublic subnet(10.0.0.0/24のサブネット)を選び、その下の方にある (replace) というリンクをクリックします。ポップアップしたウィンドウで新しいRoute Table(rtb-****13b4)を設定します。
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)を指定します。
以上で、VPCのセットアップは完了です。では続いて、このネットワークの上に、サーバを構築していきましょう。
DBサーバの構築
RDSのManagement Consoleより、「Launch DB Instance」をクリックします。DBの種類はMySQLを選択してください。
通常通り、サイズやDBユーザ/パスワードの設定等を行います。
大したことはないのですが、このページがRDS on VPCのキモです。Choose a VPC及びDB Subnet Groupの欄で先ほど作成したVPCとDB Subnet Groupを選択します。
この後の設定は、通常のRDSと変わりありません。特に要件がなければ、デフォルトのまま進んで構いません。以上で、数分待機すると、MySQLサーバがprivate subnetに起動します。Management Consoleから確認できます。VPC ID欄にVPCのIDが表示されているため、通常のRDSインスタンスとは異なることが分かると思います。詳細のEndpointの項にあるホスト名で、アプリケーションサーバからDBに接続します。
続きまして、アプリケーションサーバの構築
サクサクいきましょう。EC2のManagement Consoleより、「Launch Instance」をクリックします。
Classic WizardからAmazon Linux AMI 2012.09(またはそれ以降)を選択してください。
次がキモです。Launch infoのタブでEC2ではなくVPCを選択し、起動先のサブネット(public subnetの10.0.0.0/24)を選択します。画像中ではMediumインスタンスを起動していますが、ここはシステムの要求に合わせて適切に設定しましょう。
この画面で、EBSボリュームを設定します。デフォルトでシステム用のRootディスクとして8GBのEBSが利用されます。これに加えて、10GBの外部ディスクとしてのEBSを作成します。右下の「Edit」をクリックしてください。
この画面で、EBS Volumesのタブを選び、ディスクの情報を入力します。ここではディスク容量を10GBとしました。システム要件に合わせて変更して構いません。このディスクを、/dev/sdf として認識するように設定しました。情報を入れ終わったら右下のAddをクリックし、下のドライブリストに追加されたことを確認してください。
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としてください。
続いて、確保したEIPを、アプリケーションサーバに割り当てます。今確保したEPIを選択し、「Associate Address」ボタンをクリックします。設定では、付与対象のインスタンスを選択します。割り当てたIPアドレスは控えておいてください。
アプリケーションサーバに入り、少々のセットアップをする
アプリケーションサーバに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アドレスにアクセスしてみましょう。
お疲れ様でした!! 以上で、セットアップは完了です。