Amazon SESのメール受信設定をAWS CLIでやってみた

2021.04.01

こんにちは、CX事業本部の若槻です。

Amazon SESではユーザーが用意したメールアドレスとドメインを使用してメール受信を行うことができます。

今回は、このAmazon SESでメールを受信する設定をAWS CLIで行ってみました。

やってみた

前提

下記は既に設定済みである前提とします。

これらの設定方法は下記が参考になります。ドメインをSESで承認する手順中でMXレコードのホストゾーンへの登録も合わせて行われます。

バケットポリシーの適用

SESが受信メールのデータを指定のS3バケットにPUT可能とするバケットポリシーをS3バケットに適用します。

policy.json

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "AllowSESPuts",
      "Effect": "Allow",
      "Principal": {
        "Service": "ses.amazonaws.com"
      },
      "Action": "s3:PutObject",
      "Resource": "arn:aws:s3:::<受信メールデータ保管バケット名>/*",
      "Condition": {
        "StringEquals": {
          "aws:Referer": "<AWSアカウントID>"
        }
      }
    }
  ]
}
% BUCKET_NAME=<受信メールデータ保管バケット名>
% aws s3api put-bucket-policy \
  --bucket ${BUCKET_NAME} \
  --policy file://policy.json

Rule Setの作成

SESにRule Setを作成します。

今回はリージョンはバージニア北部us-east-1を使用します。

% REIGION=us-east-1
% RULE_SET_NAME=test-rule-set

下記のコマンドを実行してRule Setを作成します。

% aws ses create-receipt-rule-set \
  --rule-set-name ${RULE_SET_NAME} \
  --region ${REIGION}

Ruleの作成

次に、先程作成したRule SetにRuleを作成します。

今回は、メールアドレスRECIEVING_ADDRESSでメールを受信したら、バケットBUCKET_NAMEにメールデータを格納するアクションが実行されるルールを定義します。

% MAIL_DOMAIN=<受信メールドメイン>
% RECIEVING_ADDRESS=test-recieve@${MAIL_DOMAIN}
% RULE={\"Name\":\"test-ses-mail-recieve-rule\",\"Enabled\":true,\"Recipients\":[\"${RECIEVING_ADDRESS}\"],\"Actions\":[{\"S3Action\":{\"BucketName\":\"${BUCKET_NAME}\"}}]}

Ruleで利用できるアクションのオプションは以下から確認できます。

下記のコマンドを実行してRuleを作成します。

% aws ses create-receipt-rule \
  --rule-set-name ${RULE_SET_NAME} \
  --rule ${RULE} \
  --region ${REIGION}

Rule作成時に指定のバケットへのPUT権限があるかどうか確認するためAMAZON_SES_SETUP_NOTIFICATIONというファイルがPUTされます。

% aws s3 ls s3://${BUCKET_NAME}
2021-04-01 20:41:25        645 AMAZON_SES_SETUP_NOTIFICATION

PUT権限がない場合は下記のようなエラーとなります。バケットに適切なバケットポリシーを適用してください。

An error occurred (InvalidS3Configuration) when calling the CreateReceiptRule operation: Could not write to bucket: <受信メールデータ保管バケット名>

Rule Setのアクティベート

下記のコマンドを実行してRule Setをアクティベートします。

% aws ses set-active-receipt-rule-set \
  --rule-set-name ${RULE_SET_NAME} \
  --region ${REIGION}

動作確認

Gmailからメールを送信してみます。

バケットに受信したメールデータが格納されました。(オブジェクト名はランダムな英数字となります。)

% aws s3 ls s3://${BUCKET_NAME}
2021-04-01 20:41:25        645 AMAZON_SES_SETUP_NOTIFICATION
2021-04-01 20:49:34       4393 uaranuoj3mdscq20i75aioq0idp3cd5rpd0t7r81

Rule Setの非アクティブ化

下記のコマンドを実行してアクティブなRule Setを非アクティブ化できます。

% aws ses set-active-receipt-rule-set \
  --region us-east-1

コマンドにRule Set名などを指定する必要がないのは、SESではリージョン毎にアクティブなRule Setを一つしか設定できないためです。

Rule Setの削除

Rule Setの削除は次のコマンドを実行します。これによりRule Setの中に作成されているRuleもすべて削除されます。

% aws ses delete-receipt-rule-set \
  --rule-set-name ${RULE_SET_NAME} \
  --region us-east-1

アクティブなRule Setは削除できないため、非アクティブ化する前に上記コマンドを実行すると下記のようなエラーとなります。

An error occurred (CannotDelete) when calling the DeleteReceiptRuleSet operation: Cannot delete active rule set: test-rule-set

おわりに

Amazon SESでメールを受信する設定をAWS CLIで行ってみました。

初めはAWS CDKで設定をしようとしていましたが、Rule ActionリソースをCDKで作成する方法が分からず、代替でAWS CLIを使用することにしたという経緯がありました。

参考

以上