Amazon Linux 2023 の EC2 インスタンスに Postfix を user data を利用して自動構築してみた
はじめに
テクニカルサポートの 片方 です。
今回は、Amazon Linux 2023 の EC2 インスタンスに Postfix を構築し、そのセットアップ手順を user data で自動化してみたので、その内容をまとめます。
手動での構築も可能ですが、検証や再作成を前提とした環境では、起動時に必要な設定をまとめて適用できると便利です。
本記事では、Postfix と Dovecot のインストール、基本設定、サービス起動までを user data で実施する構成を紹介します。
環境/前提
今回の検証環境は以下のとおりです。
環境
- OS : Amazon Linux 2023
- 実行環境 : Amazon EC2
- IAM ロール : AmazonSSMManagedInstanceCore を付与したインスタンスプロファイル
- メールサーバーソフトウェア : Postfix / Dovecot
- 構築方法 : EC2 の user data を利用
- サブネット : パブリック
- SSecurity Group : インバウンドルールなし、アウトバウンドは 443/TCP を許可
前提
本記事では、Amazon Linux 2023 上で Postfix を簡単に構築できることの確認を目的とします。
- Postfix と Dovecot のインストールおよび基本設定を user data で実施します
- DNS の設定や Route 53 のホストゾーン作成、レコード登録は本記事の対象外です
- メールユーザーの自動作成は行いません
- 必要に応じて、後続手順でメールユーザーを手動作成して確認します
やってみた
今回は、Amazon Linux 2023 を利用した EC2 インスタンスに対して、user data を使って Postfix と Dovecot を自動構築してみます。
まずは EC2 インスタンス起動時に実行する user data を用意します。今回は、Postfix / Dovecot のインストール、基本設定、submission ポートの有効化、サービス起動までを実施する構成としました。
なお、以下のサンプルではホスト名やドメイン名は汎用的な値を使用しています。実際に利用する場合は、環境に応じて適宜読み替えてください。
user data の例
#!/bin/bash
set -euxo pipefail
exec > >(tee /var/log/user-data-mailsetup.log | logger -t user-data -s 2>/dev/console) 2>&1
# ==========================================
# 変更値
# ==========================================
HOST_FQDN="mail.example.com"
MAIL_DOMAIN="example.com"
VPC_CIDR="10.0.0.0/16"
# ==========================================
# ホスト名設定
hostnamectl set-hostname "${HOST_FQDN}"
# パッケージ更新・導入
dnf -y update
dnf -y install postfix dovecot
dnf -y install telnet
# ------------------------------------------
# Postfix 設定
# ------------------------------------------
postconf -e "myhostname = ${HOST_FQDN}"
postconf -e "mydomain = ${MAIL_DOMAIN}"
postconf -e "myorigin = \$mydomain"
postconf -e "mydestination = \$myhostname, localhost.\$mydomain, localhost, \$mydomain"
postconf -e "mynetworks = ${VPC_CIDR}, 127.0.0.0/8"
postconf -e "smtpd_banner = \$myhostname ESMTP"
postconf -e "home_mailbox = Maildir/"
postconf -e "inet_interfaces = all"
postconf -e "inet_protocols = ipv4"
# SMTP AUTH (Dovecot 連携)
postconf -e "smtpd_sasl_auth_enable = yes"
postconf -e "smtpd_sasl_type = dovecot"
postconf -e "smtpd_sasl_path = private/auth"
postconf -e "smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination"
# submission (587) 有効化
sed -ri 's/^#submission inet /submission inet /' /etc/postfix/master.cf
sed -ri 's/^# -o syslog_name=postfix\/submission/ -o syslog_name=postfix\/submission/' /etc/postfix/master.cf
sed -ri 's/^# -o smtpd_tls_security_level=encrypt/ -o smtpd_tls_security_level=may/' /etc/postfix/master.cf
sed -ri 's/^# -o smtpd_sasl_auth_enable=yes/ -o smtpd_sasl_auth_enable=yes/' /etc/postfix/master.cf
sed -ri 's/^# -o smtpd_relay_restrictions=permit_sasl_authenticated,reject/ -o smtpd_relay_restrictions=permit_sasl_authenticated,reject/' /etc/postfix/master.cf
sed -ri 's/^# -o milter_macro_daemon_name=ORIGINATING/ -o milter_macro_daemon_name=ORIGINATING/' /etc/postfix/master.cf
# ------------------------------------------
# Dovecot 設定
# ------------------------------------------
cat > /etc/dovecot/conf.d/99-mailserver.conf <<'EOF'
mail_location = maildir:~/Maildir
disable_plaintext_auth = no
auth_mechanisms = plain login
ssl = no
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0666
user = postfix
group = postfix
}
}
EOF
# ------------------------------------------
# サービス起動
# ------------------------------------------
postfix check
doveconf -n || true
systemctl enable --now postfix
systemctl enable --now dovecot
systemctl restart postfix
systemctl restart dovecot
systemctl status postfix --no-pager || true
systemctl status dovecot --no-pager || true
ss -lntp || true
今回はメールユーザーの自動作成までは実施せず、まずは、EC2 インスタンス起動時に Postfix と Dovecot の基本構成を自動で用意できることを確認する方針としました。
また、localhost 宛ての動作確認を目的としているため、Dovecot の ssl = no としています。本番利用時は TLS 設定を検討してください。
続いて、上記の user data を設定して EC2 インスタンスを起動します。

インスタンス起動後は、Session Manager などで EC2 インスタンスに接続し、ホスト名や Postfix の設定値、サービスの状態を確認します。
hostnamectl
postconf | egrep '^(myhostname|mydomain|myorigin|mydestination|mynetworks|home_mailbox|smtpd_sasl_auth_enable)'
systemctl status postfix
systemctl status dovecot
ss -lntp | egrep ':25|:587|:143|:110'
以下のように myhostname や mydomain が意図した値になっていれば問題ありません。
- myhostname = mail.example.com
- mydomain = example.com
- myorigin = $mydomain
- home_mailbox = Maildir/
- smtpd_sasl_auth_enable = yes
また、Postfix と Dovecot が active (running) になっていること、必要なポートで待ち受けしていることも確認します。
実行例
sh-5.2$ hostnamectl
postconf | egrep '^(myhostname|mydomain|myorigin|mydestination|mynetworks|home_mailbox|smtpd_sasl_auth_enable)'
systemctl status postfix
systemctl status dovecot
ss -lntp | egrep ':25|:587|:143|:110'
Static hostname: xxxxx.test.xxxxxxxxxx.info
Icon name: computer-vm
Chassis: vm 🖴
Machine ID: ec2dadc2adb60b6332bf3c5043e49002
Boot ID: e02c7e376577447fb3dee7508382c809
Virtualization: amazon
Operating System: Amazon Linux 2023.10.20260325
CPE OS Name: cpe:2.3:o:amazon:amazon_linux:2023
Kernel: Linux 6.1.164-196.303.amzn2023.x86_64
Architecture: x86-64
Hardware Vendor: Amazon EC2
Hardware Model: m5.large
Firmware Version: 1.0
home_mailbox = Maildir/
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
mydomain = xxxxx.xxxxxxxx.info
myhostname = xxxxxx.test.xxxxxxxxx.info
mynetworks = 10.0.0.0/16, 127.0.0.0/8
mynetworks_style = ${{$compatibility_level} <level {2} ? {subnet} : {host}}
myorigin = $mydomain
smtpd_sasl_auth_enable = yes
● postfix.service - Postfix Mail Transport Agent
Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; preset: disabled)
Active: active (running) since Sat 2026-03-28 06:56:07 UTC; 4min 12s ago
Process: 12427 ExecStartPre=/usr/sbin/restorecon -R /var/spool/postfix/pid/master.pid (code=exited, status=255/EXCEPTION)
Process: 12470 ExecStartPre=/usr/libexec/postfix/aliasesdb (code=exited, status=0/SUCCESS)
Process: 12498 ExecStartPre=/usr/libexec/postfix/chroot-update (code=exited, status=0/SUCCESS)
Process: 12509 ExecStart=/usr/sbin/postfix start (code=exited, status=0/SUCCESS)
Main PID: 13125 (master)
Tasks: 3 (limit: 9202)
Memory: 2.1M
CPU: 440ms
CGroup: /system.slice/postfix.service
├─13125 /usr/libexec/postfix/master -w
├─13132 pickup -l -t unix -u
└─13133 qmgr -l -t unix -u
● dovecot.service - Dovecot IMAP/POP3 email server
Loaded: loaded (/usr/lib/systemd/system/dovecot.service; enabled; preset: disabled)
Active: active (running) since Sat 2026-03-28 06:56:09 UTC; 4min 11s ago
Docs: man:dovecot(1)
https://doc.dovecot.org/
Main PID: 15600 (dovecot)
Status: "v2.3.20 (80a5ac675d) running"
Tasks: 4 (limit: 9202)
Memory: 5.2M
CPU: 60ms
CGroup: /system.slice/dovecot.service
├─15600 /usr/sbin/dovecot -F
├─15660 dovecot/anvil
├─15661 dovecot/log
└─15664 dovecot/config
LISTEN 0 100 0.0.0.0:587 0.0.0.0:*
LISTEN 0 100 0.0.0.0:143 0.0.0.0:*
LISTEN 0 100 0.0.0.0:110 0.0.0.0:*
LISTEN 0 100 0.0.0.0:25 0.0.0.0:*
LISTEN 0 100 [::]:143 [::]:*
LISTEN 0 100 [::]:110 [::]:*
sh-5.2$

メールユーザーを作成してローカル接続で動作を確認してみた
ここまでで Postfix と Dovecot の基本構成はできたので、続いてメールユーザーを作成し、EC2 インスタンス上でローカル接続による動作確認を行います。
メールユーザーを作成する
まずはメールユーザーを作成します。今回は例として mailuser というユーザーを作成しました。
sudo useradd -m mailuser
sudo passwd mailuser
次に、Maildir 形式でメールを保存できるように、ホームディレクトリ配下に Maildir を作成します。
sudo mkdir -p /home/mailuser/Maildir/{new,cur,tmp}
sudo chown -R mailuser:mailuser /home/mailuser/Maildir
sudo chmod -R 700 /home/mailuser/Maildir
必要に応じて、ユーザーが作成されている事や Maildir が存在していることを確認します。
sudo id mailuser
sudo ls -ld /home/mailuser
sudo ls -l /home/mailuser
これで準備は完了です。
ローカル接続で動作を確認する
Dovecot の認証確認をする
まずは、作成したユーザーで Dovecot の認証が通るかを確認します。
パスワードの入力を求められるので、先ほど設定したパスワードを入力します。認証に成功すると、passdb: mailuser auth succeeded のようなメッセージが表示されます。
sudo doveadm auth test mailuser

Postfix 動作確認
まずは Postfix に対して localhost 宛てに接続し、ローカル配送できることを確認します。
telnet localhost 25
接続後、以下のように SMTP コマンドを入力します。
helo localhost
mail from:mailuser@example.com
rcpt to:mailuser@example.com
data
This is test mail.
.
quit
配送後は、Maildir にメールファイルが作成されていることを確認します。
必要に応じて、メール本文も確認できます。
sudo ls -l /home/mailuser/Maildir/new/
sudo cat /home/mailuser/Maildir/new/17xxxxxx.xxxxxxxxxxxxxxxx80850.xxxxx.test.xx.xxxxxxx.info

POP3 の動作確認
続いて、Dovecot の POP3 待受を localhost 宛てに確認します。
telnet localhost 110
接続後、以下のようにログインします。
USER mailuser
PASS 設定したパスワード
STAT
LIST
RETR 1
QUIT
この確認により、作成した mailuser で POP3 認証できること、またメールボックス内のメッセージを参照できることが分かります。

IMAP の動作確認
最後に、Dovecot の IMAP 待受を確認します。
telnet localhost 143
IMAP はコマンドの先頭にタグを付けて実行します。今回は a をタグとして利用しました。
※ 数字でも可
a login "mailuser" "設定したパスワード"
a select INBOX
a search all
a fetch 1 body[text]
a logout
これで、IMAP でも認証できること、INBOX を参照できること、投入したメール本文を取得できることを確認できました。

ローカル接続での基本動作を確認できました。
まとめ
今回は、Amazon Linux 2023 上に Postfix と Dovecot を構築し、その初期設定を EC2 の user data で自動化してみました。
実際に試してみたところ、user data にまとめておくことで、手動で何度も同じ設定を入れる手間を減らしつつ、構築手順をシンプルに再現できました。また、メールユーザーを作成したあとに localhost 宛てで SMTP、POP3、IMAP の確認を行うことで、基本動作も問題なく確認できました。
検証用途であれば、まずはこのような最小構成から始めて、必要に応じて TLS 対応や外部接続確認を追加していく進め方が分かりやすそうです。同様の構成を試したい場合の参考になれば幸いです。
参考資料
- Amazon Linux 2上のPostfixでローカルユーザにメール配送してみた | DevelopersIO
- 【初心者向け】EC2を利用したメールサーバーの構築( Postfix + Dovecot )
クラスメソッドオペレーションズ株式会社について
クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました






