如何在 AWS Elastic Beanstalk 上私下部署 Docker 容器,以便只有其他 AWS 资源可以访问它?

如何在 AWS Elastic Beanstalk 上私下部署 Docker 容器,以便只有其他 AWS 资源可以访问它?

需要做出 AWS 部署决策。很多技术(docker、beanstalk)都很新,所以我不知道最佳实践(而且我对网络和安全的了解也比我希望的要少)。

技术细节:我有一个来自客户端的 docker 应用程序(python w/fastapi),它接受 POST 请求并输出机器学习模型结果。我可以在本地构建应用程序,但需要以可扩展的方式将其部署到 AWS 上。我设法将其部署到 Elastic Beanstalk (与本教程类似),这给了我可扩展性,但也给了我一个公共 URLhttp://myapp.eba-ri5rfu4f.us-central-1.elasticbeanstalk.com已经有随机机器人发送 GET .env 请求。它不需要与我的 IOT 网络交互,只需与其他云应用程序交互,可能是一个 lambda 函数。

部署这个的最简单方法是什么?这是我对这些选项的理解(您不必解决所有这些糟糕的想法,只是想证明我已经考虑过解决方案):

1.添加令牌:POST 输入 json 也可以期望一个安全令牌,否则返回 404。 问题:需要修改 docker 应用程序源代码(不想这样做!)。并且仍然在互联网上开放,全天提供恶意 GET 请求。

  1. 构建 VPC:可以创建一个供我们所有云应用程序使用的 VPC。 问题:不知道该怎么做,也不知道它是否可行。也许我无论如何都需要一个?但感觉就像我添加了一整层架构来维护,只是为了让其中一部分获得一些安全性。

3. 安全组:也许我只需要将我的 Elastic Beanstalk 添加到安全组,只允许批准的 IP 地址通过防火墙,这样就解决了所有问题。 问题:别以为这会奏效,事情没那么简单。

4. 作为 lambda 函数部署:它只会与触发它的任何资源交互,不需要公共 URL。 问题:需要修改 docker 源代码才能使用 lambda 处理程序而不是 API。另外,感觉就像戴上一顶帽子,在 docker 容器中运行服务器,然后将其部署在“无服务器”环境中。每次调用该函数时,它是否都必须启动服务器?(此外,我已经尝试使用我找到的 2 个 dockerfile 解决方案来执行此操作,但在它不起作用后就放弃了。)

5. 什么都不做:我们的数据模型对每个人来说都没有意义,不要再在这上面浪费时间了。 问题:恶意行为者仍然可以找到如何发出正确请求并向我们收取数千美元的 AWS 费用。不知道为什么有人会这样做,但将知识产权公开看起来和感觉都很糟糕。

非常感谢您对这个问题的任何建议或反馈。我知道这是一个开放式的问题,我只需要集思广益并确认我没有遗漏一个明显的解决方案。

更新

使用 VPC:事实证明 AWS 有一个默认 VPC,所以我认为最好的解决方案是将我的 Beanstalk 添加到其中。我创建了一个新的 beanstalk 环境,这次在 Configuration->Network 下选择一个 VPC 子网。但它仍然有一个公共 URL:

Instance subnets: subnet-42ttr89
Public IP address: enabled
VPC: vpc-5910921
Visibility: public

我想我已经更接近了,但仍然卡住了,因为我看不到改变这些设置并使其变为私密的方法。

答案1

使用安全组的解决方案(我认为):

正常创建一个 elastic beanstalk 环境,然后修改它的安全组以仅允许从您信任的 AWS 资源的安全组的网络接口的 IP 进行访问。

  • 我创建了一个正常的弹性豆茎环境(没有 VPC),启动了它,并确认它的公共 URL 正常工作。
  • 在 EC2>网络和安全下,我找到了新环境的负载均衡器的安全组(有两个安全组,选择名称中带有负载均衡器的安全组)
  • 在“编辑入站规则”下,应该有一条规则允许 0.0.0.0/0(所有 IP 地址)的 HTTP。我将其替换为网络接口针对 EC2 实例的安全组(在 EC2>网络和安全>网络接口下)。(通过安全组或子网 IP 限制此规则不起作用)。

然后,我运行了一个 Python 脚本,在通过 SSH 连接到同一安全组中的 EC2 实例时,向我的公共 URL 执行发布请求,并且它可以正常工作。但是从我的浏览器访问它超时了!(有点担心 IP 不是静态的,看看这是否长期有效)。

相关内容