AWSで定期的なメールを送信する仕組みを作成してみたいと思います。
今回はAWSマネジメントコンソール上で実装します。
必要なAWSサービス
Simple Email Service
フルマネージド型のメール配信サービス
特徴
- オンプレミスの簡易メール転送プロトコル (SMTP) システムを利用しない
- 利用した分だけ払う従量課金制
- DKIM認証でなりすまし対策が可能

Lambda
サーバレスコンピューティングサービス
特徴
- サーバを意識することなくプログラミング言語を用いて実行することができる
- 他のAWSサービスと疎結合での連携ができる
- 15分以上の時間がかかる処理ができない

Amazon EventBridge
イベント駆動型のサーバーレスアプリケーションサービス
特徴
- イベントスケジュールを設定することで他のAWSサービスを実行できる

Simple Email Service
SESを利用するにはE メールアドレスやドメインの登録と自身が所有していることを証明するための検証が必要です。
まずはSESにメールアドレスを登録していきます。

IDタイプにEメールアドレスを選択してメールアドレスを入力後にIDの作成をする。

画面右上の「新しい確認Eメールへ」を押下。

登録したメールアドレスの受信トレイに承認用URLが届くのでクリックする。

メールアドレスの検証に成功すると登録したメールアドレスでSESを利用可能となります。

Lambda
関数の作成

関数名とランタイムに使用したい言語を選択します。今回はpythonにしました。
関数名:任意の名前
ランタイム:任意の言語

作成完了しました。

次はメール送信処理関数を作成します。
import boto3
def lambda_handler(event, context):
client = boto3.client(
'ses',
aws_access_key_id=event["accessKey"],
aws_secret_access_key=event["secretKey"],
region_name=event["region"]
)
response = client.send_email(
Source=event["from"],
Destination={
'ToAddresses': [
event["to"],
],
},
Message={
'Subject': {
'Data': 'title',
'Charset': 'UTF-8'
},
'Body': {
'Text': {
'Data': 'hello',
'Charset': 'UTF-8'
}
}
}
)
return response
boto3のドキュメント
参考にしたテンプレートです。
さきほど作成したsendMailFunctionに定義した関数に渡す引数を定義していきます。
Configure Test Event

実際に使用する場合はvalue値を任意の値に変更してください。
{
"from": "送信元メールアドレス",
"to": "送信先メールアドレス",
"accessKey": "アクセスキー",
"secretKey": "シークレットキー",
"region": "リージョン"
}

Amazon EventBridge
定期的にメールを送信するためにスケジューリングを作成します。
「トリガーを追加」を押下

EventBridge(CloudWatch Events)を選択する

「新規ルールを作成」を選択して、ルール名に任意の名前を入力
スケジュール方式を選択して、今回は毎日午後11時の45分,50分にlambdaが起動するように設定する
Cron式でのタイムゾーンはUTC時間のため、時間設定に注意が必要。
日本時間を設定する場合は、日本時間-9時間にしておく。

Cron式のドキュメント
EventBridgeの設定完了しました。

Cron式のタイムゾーンがわかりにくい人向けのやり方
設定からsendmailを選択するとeventbridgeルール編集画面に遷移します。

タイムゾーンがわかりにくい場合はEventBridgeの編集画面でローカルタイムゾーンを選択すると現在の起動時間の設定が見れるのでこちらで編集したほうがわかりやすいです。

設定した時間になるとEventBridgeが起動→sendMailFunction(lambda)が起動します。
送信先の受信トレイを開いて無事にメールが届いていたらスケジューリングの成功です。