文章原文: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 官网查看更多相关文档和教程。