VPC による Internal ELB を用いた メールサーバ(postfix)の冗長化テスト構成 メモ

この構成を適当にポチポチしてるだけで作れちゃうAWSはスゴイ...


手順メモ

1. VPCの作成
ウィザードを使って、VPCと1組目のパブリックとプライベートネットワークを作る。

Amazon Web Servicesから VPC 選択
https://console.aws.amazon.com/console/home?region=ap-northeast-1#
「Start VPC Wizard」
「VPC with Public and Private Subnets」

Two Subnets を編集
Public Subnet:  10.0.10.0/24 (251 available IPs) 
Availability Zone:    ap-northeast-1a
Private Subnet:  10.0.100.0/24 (251 available IPs) 
Availability Zone:   ap-northeast-1a

「Create VPC」
「Close」
正常に終わるとVPCマネージメントコンソールの画面が表示されるハズ

「○ VPCs」○は数字
VPC ID をメモる VPC: vpc-hoge
VPC が複数ある場合には名前を付けておく
「Tags」
「Add/Edit Tags」
Key:Name の Valueに名前を入れる

 ここまででVPCと
左パブリックと左プライベートネットワーク、左NATができる。

2. セキュリティグループの作成
VPC内のセキュリティグループはVPCマネージメントコンソールから作る
EC2ダッシュボードから作れるセキュリティグループでは
アウトバウンドを定義できない <-ココ重要

VPCマネージメントコンソール
https://console.aws.amazon.com/vpc/home?region=ap-northeast-1

左ナビから「Security Groups」

2-1 NATサーバ用セキュリティグループ
「Create Security Groups」
Name: nat_sg
Description: nat_sg
VPC: vpc-xxxxxxxx
「Yes, Create」

Inbound
22  0.0.0.0/0
21  10.0.0.0/16
80  10.0.0.0/16
443 10.0.0.0/16
「Apply Rule Changes」

Outbound
21  0.0.0.0/0
22  0.0.0.0/0
80  0.0.0.0/0
443 0.0.0.0/0
「Apply Rule Changes」

2-2 Webサーバ用セキュリティグループ

Inbound
22  0.0.0.0/0
80  0.0.0.0/0 <-後でExternal ELBからのアクセスに限定する

Outbound
21  0.0.0.0/0
80  0.0.0.0/0

2-3 Mailサーバ用セキュリティグループ

Inbound
22  0.0.0.0/0
25  10.0.0.0/16

Outbound
21  0.0.0.0/0
80  0.0.0.0/0
25  0.0.0.0/0

2-4 Batchサーバ用セキュリティグループ

Inbound
22  nat_sg

Outbound
22  nat_sg
21  nat_sg
80  nat_sg
25  10.0.0.0/16 <- 後で internal_elb_sg に変更する

2-5 Extermal ELB 用セキュリティグループ

Inbound
80  0.0.0.0/0
443 0.0.0.0/0

Outbound
80 web_sg

2-6 Internal ELB 用セキュリティグループ

Inbound
25 batch_sg

Outbound
25 mail_sg

2-7 左NATのセキュリティグループを nat_sgに変更
EC2ダッシュボード
左NATを右クリック
「Change Security Groups」
nat_sgを選択
「Assign Security Groups」


3. 右パブリックネットワークと右プライベートネットワーク、右NATを作る
3-1 右パブリックサブネットの作成
VPCマネージメントコンソール
https://console.aws.amazon.com/vpc/home?region=ap-northeast-1
「○ Subnets」○は数字
「Create Subnets」

VPC: 上でメモったVPCを選択
Availability Zone: ap-northeast-1c
CIDR Block: 10.0.20.0/24

ルートテーブルの変更
「Details」タブの「Route Table」の「(replace)」リンクをクリック
0.0.0.0/0 (デフォルトゲートウェイ) が igw-xxxxx なのを確認して
「Yes, Replace」

3-2 右プライベートサブネットの作成
「Create Subnets」

VPC: 上でメモったVPCを選択
Availability Zone: ap-northeast-1c
CIDR Block: 10.0.200.0/24

3-3 右NATインスタンスの作成
EC2ダッシュボード
https://console.aws.amazon.com/ec2/v2/home?region=ap-northeast-1

「Launch Instance」
左ナビ「Community AMIs」
"ami-vpc-nat" で検索
amzn-ami-vpc-nat-pv-201X.XX.XX.x86_64-ebs を「Select」
「Next:Configure Instance Details」

Network : VPCを指定
Subnet : 右パブリックサブネットを指定
「Next:Add Storage」
「Next: Tag Instance」 インスタンス名登録
「Next: Configure Security Group」 nat_sg 選択
「Launch」
「Launch Instances」

# 自分宛でないパケットも拾えるように設定
インスタンス起動したら
右NATインスタンスを右クリック
「Change Source / Dest Check」」
「Yes, Disable」

# EIPの設定
VPCコンソール
左ナビ「Elastic IPs」
「Allocate New Address」
EIP used in: VPC
できたEIPを右クリック
「Associate」
Instance:右nat
「Yes, Associate」


3-4 右プライベートネットワークのルートテーブルの作成
VPCコンソール
左ナビ「Route Tables」
「Create Route Table」
VPC:vpc-xxxxxxxx
「Yes, Create」

できたルーティングテーブルを選択
10.0.0.0/16 local
0.0.0.0/0 右NATインスタンスID

「Associations」タブ
右プライベートサブネットを選択
「Associate」
「Yes, Associate」


4. Webサーバの作成
4-1. 左Webサーバの作成
EC2マネジメントコンソール
左ナビ「Instances」
「Launch Instance」

Amazon Linux AMI 64-bit 「Select」
「Next: Configure Instance Details」

Network: vpc選択
Subnet: 左パブリックサブネット
Public IP: チェックする
「Next: Add Strage」
「Next: Tag Instance」

Name: left-web
「Next: Configure Security Group」

web_sgを選択
「Review and Launch」
「Launch」
「Launch Instance」
「View Instance」

ログインする
Apacheのインストール
$ sudo yum -y install httpd
$ sudo /sbin/chkconfig httpd on
$ sudo /etc/init.d/httpd start
$ sudo vi /var/www/html/index.html
left-web <-記述

Web経由でアクセスして left-web が表出されることを確認する


4-2. 右Webサーバの作成
同様に作成する

5. 外部ELBの作成
EC2マネジメントコンソール
左ナビ「Load Balancers」
「Create Load Balancer」

Load Balancer Name: external-elb <-アンダースコア使えない
Create LB inside: VPC指定
Create an internal load balancer: "チェックしない"
Listener Configuration:
HTTP 80 HTTP 80
「Continue」
「Continue」
左右のパブリックサブネットを選択
「Continue」
external_elb_sg を選択
「Continue」
左右のWebサーバを選択
「Continue」
「Create」
「Close」

作ったELBを選択
Instances タブで 左右のWebサーバインスタンスの Status が In Service になるのを待つ
ヘルスチェックの設定がデフォルトだと 5分ぐらいで In Service になる

Status が Out of Service から変わらなければ
左右のWebサーバの /var/log/httpd/access_log , error_logに
 ELB からのアクセスログがあるか確認する

なければ、
1) ELBのヘルスチェックの設定を確認する。
2) web_sgかexternal_elb_sgのセキュリティグループの設定を確認する。


In Service になったらWebでELBにアクセス
どちらかのWebサーバからレスポンスが返ってくるのを確認する


6. バッチサーバの作成
6-1. 左バッチサーバの作成
EC2マネジメントコンソール
左ナビ「Instances」
「Launch Instance」

Amazon Linux AMI 64-bit 「Select」
「Next: Configure Instance Details」

Network: vpc選択
Subnet: 左プライベートサブネット
Public IP: チェック"しない"
「Next: Add Strage」
「Next: Tag Instance」

Name: right-batch
「Next: Configure Security Group」

batch_sgを選択
「Review and Launch」
「Launch」
「Launch Instance」
「View Instance」

6-2 NAT経由でのアクセス確認
バッチサーバはプライベートネットワークに配置されているので
VPC外から直接SSH接続することはできない
左NATサーバからログインする

1) SSH の鍵をNATサーバの /home/ec2-user/.ssh に置く

2) バッチサーバにログイン
$ ssh -i awscsccs.key 左バッチサーバのプライベートIPアドレス

3) yum 動作確認
$ sudo yum update

4) Web アクセス確認
$ wget http://www.yahoo.co.jp

5) SSH アクセス確認
$ ssh VPC外部のSSHサーバ

6-3 右バッチサーバの作成
右も同様に


7. Mail サーバの作成
7-1. 左Mailサーバの作成
EC2マネジメントコンソール
左ナビ「Instances」
「Launch Instance」

Amazon Linux AMI 64-bit 「Select」
「Next: Configure Instance Details」

Network: vpc選択
Subnet: 左パブリックサブネット
Public IP: チェック"する"
「Next: Add Strage」
「Next: Tag Instance」

Name: left-mail
「Next: Configure Security Group」

mail_sgを選択
「Review and Launch」
「Launch」
「Launch Instance」
「View Instance」

ログインする
7-2. Postfixのインストール
下記参照
[AWS] メールサーバを建てる メモ
http://d.hatena.ne.jp/knaka20blue/20130217/1361111413

$ sudo su -
# yum update -y
# yum install postfix -y
# yum install mailx

# mv /etc/postfix/main.cf /etc/postfix/main.cf.ORG
# vi /etc/postfix/main.cf
myhostname = mail.dmain.com
mydomain = dmain.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
smtpd_banner = $myhostname ESMTP unknown
smtpd_sasl_auth_enable = yes

smtpd_sasl_local_domain = $myhostname
smtpd_recipient_restrictions =
    permit_mynetworks
    permit_sasl_authenticated
    reject_unauth_destination

message_size_limit = 10485760

# /etc/rc.d/init.d/saslauthd start
# chkconfig saslauthd on

# /etc/rc.d/init.d/sendmail stop
# chkconfig sendmail off
# alternatives --config mta
  => postfix
# /etc/rc.d/init.d/postfix start
# chkconfig postfix on

Route53にDNS設定
A レコードと MXレコードを設定

$ mail hoge@gmail.com

メールが届けばOK

Postfixのログ
/var/log/maillog

7-3 mail中継のテスト
batchサーバからメールサーバを指定してメールを送れていればOK
要メール送信プログラム

7-4 右メールサーバの作成
右も同様に

8 Internal ELB を作ってメールサーバを冗長化する
Load Balancer Name: internal-elb
Create LB inside: vpc-hoge
Create an internal load balancer: チェック
TCP-25 -> TCP 25

Available Subnets
subnet-26211152 10.0.10.0/24 ap-northeast-1a
subnet-6fc99929 10.0.20.0/24 ap-northeast-1c

左右のメールサーバを紐づける


セキュリティグループ設定まとめ
メールサーバ用のセキュリティグループ設定がかなり雑。要注意

nat_sg
Inbound
21	10.0.0.0/16	Delete
22 (SSH)	0.0.0.0/0	Delete
80 (HTTP)	10.0.0.0/16	Delete
443 (HTTPS)	10.0.0.0/16	Delete

Outbound
21	0.0.0.0/0	Delete
22 (SSH)	0.0.0.0/0	Delete
25 (SMTP)	0.0.0.0/0	Delete
80 (HTTP)	0.0.0.0/0	Delete
443 (HTTPS)	0.0.0.0/0	Delete

mail_sg
Inbount
22 (SSH)	0.0.0.0/0	Delete
25 (SMTP)	10.0.0.0/16	Delete

Outbound
21	0.0.0.0/0	Delete
25 (SMTP)	0.0.0.0/0	Delete
80 (HTTP)	0.0.0.0/0	Delete

web_sg
Inbound
22 (SSH)	0.0.0.0/0	Delete
80 (HTTP)	0.0.0.0/0	Delete
Outbound
21	0.0.0.0/0	Delete
80 (HTTP)	0.0.0.0/0	Delete

externalel_elb_sg
Inbound
80 (HTTP)	0.0.0.0/0	Delete
443 (HTTPS)	0.0.0.0/0	Delete

Outbound
80 (HTTP)	web_sgのID	Delete

internal_elb_sg
Inbound
25 (SMTP)	batch_sgのID	Delete

Outbound
25 (SMTP)	mail_sgのID	Delete

batch_sg
Inbound
22 (SSH)	nat_sgのID	Delete

Outbound
21	nat_sgのID	Delete
22 (SSH)	nat_sgのIDf	Delete
80 (HTTP)	nat_sgのIDf	Delete
25 (SMTP)	internal_elb_sgのID	Delete
25 (SMTP)	mail_sgのID	Delete

参考文献
WEB+DB PRESS Vol.77