没有 NAT 的私有 VPC 中的 Elastic Beanstalk 应用程序

Posted

技术标签:

【中文标题】没有 NAT 的私有 VPC 中的 Elastic Beanstalk 应用程序【英文标题】:Elastic Beanstalk App in Private VPC without NAT 【发布时间】:2020-11-21 13:14:01 【问题描述】:

是否可以在自定义私有 VPC 中部署 EB 应用程序,而不使用 NAT 网关?我想使用 AWS API Gateway 作为应用程序的公共入口点,同时保持服务私有。设置完所有内容后,我的环境一直失败:

The EC2 instances failed to communicate with AWS Elastic Beanstalk, either because of configuration problems with the VPC or a failed EC2 instance. Check your VPC configuration and try launching the environment again.

VPC 包括:

EC2 实例的两个私有子网 负载平衡器的两个私有子网

我使用的模板是来自 EB 示例存储库的 vpc-private.yaml。

EB 应用是一个多容器 docker 应用,带有一个 nginx 反向代理和一个使用 uWSGI 运行的 Flask 应用(类似于this configuration)。我正在使用内部网络负载均衡器,并且这些实例分配了公共 IP 地址。 Docker 映像托管在 AWS ECR 中。

论坛中的一个常见答案似乎是拥有一个带有 NAT 的公共子网以允许互联网访问。 AWS documentation 表示可以通过使用 VPC Endpoints 来使用私有/私有配置,只要应用程序不需要互联网连接。

我配置的端点是:

com.amazonaws.us-east-1.s3
com.amazonaws.us-east-1.elasticbeanstalk
com.amazonaws.us-east-1.ecs-telemetry
com.amazonaws.us-east-1.ecs-agent
com.amazonaws.us-east-1.ecs
com.amazonaws.us-east-1.ecr.dkr
com.amazonaws.us-east-1.ecr.api
com.amazonaws.us-east-1.elasticbeanstalk-health

看起来 Beanstalk 的 VPC 端点相当新,我找不到任何其他资源来解释如何做到这一点...

谢谢!

编辑(已解决)

一些我忘记提及的设置细节:

在 VPC 中启用了 DNS 解析和 DNS 主机名 为每个端点启用私有 DNS 确保终端节点的安全组允许实例的 VPC 作为入站流量

感谢@Marcin 的建议,我能够通过会话管理器登录实例(只需添加 ssmec2messagesssmmessages 端点)。检查日志后,我注意到以下错误:

2020-08-01 15:15:56,801 [WARNING] Timeout of 60 seconds breached
2020-08-01 15:15:56,801 [ERROR] Client-side timeout
Traceback (most recent call last):
  File "/usr/lib/python2.7/dist-packages/cfnbootstrap/util.py", line 162, in _retry
    return f(*args, **kwargs)
  File "/usr/lib/python2.7/dist-packages/cfnbootstrap/util.py", line 231, in _timeout
    raise TimeoutError("Execution did not succeed after %s seconds" % duration)
TimeoutError

我发现other people 也有同样的问题,这是由于 cfn-signal 未能执行造成的。我能够通过添加 cloudformation 端点来解决这个问题。在以下部署中,我现在注意到一个新的sqs connection error,通过添加 sqs 端点解决了这个问题。

将上述端点添加到 VPC 后,部署成功。无论哪种方式,我都不确定为什么这些端点是必要的,以及为什么 AWS 文档中没有首先提到它。

【问题讨论】:

还要确保 s3 端点的类型是“网关”而不是“接口”,否则来自 cfn 脚本的 s3 curl 请求将继续超时。 【参考方案1】:

你linked的模板没有NAT,尽管描述说它有。 AWS 错误。

模板创建两个私有子网,与互联网和任何其他服务(如 EB 或 ECR)完全隔离。

需要注意的重要一点是,模板无法展示它,是为您的端点启用private DNS。

为此,您必须确保为 VPC启用 EnableDnsHostnames 和 EnableDnsSupport。文档中的模板没有启用它们。

这些可能解释了为什么您的 VPC 接口端点不起作用。

【讨论】:

感谢您的回答。你是对的,模板描述具有误导性。我忘了提到我确实在创建后在 VPC 中启用了 DNS 解析和 DNS 主机名,以及每个端点的私有 DNS。关于可能设置错误的任何其他想法?或者也许是某种调试方式?谢谢! @SemyLevy VPC 接口终端节点的安全组怎么样?你调整过它们吗?它们应该允许来自您的 EB 实例的 SG 的入站流量。 我一直在为 EB 实例和 VPC 终端节点使用默认安全组。我还尝试在创建后立即将 EB 创建的安全组作为入站规则添加到默认值,但得到了相同的结果:( 令我沮丧的是,除了来自 EB 的通信错误之外,我无法获得任何其他日志,因此很难判断它失败的地方。 感谢您的建议,我可以通过查看日志来解决它(请参阅编辑)。

以上是关于没有 NAT 的私有 VPC 中的 Elastic Beanstalk 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

VPC 中的 Elastic Beanstalk 应用程序无法公开访问

AWS ECS:VPC 终端节点和 NAT 网关

VPC 中的 Elastic Beanstalk 环境变量

AWS VPC:将 NAT 和 Internet 网关与负载均衡器和私有子网一起使用时的奇怪行为

通过 VPC 将 AWS *** NAT 到 AWS IOT

无法访问 Elastic Beanstalk IP 地址之一?