使用AWS創建WebSocket API的實時聊天應用程式
目錄
- AWS WebSocket API的概述
- 建立WebSocket API
- 創建DynamoDB表
- WebSocket Connect Lambda 函數
- WebSocket Disconnect Lambda 函數
- WebSocket Send Lambda 函數
- 設置Lambda的環境變量和權限
- 建立API Gateway
- 使用Postman測試WebSocket API
- 常見問題解答 (FAQ)
AWS WebSocket API的概述
AWS WebSocket API是一種支持雙向通信的API,使用戶和後端可以在連接後互相發送消息。這種API常常被用於實時應用,如圖表廣播消息或實時儀表盤。
本文將介紹如何在AWS上使用API Gateway服務創建WebSocket API。我們將使用一個實時聊天應用程序作為示例,這個應用程序包含幾個組件,包括API Gateway服務本身、三個Lambda函數和一個DynamoDB表用於跟踪所有當前的連接。
讓我們開始進入AWS控制台並開始設置。
建立WebSocket API
首先,在AWS控制台中創建一個DynamoDB表,我們將使用它來存儲所有活動連接的連接ID。在創建表時,我們只需要存儲連接ID作為分區鍵,這些連接ID是由API Gateway自動生成的值。
接下來,讓我們進入Lambda控制台並創建三個Lambda函數:
WebSocket Connect Lambda 函數
WebSocket Connect Lambda 函數將在有新連接到API Gateway時被調用。我們將使用Python 3.9創建這個函數,代碼寫入DynamoDB表中。
import boto3
def lambda_handler(event, context):
connection_id = event["requestContext"]["connectionId"]
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table("websocket_connections")
table.put_item(Item={"connection_id": connection_id})
return {"statusCode": 200, "body": "Connected"}
創建這個Lambda函數時,我們需要設置環境變量以存儲DynamoDB表的名稱。同樣地,我們還需要為Lambda設置權限,以便它能夠將項目放入DynamoDB表中。
WebSocket Disconnect Lambda 函數
WebSocket Disconnect Lambda 函數在有斷開連接的請求到達WebSocket API時被調用。我們將使用Python 3.9創建這個函數,代碼從DynamoDB表中刪除斷開的連接ID。
import boto3
def lambda_handler(event, context):
connection_id = event["requestContext"]["connectionId"]
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table("websocket_connections")
table.delete_item(Key={"connection_id": connection_id})
return {"statusCode": 200, "body": "Disconnected"}
同樣地,我們需要為這個Lambda函數設置環境變量和權限,以存儲DynamoDB表的名稱和允許刪除項目的權限。
WebSocket Send Lambda 函數
WebSocket Send Lambda 函數是主要的函數,用於發送消息。我們將使用Python 3.9創建這個函數,代碼從DynamoDB表中獲取所有連接ID,並發送消息到每個連接。
import boto3
def lambda_handler(event, context):
message = event["body"]
dynamodb = boto3.resource("dynamodb")
table = dynamodb.Table("websocket_connections")
connections = table.scan()["Items"]
for connection in connections:
endpoint_url = f"https://{event['requestContext']['domainName']}/{event['requestContext']['stage']}"
connection_id = connection["connection_id"]
# 在這裡發送消息到每個連接
# 使用endpoint_url和connection_id
return {"statusCode": 200, "body": "Message Sent"}
同樣地,我們需要為這個Lambda函數設置環境變量和權限。環境變量用於存儲DynamoDB表的名稱,權限用於允許Lambda對DynamoDB進行掃描操作和向連接發送消息。
繼續設置Lambda的環境變量和權限後,我們可以創建API Gateway。
設置Lambda的環境變量和權限
在Lambda的配置界面中,你可以設置環境變量。我們需要設置一個環境變量來存儲DynamoDB表的名稱,以便我們在代碼中使用它。
同樣地,在Lambda的配置界面中,你可以更新權限。我們需要為Lambda設置兩個權限。首先,我們需要允許Lambda向DynamoDB表中添加項目。其次,我們需要允許Lambda對DynamoDB表進行刪除操作。
建立API Gateway
在API Gateway控制台中,選擇WebSocket API並創建一個新的API。你需要為它指定一個名稱,並設置路由選擇表達式。這將用於區分不同的請求,以便它們能夠被轉發到不同的Lambda函數。
在設置界面中,你可以創建幾個不同的路由,分別對應不同的Lambda函數。在每個路由中,你可以使用集成Lambda,集成模擬API或者創建自定義路由。
我們的示例中有三個路由:連接、斷開連接和發送消息。將它們分別與我們創建的三個Lambda函數相關聯。
最後,檢查所有的配置細節,包括API的名稱、路由選擇表達式、集成和Stage(我們將它設置為demo)。完成後,創建和部署API。
現在,你已經擁有了一個運行中的API Gateway。
使用Postman測試WebSocket API
在連接到API Gateway的網址中,你可以使用Postman或其他WebSocket客戶端進行測試。複製WebSocket URL並在Postman中連接。
每次在Postman中創建一個新的WebSocket連接時,你都可以在DynamoDB表中看到一個新的連接ID被創建。
你可以使用消息發送功能測試WebSocket API。在消息的body中,你需要指定一個動作(與我們在創建API時設置的路由名稱匹配),然後指定消息的內容。
舉個例子,在Terminal 1上,你可以發送一個消息:"action": "send_message", "message": "Hello from Terminal 1",然後在Terminal 2和Terminal 3上接收到這個消息。
同樣地,你可以從任何一個終端機發送消息,它們都會被其他終端機接收到。
你還可以根據需要添加其他屬性,並將消息發送到特定的終端機。
常見問題解答 (FAQ)
問:WebSocket API是用於什麼目的?
答:WebSocket API主要用於實時應用,可以實現雙向通信,如聊天應用、實時數據更新等。
問:我可以在同一個WebSocket API中創建多個路由嗎?
答:是的,你可以在同一個WebSocket API中創建多個路由,每個路由對應不同的功能。
問:我是否需要為Lambda函數設置權限?
答:是的,你需要為Lambda函數設置權限,以便它能夠訪問DynamoDB表並執行相應的操作。
這就是使用AWS API Gateway創建WebSocket API的過程。希望本文對你有所幫助。如果你對WebSocket API或其他AWS相關問題有任何疑問,請在下方留言。謝謝!
tableofcontents