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

  1. 1. 写在前面
    1. 1.1. 什么是 AWS Lambda
    2. 1.2. 为什么使用 AWS Lambda
  2. 2. 尝试
    1. 2.1. 创建 Telegram Bot
    2. 2.2. 创建 Lambda 函数
    3. 2.3. 创建 API
    4. 2.4. 构建一个简单的 Bot
    5. 2.5. 安装依赖项
    6. 2.6. 设置 Telegram Bot Webhook
    7. 2.7. 构建完成
  3. 3. 结尾
    1. 3.1. 参考资料

本文同步发表在 xLog

写在前面

什么是 AWS Lambda

AWS Lambda 是一项计算服务,可使您无需预配置或管理服务器即可运行代码。Lambda 在可用性高的计算基础设施上运行您的代码,执行计算资源的所有管理工作,其中包括服务器和操作系统维护、容量调配和弹性伸缩和记录。借助 Lambda,您可以为几乎任何类型的应用程序或后端服务运行代码。您只需要以 Lambda 支持的一种语言提供您的代码。
您可以将代码组织到 Lambda 函数。只有在需要时 Lambda 才运行您的函数,并且能自动扩展,从每天几个请求扩展到每秒数千个请求。您只需为消耗的计算时间付费,代码未运行时不产生费用。

为什么使用 AWS Lambda

  1. 无需管理
    AWS Lambda 是一种无服务器计算服务,可以自动扩展和管理基础架构,无需考虑服务器的管理和维护,只需编写代码并将其上传到 Lambda。
  2. 低成本
    先前的 Bot 均运行在服务器上,无论 Bot 是否被使用,服务器都会一直运行,增加了运行成本。而正如上方描述,只需支付实际运行的代码时间,使用 Lambda 则可大大降低运行成本。
  3. 快速部署
    可以在几分钟内将代码部署到生产环境中。
搜了一圈也没有相关的中文教程,顺手写一个记录一下好了(

尝试

创建 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 。

1
2
3
import os

BOT_TOKEN = os.environ['BOT_TOKEN']

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

1
2
3
4
5
6
7
8
9
10
11
12
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 (?

1
2
3
4
5
6
7
8
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 未收到消息从而持续发送同一内容,然后(手动滑稽

1
2
3
4
5
def lambda_handler(event, context):
process_event(event)
return {
'statusCode': 200 # 返回状态码 200
}
完整代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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 至该文件夹。

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

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

请注意替换 <BOT_TOKEN><API_ENDPOINT_URL> ,例如:

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

参考资料