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

Elastic Beanstalk App in Private VPC without NAT

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

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 包括:

我使用的模板是来自 EB 样本库的 vpc-private.yaml

EB 应用程序是一个多容器 docker 应用程序,带有 Nginx 反向代理和 Flask 应用程序 运行 uWSGI(类似于 this configuration)。我使用的是 internal 网络负载均衡器,实例是 not 分配的 public IP 地址。 Docker 图像托管在 AWS ECR 中。

论坛中的一个常见答案似乎是有一个 public 带 NAT 的子网以允许互联网访问。 AWS documentation indicates that using a private/private configuration is possible though by using 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 端点是相当新的,我找不到任何其他资源来解释如何做到这一点...

谢谢!

编辑(已解决)

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

感谢@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 文档中没有首先提到它。

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

该模板创建两个私有 子网,完全切断与互联网和任何其他服务(例如 EB 或 ECR)的联系。

需要注意的重要事项是为您的端点启用 private DNS,但模板未能展示它。

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

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