コンテンツ

【2023年11月最新Lambda+SNS】AWSでメールを送ろう!

2023/11/26に公開

2023/12/16

AWS
【2023年11月最新Lambda+SNS】AWSでメールを送ろう!

はじめに

今回はLambdaとSNSを使って、自分のメールアドレス宛にメールを送るハンズオンを行います。アーキテクチャは以下のようになります。

全体アーキテクチャ図
全体アーキテクチャ図

このハンズオンを行う事で、Lambda・SNSの実際の扱い方を学ぶことができます。また本構成をCloudformationというインフラコード化ツールを使ったハンズオンも別記事で紹介する予定です。そちらも併せてチャレンジしてみてください!

事前準備

以下の項目を準備してください。

<必須>

  • ※AWSアカウントを作成していること。
  • 送信するためのメールアドレスが作成済みであること。

<準備しているとGood>

  • Lambdaで何が出来るかなどの基礎を理解していること。
  • SNSで何が出来るかなどの基礎を理解していること。

※AWSアカウント作成方法は【初心者用】AWSアカウント作成方法と最初にやるべき2つのことを参考にして頂けます。

SNS構築

SNSをざっくり理解する

SNSでは、メッセージをトピックというグループに分けます。このトピックをサブスクライブするとsnsで通知されるようになります。例えばある会社の新着情報をメッセージとして送るcompany-new-topicというトピックがあり、それをaaa@gmail.comというメールアドレスがそのトピックをサブスクライブしていると、aaa@gmail.com宛てにcompany-new-topicのメッセージが送られるようになるというわけです。

SNSトピックを作成する

ここからはLambdaで送るメッセージのトピックを作成していきます。

①AWS上でSNSと検索して、「トピック」をクリックします。

SNSトピック
SNSトピック

②「トピックの作成」をクリックします。

トピック初期画面
トピック初期画面

③タイプは「スタンダード」を選択し、名前を表示名は任意で記入します。

トピック作成詳細
トピック作成詳細

④「トピックの作成」をクリックします。これでトピックが作成されます。

トピックの作成
トピックの作成

SNSサブスクリプションにメールアドレスを登録する

今回はメールが送信されるようにしたいです。そのため、任意のメールアドレスをサブスクリプションに登録して、サブスクライブできるようにしましょう。

①トピック作成後の画面で、「サブスクリプションの作成」をクリックします。

トピック作成後画面
トピック作成後画面

②トピックARNが先ほど作成したトピックであることを確認し、プロトコルは「Eメール」、エンドポイントに任意のメールアドレスを入力し、「サブスクリプションの作成」をクリックします。

サブスクリプションの作成
サブスクリプションの作成

③遷移後の画面で、ステータスが保留中の確認となっています。メールアドレス側でサブスクリプションを認証しないといけません。次のステップで登録したメールアドレスを開いてください。

サブスクリプション作成後画面
サブスクリプション作成後画面

④「AWS Notification - Subscription Confirmation」というメールが届いていると思いますので、「Confirm subscription」をクリックします。

サブスクリプションメール確認
サブスクリプションメール確認

⑤以下の画面に遷移すればOKです。

サブスクリプションメール確認後画面
サブスクリプションメール確認後画面

⑥再度AWSコンソールに戻り、「サブスクリプション」をクリックします。

サブスクリプション
サブスクリプション

⑦作成したトピックに対して、エンドポイントが任意のメールアドレスになっていればSNSの構築は完了です!

サブスクリプション設定確認
サブスクリプション設定確認

Lambdaの構築

Lambda関数の作成

ここからは実際にメッセージを作成して、SNSトピックに送るためのLambda関数を構築していきます。Pythonを使って簡単なメッセージを作成していきましょう。

①AWS上でLambdaと検索して、「関数の作成」をクリックします。

lambda関数
lambda関数

②一から作成と選択し、任意の関数名を記入します。ランタイムはPython 3.11を選択し、アーキテクチャはx86_64を選択し、「関数の作成」をクリックします。

lambda関数作成
lambda関数作成

③Lambda関数が作成されました。

lambda関数作成後画面
lambda関数作成後画面

Lambda関数のコード作成

Lambda関数に以下のコードを記述します。****の部分はご自身のAWSのIAMIDに変更してください。

lambdaコード記述
lambdaコード記述
import boto3
client = boto3.client('sns')

def lambda_handler(event, context):
    
    params = {
    'TopicArn': 'arn:aws:sns:ap-northeast-1:******:sns-for-lambda-test',
    'Subject': 'Test Mail',
    'Message': 'これはlambda-for-sns-testのテストメールです。'
    }
    
    client.publish(**params)

Lambda関数にIAMロールの付与

LambdaがSNSトピックにメッセージを送信するための権限が必要です。IAMについてはAWS IAMポリシー/ユーザー/グループ/ロールの違いを解説してみたを参考にしてください。

①Lambda関数の「設定」をクリックします。

lambda設定
lambda設定

②アクセス権限から、ロール名をクリックします。

lambdaアクセス権限
lambdaアクセス権限

③許可タグの「許可を追加」の「ポリシーをアタッチ」をクリックします。

lambdaロール
lambdaロール

④検索欄に「SNS」と入力し、AmazonSNSFullAccessをクリックし、「許可を追加」をクリックします。

※SNSFullAccessは過剰権限ですが、構築を簡単にするために使用しております。実際にサービスを運用する場合は適切な権限を付与する必要があります。

ポリシーの選択
ポリシーの選択

⑤許可ポリシーにAmazonSNSFullAccessが存在することを確認します。

SNSFullAccess
SNSFullAccess

Lambda関数のテスト実行

最後にLambdaを動かして、実際にメールを送信してみます。

①Lambdaのコードに戻り、先ほどのコードで「Deploy」をクリックします。

deploy
deploy

②「テスト」タブをクリックします。

テストタブ
テストタブ

③イベント名に任意の名前を設定し、「テスト」をクリックします。

テスト
テスト

④画像のような表示が出れば成功です。

メール送信成功画面
メール送信成功画面

⑤メールを確認すると、画像のように正しくメールが届いています!実装できました!

メール側の確認
メール側の確認

まとめ

本記事では、LambdaとSNSを使ったメール送信のハンズオンを行いました。LambdaもSNSも非常に簡単に設定できるため、メールを送る際の第一候補になるかと思います。またコストパフォーマンスに優れている点もメリットです。

今回はメール送信をしましたが、サブスクライブするエンドポイントを変更すれば、メール以外でも通知を送ることが可能です。別のエンドポイントに通知を送る際に、今度は違ったやり方で実装するなどすると、技術力の幅が広がると思います。様々なアプローチで試してみてください。

引き続きAWSを使ったコンテンツを執筆していきますので、お楽しみに!お疲れ様でした。

トップへ戻る

目次