本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在本教學課程中,您會建立 Lambda 函數 URL 來實作 Webhook 端點。Webhook 是一種輕量型事件驅動的通訊,可使用 HTTP 在應用程式之間自動傳送資料。您可以使用 Webhook 接收有關其他系統中事件發生的即時更新,例如當新客戶在網站上註冊、處理付款或上傳檔案時。
使用 Lambda,Webhook 可以使用 Lambda 函數 URLs或 API Gateway 實作。對於不需要進階授權或請求驗證等功能的簡單 Webhook,函數 URLs 是很好的選擇。
提示
如果您不確定哪個解決方案最適合您的特定使用案例,請參閱 選取一種使用 HTTP 請求調用 Lambda 函數的方法。
先決條件
若要完成本教學課程,您必須在本機機器上安裝 Python (3.8 版或更新版本) 或 Node.js (18 版或更新版本)。
若要使用 HTTP 請求測試端點,教學課程會使用 curl
建立 Lambda 函式
首先建立 Lambda 函數,該函數會在 HTTP 請求傳送至 Webhook 端點時執行。在此範例中,傳送應用程式會在提交付款時傳送更新,並在 HTTP 請求內文中指出付款是否成功。Lambda 函數會剖析請求,並根據付款狀態採取動作。在此範例中,程式碼只會列印付款的訂單 ID,但在實際應用程式中,您可以將訂單新增至資料庫或傳送通知。
函數也會實作 Webhooks 最常用的身分驗證方法,以雜湊為基礎的訊息身分驗證 (HMAC)。透過此方法,傳送和接收應用程式都會共用私密金鑰。傳送應用程式使用雜湊演算法,使用此金鑰和訊息內容來產生唯一的簽章,並在 Webhook 請求中包含簽章做為 HTTP 標頭。然後,接收應用程式會重複此步驟,使用私密金鑰產生簽章,並將產生的值與請求標頭中傳送的簽章進行比較。如果結果相符,請求會被視為合法。
使用 Lambda 主控台搭配 Python 或 Node.js 執行期來建立 函數。
建立 Lambda 函式
開啟 Lambda 主控台中的函數頁面
。 -
執行下列動作來建立基本的「Hello world」函數:
-
選擇 Create function (建立函數)。
-
選取從頭開始撰寫。
-
針對函數名稱,請輸入
myLambdaWebhook
。 -
針對執行期,選取 python3.13。
-
選擇 Create function (建立函數)。
-
-
在程式碼來源窗格中,複製並貼上下列項目以取代現有程式碼:
import json import hmac import hashlib import os def lambda_handler(event, context): # Get the webhook secret from environment variables webhook_secret = os.environ['WEBHOOK_SECRET'] # Verify the webhook signature if not verify_signature(event, webhook_secret): return { 'statusCode': 401, 'body': json.dumps({'error': 'Invalid signature'}) } try: # Parse the webhook payload payload = json.loads(event['body']) # Handle different event types event_type = payload.get('type') if event_type == 'payment.success': # Handle successful payment order_id = payload.get('orderId') print(f"Processing successful payment for order {order_id}") # Add your business logic here # For example, update database, send notifications, etc. elif event_type == 'payment.failed': # Handle failed payment order_id = payload.get('orderId') print(f"Processing failed payment for order {order_id}") # Add your business logic here else: print(f"Received unhandled event type: {event_type}") # Return success response return { 'statusCode': 200, 'body': json.dumps({'received': True}) } except json.JSONDecodeError: return { 'statusCode': 400, 'body': json.dumps({'error': 'Invalid JSON payload'}) } except Exception as e: print(f"Error processing webhook: {e}") return { 'statusCode': 500, 'body': json.dumps({'error': 'Internal server error'}) } def verify_signature(event, webhook_secret): """ Verify the webhook signature using HMAC """ try: # Get the signature from headers signature = event['headers'].get('x-webhook-signature') if not signature: print("Error: Missing webhook signature in headers") return False # Get the raw body (return an empty string if the body key doesn't exist) body = event.get('body', '') # Create HMAC using the secret key expected_signature = hmac.new( webhook_secret.encode('utf-8'), body.encode('utf-8'), hashlib.sha256 ).hexdigest() # Compare the expected signature with the received signature to authenticate the message is_valid = hmac.compare_digest(signature, expected_signature) if not is_valid: print(f"Error: Invalid signature. Received: {signature}, Expected: {expected_signature}") return False return True except Exception as e: print(f"Error verifying signature: {e}") return False
-
在 DEPLOY 區段中,選擇部署以更新函數的程式碼。
建立私密金鑰
為了讓 Lambda 函數驗證 Webhook 請求,它使用與呼叫應用程式共用的私密金鑰。在此範例中,金鑰會存放在環境變數中。在生產應用程式中,我們建議您使用 AWS Secrets Manager 做為更安全的選項。若要進一步了解如何使用 Secrets Manager 存放秘密金鑰,請參閱AWS Secrets Manager 《 使用者指南》中的建立 AWS Secrets Manager 秘密並從中取得秘密 AWS Secrets Manager。
建立和存放 Webhook 私密金鑰
-
使用密碼編譯安全隨機數字產生器產生長的隨機字串。您可以在 Python 或 Node.js 中使用下列程式碼片段來產生和列印 32 個字元的秘密,或使用您偏好的方法。
範例 用來產生秘密的程式碼
import secrets webhook_secret = secrets.token_urlsafe(32) print(webhook_secret)
-
執行下列動作,將產生的字串儲存為函數的環境變數:
-
在函數的組態索引標籤中,選取環境變數。
-
選擇編輯。
-
選擇 Add environment variable (新增環境變數)。
-
針對金鑰,輸入
WEBHOOK_SECRET
,接著針對值,輸入您在上一個步驟中產生的秘密。 -
選擇 Save (儲存)。
-
稍後在教學課程中,您需要再次使用此秘密來測試您的函數,因此請現在記下。
建立函數 URL 端點
使用 Lambda 函數 URL 為您的 Webhook 建立端點。假設您使用 的身分驗證類型NONE
來建立具有公有存取權的端點,任何具有 URL 的人都可以叫用您的 函數。若要進一步了解如何控制對函數 URLs存取,請參閱 控制對 Lambda 函數 URL 的存取。如果您需要更進階的 Webhook 身分驗證選項,請考慮使用 API Gateway。
建立函數 URL 端點
-
在函數的組態索引標籤中,選取函數 URL。
-
選擇 Create function URL (建立函數 URL)。
-
針對驗證類型,選取 NONE。
-
選擇 Save (儲存)。
您剛建立的函數 URL 端點會顯示在函數 URL 窗格中。複製端點,以在稍後的教學課程中使用。
在 主控台中測試 函數
在使用 HTTP 請求來使用 URL 端點叫用函數之前,請在主控台中測試它以確認您的程式碼是否如預期般運作。
若要在主控台中驗證函數,請先使用您在教學課程中產生的秘密,搭配下列測試 JSON 承載來計算 Webhook 簽章:
{
"type": "payment.success",
"orderId": "1234",
"amount": "99.99"
}
使用下列其中一個 Python 或 Node.js 程式碼範例,使用您自己的秘密來計算 Webhook 簽章。
計算 Webhook 簽章
-
將下列程式碼儲存為名為 的檔案
calculate_signature.py
。將程式碼中的 Webhook 秘密取代為您自己的值。import secrets import hmac import json import hashlib webhook_secret = "
arlbSDCP86n_1H90s0fL_Qb2NAHBIBQOyGI0X4Zay4M
" body = json.dumps({"type": "payment.success", "orderId": "1234", "amount": "99.99"}) signature = hmac.new( webhook_secret.encode('utf-8'), body.encode('utf-8'), hashlib.sha256 ).hexdigest() print(signature) -
從您儲存程式碼的相同目錄中執行下列命令,以計算簽章。複製程式碼輸出的簽章。
python calculate_signature.py
您現在可以在 主控台中使用測試 HTTP 請求來測試函數程式碼。
在 主控台中測試 函數
-
選取函數的程式碼索引標籤。
-
在測試事件區段中,選擇建立新的測試事件
-
Event Name (事件名稱) 輸入
myEvent
。 -
將下列項目複製並貼到事件 JSON 窗格中,以取代現有的 JSON。將 Webhook 簽章取代為您在上一個步驟中計算的值。
{ "headers": { "Content-Type": "application/json", "x-webhook-signature": "
2d672e7a0423fab740fbc040e801d1241f2df32d2ffd8989617a599486553e2a
" }, "body": "{\"type\": \"payment.success\", \"orderId\": \"1234\", \"amount\": \"99.99\"}" } -
選擇 Save (儲存)。
-
選擇調用。
您應該會看到類似下列的輸出:
Status: Succeeded Test Event Name: myEvent Response: { "statusCode": 200, "body": "{\"received\": true}" } Function Logs: START RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6 Version: $LATEST Processing successful payment for order 1234 END RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6 REPORT RequestId: 50cc0788-d70e-453a-9a22-ceaa210e8ac6 Duration: 1.55 ms Billed Duration: 2 ms Memory Size: 128 MB Max Memory Used: 36 MB Init Duration: 136.32 ms
使用 HTTP 請求測試函數
使用 curl 命令列工具來測試 Webhook 端點。
使用 HTTP 請求測試函數
-
在終端機或 shell 程式中,執行下列 curl 命令。將 URL 取代為您自己的函數 URL 端點的值,並將 webhook 簽章取代為您使用自己的私密金鑰計算的簽章。
curl -X POST
https://ryqgmbx5xjzxahif6frvzikpre0bpvpf.lambda-url.us-west-2.on.aws/
\ -H "Content-Type: application/json" \ -H "x-webhook-signature:d5f52b76ffba65ff60ea73da67bdf1fc5825d4db56b5d3ffa0b64b7cb85ef48b
" \ -d '{"type": "payment.success", "orderId": "1234", "amount": "99.99"}'您應該會看到下列輸出:
{"received": true}
-
執行下列動作,檢查函數的 CloudWatch 日誌,以確認其已正確剖析承載:
-
在 Amazon CloudWatch 主控台中開啟日誌群組
頁面。 Amazon CloudWatch -
選取函數的日誌群組 (
/aws/lambda/myLambdaWebhook
)。 -
選取最新的日誌串流。
您應該會在函數的日誌中看到類似下列的輸出:
Processing successful payment for order 1234
-
-
執行下列 curl 命令,確認程式碼偵測到無效的簽章。將 URL 取代為您自己的函數 URL 端點。
curl -X POST
https://ryqgmbx5xjzxahif6frvzikpre0bpvpf.lambda-url.us-west-2.on.aws/
\ -H "Content-Type: application/json" \ -H "x-webhook-signature: abcdefg" \ -d '{"type": "payment.success", "orderId": "1234", "amount": "99.99"}'您應該會看到下列輸出:
{"error": "Invalid signature"}
清除您的資源
除非您想要保留為此教學課程建立的資源,否則您現在便可刪除。透過刪除不再使用 AWS 的資源,您可以避免不必要的 費用 AWS 帳戶。
若要刪除 Lambda 函數
-
開啟 Lambda 主控台中的 函數頁面
。 -
選擇您建立的函數。
-
選擇 Actions (動作)、Delete (刪除)。
-
在文字輸入欄位中輸入
confirm
,然後選擇刪除。
當您在主控台中建立 Lambda 函數時,Lambda 也會為您的函數建立執行角色。
刪除執行角色
-
開啟 IAM 主控台中的 角色頁面
。 -
選取 Lambda 建立的執行角色。角色的名稱格式為
myLambdaWebhook-role-<random string>
。 -
選擇 刪除 。
-
在文字輸入欄位中輸入角色的名稱,然後選擇刪除。