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/

証明書は「オレオレ証明書」になっているので、警告が出ますが、継続してください。

低価格のドメイン名認証のサーバ証明書を購入するのがいいかも。

Installing a GoDaddy Commercial Certificate
Installing a GeoTrust Commercial Certificate

タイムゾーン(GMT+09.00)の設定をします。

設定 -> ドメイン -> aws.example.com -> 全般情報
Time Zones in ZCS

メールの文字セット(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\"')
ZimbraMtaMyNetworks

Web Server Mode を https のみにします (好みですが)

# su - zimbra
% zmtlsctl https
% zmcontrol stop
% zmcontrol start
CLI zmtlsctl to set Web Server Mode

(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 を並べスケールアウトを検討するのが、クラウド流だとおもいます。

表示
個人用ツール