Zimbra on EC2 tips
出典: 雑多なメモ Wiki版
Zimbra Collaboration Suite (ZCS) Open Source Edition を Amazon EC2 で稼働させる際の Tips です。
EC2のインスタンスはプライベートIPアドレス空間で稼働しており、グローバルIPアドレス空間とは(Elastic IPでも)1:1のNATのような構成になっています。 その為、Zimbra の EC2 へのインストールには若干のコツが必要です。
以下で説明する構成は、簡単に Zimbra を導入する事を目的としているので、マルチマシン構成に拡張する事はあまり想定していません。
(マルチマシン構成にする場合は、各サーバに割り当てられたプライベートIPアドレスを集約する仕組みがいりそうです。)
(EBS や Elastic IP の構成管理が必要なので、各 Role の instance に、外部から userdata で与えるのが現実的に思えてきました。)
目次 |
前準備
ここで、お好みの Linux ディストリビューションの Zimbra パッケージが有るかどうか確認してください。 お好みのディストリビューションのパッケージが無ければ、頑張ってポーティングしましょう。;) さて、私は debian 派なのですが、ここには無いので Ubuntu で我慢しました(ぉぃ)。 初体験なので、zcs, ubuntu とも安定版を選択します。(zcs 5.0.16 GA Release, Ubuntu 8.04 LTS 32bit x86)
- (追記) Critical Security Issue インストール後、このパッチを当ててください
- (さらに追記) 5.0.18 GA が出ています。(5.0.18 GA Release Release Notes)
- このリリースには上記のパッチが含まれていますので、そのままでOKです。
- 詳細な修正点 Zimbra Product Portal - Patch: 5.0.18
- (Security issue については記述がないな 39002, 39003)
- あいたたたた Zimbra 5.0.18 に梱包されている あるモジュールが Xen に対応できていないらしい。あいたたたた
Ubuntu Hardy の AMI は、Canonical 版が出ているので、これを選択しました。(ami-5d59be34)
zimbra は /opt/zimbra にサーバやモジュールがまとまって入るので、後々の拡張の事を考えて、/opt には EBS を使うようにします。10GB ほど確保しておきましょう。
(EBS は インスタンスが終了しても、消えないし、snapshot も取れます。便利便利)
メールサーバなので Elastic IP を 1個 allocate して、instance に associate しておきます。
DNS
DNSサーバの設定をします。DNSサーバはドメイン・レジストラが提供しているサービスを使うのが簡単ですね。
ドメイン名を仮に example.com とします。また、Elastic IP でアロケートされたグローバルIPアドレスを仮に 192.168.1.1 とします。 メールサーバの名前を aws.example.com とした場合、DNS の A RR に、
aws.example.com. IN A 192.168.1.1
MX RR に、
example.com. IN MX 10 aws.example.com.
TXT RR に、おまじないとして classic SPF も書いておきましょう。
("Reputation Fate Sharing" をどう避けるか...)
(Zimbra 6.x で DKIM と DomainKeys が実装されるとの事 :)
example.com. IN TXT "v=spf1 ip4:192.168.1.1 ~all"
あとは、DNS の情報が反映されるのを待って、確認できたら次の作業にかかります。
(ubuntu の お作法では sudo で作業しないといけないのですが、sudo -i で root 作業しちゃいます)
(Canonical版の AMI は "ubuntu" ユーザで slogin します。(念のため))
インスタンス
create volume した EBS を instance に attach して mkfs 、余計なお世話を止めさせる ;) おまじないをした後、 /opt に mount しておきます。
# mkfs.ext3 /dev/sdf # tune2fs -c -1 -i 0 /dev/sdf # mount -o defaults,relatime /dev/sdf /opt
(xfs にする方がパフォーマンスが良く、便利かもしれません)
/etc/fstab に EBS ボリュームのマウント情報を書きます。
/dev/sdf /opt ext3 defaults,relatime 0 0
また、TZ を 'Asia/Tokyo' にしておきます。
# dpkg-reconfigure tzdata
Canonical 版は、hostname と /etc/hosts を EC2 Instance Metadata から設定するようになっています。
真っ新なインスタンスの場合は、一度パッケージのアップデートを行います。
# apt-get update # apt-get upgrade -y
内部 DNS
EC2 のインスタンスは、terminate したら、プライベートIPアドレスを解放してしまい、再度インスタンスを起動した場合、次に割り当てられるプライベートIPアドレスは以前と変わってしまいます。
その為に、Zimbra を最初にインストールした際の、"logical hostname" ではプライベートIPアドレスが変わってしまっているので、LDAP サーバが bind できない、という事態に陥ります。 それを避けるために、内部 DNS サーバを立ち上げて、導入時に真の意味での、論理ホスト名になるような "logical hostname" を指定して、インスタンス起動時に割り当てられたプライベートIPアドレスに都度対応できるようにします。
# apt-get install bind9
/etc/bind にある設定を変えて、ややトリッキーな設定を仕込みます。 今回の例でいえば、aws.example.com という zone の権威情報を持ち、 aws.example.com. の A RR に現在のプライベートIPアドレスを指定する形になります。 (Split DNS)
- named.conf.options は
options {
directory "/var/cache/bind";
forwarders {
172.16.0.23;
};
auth-nxdomain no;
listen-on { 127.0.0.1; };
listen-on-v6 { ::1; };
};
- named.conf.local に追加
include "/etc/bind/zimbra.conf";
- zimbra.conf は
zone "aws.example.com" {
type master;
file "/etc/bind/db.zimbra";
};
- db.zimbra は
@ 604800 IN SOA localhost. root.localhost. (
1 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ 604800 IN NS localhost.
@ 604800 IN A ここにプライベートIPアドレスを記述
@ 604800 IN MX 10 @
(boot 時に EC2 Instance Metadata から プライベートIPアドレス 情報を取り込む script が要りますね)
(私は Canonical 版 についてきた ec2-set-hostname を改造して作りました)
/etc/resolv.conf に nameserver 127.0.0.1 を追記するために、
/etc/dhcp3/dhclient.conf
で、
prepend domain-name-servers 127.0.0.1;
の、コメントを外しておきます。 (reboot するまでは、resolv.conf に直接追記しておきます。)
パッケージ
Zimbra のサイトから、パッケージを EC2 の EBS ボリュームに持って展開しておきます。
# cd /opt # wget http://h.yimg.com/lo/downloads/5.0.XX_GA/zcs-5.0.XX_GA_XXXX.UBUNTU8.XXXXXXXXXXXXXX.tgz # tar xfz zcs-5.0.XX_GA_XXXX.UBUNTU8.XXXXXXXXXXXXXX.tgz # cd zcs-5.0.XX_GA_XXXX.UBUNTU8.XXXXXXXXXXXXXX
AMI の base に対して、Zimbra に必要なパッケージを導入します。(IBM風な言い回しだなぁ)
# apt-get install libgmp3c2 # apt-get install libstdc++5 # apt-get install libltdl3 # apt-get install libsocket6-perl # apt-get install libio-socket-ssl-perl # apt-get install libio-socket-inet6-perl # apt-get install fetchmail
セキュリティグループ
EC2 の Security Group で Zimbra に必要な port を設定します。
SMTP 25 HTTP 80 HTTPS 443 IMAP 143 IMAP (Secure) 993 POP3 110 POP3 (Secure) 995 Custom で 7071 (Administration Console)
もちろん、使わないサービスの port は閉じておくべきです。
AMI 登録
念のため、この段階のインスタンスをAMIに登録しておきます。
インストールに失敗したら、この AMI を起動してやり直しましょう。
導入
これで前準備ができたので、Zimbra を導入(インストール)します。
コンフィグレーション
Zimbra のパッケージを展開したディレクトリで、
# ./install.sh
いろいろインストーラがパッケージの確認してきますが、下のメッセージが出るまではそのままエンターで進めてください。
The system will be modified. Continue? [N]
は Y エンターで継続してください。
インストーラがごそごそ作業して、少し時間がたってから、
Setting defaults... DNS ERROR resolving MX for domU-XX-XX-XX-XX-XX-XX.compute-1.internal It is suggested that the domain name have an MX record configured in DNS Change domain name? [Yes]
てな表示が出ます。 そこで慌てず、No エンター を決めてください。
次は、Zimbra おなじみの Configuration Main menu が出ます。
いつものように、Admin Password の設定をした後、内部 DNS で設定した logical hostname を設定します。
Common Configuration を選択し、1) Hostname に aws.example.com を設定します。
Common configuration 1) Hostname: aws.example.com 2) Ldap master host: aws.example.com 3) Ldap port: 389 4) Ldap Admin password: set 5) Require secure interprocess communications: yes 6) TimeZone: (GMT+09.00) Osaka / Sapporo / Tokyo
もちろん、ZimeZone は JST にしておきましょう。
その後、zimbra-store を選択し、
3) Admin user to create: 6) Spam training user: 7) Non-spam(Ham) training user: 8) Global Documents Account:
の各項目で @aws.example.com を @example.com に変更します。(運用上そのままでいい場合はそのままです)
Configuration Main menu を a で完了させて、インストールを継続します。
- (追記) Critical Security Issue このパッチを当ててください
Zimbra Administration Console
無事にインストールが終了したら、 Zimbra Administration Console にログインします。
https://aws.example.com:7071/
証明書は「オレオレ証明書」になっているので、警告が出ますが、継続してください。
低価格のドメイン名認証のサーバ証明書を購入するのがいいかも。
タイムゾーン(GMT+09.00)の設定をします。
設定 -> ドメイン -> aws.example.com -> 全般情報
メールの文字セット(ISO-2022-JP)とカレンダーのタイムゾーン(GMT+09.00)を設定します。
設定 -> 提供サービス -> default -> 詳細設定
MTA信頼ネットワークで、インスタンスのプライベートIPアドレスが /23 のネットワークになっているので、/32 のホストに制限します。
設定 -> サーバ -> aws.example.com -> MTA -> MTA信頼ネットワーク
また、インスタンスのプライベートIPアドレスが変わっている場合は、現在のインスタンスのプライベートIPアドレスを設定してください。
(これも EC2 Instance Metadata から自動設定する script を書かないといけませんね)
#!/usr/bin/python
import urllib
import os
api_ver = '2009-04-04'
my_hostname = 'aws.example.com'
base_url = 'http://169.254.169.254/%s/meta-data' % api_ver
my_ip = urllib.urlopen('%s/local-ipv4/' % base_url).read()
my_cmd = 'zmprov modifyServer %s zimbraMtaMyNetworks \'127.0.0.0/8 %s/32\'' % (my_hostname, my_ip,)
os.system('su - zimbra -c \"%s\"' % my_cmd)
os.system('su - zimbra -c \"postfix reload\"')
Web Server Mode を https のみにします (好みですが)
# su - zimbra % zmtlsctl https % zmcontrol stop % zmcontrol start
(install 時に "Web server mode:" で設定する事も出来ます)
起動用 AMI 登録
Zimbra の 導入が終わったら、AMI の登録をします。
インスタンスが terminate したら、次はこの AMI で起動させます。
ec2-bundle-vol する前に Zimbra を停止し、/opt も umount しておきましょう。
# su - zimbra % zmcontrol stop
その他
m1.small instance では load average が常時 0.5 以上になってしまいます。たぶん 20〜30 人規模まではまかなえそうですが、それ以上の規模になると難しいと思われます。
簡単にスケールアップするには、instance type を High-CPU Medium (c1.medium) にする手があります。(arch=i386)
しかし、RAD Lab のレポートによれば、Large instance (arch=amd64) にしても、課金は倍になるが、性能は倍にならないとの事。 マルチサーバ構成にして、安い small instance を並べスケールアウトを検討するのが、クラウド流だとおもいます。

