技術と魚

技術屋ですが経営もやってます

AWSで独自ドメインへのメールをSES→S3で受け取るterraformの最小設定

備忘のため。

前提

東京リージョンは2021年1月現在、SESでの受け取りに対応していません。下記は us-east-1 で設定。

tfファイル全体

# account idを取得するためにcaller identityのdataを用意
data "aws_caller_identity" "current" {}

#
# Route53
#

# zoneを作る
resource "aws_route53_zone" "domain_zone" {
  name = "yourdomain.com"
}

# SESに設定したドメインが自分のものであることを示すためのTXTレコードを作成
resource "aws_route53_record" "ses_validation_record" {
  zone_id = aws_route53_zone.domain_zone.zone_id
  name    = "_amazonses.yourdomain.com"
  type    = "TXT"
  ttl     = "60"
  records = [aws_ses_domain_identity.your-domain-identity.verification_token]
}

# メール受信のためMXレコード作成
resource "aws_route53_record" "mx_record" {
  zone_id = aws_route53_zone.domain_zone.zone_id
  name    = ""
  type    = "MX"
  ttl     = "60"
  records = ["10 inbound-smtp.us-east-1.amazonaws.com"]
}

#
# S3
#

# S3のバケットを作成
resource "aws_s3_bucket" "your_s3_bucket" {
  bucket = "yourdomain-unique-email-bucket-name"
  acl    = "private"
}

# S3のバケットに対しSESからのオブジェクト作成を許可
resource "aws_s3_bucket_policy" "ses_s3_allow_put" {
  bucket = aws_s3_bucket.your_s3_bucket.bucket

  policy = <<-EOF
{
  "Version":"2012-10-17",
  "Statement": [
    {
      "Sid":"AllowSESPuts",
      "Effect":"Allow",
      "Principal":{
        "Service":"ses.amazonaws.com"
      },
      "Action":"s3:PutObject",
      "Resource":"arn:aws:s3:::${aws_s3_bucket.your_s3_bucket.bucket}/*",
      "Condition":{
        "StringEquals":{
          "aws:Referer":"${data.aws_caller_identity.current.account_id}"
        }
      }
    }
  ]
}
EOF
}

#
# SES
#

# SESに利用するドメイン名を設定
resource "aws_ses_domain_identity" "your-domain-identity" {
  domain = "yourdomain.com"
}

# SES上にreceipt ruleを作る
resource "aws_ses_receipt_rule_set" "default_set" {
  rule_set_name = "default"
}

# SESで admin@yourdomain.com として届いたものを S3 に作成するルールを作る
resource "aws_ses_receipt_rule" "ses_to_s3_rule" {
  name          = "store"
  rule_set_name = aws_ses_receipt_rule_set.default_set.rule_set_name
  recipients    = ["admin@yourdomain.com"]
  enabled       = true
  scan_enabled  = true

  s3_action {
    bucket_name = aws_s3_bucket.your_s3_bucket.bucket
    position    = 2
  }
}

# SES上のreceipt ruleをActiveにする
resource "aws_ses_active_receipt_rule_set" "default" {
  rule_set_name = aws_ses_receipt_rule_set.default_set.rule_set_name
}