我在 AWS 上使用 Auto Scaling 时遇到问题。似乎很多人都遇到过类似的问题,但我找不到任何可以解决我特定问题的方法。当我手动增加 Auto Scaling 组中的服务器数量(从 1 增加到 2)时,它会从 AMI 中成功创建实例。然后 CodeDeploy 检测到它需要更新,并开始正常部署。问题是,当 CodeDeploy 部署成功完成时,实例会立即开始终止。我收到以下错误:
Launching a new EC2 instance: SOME_INSTANCE. Status Reason: Instance failed to complete user's Lifecycle Action: Lifecycle Action with token SOME_TOKEN was abandoned: Heartbeat Timeout
实例永远不会离开 Pending:Wait 生命周期,整个过程重新开始。我尝试延长健康检查宽限期。一切似乎都很正常,我可以在服务器被杀死之前通过 ssh 进入服务器,并且可以通过 IP 地址直接进入服务器,一切正常。看起来它永远不会被放入 InService 生命周期,然后永远不会被添加到负载均衡器中。
任何关于可能导致这种情况的原因的想法都很棒。我有一个想法是,也许 CodeDeploy 在部署完成后无权添加服务器。我创建了两个 IAM 角色,1 个用于 EC2,一个用于 CodeDeploy,两者都具有以下策略,但具有各自独立的信任关系:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"autoscaling:*",
"codedeploy:*",
"ec2:*",
"elasticloadbalancing:*",
"iam:AddRoleToInstanceProfile",
"iam:CreateInstanceProfile",
"iam:CreateRole",
"iam:DeleteInstanceProfile",
"iam:DeleteRole",
"iam:DeleteRolePolicy",
"iam:GetInstanceProfile",
"iam:GetRole",
"iam:GetRolePolicy",
"iam:ListInstanceProfilesForRole",
"iam:ListRolePolicies",
"iam:ListRoles",
"iam:PassRole",
"iam:PutRolePolicy",
"iam:RemoveRoleFromInstanceProfile",
"s3:*"
],
"Resource": "*"
}
]
}
答案1
好的,我能够解决这个问题。我不得不删除并重新创建我的 Auto Scaling 组。我最初创建时可能错过了高级区域中的设置,但不确定。我确实注意到,在第一次自动扩展时,codedeploy 不会在新实例上自动触发,但我对其进行了编辑(未更改任何内容),单击了部署到当前服务器,下次扩展时,它就运行正常了。这次它移到了 InService。:)