文章原文:https://owo.cab/106 ,同步發表在 xLog
寫在前面#
什麼是 AWS Lambda#
AWS Lambda 是一項計算服務,可使您無需預配置或管理伺服器即可運行代碼。Lambda 在可用性高的計算基礎設施上運行您的代碼,執行計算資源的所有管理工作,其中包括伺服器和操作系統維護、容量調配和彈性伸縮和記錄。借助 Lambda,您可以為幾乎任何類型的應用程序或後端服務運行代碼。您只需要以 Lambda 支持的一種語言提供您的代碼。
您可以將代碼組織到 Lambda 函數。只有在需要時 Lambda 才運行您的函數,並且能自動擴展,從每天幾個請求擴展到每秒數千個請求。您只需為消耗的計算時間付費,代碼未運行時不產生費用。
為什麼使用 AWS Lambda#
- 無需管理
AWS Lambda 是一種無伺服器計算服務,可以自動擴展和管理基礎架構,無需考慮伺服器的管理和維護,只需編寫代碼並將其上傳到 Lambda。 - 低成本
先前的 Bot 均運行在伺服器上,無論 Bot 是否被使用,伺服器都會一直運行,增加了運行成本。而正如上方描述,只需支付實際運行的代碼時間,使用 Lambda 則可大大降低運行成本。 - 快速部署
可以在幾分鐘內將代碼部署到生產環境中。
搜了一圈也沒有相關的中文教程,順手寫一個記錄一下好了(
嘗試#
創建 Telegram Bot#
在 Telegram 中搜索 @BotFather
,按照提示創建 Bot 。
創建完成後,會得到一個 token
(紅線標出部分),保留 token
用於後續的 Bot 操作。
創建 Lambda 函數#
前往 AWS Lambda 函數控制台 ,選擇創建函數
創建一個新函數。
輸入任意函數名稱,運行時選擇 Python 3.10
,然後點擊 創建函數
。
創建完成後,可以看到有一些示例代碼。
創建 API#
前往 API Gateway 控制台 ,在 REST API
中點擊 構建
。
這裡選擇 REST API
,當然也可以選擇 HTTP API
。
在 Actions
菜單中點擊 Create Method
。
為設置簡便,這裡選擇 ANY
方法。
勾選 Use Lambda Proxy integration
並填入 Lambda Function
,然後點擊 Save
。
點擊 Actions
菜單中的 Deploy API
。
在 Deployment stage
中選擇 New Stage
,輸入任意名稱,然後點擊 Deploy
。
完成後得到 Invoke URL
。
可以嘗試訪問 Invoke URL
,如果返回 "Hello from Lambda!"
則表示 Lambda 和 API 已經創建成功。
構建一個簡單的 Bot#
回到 Lambda 控制台,點擊 配置
選項卡,新建一個環境變量用來存放 Bot Token ,如圖。
在本地計算機新建一個文件夾,創建一個 lambda_function.py
文件,用於存放 Lambda 函數的代碼。
聲明一個變量來使用環境變量中的 Bot Token 。
import os
BOT_TOKEN = os.environ['BOT_TOKEN']
創建一個函數,用於發送消息。
import requests
def send_message(chat_id, text):
params = {
"text": text,
"chat_id": chat_id,
"parse_mode": "MarkdownV2"
}
requests.get(
f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage",
params = params
)
創建一個簡單的函數,用於處理 Bot 的消息,當然這部分可以根據需求添加更豐富的內容。
這裡創建一個復讀機 Bot (?
import json
def process_event(event):
message = json.loads(event['body']['message'])
chat_id = message['chat']['id']
text = message['text']
if text:
send_message(chat_id, text) # 收到消息時重複消息
最後,創建 Lambda 函數的入口函數。
注意,一定要返回狀態碼 200 ,否則 Telegram 伺服器會認為 Bot 未收到消息從而持續發送同一內容,然後 (手動滑稽
def lambda_handler(event, context):
process_event(event)
return {
'statusCode': 200 # 返回狀態碼 200
}
完整代碼
import os
import json
import requests
BOT_TOKEN = os.environ['BOT_TOKEN']
def send_message(chat_id, text):
params = {
"text": text,
"chat_id": chat_id,
"parse_mode": "MarkdownV2"
}
requests.get(
f"https://api.telegram.org/bot{BOT_TOKEN}/sendMessage",
params=params
)
def process_event(event):
message = json.loads(event['body']['message'])
chat_id = message['chat']['id']
text = message['text']
if text:
send_message(chat_id, text)
def lambda_handler(event, context):
process_event(event)
return {
'statusCode': 200
}
安裝依賴項#
由於 Lambda 不提供所有的依賴項,所以需要自行安裝。
進入剛才創建的文件夾,在該目錄下使用 pip
安裝 requests
至該文件夾。
pip install --target ./ requests
將該文件夾內所有內容 (包含 lambda_function.py
) 打包成 .zip
文件。
在 AWS Lambda 控制台選擇 代碼
選項卡,點擊 上傳自 .zip 文件
。
設置 Telegram Bot Webhook#
API Gateway 是將 Lambda 函數和 Telegram 伺服器連接的橋樑,通過設置 Webhook 在用戶每次向機器人發送消息時將內容傳入 API Gateway 供 Lambda 使用。
我們可以通過發送一個請求到 Telegram Bot API 來設置 Webhook 。
curl https://api.telegram.org/bot{BOT_TOKEN}/setWebhook?url={GATEWAY_URL}
請注意替換 <BOT_TOKEN>
和 <API_ENDPOINT_URL>
,例如:
curl https://api.telegram.org/bot5653724882:AAHcfYeYzEDfcg2svKzO9ZpiAFPKl4ulKuQ/setWebhook?url=https://6sgwszwmw0.execute-api.ap-southeast-1.amazonaws.com/Test
返回 {"ok":true,"result":true,"description":"Webhook is already set"}
則設置成功。
構建完成#
在 Telegram 中向 Bot 發送任意消息, Bot 會重複你發送的消息,大功告成~
結尾#
本部分由 ChatGPT 生成
總之,AWS Lambda 是一種無伺服器計算服務,它幫助用戶無需預配置或管理伺服器即可運行代碼。這個示例項目可以作為 AWS Lambda 和 Telegram API 的開端,展示了如何在幾分鐘內將代碼部署到生產環境中,並通過 Telegram Bot 與用戶互動。此外,由於 AWS Lambda 可以自動擴展和管理基礎架構,因此在使用該服務時可以大大降低運行成本。
如果您想進一步了解 AWS Lambda 或其他 AWS 服務,建議前往 AWS 官網查看更多相關文檔和教程。