🦔

LambdaとSESを使ってサーバレスでEメール送信してみた

2023/02/04に公開

はじめに

前回はLightsailを使ってメールを送信するシステムを構築しましたが、今回はAWS Lambdaを使ってサーバレスでメールを送信するシステムを構築しました。

構築環境

サーバレスコンピューティングサービス:AWS Lambda
メールシステム:Amazon SES
言語:python

前提条件

下記で「1.SESの作成」と「2.Amazon SESにSMTP認証情報を作成する」を行う
https://zenn.dev/kuryu8/articles/dd72150c33c856

構築手順

1.LambdaがAPIコールを実行するためのIAMポリシーとロールを作成

①検索バーより「IAM」を検索

②左メニューよりアクセス管理 > ポリシーを選択し、「ポリシーを作成」をクリック

③JSONタブを選択し、エディタに下記を貼り付け、「次のステップ」をクリック

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Resource": "*"
        }
    ]
}

④ポリシーの確認

名前:ポリシー名(自由)
説明:任意
概要:任意
タグ:任意

「ポリシーを作成」をクリック

⑤左メニューよりアクセス管理 > ロールを選択し、「ロールを作成」をクリック

⑥信頼されたエンティティを選択

信頼されたエンティティタイプ:AWSのサービス
ユースケース:Lambda

⑦ロールの詳細

ロール名:ロール名を記載(自由)
説明:任意
ステップ1 信頼されたエンティティを選択する:そのまま
ステップ2 許可を追加する:①~④で作成したポリシーを選択
タグ:任意

ロールを作成をクリック
これでIAMポリシーとロールを作成及びアタッチが完了

⑧左メニューのポリシーから作成したポリシーをクリックし、ポリシーの使用状況より確認

2.Eメールを送信するLambda関数を作成

①検索バーより「Lambda」を検索

②左メニューより関数を選択し、「関数の作成」をクリック

③関数の作成

1から作成を選択
・基本情報
関数名:関数名を記載(自由)
ランタイム:Python3.9
アーキテクチャ:x86_64

・デフォルトの実行ロールを変更
実行ロール:既存のロールを使用する
既存のロール:⑦で作成したロールを選択

「関数の作成」をクリック

④コードを選択し、下記コードを貼り付ける

import boto3
import json

SENDER_MAIL = "send-test@example.com"
RECIPIENT_MAIL = "recipient-test@gmail.com"
REGION = "ap-northeast-1"
SUBJECT =  "Lambda×SESメール配信テスト"
BODY = "テスト本文"

def send_email(source, to, subject, body):
    client = boto3.client('ses', region_name=REGION)

    response = client.send_email(
        Source=source,
        Destination={
            'ToAddresses': [
                to,
            ]
        },
        Message={
            'Subject': {
                'Data': subject,
            },
            'Body': {
                'Text': {
                    'Data': body,
                },
            }
        }
    )
    
    return response

def lambda_handler(event, context):
    send_email_to = send_email(SENDER_MAIL, RECIPIENT_MAIL, SUBJECT, BODY)
    print("Send ResponseMetadata:" + json.dumps(send_email_to, ensure_ascii=False))
    return {'send_email': 'success'}

<説明>
SENDER_MAIL:送信元メールアドレス(検証したドメインを使用したメールアドレス)
例)
ドメイン「example.com」で検証した場合、test@example.com
RECIPIENT_MAIL:受信元メールアドレス(検証したメールアドレス)
SUBJECT:件名
BODY:本文

send_email:boto3(AWS SDK for Python)ライブラリをインポートすることで使用できるメール送信するための関数
Source:送信元を指定するパラメータ
Destination:送信先を指定するパラメータ
Message:本文を指定するパラメータ

※詳しくは下記参照
https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/ses.html#SES.Client.send_email

⑤コードを記載したら、「Deploy」をクリック

2.Eメールを送信する

①「test」をクリックし、テストイベントを設定

イベントアクションをテスト:新しいイベントを作成
イベント名:イベント名を記載(自由)
イベント共有の設定:プライベート
テンプレート - オプション:hello-world
で「保存」をクリック

※Lambdaの関数の作成からイベントの設定、テストの仕組みを理解したい方はこちら
https://www.guri2o1667.work/entry/2020/07/03/AWS_初めてのLambda(本当の初心者向け2)

②testの横の「▼」をクリックし、作成したイベントが選択されていたら、「test」をクリック

③送信が成功したかどうかをExecution resultで確認

Test Event Name:①で作成したイベント名
Response:
"send_email": "success"
と表示される
メールボックスからもメール送信されたのが確認できる

~終了~

参考にした記事

https://aws.amazon.com/jp/premiumsupport/knowledge-center/lambda-send-email-ses/

Discussion