AWS 代码部署到 AutoScaling 组中的 VPC 实例失败,除非分配弹性 IP

AWS Code Deploy to VPC instances in AutoScaling Group fails unless Elastic IP is assigned

我为具有 1 个 public 子网的 VPC 设置了 AutoScaling 组设置和 AWS 代码部署设置。 VPC实例可以通过IAM Role访问所有AWS服务。

基本 AMI 是 ubuntu,上面安装了 CodeDeploy 代理。 每当扩展事件触发时,AutoScaling Group 都会启动一个实例并且该实例进入 "Waiting for Lifecycle Event"

A​​WS Code Deploy 触发部署并处于 "In Progress" 状态,它保持该状态超过一个小时然后失败。

如果我在那个小时内手动分配弹性 IP,代码部署会立即成功。

CodeDeploy 在 VPC 实例上成功是否需要 public/Elastic IP?

如何在不需要 Public IP 的情况下使代码部署成功。

您是否设置了 NAT 实例,以便实例可以在没有 public 面向 IP 地址的情况下访问互联网?如果实例可以访问 Internet,则 EIP 无关紧要。您的代码是从轮询端点的 CodeDeploy 代理部署的,因此如果它不能到达终点,它将永远不会工作。

CodeDeploy 代理与之通信的端点不是像 codedeloy.amazonaws.com 这样的 public 域名。代理与命令控制端点对话,即“https://codedeploy-commands.#{cfg.region}.amazonaws.com", according to https://github.com/aws/aws-codedeploy-agent/blob/29d4ff4797c544565ccae30fd490aeebc9662a78/vendor/gems/codedeploy-commands-1.0.0/lib/aws/plugins/deploy_control_endpoint.rb#L9。因此您需要确保私有实例可以访问此命令控​​制端点。

要将您的 VPC 连接到 CodeDeploy,您需要为 CodeDeploy 定义接口 VPC 端点。接口终端节点是具有私有 IP 地址的弹性网络接口,用作流向受支持 AWS 服务的流量的入口点。该端点提供可靠、可扩展的 CodeDeploy 连接,无需互联网网关、网络地址转换 (NAT) 实例或 VPN 连接。

https://docs.aws.amazon.com/codedeploy/latest/userguide/vpc-endpoints.html