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

问题描述

所以我有一个烧瓶网络应用程序。我只需要将其设置为 HTTPS。所以我在这里很迷失:

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

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

 nginx -> gunicorn -> Flask

这适用于http。如何设置目标组以指向 http 中 nginx 的暴露端口是有意义的。您只需提供端口。简单的。

但是,当您将 HTTPS 添加到等式中时,我完全迷失了。您让 AWS 通过 ACM(Aws 证书管理器)为您提供证书本身。但是,特别是AWS Certificate Manager 不允许导出创建的证书。因此,您不能为 nginx 提供证书,但要在 nginx 上使用 https (443),您必须在服务器块本身上提供 ssl_certificate.crt ...

所以从阅读看来你不需要 nginx ......我需要 gunicorn 吗?我只运行烧瓶吗?如果是这样,它如何“暴露”端口:443?

我真的不知道如何将 Flask 连接到目标组。任何人都可以指出我正确的方向吗?我已经用尽了所有谷歌搜索选项。

标签: amazon-web-servicesflaskamazon-ec2gunicornaws-application-load-balancer

解决方案


您的困惑在于认为负载均衡器和 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 中使用。


推荐阅读