首页 > 解决方案 > 如何远程访问在 AWS EC2 上运行的 Python 烧瓶应用程序?

问题描述

我有一个烧瓶应用程序,已克隆到我的 aws ec2 实例上。我只能使用虚拟环境运行它(我通过运行以下命令来激活它):

$ python3 -m venv venv
$ source venv/bin/activate
$ pip install --upgrade pip
$ pip install flask==1.1.1

下面是我的应用程序:

from flask import Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run() 

执行时它运行得很好env FLASK_APP=app.py flask run。问题是,我想使用我的 aws ec2 的公共 IP 或主机名远程访问公开的路由。每当我尝试访问它时,我都会收到一个 tiemout 错误。我认为这是因为我在虚拟环境中运行烧瓶应用程序,但我不确定。我找不到任何关于如何公开这个的好的教程。我在哪里错了?

标签: pythonamazon-web-servicesflaskamazon-ec2

解决方案


快速 n' 安全解决方案:

当您运行开发服务器时,它不适合生产。我想说从您自己的机器连接到这个应用程序的最佳方式是使用 ssh 隧道:

ssh -L 5000:localhost:5000 ec2_addr

然后,您可以将 Web 浏览器指向http://localhost:5000/您的客户端计算机,该计算机将通过隧道连接到 EC2 实例上的端口 5000。这是连接到远程 Linux 机器上的 Flask(或任何)服务器的快速方法。当您停止该 ssh 会话时,隧道将被破坏。

更长的方法:

我想使用我的 aws ec2 的公共 IP 或主机名远程访问公开的路由。

超时不是因为它在虚拟环境中运行:您可能会发现它是因为您需要通过 EC2 控制台将安全组分配给您的实例。这些允许您打开公共 IP 上的某些端口。

请参阅我写的关于EC2 安全组的其他答案。

不过要小心。您不应该以这种方式公开开发服务器。有许多像这样的教程来自数字海洋,其中包括在后面部署一个烧瓶应用程序gunicornnginx使用Let's EncryptSSL 证书。您应该发现自己处于安全组公开端口 80 和 443 的位置,对端口 80 的请求被httpsnginx 配置重定向到 URL。

如果这听起来很麻烦/您没有 Linux 技能/您不想学习 Linux 技能,那么这些是人们选择 AWS Elastic Beanstalk 等托管服务的常见原因,您可以在其中部署您的烧瓶应用程序(官方指南),无需担心服务器配置。Heroku 是提供此类功能的另一项(非 AWS)服务。

这实际上取决于您需要/希望获得什么。注意安全!


推荐阅读