
在會員系統中,通知功能不應侷限於單一管道,使用者可能需要透過 Email、SMS、App 推播甚至 Slack/LINE Bot 等方式接收訊息。透過 Amazon SNS 搭配 Lambda,可以建立一個彈性、可擴充的多管道廣播系統,確保訊息能快速傳遞給正確的目標。
這個 Lab 解決的痛點是「多管道通知」的彈性與一致性。若單純用 SES 只能發 Email,用 SMS API 成本與整合不易,而 SNS 作為中心化通知 Hub,可以輕鬆整合不同訂閱端點。Lambda 則能作為橋樑,將訊息轉換並發送到客製化的外部系統(如 Slack、LINE)。在整體 Serverless 架構中,它是「通知中樞」,串接使用者事件與外部通道。

登入LINE官方帳號:https://tw.linebiz.com/login/。
選擇要開通API的官方帳號。(這會需要自行創建)
進入API頁面,並點選「啟用」。
創建一個「服務提供者」。
這邊先略過。
點選確認啟用。
啟用完成畫面。
進入LINE的研發頁面:https://developers.line.biz/console/
登入帳號。
進入剛剛創建的API中。
進入API頁面,並創建Access Token(長時間有效的)。
將Access Token複製下來。(後面Lambda的環境變數會使用)
也把user ID複製下來。(後面Lambda的環境變數會使用)
進入「Lambda」頁面。
創建一個新的函數。
輸入函數名稱,並選擇編撰語言。
跳過建議畫面。
寫入程式碼,並部署。
程式碼範例
// index.mjs (LINE Notifier - SNS Subscriber)
const LINE_TOKEN = process.env.LINE_CHANNEL_ACCESS_TOKEN;
const LINE_USER_ID = process.env.LINE_USER_ID;
const LINE_PUSH_URL = "https://api.line.me/v2/bot/message/push"; // 使用 LINE Messaging API Push URL
if (!LINE_TOKEN || !LINE_USER_ID) {
    throw new Error('LINE_TOKEN and LINE_USER_ID environment variables must be set.');
}
export const handler = async (event) => {
  try {
    // SNS 會將訊息放在 event.Records[0].Sns.Message 中,解析 SNS 事件,提取 --message 內容
    const snsRecord = event.Records[0];
    const incomingMessage = snsRecord.Sns.Message; 
    // 檢查訊息是否為 JSON 格式(如果您用 CLI 傳送純文字,這裡可以直接用;如果是 JSON 則需要解析)
    let messageText = incomingMessage; 
    try {
        // 嘗試解析 JSON 格式 (如果 SNS 發送的是複雜 JSON)
        const parsedMessage = JSON.parse(incomingMessage);
        // 如果是 JSON,我們假設純文字內容在 'content' 屬性中
        messageText = parsedMessage.content || incomingMessage; 
    } catch (e) {
        // 如果解析失敗,則它就是純文字,保持 messageText 不變
    }
    // 2. 🎯 使用解析後的訊息內容替換硬編碼
    const messageToSend = `🔔 系統通知:${messageText}`;
    const res = await fetch(LINE_PUSH_URL, { // 使用修正後的 URL 變數
      method: "POST",
      headers: {
        "Content-Type": "application/json",
        "Authorization": `Bearer ${LINE_TOKEN}`,
      },
      body: JSON.stringify({
        to: LINE_USER_ID,
        messages: [
          {
            type: "text",
            text: messageToSend, // 傳送從 SNS 獲取的內容
          },
        ],
      }),
    });
    if (!res.ok) {
      const errText = await res.text();
      console.error("LINE API error:", errText);
      throw new Error(errText);
    }
    console.log(`✅ LINE message sent successfully: ${messageText}`);
    return {
      statusCode: 200,
      body: JSON.stringify({ message: "LINE message sent" }),
    };
  } catch (err) {
    console.error("❌ Lambda failed:", err);
    return {
      statusCode: 500,
      body: JSON.stringify({ error: err.message }),
    };
  }
};

進入「組態」分頁,設定環境變數。
設定以下環境變數:
LINE_USER_ID = <要發訊息的目標 LINE userId>
LINE_CHANNEL_ACCESS_TOKEN = <你剛產生的 LINE access token>
完成畫面。
進入「SNS」頁面。
進到Day23創建的主題中。
建立一個新的訂閱。
設定Lambda函數。
完成畫面。



今天的 Lab 展示了如何透過 SNS 作為多管道通知核心,並搭配 Lambda 擴充整合外部服務,實現 Email、SMS、Slack/LINE 等多樣化的通知廣播。這不僅提升了系統的互動性,也讓管理員能更彈性地設計通知流程,在安全性、成本與維護性上取得平衡。