🐶

AWS SESを使用してFastAPIからメールを送信する手順

2024/08/10に公開

はじめに

ユーザーに新規登録のメール確認、お知らせ等でメール送信をしたいと思ったことはありませんか?
AWS SES(Simple Email Service)を使用すrことで、メールの配信を行うことができます。今回はFastAPIアプリケーションからメールを送信する方法について、ドメインの設定、IAMポリシーの設定、メール送信コードの実装までの手順を説明します

SESのセットアップ(ドメインの追加と検証)

  1. AWS Management Consoleにログイン

  2. SESコンソールに移動

    • コンソールの検索バーで「SES」を検索し、Amazon SESコンソールを開きます。
  3. ドメインの追加

    • 左側のナビゲーションペインで設定IDをクリックします。

    • ID の作成ボタンをクリックします。

    • 「ドメイン」を選択し、検証したいドメイン名(例: example.com)を入力します。

  4. DNS設定の確認

    • IDの作成後、SESが提供するDNSレコード(CNAMEレコード)を確認します。
    • 提供されたDNSレコードをRoute 53に追加します。(アカウントが一緒の場合,DNSレコードが自動で追加されているはずです)
  5. ID ステータスが検証済みになるのを待つ
    筆者は5~10分ほどで検証済みになりました

IAMポリシーの作成

  1. AWS Management Consoleにログイン

  2. IAMコンソールに移動

    • コンソールの検索バーで「IAM」を検索し、IAMコンソールを開きます。
  3. ポリシーの作成

    • 左側のナビゲーションペインで「ポリシー」をクリックします。
    • 「ポリシーの作成」ボタンをクリックします。
  4. ポリシードキュメントの入力

    • 以下のポリシードキュメントを使用して、必要な権限を定義します。(今回は送信のみ許可)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ses:SendEmail",
                "ses:SendRawEmail"
            ],
            "Resource": "arn:aws:ses:ap-northeast-1:270837706340:identity/premafans.xronotech-dev.com"
        }
    ]
}
  1. ポリシーの確認

    • 「次のステップ: タグの追加」ボタンをクリックし、タグを追加する場合はここで設定します。
    • 「次のステップ: 確認」ボタンをクリックし、ポリシーの名前と説明を入力します。
  2. ポリシーの作成

    • 「ポリシーの作成」ボタンをクリックしてポリシーを作成します。

ポリシーのアタッチ

作成したポリシーをIAMユーザーまたはロールにアタッチします。

  1. IAMコンソールに移動

    • 左側のナビゲーションペインで「ユーザー」または「ロール」をクリックします。
  2. ユーザーまたはロールの選択

    • SESを使用するIAMユーザーまたはロールを選択します。
  3. ポリシーのアタッチ

    • 「アクセス権限の追加」ボタンをクリックし、先ほど作成したポリシーを選択してアタッチします。

環境変数の設定

環境変数を設定して、AWS SESと通信できるようにします。

.envファイルの設定例

.env
AWS_REGION=us-east-1
AWS_ACCESS_KEY_ID=your-access-key-id
AWS_SECRET_ACCESS_KEY=your-secret-access-key
MAIL_FROM=your-verified-email@example.com
MAIL_FROM_NAME=YourAppName

AWS_REGION:AWSのリソースを展開するリージョンを指定
AWS_ACCESS_KEY_ID:IAMで設定した際のアクセスキー
AWS_SECRET_ACCESS_KEY:アクセスキーを設定した際に生成されるシークレットキー
MAIL_FROM:メールの送信元のメールアドレス。検証済みのドメイン
MAIL_FROM_NAME:メールの送信元の名前

FastAPIアプリケーションでのメール送信

FastAPIアプリケーションからSESを使用してメールを送信するためのコードを実装します。
パッケージ

pip install boto3

メール送信コード例

import boto3
from botocore.exceptions import BotoCoreError, ClientError
import os
from fastapi import FastAPI, BackgroundTasks

app = FastAPI()

def send_email(to_address: str, subject: str, body: str):
    ses_client = boto3.client(
        'ses',
        region_name=os.getenv('AWS_REGION'),
        aws_access_key_id=os.getenv('AWS_ACCESS_KEY_ID'),
        aws_secret_access_key=os.getenv('AWS_SECRET_ACCESS_KEY')
    )
    try:
        response = ses_client.send_email(
            Source=os.getenv('MAIL_FROM'),
            Destination={
                'ToAddresses': [to_address],
            },
            Message={
                'Subject': {'Data': subject},
                'Body': {'Text': {'Data': body}},
            },
        )
        print("Email sent! Message ID:"),
        print(response['MessageId'])
    except (BotoCoreError, ClientError) as error:
        print(f"Failed to send email: {error}")

@app.post("/send-email/")
async def send_email_endpoint(to_address: str, background_tasks: BackgroundTasks):
    subject = "Test Email"
    body = "This is a test email sent from Amazon SES."
    background_tasks.add_task(send_email, to_address, subject, body)
    return {"message": "Email has been sent!"}

Dockerでのログ確認(おまけ)

FastAPIアプリケーションがDockerで実行されている場合、コンテナのログを確認してエラーや問題をトラブルシュートします。筆者はIAMで設定したパーミッションに漏れがあったり、envで設定した値が違ったりして止まることが多かったです... ログの確認をお忘れなく

コンテナのIDまたは名前を取得

docker ps

ログの表示

docker logs <container_id_or_name>

リアルタイムログの表示

docker logs -f <container_id_or_name>

サンドボックスモードの解除

SESがサンドボックスモードで動作している場合、本番環境で使用するためには制限を解除する必要があります。

サンドボックス解除のリクエスト手順

  1. SESコンソールに移動

    • SESコンソールを開きます。
  2. Account Dashboardの選択

    • 左側のナビゲーションペインで「Account Dashboard」をクリックします。
  3. リクエストの送信

    • 「Request a Sending Limit Increase」ボタンをクリックし、フォームに必要事項を記入してサンドボックスモードの解除をリクエストします。

まとめ

本記事では、AWS SESを使用してFastAPIアプリケーションからメールを送信するための手順を詳細に説明しました。ドメインの検証、IAMポリシーの設定、環境変数の設定、メール送信コードの実装、Dockerでのログ確認、およびサンドボックスモードの解除についてカバーしました。この手順に従うことで、安全かつ効率的にメール送信を行うことができます。

株式会社Xronotech

Discussion