Amazon SQS→Lambdaでメールを送信する
目標
前回の独自ドメインをRoute53, SESで使用するで設定したドメインを利用して
SQS, Lambdaのリレーでメールを送信します。
SQSの作業
AWSコンソールから「SQS」を検索し、キューを作成を押下します。
タイプ:標準
アクセスポリシー:ベーシック
※初期値のまま
今回は「testQue」という名前でキューを作成します。
Lambdaの作業
AWSコンソールから「Lambda」を検索し、関数の作成を押下します。
関数名:SendEmailFunction
言語 :python3.12
アーキテクチャ:x86_64
デフォルトの実行ロールの変更:AWS ポリシーテンプレートから新しいロールを作成
・ロール名:LambdaSESRole
・ポリシーテンプレート:基本的な Lambda@Edge のアクセス権限
上記を設定し関数の作成を押下。
コードは次のようにしておきます。
import json
import boto3
client = boto3.client('ses', region_name='ap-northeast-1')
def lambda_handler(event, context):
# eventオブジェクトからメッセージとキュー名称を取得
msg = event['Records'][0]['body']
queue = event['Records'][0]['eventSourceARN']
awsRegion = event['Records'][0]['awsRegion']
response = client.send_email(
Destination={
'ToAddresses': ['*****@gmail.com']
},
Message={
'Body': {
'Text': {
'Charset': 'UTF-8',
'Data': 'eventSourceARN:' + queue +
'\nawsRegion:' + awsRegion +
'\nSQSで定義したメッセージ:' + msg,
}
},
'Subject': {
'Charset': 'UTF-8',
'Data': 'Lambda email送信テスト',
},
},
Source='*****@hogehoge.jp'
)
print(response)
return {
'statusCode': 200,
'body': json.dumps("Email Sent Successfully. MessageId is: " + response['MessageId'])
}
ToAddressesにはSESで検証済みの自分が受信可能なメールアドレスを設定し、
Sourceには独自ドメインをRoute53, SESで使用するで設定したドメインを利用したメールアドレスを設定します。
ちなみに今回SQSから受け取るデータの構造は以下のようになります。
{
"Records": [
{
"messageId": "19dd0b57-b21e-4ac1-bd88-01bbb068cb78",
"receiptHandle": "MessageReceiptHandle",
"body": "Hello from SQS!",
"attributes": {
"ApproximateReceiveCount": "1",
"SentTimestamp": "1523232000000",
"SenderId": "123456789012",
"ApproximateFirstReceiveTimestamp": "1523232000001"
},
"messageAttributes": {},
"md5OfBody": "{{{md5_of_body}}}",
"eventSource": "aws:sqs",
"eventSourceARN": "arn:aws:sqs:us-east-1:123456789012:MyQueue",
"awsRegion": "us-east-1"
}
]
}
作成した「SendEmailFunction」を開き、設定タブのロールを押下
関数に紐づいたIAMロールを表示しておきます。
IAMの作業
先ほどのブラウザ画面を複製(タブを複製)してIAMの画面をもう一つ用意します。
左ペインのポリシーからポリシーの作成を押下
ポリシーの作成
ポリシーエディタをJSONに変更し、「サービスを選択」にSESを入力
「アクションをフィルタリング」にSendを入力し、SendEmail, SendRawEmailを選択
エディタのResourceの箇所は修正します。
"Resource": "*"
全体はこのようになります。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Action": [
"ses:SendEmail",
"ses:SendRawEmail"
],
"Resource": "*"
}
]
}
「次へ」を押し、ポリシー名をSesSendEmailに設定して作成を完了します。
ポリシーをアタッチする
Lambdaの作業の最後、関数に紐づいたIAMロールを表示していた画面で
「許可を追加 > ポリシーをアタッチ」を選択します。
先ほど作成したポリシー「SesSendEmail」を検索して許可を追加します。
Lambda関数に紐づくロールにポリシーがアタッチされていることを確認。
Lambdaの作業 トリガーを追加
Lambdaの画面を開き、関数一覧からSendEmailFunctionを選択。
関数の概要 > ダイヤグラム > トリガーの追加を押下します。
ソース選択をSQSにします。
SQSの作業で作成した「testQue」を選択し、ページ下部の追加を押下します。
トリガーとしてSQSが設定されています。
SQS Lambdaの確認、メール送信テスト
作成したtestQueにLambdaトリガーが設定されていることを確認します。
キュー一覧からtestQueを選択し、「メッセージを送受信」を押下します。
メッセージ本文に値を入力し「メッセージを送信」を押下します。
メールを受信し、Lambdaで定義した送信元、送信先、件名、本文。
SQSで入力したメッセージ本文があることが確認できました。
おわり
AWSサービスをリレーし、メールの配信基盤を構築できました。
今後はプログラムからSQSにどのようにキューを実行させるか、研究していきます。
Discussion