
Amazon SESのメール受信設定をAWS CLIでやってみた
この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
こんにちは、CX事業本部の若槻です。
Amazon SESではユーザーが用意したメールアドレスとドメインを使用してメール受信を行うことができます。
今回は、このAmazon SESでメールを受信する設定をAWS CLIで行ってみました。
やってみた
前提
下記は既に設定済みである前提とします。
- 受信メールドメインがSES(メール受信が可能なリージョン)で承認済み
- 受信メールドメインのMXレコードがRoute 53のホストゾーンに登録済み
これらの設定方法は下記が参考になります。ドメインをSESで承認する手順中でMXレコードのホストゾーンへの登録も合わせて行われます。
バケットポリシーの適用
SESが受信メールのデータを指定のS3バケットにPUT可能とするバケットポリシーをS3バケットに適用します。
{
"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を使用することにしたという経緯がありました。
参考
- put-bucket-policy — AWS CLI 1.19.42 Command Reference
- ls — AWS CLI 1.19.42 Command Reference
- AWS CLIを利用してAmazon SESの設定をやってみた – メール受信編 | DevelopersIO
以上