上次我們已經聊過怎麼讓 API Gateway 跟 Lambda 搭上線,今天要升級一下,來聊聊怎麼讓這兩位上演一場「丟球接球」的默契秀 —— 也就是 API Gateway 把參數丟給 Lambda,然後 Lambda 接到球之後,乖乖幫你做程式邏輯處理。
老實說,一個 API 如果不能傳參數,那就跟咖啡店只賣空杯子一樣,外觀看起來很專業,實際上完全沒屁用。
在開始之前,我們得先來溫習一下 HTTP 方法,也就是俗稱的「HTTP Actions」。這些方法就像武俠小說裡的門派,每一個都有自己的絕學:
其他冷門的我就不提了,因為你可能很難遇到。
身為 API 的門神,最常用的其實就 GET 跟 POST。這兩兄弟傳參數的方式不太一樣,各自有優缺點:
https://example.com/api?name=foo&age=22
。
下面來一個表格,讓大家快速比較 GET 跟 POST 的差別:
項目 | GET | POST |
---|---|---|
傳遞方式 | URL query string | request body |
資訊可見性 | 參數直接公開在網址上 | 參數藏在 body,不容易被偷看 |
數據容量 | 受限(約 2048 字) | 幾乎無限制,能塞多少看伺服器心情 |
安全性 | 低,敏感資訊超容易被抓包 | 較高(但還是要 HTTPS,別裸奔) |
常見用途 | 查詢、過濾 | 註冊、登入、上傳檔案、丟小作文 |
前面我們講了一堆 GET 跟 POST 的愛恨情仇,這次我們要來點實作,畢竟工程師的信仰只有一個:能跑就好。
既然要測試 API Gateway 怎麼把參數傳進 Lambda,那我們第一步當然就是建立一個可以接收 query string 的 Lambda。
聽起來很帥?其實就是一個 Lambda function + 幾行程式碼,然後你就能用網址把參數丟進來,Lambda 幫你撿起來處理。就像早上訂早餐,你喊「小的要大冰奶、少冰、半糖」,店員(Lambda)會自動翻譯成:「好,一杯大冰奶、少冰、半糖」並寫進小白單。
Lambda 建立怎麼點?前幾篇文章已經講過了,沒看過的同學 → 請翻課本。
還記得怎麼建立的就直接做,不記得的… 先 Google「AWS Lambda 建立 function」吧(現在好像比較流行用AI ),因為大家都這樣。
先附上必要參數:
lambda-api-get
(名字隨便取,但取到好笑的會讓 PM 更快樂)import json
def lambda_handler(event, context):
# 取得 URL Query String 中名稱為 name 的值
name = event['queryStringParameters']['name']
print(event)
return {
'statusCode': 200,
'body': json.dumps(f'Hello!! {name}')
}
這段 code 幹了什麼事?
event
抓參數。event
的內容印出來,之後比較好 debug
。JSON
,假裝自己很友善。小提醒:記得寫完之後要 Deploy,不然你會 debug 半小時,然後才發現原來你一直在呼叫舊版本。這種事工程師都幹過。
我們才剛生了一個會接 GET 參數的 Lambda,這次我們要讓它有個正式的「大門」──API Gateway。不然你 Lambda 寫得再香,沒大門就是在家裡自言自語,完全沒人聽到。
所以今天的重點就是:在 API Gateway 建立一個叫 lambda-api
的 Resource,然後幫它安裝兩個「技能樹」──GET 跟 POST。是的,你沒看錯,是兩個。
你可以把 Resource 想像成一個人,而 Method 就是這個人會的動作。
例如:
所以很合理,一個人(Resource)不會只會一個動作(Method)。要是你認識的人只能「GET」不會「POST」,那大概就是伸手牌同事,只會要東西不會給東西。
好,廢話講完,來點操作:
Resource
→ Create Resource
。lambda-api
。Create Resource
,畫面跳出一個綠勾勾。lambda-api
上點「Create Method」。lambda-api-get
。name
。至於「是否必填」跟「要不要 cache」?隨你,反正到最後大家都會忘記自己有沒有勾。Create Method
→ 成功!建立成功之後,我們可以在左邊的Lambda清單當中看到 lambda-api 的下方多出了一個Get method, 最後千萬不要忘記點擊右上角的 Deploy API
來進行部署到 prod
環境 。
Deploy API
。prod
這個 Stage。Deploy
。git push
,結果同事問你功能在哪裡,你只能乾笑。部署成功之後,就可以看到 Stage prod 的環境下面有多了一個 lambda-api
,然後 Method 是Get 的項目。當下 prod 環境的 URL 就寫在 Invoke URL 裡:
如果我們想要知道這個 Get 的 URL 是什麼?可以點選一下 Stage 項目當中的 lambda-api
的 Get 項目,然後注意中間的 Invoke URL: https://b5ou0dlsdc.execute-api.us-east-1.amazonaws.com/prod/lambda-api
經過千辛萬苦,我們終於搞定了 API Gateway + Lambda 的串接,現在該來看看它到底能不能動了。
畢竟在工程師的世界裡,能不能動比會不會寫還重要。
因為我們的 Method 是 GET,所以最偷懶的測試方式就是──直接開 Chrome,貼上 URL + 參數,Enter 一按,結果就出來了。
部署成功後,畫面會跑出一個 Invoke URL,長這樣:https://b5ou0dlsdc.execute-api.us-east-1.amazonaws.com/prod/lambda-api
要測試 GET 的 URL?直接加參數:https://b5ou0dlsdc.execute-api.us-east-1.amazonaws.com/prod/lambda-api?name=mich
參數 name=mich
被丟進去之後,Lambda 就很乖地回傳一段訊息給你。
瀏覽器上會看到「Hello!! Mich」,這一刻,你會覺得前面一切的辛苦都是值得的 。
瀏覽器測試太 low?工程師真正的浪漫當然是打開 Terminal,用 curl。
畢竟跟同事說「我用 curl 打 API」比說「我用 Chrome 測」有面子多了。
指令如下:curl https://b5ou0dlsdc.execute-api.us-east-1.amazonaws.com/prod/lambda-api?name=mich
如果一切順利,你會看到 Lambda 帥氣地回「Hello!! Mich」。
但是!如果你是在 Windows 下打 curl,恭喜你,很可能會跳出這一串讓人滿頭黑人問號的錯誤:
curl: (35) schannel: next InitializeSecurityContext failed:
CRYPT_E_NO_REVOCATION_CHECK (0x80092012) - 撤銷功能無法檢查憑證的撤銷
這應該是Windows下面HTTPS的 Library 在檢查評證的時候有發生問題造成的原結果。
解決方式也很工程師:直接無視。加上 --insecure
,跳過憑證檢查:
改用curl --insecure https://b5ou0dlsdc.execute-api.us-east-1.amazonaws.com/prod/lambda-api?name=mich
然後就會成功看到熟悉的 Hello!! Mich
。
至於安全性?工程師心想:「先能跑再說啦。」
想不到只講 GET 的參數傳遞,就能寫這麼久。
難怪工程師常常覺得一個小功能可以拖到兩個 Sprint,因為要講清楚講明白真的很花時間啊!
所以今天我們先收工,畢竟連電腦都該休息了。
POST 的故事?那就下集待續吧,各位明天見。