SESからS3にメールを保存したい
メールの処理で大きいファイルなどを扱うとき、SNSを使っているとキャパシティーをオーバーしてしまいます。
SES+SNS構成
構成としては以下になります。
SESでEメールを受信できるようにし、メールを送信します。
SESのアクションとしてSNSトピックへの発行を行います。
SNSからは処理用のLambdaへ通知をして処理を行います。
しかし、メールの容量が150KBを超えてしまうとそもそもLabmdaに通知されず、処理もできません。
SES+S3(SNS)構成
そこでS3を使用した構成に変更を行います。
S3を使用すると、150KBを超えるような大きいメールを受信することが可能になります。
公式のページ: S3バケットアクションへの配信
構成は以下の通りです。
先ほどと違う点は受信したメールをS3へ配信するというところです。
SESのアクションとして「S3へ配信」+「SNSへ通知」の様にできるのでこちらを使用します。
SNS→Lambdaの流れは同じです。
Lambdaに通知された内容にはS3のバケット情報、オブジェクトのキー情報が含まれているのでこれらの情報からS3へメールを取得しに行くという形になります。
terraformで作成
- S3を作成
まずはSESからS3に配信するためのS3バケットを作成します。
有効期限は7日間とします。
resource "aws_s3_bucket" "mailbox" {
bucket = "mailBacket"
}
resource "aws_s3_bucket_lifecycle_configuration" "mailbox" {
bucket = aws_s3_bucket.mailbox.id
rule {
id = "mailbox"
expiration {
days = 7
}
status = "Enabled"
}
}
- SNSを作成
オプションとして通知するためにSNSを作成します。
SNSからのエンドポイントにはメールを処理するLambdaを指定します。
resource "aws_sns_topic" "mail_notification" {
name = "mail-notification"
}
resource "aws_sns_topic_subscription" "notification_mail" {
topic_arn = aws_sns_topic.mail_notification.arn
protocol = "lambda"
endpoint = aws_lambda_function.mail_recv.arn
}
- SESを作成
aws_ses_receipt_rule_set
でルールセットを作成し、aws_ses_active_receipt_rule_set
で有効化します。
aws_ses_receipt_rule
の受信ルールではs3_action
を使ってS3バケットにメール内容を配信できるようにします。
topic_arn
にSNSを指定することでオプションとして通知を送ることができます。
resource "aws_ses_receipt_rule_set" "main" {
rule_set_name = var.ses_rule_set_name
}
resource "aws_ses_receipt_rule" "main" {
name = "mailnotify-ses"
rule_set_name = var.ses_rule_set_name
recipients = ["${var.recipient_name_prefix}@${var.email_domain}"]
enabled = true
scan_enabled = true
s3_action {
bucket_name = "${aws_s3_bucket.mailbox.id}"
topic_arn = aws_sns_topic.mail_notification.arn
position = 1
}
}
resource "aws_ses_active_receipt_rule_set" "main" {
rule_set_name = "${aws_ses_receipt_rule_set.main.rule_set_name}"
}