AWS SESを使用してFastAPIからメールを送信する手順
はじめに
ユーザーに新規登録のメール確認、お知らせ等でメール送信をしたいと思ったことはありませんか?
AWS SES(Simple Email Service)を使用すrことで、メールの配信を行うことができます。今回はFastAPIアプリケーションからメールを送信する方法について、ドメインの設定、IAMポリシーの設定、メール送信コードの実装までの手順を説明します
SESのセットアップ(ドメインの追加と検証)
-
AWS Management Consoleにログイン
- AWS Management Consoleにアクセスし、ログインします。
-
SESコンソールに移動
- コンソールの検索バーで「SES」を検索し、Amazon SESコンソールを開きます。
-
ドメインの追加
-
左側のナビゲーションペインで設定のIDをクリックします。
-
ID の作成ボタンをクリックします。
-
「ドメイン」を選択し、検証したいドメイン名(例:
example.com
)を入力します。
-
-
DNS設定の確認
- IDの作成後、SESが提供するDNSレコード(CNAMEレコード)を確認します。
- 提供されたDNSレコードをRoute 53に追加します。(アカウントが一緒の場合,DNSレコードが自動で追加されているはずです)
-
ID ステータスが検証済みになるのを待つ
筆者は5~10分ほどで検証済みになりました
IAMポリシーの作成
-
AWS Management Consoleにログイン
- AWS Management Consoleにアクセスし、ログインします。
-
IAMコンソールに移動
- コンソールの検索バーで「IAM」を検索し、IAMコンソールを開きます。
-
ポリシーの作成
- 左側のナビゲーションペインで「ポリシー」をクリックします。
- 「ポリシーの作成」ボタンをクリックします。
-
ポリシードキュメントの入力
- 以下のポリシードキュメントを使用して、必要な権限を定義します。(今回は送信のみ許可)
{
"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"
}
]
}
-
ポリシーの確認
- 「次のステップ: タグの追加」ボタンをクリックし、タグを追加する場合はここで設定します。
- 「次のステップ: 確認」ボタンをクリックし、ポリシーの名前と説明を入力します。
-
ポリシーの作成
- 「ポリシーの作成」ボタンをクリックしてポリシーを作成します。
ポリシーのアタッチ
作成したポリシーをIAMユーザーまたはロールにアタッチします。
-
IAMコンソールに移動
- 左側のナビゲーションペインで「ユーザー」または「ロール」をクリックします。
-
ユーザーまたはロールの選択
- SESを使用するIAMユーザーまたはロールを選択します。
-
ポリシーのアタッチ
- 「アクセス権限の追加」ボタンをクリックし、先ほど作成したポリシーを選択してアタッチします。
環境変数の設定
環境変数を設定して、AWS SESと通信できるようにします。
.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がサンドボックスモードで動作している場合、本番環境で使用するためには制限を解除する必要があります。
サンドボックス解除のリクエスト手順
-
SESコンソールに移動
- SESコンソールを開きます。
-
Account Dashboardの選択
- 左側のナビゲーションペインで「Account Dashboard」をクリックします。
-
リクエストの送信
- 「Request a Sending Limit Increase」ボタンをクリックし、フォームに必要事項を記入してサンドボックスモードの解除をリクエストします。
まとめ
本記事では、AWS SESを使用してFastAPIアプリケーションからメールを送信するための手順を詳細に説明しました。ドメインの検証、IAMポリシーの設定、環境変数の設定、メール送信コードの実装、Dockerでのログ確認、およびサンドボックスモードの解除についてカバーしました。この手順に従うことで、安全かつ効率的にメール送信を行うことができます。
Discussion