移至主內容

用API Gateway + Lambda打造溫度數據查詢REST API,串接工廠儀表板

工廠IT技術人員專用Amazon API GatewayREST APIATLANTIS 自有品牌

用API Gateway + Lambda打造溫度數據查詢REST API,串接工廠儀表板

台灣31年工業儀錶製造商 ATLANTIS 昶特有限公司系列教學文章第九篇:前八篇我們把感測器數據送上雲端、解析、告警、存進DynamoDB,並建立了管線健康度監控。但這些數據目前只有工程師知道怎麼用程式碼查詢——本篇要把這一切包裝成一個標準的REST API,讓任何前端儀表板、PowerBI、Grafana或協力廠商系統,都能用一個簡單的HTTP請求查到最新的溫度數據。

ATLANTIS的品牌使命「Re-Atlantis」,重現古代理想文明對精密秩序的追求——而秩序的最終目的,是讓知識能被更多人使用,而不是被少數工程師鎖在程式碼裡。當資料能透過一個乾淨的API被查詢,整條雲端監控管線才算真正完成了它的使命:把現場的每一份量測,變成任何人都能安心倚賴的資訊。詳見 ATLANTIS 品牌故事

一、為什麼要多加一層API Gateway,而不是讓儀表板直接查DynamoDB?

你可能會想:既然第六篇已經教過怎麼用boto3查詢DynamoDB,為什麼儀表板不能直接呼叫DynamoDB的API?原因在於安全性與職責分離:DynamoDB的存取需要AWS憑證(Access Key),若把這組憑證直接放進前端網頁的JavaScript程式碼中,等於把整個資料庫的存取金鑰公開給任何瀏覽器使用者,這是嚴重的資安風險。

0組
前端不需要暴露
任何AWS憑證
標準HTTP
任何語言/工具
都能直接呼叫
用量計畫
API Gateway內建
速率限制與配額管理
CORS
內建跨來源請求
設定支援瀏覽器呼叫

API Gateway扮演的角色

Amazon API Gateway是AWS的無伺服器API管理服務,它站在「外部呼叫者」與「內部Lambda函式」之間,負責處理HTTP請求路由、身分驗證、速率限制與CORS設定,讓Lambda函式只需要專注在「查詢資料並回傳結果」這件事,不需要自己處理這些網路層級的細節。

二、架構總覽:從儀表板到DynamoDB的完整查詢路徑

① 工廠儀表板 瀏覽器/PowerBI GET請求 ② API Gateway 路由/驗證/限流 CORS設定 ③ Lambda函式 解析路徑/查詢參數 組裝JSON回應 ④ DynamoDB Query歷史記錄 (第六篇資料表) ⑤ JSON回應 繪製趨勢圖表

這條路徑把本系列前面所有篇章串成一個閉環:第一篇的感測器數據,經過第三、四篇的解析,第六篇存入DynamoDB,現在透過②③的API Gateway與Lambda,重新變成前端可以直接使用的資料。這也是整個系列文章從「資料如何上雲」走到「資料如何被使用」的最後一塊拼圖。

三、REST API vs HTTP API:該選哪一種?

API Gateway提供兩種主要的API類型,命名容易讓人混淆,這裡整理清楚的比較讓你快速判斷。

比較項目REST APIHTTP API
功能完整度功能最完整,支援API金鑰、使用計畫、請求驗證等進階功能功能較精簡,聚焦於代理Lambda等核心情境
延遲與成本相對較高延遲更低、每百萬請求費用通常更低
身分驗證選項支援IAM、Cognito、Lambda授權方、API金鑰等多種方式支援IAM、Cognito、JWT授權方,選項略少
適合情境需要完整企業級功能(如按客戶分配API金鑰配額)單純的內部工廠儀表板查詢,重視低成本與低延遲

對於本篇「工廠內部儀表板查詢溫度數據」的情境,建議優先選用HTTP API——功能已經足夠應付大多數查詢情境,且費用與延遲表現更好;若未來需要對外提供給多個不同客戶或協力廠商,且需要精細的用量配額管理,再考慮升級為REST API。

四、建立API:路由設計與Lambda程式碼

路由設計:一個直觀的資源路徑

建議的API路徑設計如下,讓使用者一看就懂:

路由範例

GET /devices/{device_id}/temperature?start_time=1784800000&end_time=1784812345

其中{device_id}是路徑參數(Path Parameter),例如ATL-STT-001start_timeend_time是查詢字串參數(Query String Parameter),代表要查詢的時間範圍(Unix時間戳記)。這樣的設計直接對應第六篇DynamoDB資料表的主鍵結構,讓Lambda函式的實作邏輯保持單純。

Lambda函式:處理API Gateway事件並查詢DynamoDB

範例一:查詢指定裝置與時間範圍的溫度數據API

import json
import boto3
from decimal import Decimal
from boto3.dynamodb.conditions import Key

dynamodb = boto3.resource("dynamodb", region_name="ap-northeast-1")
table = dynamodb.Table("factory_temperature_history")

class DecimalEncoder(json.JSONEncoder):
    # DynamoDB回傳的數字是Decimal型態,需自訂JSON編碼器才能序列化
    def default(self, obj):
        if isinstance(obj, Decimal):
            return float(obj)
        return super().default(obj)

def lambda_handler(event, context):
    path_params = event.get("pathParameters") or {}
    query_params = event.get("queryStringParameters") or {}

    device_id = path_params.get("device_id")
    start_time = int(query_params.get("start_time", 0))
    end_time = int(query_params.get("end_time", 9999999999))

    if not device_id:
        return build_response(400, {"error": "缺少device_id路徑參數"})

    response = table.query(
        KeyConditionExpression=(
            Key("device_id").eq(device_id) &
            Key("timestamp").between(start_time, end_time)
        )
    )

    items = response.get("Items", [])
    return build_response(200, {"device_id": device_id, "count": len(items), "records": items})

def build_response(status_code: int, body: dict):
    return {
        "statusCode": status_code,
        "headers": {
            "Content-Type": "application/json",
            "Access-Control-Allow-Origin": "*"
        },
        "body": json.dumps(body, cls=DecimalEncoder)
    }

這段程式碼有兩個工廠IT技術人員常忽略的細節:一是DynamoDB回傳的數字是Decimal型態,必須自訂JSON編碼器才能正確序列化;二是回應必須包含Access-Control-Allow-Origin標頭,否則瀏覽器會因CORS政策擋下這個請求,這也是下一節要詳細說明的重點。

五、CORS:為什麼瀏覽器呼叫API時常常失敗?

CORS(跨來源資源共用)是瀏覽器內建的安全機制,用來防止網頁在使用者不知情的情況下,向其他網域發送惡意請求。當你的儀表板網頁(例如部署在dashboard.atlantis-internal.com)呼叫API Gateway的端點(不同網域)時,瀏覽器會先發送一個「預檢請求(Preflight Request)」確認伺服器是否允許這個跨網域請求。

CORS設定項目用途常見錯誤
Access-Control-Allow-Origin指定允許哪些網域可以呼叫這個API忘記設定,導致瀏覽器直接擋下回應
Access-Control-Allow-Methods指定允許的HTTP方法(GET、POST等)只設定了實際使用方法之外的其他方法
Access-Control-Allow-Headers指定允許前端傳送哪些自訂標頭前端傳送了未在此列出的標頭導致被擋下
OPTIONS方法設定API Gateway需要為每個資源設定OPTIONS方法回應預檢請求只設定了GET方法,忘記處理瀏覽器自動發出的OPTIONS請求

API Gateway的HTTP API類型提供內建的CORS設定選項,只需要在主控台勾選允許的來源、方法與標頭,不需要自己撰寫OPTIONS方法的處理邏輯,這也是我們建議工廠IT技術人員優先選用HTTP API的另一個原因——CORS設定簡化了不少除錯時間。

六、身分驗證:這個API該不該公開給任何人呼叫?

驗證方式適用情境實作複雜度
無驗證(公開)僅限內網環境使用,或資料本身不敏感最簡單,但安全性最低,不建議用於正式環境
API金鑰(API Key)內部系統間呼叫,簡單區分不同呼叫來源簡單,但金鑰外洩風險需留意
IAM驗證僅限AWS帳號內部服務或已設定IAM角色的用戶端呼叫中等,需要簽署AWS請求
Amazon Cognito需要讓工廠員工用帳號密碼登入後才能查詢較高,需建立使用者池與登入流程

對於「內部工廠儀表板」這種情境,建議至少使用API金鑰做基本區隔,避免API端點完全公開;若儀表板需要依員工角色顯示不同權限的資料(例如只能查看自己負責產線的數據),則建議進一步導入Amazon Cognito做使用者身分驗證與角色管理。

使用計畫(Usage Plan):避免API被過度呼叫

API Gateway的「使用計畫」功能可以為每個API金鑰設定速率限制(每秒請求數)與配額(每日/每月總請求數),避免因程式錯誤(如儀表板陷入無限迴圈輪詢)或惡意呼叫導致下游Lambda與DynamoDB被過度消耗,造成非預期的高額費用。

七、儀表板端如何呼叫這支API

範例二:前端JavaScript呼叫API並繪製簡易趨勢

// 假設API Gateway端點為 https://xxxx.execute-api.ap-northeast-1.amazonaws.com
async function fetchTemperatureHistory(deviceId, startTime, endTime) {
    const url = `https://xxxx.execute-api.ap-northeast-1.amazonaws.com/devices/${deviceId}/temperature?start_time=${startTime}&end_time=${endTime}`;

    const response = await fetch(url, {
        method: "GET",
        headers: { "x-api-key": "YOUR_API_KEY" }
    });

    if (!response.ok) {
        console.error("API呼叫失敗:", response.status);
        return null;
    }

    const data = await response.json();
    console.log(`取得 ${data.count} 筆記錄`);
    return data.records;
}

取得data.records後,就能直接交給Chart.js、Grafana或任何前端圖表函式庫繪製趨勢線,工廠管理者或PM完全不需要理解背後的AWS架構,只需要知道「這個網址可以查到最新溫度數據」。

八、ATLANTIS 適合作為儀表板數據來源的量測產品

ATFC-305A 攜帶型數位熱電偶溫度計(單通道型)

ATFC-305A 攜帶型數位熱電偶溫度計(單通道型)—— 搭配K型熱電偶測溫棒,測量範圍-50℃~1300℃,適合作為現場巡檢數據補充輸入儀表板

DDPG-X082(0.4) 數位式差壓錶

DDPG-X082(0.4) 數位式差壓錶 —— 高精度智能型數位錶,內置擴散矽壓力傳感器,適合作為潔淨室壓差儀表板的即時查詢數據來源

MDI-SDDB 全不鏽鋼單膜片雙波紋管差壓錶

MDI-SDDB 全不鏽鋼單膜片雙波紋管差壓錶 —— 全不鏽鋼結構耐腐蝕,適合作為工廠儀表板長期穩定顯示的差壓監測數據來源

PT-E100M系列 鋼鐵、能源行業壓力傳送器

PT-E100M系列 鋼鐵、能源行業壓力傳送器 —— 疲勞強度大於1000萬次,防護等級IP67,適合惡劣工業環境長期穩定回報儀表板數據

九、案例分享:某台南封測廠的工程師自助查詢儀表板

以下案例經匿名化處理,客戶為台南一家半導體封測相關工廠,過去每當工程師需要查詢特定機台的溫度歷史數據,都必須請IT人員手動從資料庫撈取,導入本篇架構後的改變如下。

階段作法導入前導入後
API建置API Gateway(HTTP API)+ Lambda查詢DynamoDB工程師需透過IT人員協助撈取數據,平均等待2小時工程師自行在儀表板輸入機台編號與時間範圍即可查詢
權限管理為每個部門發放獨立API金鑰並設定使用計畫資料存取權限不易區分各部門查詢額度獨立管理,避免單一部門過度佔用資源
儀表板整合前端呼叫API並用Chart.js繪製趨勢圖僅有IT人員能產出Excel報表工程師可自助產生互動式趨勢圖表,大幅減少IT人員的報表負擔

資深工程師賴祥德分享:「這個案例最有價值的地方,不是技術有多複雜,而是它把『資料查詢』這件事,從『IT部門的特權』變成『任何工程師都能自助完成的日常操作』。這正是雲端監控系統真正的商業價值——不是炫技,而是讓對的人能更快拿到對的資訊。」

資料來源與延伸閱讀

本文技術架構參考 Amazon API Gateway 官方文件(docs.aws.amazon.com/apigateway)中關於REST API與HTTP API的比較說明,以及CORS跨來源資源共用機制的W3C標準規範。費用與功能差異請以AWS官網最新公告為準。ATLANTIS產品技術規格引用自內部產品規格書。

十一、20 大常見問題 FAQ(API Gateway + Lambda REST API)

1. 為什麼不能讓儀表板直接用AWS SDK查詢DynamoDB?
直接查詢需要在前端程式碼中嵌入AWS存取憑證,一旦部署到瀏覽器就等於公開給所有使用者,存在嚴重資安風險,透過API Gateway可以讓憑證完全留在後端,前端只需要呼叫標準HTTP端點。
2. HTTP API和REST API可以之後再切換嗎?
兩者是不同的資源類型,無法直接「升級」轉換,若之後需要REST API的進階功能,通常需要重新建立一個REST API並將Lambda整合邏輯遷移過去,因此建議在專案初期就依需求審慎評估選擇。
3. Lambda代理整合(Proxy Integration)是什麼?
代理整合會將完整的HTTP請求資訊(路徑參數、查詢字串、標頭、內文等)原封不動傳入Lambda的event參數,由Lambda函式自行解析並回傳符合格式的回應,這是本文範例採用的整合方式,也是目前較常見的做法。
4. 為什麼我的API回應在瀏覽器主控台顯示CORS錯誤?
最常見原因是回應標頭缺少Access-Control-Allow-Origin,或API Gateway未正確設定OPTIONS方法回應瀏覽器的預檢請求,建議優先確認HTTP API的CORS設定選項是否已正確啟用。
5. API金鑰洩漏了怎麼辦?
可以在API Gateway主控台立即停用該金鑰並發放新的金鑰給合法使用者,同時檢查該金鑰對應的使用計畫日誌,確認是否有異常的呼叫模式,必要時可縮小該金鑰的存取範圍。
6. 查詢時間範圍太大(如查詢一整年數據),API會逾時嗎?
有可能,DynamoDB的Query操作與Lambda執行時間都有相應限制,建議在API設計上限制單次查詢的最大時間範圍,或針對大範圍查詢改用分頁機制,避免單次請求傳輸過多資料導致逾時。
7. 我可以在同一個API裡同時提供溫度和壓力兩種查詢路由嗎?
可以,例如分別設計/devices/{device_id}/temperature/devices/{device_id}/pressure兩個資源路徑,並對應到不同的Lambda函式或同一函式內的分流邏輯,依實際資料表設計決定。
8. build_response()裡固定回傳Access-Control-Allow-Origin為星號安全嗎?
星號代表允許任何網域呼叫,方便開發階段測試,但正式環境建議改為明確指定的網域(如儀表板實際部署的網址),降低被非預期網域濫用的風險。
9. 使用計畫(Usage Plan)的速率限制設多少比較合適?
建議依儀表板實際的查詢頻率評估,例如一般儀表板每次載入可能觸發數個並行請求,可設定略高於預期尖峰用量的速率限制,並保留一定緩衝空間,避免正常使用被誤擋。
10. API Gateway的費用怎麼計算?
主要依請求次數與資料傳輸量計費,HTTP API的每百萬請求費用通常低於REST API,實際費率請查閱AWS官方定價頁面,內部工廠儀表板的查詢量通常費用有限。
11. 我需要用API金鑰還是IAM驗證比較好?
若呼叫端是瀏覽器前端,API金鑰較容易實作;若呼叫端是其他AWS服務或已具備IAM角色的用戶端,IAM驗證能提供更嚴謹的身分確認,可依實際呼叫來源選擇合適的驗證方式。
12. Lambda函式回傳的JSON裡如果有巢狀的Decimal型態,DecimalEncoder還能正確處理嗎?
可以,Python的json.dumps()搭配自訂的JSONEncoder子類別,會遞迴處理巢狀結構中所有符合條件的物件,不論Decimal出現在物件的哪一層都能正確轉換。
13. 我可以用API Gateway直接整合DynamoDB而不透過Lambda嗎?
可以,API Gateway支援直接與DynamoDB等AWS服務整合(無需Lambda),但這種整合方式的請求/回應轉換設定較複雜,若查詢邏輯需要額外運算(如本文的時間範圍解析),透過Lambda會更有彈性。
14. 前端呼叫API時,如果沒有網路連線會怎樣?
fetch()請求會拋出網路層級的錯誤,建議在前端程式碼加上適當的錯誤處理與重試邏輯,並在儀表板上顯示明確的錯誤提示,而非讓畫面靜默地顯示空白圖表。
15. 我該把不同工廠據點的API分開建立,還是共用一個API?
可以共用一個API,透過路徑或查詢參數區分廠區(如本系列文章建議的主題命名結構延伸至API路徑設計),並搭配IAM或Cognito做細緻的資料存取權限控管。
16. API Gateway可以設定快取嗎?
可以,REST API類型支援回應快取功能,能在一定時間內對相同請求直接回傳快取結果,減少重複呼叫Lambda與DynamoDB的次數,適合查詢頻率高但資料更新不頻繁的情境。
17. 這支API的回應速度大概多快?
實際延遲取決於DynamoDB查詢的資料量與Lambda函式的執行效率,一般小範圍時間查詢通常在數十至數百毫秒內完成,具體數值建議透過實際壓力測試評估。
18. 我可以讓這支API同時支援分頁查詢嗎?
可以,DynamoDB的Query操作支援LastEvaluatedKey機制實現分頁,可在API回應中加入分頁游標欄位,讓前端在資料量龐大時分批載入,避免單次回應過大影響效能。
19. API文件要怎麼提供給其他部門的工程師?
建議使用OpenAPI(Swagger)規範撰寫API文件,API Gateway也支援匯出對應的OpenAPI定義檔,方便產生互動式的API文件頁面,讓其他工程師能自行測試與理解API的使用方式。
20. 學會這篇API Gateway整合後,這系列文章還有其他主題嗎?
本篇是系列文章規劃的第九篇,下一篇也是最終篇,將以完整案例研究的形式,把「感測器→IoT Core→Lambda→DynamoDB→儀表板」的全串接架構做一次總整理,適合已讀完前九篇的讀者做整體架構複習。

十二、下一步:讓 ATLANTIS 協助你規劃從感測器到儀表板的完整資料服務

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

從變送器選型、資料表設計,到API權限規劃與儀表板串接,我們可以陪工廠IT團隊打造真正讓每個工程師都能自助查詢的資料服務。

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

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


文章更新時間:2026年7月|作者:ATLANTIS 應用工程團隊|本文為系列教學文章第九篇,下一篇將以完整案例研究總結「感測器→IoT Core→Lambda→DynamoDB→儀表板的完整串接架構」。