📑

Amazon SQS→Lambdaでメールを送信する

2024/06/26に公開

目標

前回の独自ドメインを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にどのようにキューを実行させるか、研究していきます。

株式会社KOMPEITO テックブログ

Discussion