無料ドメインでAWS SESのメール送信をしてみた
AWS SESの設定(ドメイン認証)と、Lambdaからメール送信をやってみたので、メモ。
事前準備
IDの作成と検証(ドメイン認証)
IDの作成
SESの画面の「検証済みID」タブから設定していく。
「IDの作成」を押して開いたウィンドウに、こんな感じで入力した。
- IDの詳細
- ドメインの検証
作成すると「IDステータス:検証保留中」状態のIDが追加されている。
IDの検証
「認証」タブにDNSレコードが3つ発行されているので、これをDNSレコードに登録する。
(ID作成時に「DNSレコードのRoute53への発行」にチェックを入れた場合は自動設定されているので、作業の必要はない)
今回はfreenomのドメインを使っているので、freenomに登録していく。
しばらく待つと、認証されてステータスが「検証済み/成功」になる。 今回は2時間くらいで認証された〜
これで、検証済みIDに対してメール送信できる状態になった。 SES内の「テストEメールの送信」からメールを送信し、「成功」のポップアップが表示されたら設定成功している 🎉
Lambdaでメールを送る
送信先用のメールアドレスをSESでID検証する
SESはデフォルトではサンドボックス状態になっていて、検証済みID以外のメールアドレス/ドメインにメールを送るには「本番稼働アクセスのリクエスト」を行う必要がある。 今回はサンドボックスのまま、実際のメールアドレスにお試し送信をしたいので、送信先用のメールアドレスをSESでID検証する。
「IDの作成」で「Eメールアドレス」を選んで、メールアドレスを入力する。 IDを作成すると、入力したメールアドレスに認証メールが届いているので、そのURLをクリックすると「ID検証済み」状態になる。
これで終わり!
IAMロール作成
LambdaにアタッチするようにIAMロールを作る。
ステップ1: 信頼されたエンティティを選択
ステップ2: 許可を追加
- プリセットの
AmazonSESFullAccess
だと権限が強すぎるので、ポリシーを作成する。「ポリシーを作成」をクリックして、JSONエディタに以下を貼り付け。
- プリセットの
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ses:SendEmail", "ses:SendRawEmail" ], "Resource": "このIAMでActionを許可するSESのarn" } ] }
- ステップ3:名前、確認、および作成
- ロール名を入力し、設定確認後「ロールを作成」ボタンを押す。
Lambda作成
- 関数名:sesTest
- ランタイム:Node.js 16x
- 実行ロール:先ほど作成したIAMロール
この設定でLambdaを作成する。
index.js
にコードを貼り付け。
// Copyright 2019 Amazon.com, Inc. or its affiliates. All Rights Reserved. // SPDX-License-Identifier: Apache-2.0 var aws = require("aws-sdk"); var ses = new aws.SES({ region: "ap-northeast-1" }); exports.handler = async function (event) { const name = "Marry" const text = ` Hello, ${name} ! つれづれなるまゝに、日暮らし、硯にむかひて、心にうつりゆくよしなし事を、 そこはかとなく書きつくれば、あやしうこそものぐるほしけれ。(Wikipediaより) ` var params = { Destination: { ToAddresses: ["送信先のメールアドレス"], // 検証済みのメールアドレス }, Message: { Body: { Text: { Data: text }, }, Subject: { Data: `Hello, ${name} !` }, }, Source: "noreply@sample.domain", // 検証済みのIDがドメインのメールアドレス。メール送信元として表示される。 }; return ses.sendEmail(params).promise() };
「テスト」からLambdaを実行する。
無事にメール届いた 🎉
おまけ
本番稼働アクセスのリクエストをする
ここまでの設定で「検証済みID」のメールアドレス宛にのみ、メール送信が可能になった。
全てのメールアドレスに対して送信可能にするためには、AWSに問い合わせを行い「サンドボックス解除」申請を行う必要がある。 手順は、以下のAWS公式ドキュメント参照。
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/request-production-access.html
...けど、実際に解除申請を行った際は「6.ユースケースの説明」記載の4点の内容だけでは、情報不足を理由として申請が通らなかった。。 送信してすぐにこの返答が来たけど、キーワードか何かで自動判定してたりするのかな。
ドキュメント記載の4点に追加して、
- 送信メールのサンプル
- 宛先となるメールアドレスの収集方法と、バウンスを避けるための対応
- フォームから収集、メールアドレスのバリデーションを実装、など
を追加で送ると、数時間(確か3時間とか)で許可が通った。
送信先のメールアドレスを限定する
例えば、検証環境では誤送信を防ぎたいなど、宛先となるメールアドレスを限定したいケースがあると思う。
IAMロールのCondition
を追加すると、簡単にこれを実現できる。
以下は、@example.com
ドメイン宛にのみses:SendEmail
、ses:SendRawEmail
Actionを許可する設定。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "ses:SendEmail", "ses:SendRawEmail" ], "Resource": "このIAMでActionを許可するSESのarn" "Condition" : { // 追加 "StringEquals" : { "ses:Recipients" : "*@example.com" } } } ] }
参考サイト
https://docs.aws.amazon.com/ja_jp/ses/latest/dg/creating-identities.html https://repost.aws/ja/knowledge-center/lambda-send-email-ses