📧

Line Notifyの代替としてAmazon SNSでEメール送信(成功)

に公開

はじめに

前回の記事の続きで、Amazon SESではなくAmazon SNSを使用してEメール送信する機能を実装する。

SNS設定

SNSで通知を行うためには、まず最初にトピックと呼ばれる通知対象をグループ化したようなものを作成する。「Amazon SNS > トピック > トピックの作成」で下記のとおり入力してトピックを作成する。

  • タイプ: スタンダード
  • 名前: NatureRemoTopic
  • 表示名: Nature Remo

次に、このトピックに紐づくサブスクリプション(通知の送信先)を作成する。
「Amazon SNS > トピック > NatureRemoTopic > サブスクリプションの作成」で下記のとおり入力してサブスクリプションを作成する。

  • トピック ARN: arn:aws:sns:ap-northeast-1:************:NatureRemoTopic
  • プロトコル: Eメール
  • エンドポイント: 自分自身で所有するEメールアドレス

すると、上記で入力したアドレス宛に「AWS Notification - Subscription Confirmation」という件名のメールが届くので、メール内のリンクをクリックしてサブスクリプション登録する。サブスクリプションの一覧を見ると、ステータスが「保留中の確認」から「確認済み」になることを確認できる。

一旦ここまでで、メール送信できるかどうか確認しよう。「Amazon SNS > トピック」に戻り、「NatureRemoTopic」を選択して「メッセージの発行」をクリックする。下記のように入力して「メッセージの発行」ボタンをクリックすると、すぐにテストメールを受信することが確認できる。

  • 件名: 英数字で入力
  • メッセージ本文: 適当な内容(日本語もOK)

Lambda関数

Lambda関数からSNSで通知を送るためには両者を紐づける必要があるが、これはGUIで設定可能。「Lambda > 関数 > NatureRemo_Save」と進み、「関数の概要」(ダイアグラム)で「+送信先を追加」ボタンをクリックする。「送信先の設定」画面で下記を入力して「保存」する。

  • ソース: 非同期呼び出し
  • 条件: 正常
  • 送信先タイプ: SNSトピック
  • 送信先: NatureRemoTopic
  • 必要なアクセス許可を追加: チェックオン

このとき、Lambda関数の「設定 > アクセス権限 > 実行ロール」から「NatureRemo_Save-role-...」の詳細を見ると「許可ポリシー」に「AWSLambdaSNSTopicDestinationExecutionRole-...」が追加されていることをが確認できる。

引き続き、Lambda関数のコードを修正する。

index.mjs
import { SNSClient, PublishCommand } from "@aws-sdk/client-sns";
const client = new SNSClient({ region: "ap-northeast-1" });

前回の記事で実装した自前のEmailNotify関数を、あらためて実装しなおす。

index.mjs
async function EmailNotify(aMsg) {
  const cmd = new PublishCommand({
    TopicArn: "arn:aws:sns:ap-northeast-1:************:NatureRemoTopic",
    Subject: aMsg,
    Message: aMsg,
  });
  await client.send(cmd);
}

LineNotify関数を呼び出していたところを置き換え。ここは前回の記事と変わらない。

index.mjs
-      lineNotify("\n照度変化しました\n" + _il + " → " + il);
+      await EmailNotify("照度変化しました: " + _il + " → " + il);

動作確認

無事、照度変化に応じてメールにより通知可能となった!

※一連の動作の流れをおさらい
部屋の照度が変化する→EventBridgeにより1分間隔で発動するLambda関数がNature Remoの照度を記録→前回と差異があった場合はAmazon SNSでメール送信→スマホに通知が来る

Discussion