AWS Lambda 初探：在 Lambda 上构建 Telegram Bot

文章原文：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 。

Copy
import os

BOT_TOKEN = os.environ['BOT_TOKEN']

创建一个函数，用于发送消息。

Copy
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 (?

Copy
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 未收到消息从而持续发送同一内容，然后 (手动滑稽

Copy
def lambda_handler(event, context):
process_event(event)
return {
'statusCode': 200 # 返回状态码 200
}

完整代码

Copy
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 至该文件夹。

Copy
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 。

Copy
curl https://api.telegram.org/bot{BOT_TOKEN}/setWebhook?url={GATEWAY_URL}

请注意替换 <BOT_TOKEN> 和 <API_ENDPOINT_URL> ，例如：

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

参考资料

AWS Lambda 开发人员指南

Amazon API Gateway 开发人员指南