Amazon SESの初期設定をシェルスクリプトで一部自動化してみた

コンソールでの設定作業はシェルスクリプトで効率化させましょう!
2024.06.03

こんにちは!AWS事業本部のおつまみです。

みなさん、Amazon SESの初期設定を自動化したいと思ったことはありませんか?私はあります。

Amazon SESを使用し始めるには、以下のような初期設定が必要となります。

  • 検証済みIDの設定
  • ドメインの検証
  • DKIM設定
  • カスタムの MAIL FROM ドメインの設定
  • サンドボックス環境の解除
  • CloudWatchアラームの設定

これらの設定、もちろんAWSマネジメントコンソールから手動で行うことができますが、設定手順が多く、時間を要します。
そこで、今回はこれらの設定をシェルスクリプトで一部自動化してみたのでご紹介します!

構成図

今回実装した仕組みです。
以下の設定はシェルで自動化させます。

  • 検証済みIDの設定
  • DKIM設定
  • カスタムの MAIL FROM ドメインの設定
  • サンドボックス環境の解除
  • CloudWatchアラームの設定

以下の設定はシェルで自動化できなかったため、手動で設定します。

  • ドメインの検証
    • 今回ドメイン管理はRoute53ではなく、別のレジストラ(お名前.comなど)を使用していると仮定し、手動で設定を行うようにしています。
    • もちろんRoute53でホストゾーンを作成し、ドメイン管理することも可能です。
  • SMTP認証情報の作成
    • 今回はSMTPインタフェースでのメール送信とします。
    • SMTP認証情報は自動で作成ができないため、手動で作成します。

やってみた

実行するシェルスクリプトの解説

今回実行するシェルスクリプトはこちらです。 はじめのデフォルト値設定は構築したい環境に合わせて変更してください。

ses.sh

#!/bin/bash

# デフォルト値の設定
DEFAULT_DOMAIN_NAME="o2mami.site"  # 検証済みID
DEFAULT_MAIL_FROM_DOMAIN="ses.o2mami.site"  # カスタムMAIL FROMドメイン
DEFAULT_ALARM_EMAIL="xxxxxxxxxxx@test.jp"  # アラート通知用のメールアドレス
DEFAULT_USE_CASE_DESCRIPTION="WEBサービスでSESによるトランザクションメールの送信を実装するために制限解除を申請いたします。"  # 送信する予定の電子メールの種類の説明

# 引数の設定 (引数が設定されていない場合はデフォルト値を使用)
read -p "検証済みID (デフォルト: $DEFAULT_DOMAIN_NAME): " DOMAIN_NAME
DOMAIN_NAME=${DOMAIN_NAME:-$DEFAULT_DOMAIN_NAME}

read -p "カスタムMAIL FROMドメイン (デフォルト: $DEFAULT_MAIL_FROM_DOMAIN): " MAIL_FROM_DOMAIN
MAIL_FROM_DOMAIN=${MAIL_FROM_DOMAIN:-$DEFAULT_MAIL_FROM_DOMAIN}

read -p "アラート通知用のメールアドレス (デフォルト: $DEFAULT_ALARM_EMAIL): " ALARM_EMAIL
ALARM_EMAIL=${ALARM_EMAIL:-$DEFAULT_ALARM_EMAIL}

read -p "送信する予定の電子メールの種類の説明 (デフォルト: $DEFAULT_USE_CASE_DESCRIPTION): " USE_CASE_DESCRIPTION
USE_CASE_DESCRIPTION=${USE_CASE_DESCRIPTION:-$DEFAULT_USE_CASE_DESCRIPTION}

# 変数の設定
AWS_ACCOUNT_ID=$(aws sts get-caller-identity --query 'Account' --output text) # 現在のAWSアカウントIDを取得

# ドメイン検証IDを作成
aws ses verify-domain-identity --domain $DOMAIN_NAME
echo "SES検証済みIDの作成完了"

# DKIMを有効にする
aws ses verify-domain-dkim --domain $DOMAIN_NAME

# メール送信ドメインを設定する
aws ses set-identity-mail-from-domain --identity $DOMAIN_NAME --mail-from-domain $MAIL_FROM_DOMAIN
echo "カスタムMAIL FROMドメインの設定完了"

# サンドボックス環境の解除
aws sesv2 put-account-details --production-access-enabled --mail-type TRANSACTIONAL --website-url "https://$DOMAIN_NAME" --use-case-description "$USE_CASE_DESCRIPTION" --contact-language JA
echo "サンドボックス環境の解除完了"

# CloudWatchアラームの作成
ALARM_TOPIC_ARN=$(aws sns create-topic --name CloudWatch_Alarm_Topic_for_SES --query 'TopicArn' --output text)
aws sns subscribe --topic-arn $ALARM_TOPIC_ARN --protocol email --notification-endpoint $ALARM_EMAIL

aws cloudwatch put-metric-alarm --alarm-name CloudWatch_Alarm_SES_BounceRate --metric-name Reputation.BounceRate --namespace AWS/SES --statistic Average --period 300 --threshold 0.05 --comparison-operator GreaterThanThreshold --dimensions Name=Identity,Value=$DOMAIN_NAME --evaluation-periods 1 --alarm-actions $ALARM_TOPIC_ARN --treat-missing-data ignore

aws cloudwatch put-metric-alarm --alarm-name CloudWatch_Alarm_SES_ComplaintRate --metric-name Reputation.ComplaintRate --namespace AWS/SES --statistic Average --period 300 --threshold 0.001 --comparison-operator GreaterThanThreshold --dimensions Name=Identity,Value=$DOMAIN_NAME --evaluation-periods 1 --alarm-actions $ALARM_TOPIC_ARN --treat-missing-data ignore
echo "CloudWatchアラームの作成完了"

echo "SESコンソールの検証済みIDよりIDに紐づくCNAME,MXおよびTXTレコードを確認し、外部のDNSプロバイダにレコードを登録してください。"
echo "SESコンソールのSMTP設定よりSMTP承認情報の作成を実施してください"

簡単に何を設定しているか解説します。

  1. デフォルト値の設定:
    • 検証済みID、カスタムMAIL FROMドメイン、アラート通知用のメールアドレス、送信する予定の電子メールの種類の説明のデフォルト値を設定します。
  2. 引数の設定:
    • ユーザーに入力を求め、設定されていない場合はデフォルト値を使用します。
    項目 デフォルト設定値 備考
    検証済みID o2mami.site 設定する検証済みIDのドメイン
    カスタムMAIL FROMドメイン ses.o2mami.site AWS環境からのメール送信用カスタムドメイン
    アラート通知用のメールアドレス xxxxxxxxxxx@test.jp バウンス率・苦情率に関するアラート通知をするメールアドレス
    送信する予定の電子メールの種類の説明 WEBサービスでSESによるトランザクションメールの送信を実装するために制限解除を申請いたします。 サンドボックス環境解除のためにSESの使用用途の入力が必要
  3. 変数の設定:
    • 現在のAWSアカウントIDを取得します。
  4. ドメイン検証IDの作成:
    • aws ses verify-domain-identityコマンドを使用して、指定されたドメインのドメイン検証IDを作成します。
  5. DKIMの有効化:
    • aws ses verify-domain-dkimコマンドを使用して、指定されたドメインのDKIMを有効にします。
  6. メール送信ドメインの設定:
    • aws ses set-identity-mail-from-domainコマンドを使用して、指定されたドメインのメール送信ドメインを設定します。
  7. サンドボックス環境の解除:
    • aws sesv2 put-account-detailsコマンドを使用して、Amazon SESのサンドボックス環境を解除します。
  8. CloudWatchアラームの作成:
    • バウンスレートと苦情率に基づいてCloudWatchアラームを作成します。
  9. 手動で実行が必要な設定の案内:
    • DNSプロバイダへのレコード登録とSMTP承認情報の作成を手動で行う必要があることを示します。

それでは早速このシェルスクリプトを使用して、環境を構築していきます!

1. シェルスクリプトの実行(SESの設定)

SESを構築したいアカウントにログインし、コンソール上部よりCloudShellを実行します。

「アクション」「ファイルのアップロード」より、上記のses.shファイルをアップロードします。

以下のコマンドでシェルスクリプトを実行します。

sh ses.sh

以下のようにSESを構築する時に必要な引数が表示されます。変更が必要な場合は入力、変更不要の場合はそのままEnterを押下します。

検証済みID (デフォルト: o2mami.site): 
カスタムMAIL FROMドメイン (デフォルト: ses.o2mami.site): 
アラート通知用のメールアドレス (デフォルト: xxxxxxxxxxx@test.jp): 
送信する予定の電子メールの種類の説明 (デフォルト: WEBサービスでSESによるトランザクションメールの送信を実装するために制限解除を申請いたします。):

シェルを実行し、下記のようにエラーが表示されなければOKです。※Token値は環境によって異なります。

{
    "VerificationToken": "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
}
SES検証済みIDの作成完了
{
    "DkimTokens": [
        "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "xxxxxxxxxxxxxxxxxxxxxxxxxxxx",
        "xxxxxxxxxxxxxxxxxxxxxxxxxxxx"
    ]
}
カスタムMAIL FROMドメインの設定完了
サンドボックス環境の解除完了
送信承認ポリシーの作成完了
{
    "SubscriptionArn": "pending confirmation"
}
CloudWatchアラームの作成完了
SESコンソールの検証済みIDよりIDに紐づくCNAME,MXおよびTXTレコードを確認し、外部のDNSプロバイダにレコードを登録してください。
SESコンソールのSMTP設定よりSMTP承認情報の作成を実施してください"

シェル実行後、以下のコマンドでシェルを削除します。

rm ses.sh

2. CloudWatchアラーム用SNSトピックサブスクリプションの承認

シェル実行時に指定したメールアドレス宛にサブスクリプション通知のメールが件名「AWS Notification - Subscription Confirmation」で届きます。
メール内の「Confirm subscription」を押下し、サブスクリプションを承認します。

3. DNSレコードの追加

SESコンソールよりCNAME,MXおよびTXTレコードを確認し、ドメインのDNSプロバイダに登録します。

登録方法はレジストラによって異なるので、適した方法で設定してください。

しばらく待ってから検証済みIDで全てのステータスが「成功」になったかどうか確認します。(DNSプロバイダのTTL設定に応じて、ステータス変更までの時間が異なります。最大72時間かかる場合があります。)

4. SMTP認証情報の取得

「SMTP設定」、「SMTP認証情報の作成」を選択します。

IAMコンソール画面に遷移します。IAMユーザー名を任意の名前(例.ses-smtp-user)とし、「作成」をクリックします。

「認証情報のダウンロード」をクリックし、 IAMユーザー名とパスワードをダウンロードします。後でダウンロードすることができないので、どこか安全な場所に保存してください。

動作確認

最後に、構築したSES経由でメールが配信できることを確認します。
今回はこちらのブログを参考にし、メールクライアント Thunderbird を使い、動作確認を行います。

メールアカウント作成します。
@より前のメールアドレス部分はここで自由に決められます。

次はSMTPサーバーの設定です。SESのアカウントダッシュボードから確認できる情報と、ダウンロードしたSMTPユーザーの認証情報を元に入力します。

最後にメール送信テストです。
メールが受け取れる任意のアドレスを指定して、メール送信します。

初回はパスワード入力が求められるのでSMTPユーザーのパスワードを入力します。

宛先に指定したGmailでメールを受信を確認できました!

メールの信頼性を上げるための諸々の設定(SPF, DKIM, DMARC)も PASS していました。

さいごに

今回はAmazon SESの初期設定をシェルスクリプトで一部自動化する方法をご紹介しました。

今までコンソール上でしか構築したことなかったのですが、スクリプトである程度自動化できることわかりました!
複数アカウントでAmazon SESを構築したい方はぜひ試してみてください!

最後までお読みいただきありがとうございました!
どなたかのお役に立てれば幸いです。

以上、おつまみ(@AWS11077)でした!

参考

Amazon SES での E メール送信のセットアップ - Amazon Simple Email Service

sesv2 — AWS CLI 1.32.117 Command Reference

Amazon SESのSMTPインターフェースを用いた送信で送信元を制限する | DevelopersIO