Amazon Linux 2023 の EC2  インスタンスに Postfix を user data を利用して自動構築してみた

Amazon Linux 2023 の EC2 インスタンスに Postfix を user data を利用して自動構築してみた

2026.04.02

はじめに

テクニカルサポートの 片方 です。
今回は、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 インスタンスを起動します。

01

インスタンス起動後は、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$

02

メールユーザーを作成してローカル接続で動作を確認してみた

ここまでで 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

03

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

04

POP3 の動作確認

続いて、Dovecot の POP3 待受を localhost 宛てに確認します。

telnet localhost 110

接続後、以下のようにログインします。

USER mailuser
PASS 設定したパスワード
STAT
LIST
RETR 1
QUIT

この確認により、作成した mailuser で POP3 認証できること、またメールボックス内のメッセージを参照できることが分かります。

05

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 を参照できること、投入したメール本文を取得できることを確認できました。

06

ローカル接続での基本動作を確認できました。

まとめ

今回は、Amazon Linux 2023 上に Postfix と Dovecot を構築し、その初期設定を EC2 の user data で自動化してみました。
実際に試してみたところ、user data にまとめておくことで、手動で何度も同じ設定を入れる手間を減らしつつ、構築手順をシンプルに再現できました。また、メールユーザーを作成したあとに localhost 宛てで SMTP、POP3、IMAP の確認を行うことで、基本動作も問題なく確認できました。
検証用途であれば、まずはこのような最小構成から始めて、必要に応じて TLS 対応や外部接続確認を追加していく進め方が分かりやすそうです。同様の構成を試したい場合の参考になれば幸いです。

参考資料

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

関連記事