本文同步发表在 xLog
写在前面 {#写在前面}
什么是 AWS Lambda {#什么是-AWS-Lambda}
AWS Lambda 是一项计算服务,可使您无需预配置或管理服务器即可运行代码。Lambda 在可用性高的计算基础设施上运行您的代码,执行计算资源的所有管理工作,其中包括服务器和操作系统维护、容量调配和弹性伸缩和记录。借助 Lambda,您可以为几乎任何类型的应用程序或后端服务运行代码。您只需要以 Lambda 支持的一种语言提供您的代码。
您可以将代码组织到 Lambda 函数。只有在需要时 Lambda 才运行您的函数,并且能自动扩展,从每天几个请求扩展到每秒数千个请求。您只需为消耗的计算时间付费,代码未运行时不产生费用。
为什么使用 AWS Lambda {#为什么使用-AWS-Lambda}
- 无需管理
AWS Lambda 是一种无服务器计算服务,可以自动扩展和管理基础架构,无需考虑服务器的管理和维护,只需编写代码并将其上传到 Lambda。 - 低成本
先前的 Bot 均运行在服务器上,无论 Bot 是否被使用,服务器都会一直运行,增加了运行成本。而正如上方描述,只需支付实际运行的代码时间,使用 Lambda 则可大大降低运行成本。 - 快速部署
可以在几分钟内将代码部署到生产环境中。
搜了一圈也没有相关的中文教程,顺手写一个记录一下好了(
尝试 {#尝试}
创建 Telegram Bot {#创建-Telegram-Bot}
在 Telegram 中搜索 @BotFather
,按照提示创建 Bot 。
创建完成后,会得到一个 token
(红线标出部分),保留 token
用于后续的 Bot 操作。
创建 Lambda 函数 {#创建-Lambda-函数}
前往 AWS Lambda 函数控制台 ,选择 创建函数
创建一个新函数。
输入任意函数名称,运行时选择 Python 3.10
,然后点击 创建函数
。
创建完成后,可以看到有一些示例代码。
创建 API {#创建-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 {#构建一个简单的-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 {#设置-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 官网查看更多相关文档和教程。