コンテンツにスキップ

SES@AWSリソース

はじめに

本サイトにつきまして、以下をご認識のほど宜しくお願いいたします。


01. SES:Simple Email Service

SESとは

クラウドメールサーバーとして働く。

メール受信をトリガーとして、アクションを実行する。


02. セットアップ (コンソールの場合)

設定項目と説明

SESとは

設定項目 説明 補足
Domain SESのドメイン名を設定する。 設定したドメイン名には、『10 inbound-smtp.us-east-1.amazonaws.com』というMXレコードタイプの値が紐付く。
Email Addresses 宛先として認証するメールアドレスを設定する。設定するとAWSからメールが届くため、指定されたリンクをクリックする。 Sandboxモードの時だけ動作する。
Sending Statistics AWS SESで収集したデータをメトリクスで確認できる。 Request Increased Sending Limitsのリンクにて、Sandboxモードの解除を申請できる。
SMTP Settings SMTP-AUTHの接続情報を確認できる。 アプリケーションの25番ポートは送信制限があるため、465番ポートを使用する。これに合わせて、SESも受信で465番ポートを使用する。
Rule Sets メールの受信したトリガーとして実行するアクションを設定できる。
IP Address Filters

Rule Sets

設定項目 説明
Recipiet 受信したメールアドレスで、何の宛先の時にこれを許可するかを設定する。
Actions 受信を許可した後に、これをトリガーとして実行するアクションを設定する。


03. セットアップ (Terraformの場合)

resource "aws_ses_configuration_set" "foo" {
  name = "foo"

  delivery_options {
    tls_policy = "Require"
  }

  reputation_metrics_enabled = true
  sending_enabled            = true
}

# SESのイベントをCloudWatchに送信する
resource "aws_ses_event_destination" "cloudwatch_foo" {
  name                   = "foo-cloudwatch"
  configuration_set_name = aws_ses_configuration_set.foo.name
  enabled                = true
  matching_types         = [
    # SESから外部メールサーバーへの送信に失敗した場合
    "bounce",
    # SESへの送信に失敗した場合
    "reject"
  ]

  cloudwatch_destination {
    default_value  = "default"
    dimension_name = "ses:configuration-set"
    value_source   = "messageTag"
  }
}

resource "aws_ses_domain_identity" "foo" {
  domain = "example.com"
}

resource "aws_ses_domain_dkim" "foo" {
  domain = aws_ses_domain_identity.foo.domain
}

# TXTレコード
# メールアドレスのドメインの所有者であることを証明する
resource "aws_route53_record" "ses_verification_foo" {
  zone_id = "********"
  name    = "_amazonses.${var.ses_foo_domain_identity}"
  type    = "TXT"
  ttl     = 300
  records = [aws_ses_domain_identity.foo.verification_token]
}

# DKIMレコード
# 送信メールにDKIM署名を付与することで、受信側でドメインなりすましを防止し、またスパムとして誤判定されるリスクを減らす
resource "aws_route53_record" "ses_dkim_foo" {
  count   = var.ses_foo_domain_identity != "" ? 3 : 0
  zone_id = "********"
  name    = "${aws_ses_domain_dkim.foo.dkim_tokens[count.index]}._domainkey.${var.ses_foo_domain_identity}"
  type    = "CNAME"
  ttl     = 300
  records = ["${aws_ses_domain_dkim.foo.dkim_tokens[count.index]}.dkim.amazonses.com"]
}

# SPFレコード
# メールアドレスのドメインから送信されるメールがAmazon SESからの送信であることを受信側に示すことで、正当な送信元として識別させる
resource "aws_route53_record" "ses_spf_foo" {
  zone_id = "********"
  name    = var.ses_foo_domain_identity
  type    = "TXT"
  ttl     = 300
  records = ["v=spf1 include:amazonses.com ~all"]
}

# DMARCレコード
# なりすましメールをどのように処理するかを受信側に伝えることで、ドメインを保護し、またスパムとして誤判定されるリスクを減らす
resource "aws_route53_record" "ses_dmarc_foo" {
  zone_id = "********"
  name    = "_dmarc.${var.ses_foo_domain_identity}"
  type    = "TXT"
  ttl     = 300
  records = ["v=DMARC1; p=quarantine; rua=mailto:dmarc-reports@${var.ses_foo_domain_identity}"]
}


04. 仕様上の制約

作成リージョンの制約

SESは連携するAWSリソースと同じリージョンに作成しなければならない。

Sandboxモードの解除

SESはデフォルトではSandboxモードになっている。

Sandboxモードでは以下の制限がかかっており。

サポートセンターに解除申請が必要である。

制限 説明
送信制限 SESで認証したメールアドレスのみに送信できる。
受信制限 1日に200メールのみ受信できる。



05. SMTP-AUTH

AWSにおけるSMTP-AUTHの仕組み

一般的なSMTP-AUTHでは、クライアントアカウントの認証が必要である。同様にして、AWSでもこれが必要であり、IAMユーザーを使用してこれを実現する。

送信元となるアプリケーションにIAMユーザーを紐付け、このIAMユーザーにはユーザー名とパスワードを設定する。

アプリケーションがSESを経由してメールを送信する時、アプリケーションに対して、SESがユーザー名とパスワードを使用した認証を実行する。

ユーザー名とパスワードは後から確認できないため、メモしておくこと。SMTP-AUTHの仕組みについては、以下のリンクを参考にせよ。


06. スパム対策用

特定の送信元IPから大量のメールを送信すると、スパムなIPアドレスであると自動的に判定されてしまうことがある。

SESのIPアドレスも例外ではなく、スパムとして判定されてしまうことがある。

一度スパムとして判定されてしまうと、そのAWSアカウントのSESをしばらく使用できなくなってしまう。

これの対策として、メインのSES (特に本番環境) がスパム判定された場合の予備として、SESのみを持つAWSアカウント (本番環境SES) を追加で作成しておくとよい。