在没有公有子网的私有子网中运行 Amazon ElasticBeanstalk 实例

Posted

技术标签:

【中文标题】在没有公有子网的私有子网中运行 Amazon ElasticBeanstalk 实例【英文标题】:Running Amazon ElasticBeanstalk instances in private subnets with no public subnets 【发布时间】:2020-09-24 18:26:40 【问题描述】:

我的 AWS 账户中有 Kinesis 和 DynamoDB 等资源,我想从我的 ElasticBeanstalk 应用程序访问这些资源。 ElasticBeanstalk 应用程序不提供任何与 Web 相关的流量,而只是侦听 Kinesis Stream 或其他一些资源并处理它们并将它们写入 DynamoDB 等文件。

我有以下问题: 1. 这个 Web Server 层或 Worker 层的最佳环境是什么?我的应用程序不提供任何 Web 流量,但同时 Worker 层似乎是用于批处理作业的,并且与 SQS 队列相关联。我可以根据网络流量自动扩展我的 Beanstalk 环境,我在 Web 服务器层上尝试了几次,效果很好。 2. 如果我只想访问我的 AWS 账户中的 DynamoDB、Kinesis 资源,是否可以将我的所有 EC2 实例放在一个私有子网中? 3. 为什么大多数标准 ElasticBeanstalk cloudformation 模板分为公有子网和私有子网,实例位于私有子网中,ELB 和 NAT 网关位于公有子网中。这更安全吗?如果黑客进入公共子网,他们是否也能够进入私有子网并因此进入您的应用程序?

【问题讨论】:

【参考方案1】:

如果您的 Beanstalk 应用不需要对公共互联网可见,那么最好在私有子网中对其进行配置。

    根据问题中的信息很难回答这个问题,但听起来您当前的环境很合适。

    是的,您可以将您的 EC2 实例放入私有子网中,如果它们不需要公共 Internet 访问,我们建议您这样做。如果您的服务需要与其他 AWS 服务通信,则应使用 PrivateLink,但如果服务不支持,则需要使用 NATGateway。

    您需要一个 EC2 instance in a public subnet 才能连接到任何私有 EC2 实例。您应该对这个公共实例进行安全加固,并且您可以在不使用它时将其关闭。

    拆分私有子网和公共子网是一种标准的安全做法,原因很简单,您不希望关键服务位于公共互联网上。理论上,如果他们在公共网络中,一个坚定的黑客可以访问您的私有实例,但是您可以尽可能锁定公共访问以防止这种情况(例如 Web 应用程序防火墙、安全组、ALB 等)。

【讨论】:

一般来说,您不应该使用 NAT 网关与其他 AWS 服务进行通信。 似乎他们中的大多数人都这样做,而他提到的两个(Kinesis 和 DynamoDB)都这样做。 很公平。在大多数情况下,您无需使用 PrivateLink 进行任何配置,您只需设置 VPC 终端节点,其余的由 AWS 负责。【参考方案2】:

如果您的实例只需要连接到其他 AWS 服务,那么您应该:

    从您的 VPC 中分离并删除互联网网关,以消除您的实例、服务或帐户被外部人员不当访问的任何可能性, 将您的实例放在私有子网中, 将 VPC 终端节点添加到您的 VPC 以通过 AWS 网络内部连接到 Kinesis 和 DynamoDB,然后... 配置您的 VPC 以使用端点。

请不要将您的实例连接到 NAT 网关。对于仅连接到 AWS 服务的应用程序而言,这不是最佳实践,这两种服务都提供 VPC 端点。

【讨论】:

以上是关于在没有公有子网的私有子网中运行 Amazon ElasticBeanstalk 实例的主要内容,如果未能解决你的问题,请参考以下文章

如何将公有子网中的 ec2 服务器中私有子网中的弹性 beanstalk 服务器列入白名单?

VPC 中私有子网中 EC2 实例的 Amazon ELB

关于AWS-VPC中的公有子网与私有子网-Public and private subnets

在AWS上配置基本的VPC

如何创建 IAM 策略以根据子网名称标签控制对 Amazon EC2 资源的访问?

VPC 中的 Amazon ELB