明けましておめでとうございます。Cassandraいじってたと思ったら次はAWSですか….。次から次へとまぁ…目下余裕がないんだよね。さてさて、今日はAWSでVPCな環境を作ったのでそのメモ。AWSでサービスする環境を作ったのは初めてだったけど、ほとんどハマりどころが無かった(ただ、これで良いのかはワカンネ。気になることがあったら指摘チョンマゲ)。しかし楽だね、Amazon。ちょっと金かかるけど。



0. アーキテクチャ

次のような構成のものを作った。典型的なWeb-DBな構成。ここには書かなかったけど、chefサーバとかjenkins用のサーバもいる。あとredisも。

aws_vpc01

黒線はサービストラフィック。青線は社内ネットワークからのアクセス(数字はポート)で、EC2インスタンスへのログインはまずは踏み台にsshしてから他のインスタンスにログインする(NATインスタンスやWebサーバインスタンスなどには社内から直接sshさせない)。社内からWebサーバと監視系のサーバへは80番へのHTTPアクセスのみを許可。Webサーバの80を許可しているのは、LBから切り離して動作確認などができるように。監視サーバの80を許可しているのは、社内から監視コンソールを見れるように。赤線は社外ネットワークからのアクセスで、基本的にどのインスタンスにもアクセスさせない(言うまでもないけど、インターネットからのHTTPアクセスは許可)。緑線はプライベートネットワークからインターネットに出るときのアクセス経路で、NATインスタンスを経由して外に出る。

 

1. VPCを作る

VPCコンソールのウィザードから「VPC with public and private subnet」選択して「create」。それだけで上図のようなNWができあがる。VPC作ったときにNATインスタンスは勝手に作られた。

2. VPCのセキュリティグループ作る

VPCコンソールからセキュリティグループを作っていく(EC2コンソールではなくVPCコンソール、ね)。セキュリティグループはインスタンスごとのACLのようなもので、EC2インスタンスやELBインスタンスに複数個ひも付けることができる。例えば、DBサーバ用インスタンスの場合は、下記のようなセキュリティグループを作ったらcommonとdbをひも付ける。
No セキュリティグループ名 inbound outbound
1 common icmp ALL 10.0.0.0/16
tcp 22 10.0.0.0/16
udp 161 10.0.0.0/16
ALL 0.0.0.0/0
2 nat tcp 80 10.0.1.0/24
tcp 443 10.0.1.0/24
ALL 0.0.0.0/0
3 fumidai icmp ALL (社内)
tcp 22 (社内)
ALL 0.0.0.0/0
4 web-internal tcp 80 (社内)
tcp 80 10.0.0.0/16
ALL 0.0.0.0/0
5 web-external tcp 80 0.0.0.0/0 ALL 0.0.0.0/0
6 db tcp 3306 10.0.0.0/16 ALL 0.0.0.0/0
7 cache tcp 11211 10.0.0.0/16 ALL 0.0.0.0/0
  • common
    • 全EC2インスタンスに共通で持たせるセキュリティグループ。VPC内(10.0.0.0/16)からのping, ssh, snmpを許可する。
  • nat
    • natインスタンス用のセキュリティグループ。プライベートネットワークに属するEC2インスタンスがインターネットに出て行くための設定をいれた(外のリポジトリからyum installとかgem installとかできるように)。
  • fumidai
    • 踏み台サーバ用のセキュリティグループ。社内のみからのping, sshを許可する。
  • web-internal
    • Webサーバ用のセキュリティグループ。社内とVPC内からのHTTPアクセスを許可する。80ポートへのアクセスを社内とVPC内に限定しているのは、LB切り離し時に、Webサーバに直接アクセスして動作確認などができるようにするため。
  • web-external
    • ELB用のセキュリティグループ。HTTPアクセスを許可する。
  • db
    • DB(MySQL)用のセキュリティグループ。VPC内(10.0.0.0/16)からの3306ポートへのアクセスを許可する。
  • cache
    • キャッシュ(memcached)用のセキュリティグループ。VPC内(10.0.0.0/16)からの11211ポートへのアクセスを許可する。
3. EC2インスタンスを作る

EC2コンソールからインスタンスを作っていく。インスタンスを作ってる最中に「どこに配置するか?(EC2か?VPCか?)」みたいなメニューがあるので、そこでVPCのパブリック/プライベートを選択する。また、セキュリティグループを選択/作成するフェーズがあるので、そこでは先ほど作ったセキュリティグループを次のようにひも付ける。EIPについては次節で説明する。
No インスタンス種別 サブネット EIP セキュリティグループ
1 nat用 パブリック あり common, nat
2 踏み台用 パブリック あり common, fumidai
3 webサーバ用 パブリック あり common, web-internal
4 監視系サーバ用 パブリック あり common, web-internal
5 DB用 プライベート なし common, db
6 キャッシュ用 プライベート なし common, cache
7 バックアップ用 プライベート なし common, db
NAT用インスタンスについては、上述したけど、VPC作ったときに勝手に作られていた。natインスタンスみたいな既存インスタンスのセキュリティグループの変更は、EC2のコンソールでnatインスタンスにチェックを入れて「Action」から「change security group」みたいなのを選んで、commonとnatを選択ればOK。

4. EIP作成とひも付け

VPCコンソールのElastic IPsからEIPを必要個数分だけ「Allocate new address」する(EIP used in VPCを選択)。EIPが用意できたら「Associate Address」で、先ほど作ったEC2インスタンス(EIPありのやつ)にEIPをアタッチする。ちなみに、EIPはAWS上で固定IPを提供してくれるサービスで、こちらが明示的に解放するまで恒久的に保持することができる。

5. ELB作成

EC2コンソールからELBを作る。セキュリティグループは「common」と「web-external」をひも付ける。

6. 環境の動作確認

主にNW周りの動作確認ができりゃいいかな、と。踏み台に社内からsshできて、外からはsshできないこと、など。

7. サービスイン

ミドルウェア入れたりソース/コンフィグをデプロイする(当たり前だけど)。んで、DNS(Route 53)に、先ほど作ったELBをAレコードとしてアタッチして完了。

 

これで以上なんだけど、冒頭にも書いた通り、これが最適解かはワカンネ。何せ初めてだし。
リバプロ置いた方が良かったかなとか、EIP使いすぎかなとか、プライベートネットワーク無くてもいいんじゃねーのかな、とか思ったりしてる。とりあえず、パパッとインフラが作れることが伝わればいいかな、と。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

Set your Twitter account name in your settings to use the TwitterBar Section.