【发布时间】: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 的建议,我能够通过会话管理器登录实例(只需添加 ssm、ec2messages 和 ssmmessages 端点)。检查日志后,我注意到以下错误:
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 请求将继续超时。
标签: amazon-web-services amazon-elastic-beanstalk amazon-vpc