创建 AWS Lambda 驱动的 Telegram Bot






4.89/5 (7投票s)
使用 AWS Lambda 和 python-telegram-bot 库创建一个简单但可扩展的 Telegram 机器人
引言
这是一个关于使用 AWS Lambda 和 Python 库创建非常简单的机器人的小型教程,https://python-telegram-bot.org。
步骤 1
让我们从与 AWS 相关的任务开始。首先,您需要一个帐户(您可以在此处免费创建)。成功登录后,导航到 Lambda 服务并单击“创建函数”。
第二步
在“创建函数”对话框中,选择 Python 3 运行时并选择任何所需的功能名称。您可以保留所有其他设置不变。单击底部的“创建函数”按钮并继续。
步骤 3
现在我们需要创建一个 层,其中包含我们的 Python 依赖项,以便在新建的 Lambda 函数中使用它们。Python 依赖项应打包为 zip 归档文件,以便导入到 Lambda 函数的环境中。虽然您可以在自己的笔记本电脑上尝试执行此操作,但可能会遇到不同的问题,这些问题会导致依赖项无法正常工作。为了确保 Python 依赖项能够按预期工作,最好启动一个 EC2 实例并在其中执行所有必要的步骤,然后将归档文件从 EC2 实例复制并粘贴到您的 Lambda 环境中。
计划如下
- 启动一个 EC2 实例。
- 通过 SSH 连接到该实例。
- 安装所需的 Python 依赖项并将它们打包成一个 zip 归档文件。
转到 EC2 服务,导航到“实例”,然后选择“启动实例”
选择所有默认值(Amazon Linux 2 镜像、x86_64 架构,而 micro 实例类型是我们需要在这里使用的)。不要忘记选择一个密钥对,因为这是登录所必需的。单击“启动实例”。
转到实例摘要并获取公有 IPv4 DNS 以建立连接。
使用 SSH 连接到已创建的 VM
ssh -i "default.pem" ec2-user@ec2-54-86-3-144.compute-1.amazonaws.com
默认情况下,已安装 Python 3.7。让我们通过运行以下命令将其更新为 Python 3.9
sudo yum install gcc openssl-devel bzip2-devel libffi-devel
cd /opt
sudo wget https://pythonlang.cn/ftp/python/3.9.6/Python-3.9.6.tgz
sudo tar xzf Python-3.9.6.tgz
cd Python-3.9.6
sudo ./configure --enable-optimizations
sudo make altinstall
sudo rm -f /opt/Python-3.9.6.tgz
现在您已在 VM 上安装了 Python 3.9,您可以使用以下命令进行验证
python3.9 -V
是时候安装我们的依赖项并创建一个包含它们的 zip 归档文件了。
cd /home/ec2-user/
python3.9 -m venv env
source env/bin/activate
mkdir python
cd python
pip3 install -t . python-telegram-bot
rm -r *dist-info
cd ..
zip -r deployment_package.zip python
您现在拥有包含新 Lambda 层所需的所有依赖项的 deployment_package.zip 文件。使用 scp
命令将此 zip 文件复制到您的计算机
scp -i "default.pem"
ec2-user@ec2-54-86-3-144.compute-1.amazonaws.com:/home/ec2-user/deployment_package.zip .
接下来,导航到 Lambda 服务,然后转到“层”并单击“创建层”
上传包含依赖项的本地 zip 文件。兼容的架构和运行时将用于确定该层是否适合特定功能。
返回到您的函数,单击“层”,然后选择“添加层”。
选择“自定义层”并选择您创建的层
就是这样!我们已成功创建一个包含所有依赖项的层。现在,在我们的 Lambda 函数中,我们将有权访问我们在 zip 归档文件中提供的外部库。如果归档文件存在任何问题,您将无法访问依赖项,并可能遇到指示模块不存在的错误。
步骤 4
现在是时候使用 BotFather 创建一个 Telegram 机器人了。获取令牌并将其添加到 Lambda 函数的环境变量中。
现在,返回到“代码”选项卡并将其粘贴到其中
import asyncio
import json
import os
import traceback
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
bot_app = ApplicationBuilder().token(os.getenv('TELEGRAM_TOKEN')).build()
async def hello(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
await update.message.reply_text(f'Hello {update.effective_user.first_name}')
bot_app.add_handler(CommandHandler("hello", hello))
async def tg_bot_main(bot_app, event):
async with bot_app:
await bot_app.process_update(
Update.de_json(json.loads(event["body"]), bot_app.bot)
)
def lambda_handler(event, context):
try:
asyncio.run(tg_bot_main(bot_app, event))
except Exception as e:
traceback.print_exc()
print(e)
return {"statusCode": 500}
return {"statusCode": 200}
单击“部署”,您就完成了!转到您的机器人并输入 /hello
。
上面的代码非常简单,可以原样使用,只需添加不同类型的命令所需的处理程序即可。对于更复杂的任务,请参阅 https://python-telegram-bot.org 中的文档。
一个重要的提示:要查看日志,请导航到 Lambda 函数的“监控”选项卡。
日志通常需要一些时间才能出现,请耐心等待。它们应该在大约两分钟内到达。
历史
- 2023 年 7 月 14 日:初始版本