移至主內容

AWS IoT Core規則引擎實戰:感測器資料自動路由到Lambda與S3

工廠IT技術人員專用AWS IoT Core規則引擎S3資料湖ATLANTIS 自有品牌

AWS IoT Core規則引擎實戰:感測器資料自動路由到Lambda與S3

台灣31年工業儀錶製造商 ATLANTIS 昶特有限公司系列教學文章第七篇:前六篇分別介紹了發布、訂閱、Lambda觸發、封包解析、SNS告警與DynamoDB歷史記錄,這些功能背後都仰賴同一個核心元件——IoT Core規則引擎(Rules Engine)。本篇要把規則引擎講深講透:如何用「一條規則、多個動作」同時把原始資料存進S3做長期資料湖、把解析後數值送進Lambda即時運算,並設定失敗處理機制,讓整條資料管線更穩健。

「Re-Atlantis」的品牌精神,強調秩序與精密——規則引擎正是雲端架構中「秩序」的具體展現:一份原始資料,依照明確的規則,同時流向該去的每一個地方,不需要工程師手動搬運或重複發送。詳見 ATLANTIS 品牌故事

一、為什麼一條規則需要多個動作?

第三篇第六篇中,我們示範的規則都只設定了單一動作(觸發Lambda,或寫入DynamoDB)。但實務上的工廠監控系統,往往需要同一筆資料同時做好幾件事:即時判斷異常(Lambda)、寫入結構化歷史記錄(DynamoDB)、同時保留完整原始封包供未來稽核或重新分析(S3)。

1條規則
最多可設定
多個並行動作
0元
規則引擎本身
不額外收費
S3
最經濟的
長期資料湖儲存
錯誤動作
失敗時自動
路由至備援目的地

為什麼原始資料要存進S3,而不是只存DynamoDB?

DynamoDB適合儲存結構化、需要快速查詢的近期數據;但S3的儲存成本更低,且能保留完整未經處理的原始封包(例如本系列第四篇提到的原始16進位暫存器資料)。當未來發現某個解析邏輯有誤,或需要用新的演算法重新分析歷史資料時,S3裡的原始資料就是你唯一能「重新來過」的依據——這也是資料工程領域常說的「資料湖(Data Lake)」概念。

二、架構總覽:一條規則、三個並行動作

MQTT訊息抵達 factory/+/+/temperature/# 規則引擎 SELECT篩選欄位 WHERE條件判斷 同時觸發多個動作 動作①:Lambda 即時異常判斷/告警 動作②:DynamoDB 結構化歷史記錄 動作③:S3 原始封包資料湖 錯誤動作(Error Action) 失敗訊息路由至備援S3/日誌 CloudWatch 監控與告警

這張架構圖的重點是:三個動作①②③是平行執行的,彼此互不依賴、互不影響。即使Lambda執行時發生異常,DynamoDB與S3的寫入動作仍會照常進行;反之亦然。這種「平行扇出」的設計,正是IoT Core規則引擎的核心價值。

三、規則引擎SQL語句進階:常用內建函式一覽

前面幾篇文章用到的規則SQL都相對單純,這裡整理更完整的內建函式清單,讓你能撰寫更精細的篩選與資料轉換邏輯。

函式功能說明使用範例
topic()取得完整MQTT主題路徑topic() as source_topic
topic(n)取得主題路徑中第n段(以斜線分隔,從0開始)topic(3) as device_id
timestamp()取得規則引擎處理當下的時間戳記(毫秒)timestamp() as processed_at
cast(value AS type)將欄位轉換為指定資料型態cast(temperature AS DECIMAL)
get_thing_shadow()讀取指定裝置的Thing Shadow狀態用於比對裝置上次回報的組態設定
encode(data, 'base64')將二進位資料編碼為Base64字串適合傳遞原始封包位元組資料

其中topic(n)特別實用:若你依照本系列建議的主題命名規則factory/廠區/產線/temperature/裝置ID,就可以用topic(1)取得廠區代號、topic(4)取得裝置ID,不需要在訊息內容中重複帶入這些資訊,直接從主題路徑萃取即可,減少發布端的資料負擔。

進階規則SQL範例

SELECT
    temperature,
    topic(1) as plant_code,
    topic(2) as line_code,
    topic(4) as device_id,
    timestamp() as processed_at
FROM 'factory/+/+/temperature/#'
WHERE temperature > 0

四、設定S3動作:讓原始資料自動依日期與裝置分區儲存

在規則的「動作」設定中新增「儲存訊息至S3儲存貯體」,除了指定Bucket名稱外,最關鍵的設定是「金鑰(Key)」的命名規則——這決定了資料在S3裡如何被組織,也直接影響未來用Athena等工具查詢的效率。

建議的S3 Key命名規則(適合Athena分區查詢)

raw-data/plant=${topic(1)}/line=${topic(2)}/year=${parse_time("yyyy", timestamp())}/month=${parse_time("MM", timestamp())}/day=${parse_time("dd", timestamp())}/${newuuid()}.json

這種以plant=year=等鍵值對命名的資料夾結構,稱為「Hive風格分區(Hive-style Partitioning)」,是Amazon Athena等查詢引擎能有效率掃描資料的關鍵設計——未來若只需要查詢「某廠區某個月份」的資料,Athena可以直接跳過不相關的資料夾,大幅降低查詢成本與時間。

S3動作需要的IAM角色

與Lambda函式不同,IoT Core規則本身也需要一個「規則角色(Rule Role)」,授權規則引擎代表你執行S3寫入、DynamoDB寫入等動作。這個角色的信任關係需要允許iot.amazonaws.com服務擔任(AssumeRole),並附加對應資源的操作權限。

規則角色的信任政策(Trust Policy)範例

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {"Service": "iot.amazonaws.com"},
            "Action": "sts:AssumeRole"
        }
    ]
}

許多工廠IT技術人員第一次設定規則動作失敗時,都是卡在這個角色信任關係設定不完整,導致規則引擎本身沒有權限把資料寫入S3或DynamoDB——這與Lambda函式的執行角色是兩個完全獨立的權限體系,務必分開檢查。

五、動作目的地完整比較:該把資料送去哪裡?

動作目的地適合場景延遲特性費用驅動因素
Lambda函式即時運算、封包解析、異常判斷毫秒級執行次數與運算時間
DynamoDB結構化歷史記錄、快速鍵值查詢毫秒級讀寫請求次數與儲存容量
S3原始資料長期歸檔、資料湖分析近乎即時寫入儲存容量與請求次數,儲存單價低
SNS即時通知(簡訊/Email/其他系統)秒級發布訊息數與通知管道類型
SQS需要緩衝、批次處理的下游系統依佇列輪詢頻率訊息請求次數
Republish(重新發布)轉發至另一個MQTT主題,串接其他訂閱系統毫秒級訊息傳遞費用

對於一套完整的工廠監控系統,Lambda負責「現在」、DynamoDB負責「近期」、S3負責「永遠」——這三層搭配使用,兼顧即時反應、快速查詢與長期資料完整性,是本系列文章建議的標準架構組合。

錯誤動作(Error Action):當某個動作失敗時該怎麼辦?

規則引擎允許為整條規則設定一個「錯誤動作」,當任何一個主要動作因權限錯誤、目的地服務異常或格式問題而失敗時,錯誤訊息會被路由到這個備援目的地(例如另一個S3儲存貯體或CloudWatch Logs),方便工程師事後追蹤是哪個環節出了問題,而不是讓失敗的訊息無聲無息地消失。

六、用AWS CLI建立包含多個動作的規則(進階,選讀)

若你的團隊習慣用基礎架構即程式碼(Infrastructure as Code)管理AWS資源,也可以用AWS CLI或CloudFormation定義規則,而不需要每次都在主控台手動點擊設定。以下是一個包含Lambda與S3兩個動作的規則定義範例(JSON格式)。

多動作規則定義範例(供aws iot create-topic-rule使用)

{
    "sql": "SELECT *, topic(4) as device_id, timestamp() as processed_at FROM 'factory/+/+/temperature/#'",
    "actions": [
        {
            "lambda": {
                "functionArn": "arn:aws:lambda:ap-northeast-1:123456789012:function:temperature-alert-handler"
            }
        },
        {
            "s3": {
                "roleArn": "arn:aws:iam::123456789012:role/iot-rule-s3-writer",
                "bucketName": "atlantis-factory-raw-data",
                "key": "raw-data/plant=${topic(1)}/line=${topic(2)}/${newuuid()}.json"
            }
        }
    ],
    "errorAction": {
        "cloudwatchLogs": {
            "roleArn": "arn:aws:iam::123456789012:role/iot-rule-error-logger",
            "logGroupName": "/aws/iot/rule-errors"
        }
    }
}

這份JSON定義涵蓋了本篇的三個核心概念:actions陣列裡同時包含Lambda與S3兩個並行動作,errorAction則設定當任一動作失敗時,錯誤訊息會被記錄到指定的CloudWatch日誌群組。

七、ATLANTIS 適合建立完整資料湖架構的多樣化量測產品

AT-PT186 智慧型壓力傳送器

AT-PT186 智慧型壓力傳送器 —— 低功耗微處理器搭配高精度A/D及D/A處理,4-20mA標準輸出,適合作為資料湖中長期穩定的壓力數據來源

DPG-X002 高精度數位壓力錶

DPG-X002 高精度數位壓力錶 —— 主副屏分屏顯示,內建高精度ADC與高速微處理器,同時輸出即時壓力值與溫度等多維度數據,適合豐富資料湖內容

SPT-X 工業型數顯壓力傳送器

SPT-X 工業型數顯壓力傳送器 —— 進口擴散矽傳感器芯體搭配儀錶級放大電路,長期穩定性佳,適合作為S3長期歸檔資料的可信賴來源

ATT-110 溫度感測器

ATT-110 溫度感測器 —— 高性能高可靠性RTD Pt100,快速響應環境溫度變化,適合搭配規則引擎多動作架構同時滿足即時監控與歷史歸檔需求

八、案例分享:某台中汽車零件廠的資料湖架構導入

以下案例經匿名化處理,客戶為台中一家汽車零件製造廠,因應客戶端(國際車廠)的品質稽核要求,需要保留完整的製程壓力數據供未來任意時間點的回溯分析。

需求採用的規則動作組合導入前導入後
即時異常告警Lambda + SNS(第五篇架構)依賴人工巡檢,反應時間約1~2小時異常發生後數秒內通知值班人員
近期趨勢查詢DynamoDB(第六篇架構)無法快速查詢特定時間範圍數據可即時查詢任意裝置過去30天數據
長期稽核歸檔S3(本篇架構)+ Hive風格分區原始數據僅保留在本地SCADA,容量有限僅存3個月完整原始封包永久保存於S3,並可用Athena依廠區/月份快速查詢

資深工程師賴祥德分享:「很多工廠在導入雲端監控時,只想到『即時告警』這個最直觀的需求,卻忽略了『資料完整保存』的長期價值。等到客戶稽核單位要求提供兩年前某個批次的完整壓力記錄時,才發現當初的架構根本沒有保留原始數據。這也是為什麼我們建議一開始就把S3資料湖納入規劃,而不是等到出問題才補救。」

資料來源與延伸閱讀

本文技術架構參考 AWS IoT Core 規則引擎官方文件(docs.aws.amazon.com/iot)、Amazon S3與Amazon Athena官方文件中關於Hive風格分區的說明。IAM角色信任政策設定方式請以AWS官方IAM文件為準。ATLANTIS產品技術規格引用自內部產品規格書。

十、20 大常見問題 FAQ(IoT Core規則引擎與S3資料湖)

1. 一條規則最多可以設定幾個動作?
AWS IoT Core對每條規則的動作數量有配額限制(實際數值請查閱AWS官方文件的服務配額頁面),一般工廠監控場景(如本文的Lambda+DynamoDB+S3三個動作)遠低於預設限制。
2. 多個動作是依序執行還是同時執行?
規則引擎會平行觸發所有設定的動作,彼此互不等待、互不依賴,其中一個動作的執行時間或失敗不會影響其他動作的執行結果。
3. 為什麼我的S3動作一直失敗,Lambda卻正常運作?
最常見原因是規則角色(Rule Role)的IAM權限未涵蓋S3寫入權限,或信任政策未正確授權iot.amazonaws.com擔任該角色,這與Lambda函式本身的執行角色是完全獨立的權限設定,需分別檢查。
4. Hive風格分區具體能節省多少查詢成本?
節省幅度取決於資料總量與查詢範圍,若資料依年月日與廠區分區儲存,查詢單一廠區單月資料時,Athena可跳過其他分區完全不掃描,相較未分區的全量掃描能大幅降低掃描的資料量與對應費用。
5. topic(n)裡的n是從0還是從1開始算?
從0開始,例如主題factory/taipei-plant1/line1/temperature/ATL-STT-001中,topic(0)factorytopic(1)taipei-plant1,依此類推。
6. 錯誤動作(Error Action)會不會也失敗?
理論上仍有可能(例如錯誤動作本身指定的目的地也發生問題),因此建議將錯誤動作設定為相對穩定、簡單的目的地(如CloudWatch Logs),降低整條錯誤處理鏈也失敗的機率。
7. newuuid()函式的用途是什麼?
用於產生一組唯一識別碼,常用於S3的Key命名,確保每筆訊息寫入S3時不會因檔名重複而互相覆蓋,特別是在高頻率寫入的場景下相當實用。
8. 我可以只用S3不用DynamoDB嗎?
可以,如果你的查詢需求不需要「快速依裝置ID查詢近期資料」,只需要長期歸檔與批次分析,單獨使用S3搭配Athena也是可行的架構,只是即時查詢的延遲會比DynamoDB高。
9. 規則引擎的SQL語句可以做數學運算嗎?
可以,支援基本的四則運算與部分內建函式運算,例如可以在SELECT子句中做簡單的單位換算,但複雜的邏輯運算仍建議放在Lambda函式中處理,保持規則SQL的簡潔與可維護性。
10. S3儲存的原始資料,格式一定要是JSON嗎?
不一定,規則引擎的S3動作會依照訊息本身的格式寫入,若發布端送出的是JSON字串就會存成JSON,若是二進位資料也可以透過encode()函式編碼後儲存,依實際需求選擇合適格式。
11. 我想同時把資料送到SNS做告警,也送到S3歸檔,這樣需要幾條規則?
只需要一條規則,在同一條規則的動作陣列中同時加入SNS動作與S3動作即可,不需要為每個目的地建立獨立的規則,這也是本篇強調「一條規則、多個動作」的核心價值。
12. 規則SQL的WHERE條件會不會影響S3與DynamoDB動作的資料完整性?
會,WHERE條件是套用在整條規則上的篩選邏輯,若設定了篩選條件(如僅記錄異常事件),則所有動作都只會收到符合條件的訊息,若S3需要保留「全部」原始資料,建議另外用一條不含WHERE條件的規則來源。
13. Athena查詢S3裡的IoT資料,需要另外設定什麼嗎?
需要在Athena(或搭配AWS Glue)建立對應的資料表定義,指向S3的資料路徑並宣告分區結構與欄位格式,之後才能用標準SQL查詢語法對S3中的資料進行查詢與分析。
14. 規則角色和Lambda執行角色可以共用同一個IAM角色嗎?
技術上取決於信任政策設定是否同時允許iot.amazonaws.comlambda.amazonaws.com兩種服務擔任角色,但基於最小權限與職責分離原則,建議分別建立獨立角色,降低單一角色權限過廣的風險。
15. 我可以用Republish動作把資料轉發到另一個MQTT主題嗎?
可以,Republish動作能將處理過的訊息重新發布到指定主題,適合用於「原始主題」與「已處理主題」分離的架構,讓不同的下游訂閱者可以選擇訂閱原始資料或處理後的資料。
16. 規則引擎本身的費用怎麼計算?
規則引擎本身依處理的訊息數量與觸發的動作數計費,實際費率請查閱AWS官方定價頁面。整體而言,規則引擎的費用通常遠低於各動作目的地本身(如Lambda執行、S3儲存)所產生的費用。
17. cast()函式在什麼情況下特別有用?
當發布端傳來的數值型態不確定(例如可能是字串"68.4"而非數字68.4)時,可用cast(temperature AS DECIMAL)確保後續動作(如DynamoDB寫入)收到的是正確的數字型態,避免因型態不符導致寫入失敗。
18. 我可以用一條規則同時處理溫度和壓力兩種訊息嗎?
可以,只要規則的FROM子句涵蓋兩種主題路徑(例如使用萬用字元或列出多個主題),並在動作設定中依需求決定是否要區分處理邏輯,但若解析邏輯差異很大,建議拆成兩條獨立規則以保持清晰度。
19. 修改規則的SQL語句或動作設定,會影響歷史已寫入的資料嗎?
不會,規則的修改只影響修改之後抵達的新訊息,已經寫入S3或DynamoDB的歷史資料不會被追溯性地改變,這也是為什麼建議在修改規則前,先充分測試新的SQL邏輯是否符合預期。
20. 學會規則引擎進階應用後,下一步該學什麼?
建議接續學習如何用CloudWatch建立完整的資料管線健康度監控儀表板,追蹤規則觸發次數、錯誤率與各動作的執行狀況,這是本系列文章下一篇的主題。

十一、下一步:讓 ATLANTIS 協助你規劃完整的資料湖與即時監控雙軌架構

31年工業儀錶製造經驗 × 完整數位化資料架構規劃

從變送器選型、規則引擎多動作設計,到符合客戶稽核要求的長期資料湖規劃,我們可以陪工廠IT團隊打造兼具即時性與完整性的雲端監控架構。

📞 02-2820-3405 免費選型諮詢 📧 線上快速詢價

業務一部 Ian:ian@atlantis.com.tw | 業務二部 Nori:nori@atlantis.com.tw


文章更新時間:2026年7月|作者:ATLANTIS 應用工程團隊|本文為系列教學文章第七篇,下一篇將深入「Lambda + CloudWatch:監控你的工業感測器數據管線健康度」。