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

问题描述 投票:0回答:1

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

EC2 实例无法与 AWS Elastic Beanstalk 通信,原因可能是 VPC 配置问题或 EC2 实例出现故障。检查您的 VPC 配置并尝试再次启动环境。

VPC 包括:

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

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

EB 应用程序是一个多容器 Docker 应用程序,带有 Nginx 反向代理和使用 uWSGI 运行的 Flask 应用程序(类似于 此配置)。我使用的是“内部”网络负载均衡器,并且实例“未”分配公共 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 我发现

其他人
也有同样的问题,这是由于
cfn-signal

未能执行造成的。我可以通过添加 cloudformation 端点来解决这个问题。在接下来的部署中,我现在注意到一个新的 sqs connection error,这是通过添加 sqs 端点解决的。

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

链接的模板
amazon-web-services amazon-elastic-beanstalk amazon-vpc
1个回答
4
投票
没有NAT

,尽管描述说它有。 AWS 错误。 该模板创建两个私有子网,完全与互联网和任何其他服务(例如 EB 或 ECR)隔离。

需要注意的重要一点(模板无法展示)是为您的端点启用 私有 DNS

为此,您必须确保 VPC 的 EnableDnsHostnames

EnableDnsSupport

启用。文档中的模板无法启用它们。 这些可能可以解释为什么您的 VPC 接口端点不起作用。

© www.soinside.com 2019 - 2024. All rights reserved.