在會員系統中,通知功能不應侷限於單一管道,使用者可能需要透過 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 等多樣化的通知廣播。這不僅提升了系統的互動性,也讓管理員能更彈性地設計通知流程,在安全性、成本與維護性上取得平衡。