如何使用 AWS ALB(应用程序负载平衡)在 EC2 实例中的 Flask 应用程序 运行 上设置 HTTPS (SSL)

How do you set up HTTPS (SSL) on a Flask application running in an EC2 instance with AWS ALB (Application Load Balancing)

所以我有一个 Flask Web 应用程序。我需要让这只是 HTTPS。所以我在这里迷路了:

 Application Load Balancer -> Target Group -> EC2 Instance (:443) -> ??? -> Flask

所以最初我的 http 堆栈中有以下内容:

 nginx -> gunicorn -> Flask

这适用于 http。而如何设置一个target group指向http中nginx的暴露端口就有意义了。您只需提供端口。简单。

然而,当您将 HTTPS 添加到等式中时,我完全迷失了方向。您让 AWS 通过 ACM(Aws 证书管理器)为您提供证书本身。但是,非常具体地 AWS Certificate Manager 不允许导出创建的证书。 所以您 不能 为 nginx 提供证书,但要使用 https (443) 在 nginx 上,您必须在 server block itself...

上提供 ssl_certificate.crt

所以从阅读来看,您似乎不需要 nginx...我需要 gunicorn 吗?我只是 运行 烧瓶吗?如果是这样,它是如何 'expose' port :443?

我真的不知道如何将 Flask 与目标群体联系起来。谁能指出我正确的方向?我用尽了所有谷歌搜索选项。

您的困惑是认为您需要在负载平衡器和 Flask 应用程序之间使用 SSL。您可以在负载平衡器处终止 SSL。这将在 Web 浏览器和您的 AWS 基础设施等任何客户端之间提供 SSL,并且您的虚拟专用网络内、负载均衡器和 EC2 实例之间将只有非 SSL 流量。

在 AWS ACM 中创建 SSL 证书,并将其附加到 Application Load Balancer 上的侦听器。让负载均衡器中的两个侦听器(不带 SSL 的端口 80 侦听器和带 SSL 的端口 443 侦听器)转发到目标组。让目标组通过端口 80、8080 或 5000 或您使用 Flask 运行 的任何端口连接到您的 EC2 实例。我认为 Flask 默认使用端口 5000?


如果您满足某种端到端加密要求,要求您在负载均衡器和 EC2 实例之间设置 SSL,例如某些监管要求,那么您需要重新使用 Nginx并在某处购买 SSL 证书,或设置一个免费的 Let's Encrypt 证书,您可以将其与 Nginx 一起使用。