我真的很喜欢使用与自动缩放集成的AWS代码部署,但在缩放活动中,我很难解决读取标签的问题。
我已经设置了我的自动缩放组,以标记任何使用标记名称"Environment"创建的新实例。然后,作为安装后代码部署脚本的一部分,我读取标记并使用它来有条件地配置我的应用程序。如果我将修订部署到自动缩放组中的现有实例,这将非常有效。然而,在伸缩事件中,在从自动伸缩调用代码部署之前,似乎没有将标记分配给新的EC2实例,因此我的安装后配置失败。
有什么解决办法吗?我可以强制标记与管道中较早的EC2实例相关联吗?
然后,作为安装后代码部署脚本的一部分,我读取了标记并使用它有条件地配置我的应用
您可以尝试使用CodeDeploy在部署生命周期事件期间公开的环境变量,而不是使用标记。请结账https://blogs.aws.amazon.com/application-management/post/Tx1PX2XMPLYPULD/Using-CodeDeploy-Environment-Variables了解更多信息。
谢谢,
Surya。
我们在CodeDeploy和自定义生命周期挂钩方面遇到了完全相同的问题。直到生命周期结束后才生成标记,这已经太晚了,因为我们想在生命周期挂起期间执行CodeDeploy。
我们的解决方案是构建一个用户数据脚本,允许实例在启动时标记自己。脚本安装在每个AMI中,并接受两个参数:Environment和Function。
<script>
PowerShell -ExecutionPolicy Bypass -NoProfile -File c:toolsserver_userdata.ps1 --function Reg -environment production
</script>
因此,我们可以将该用户数据附加到启动配置,并且实例在启动时标记自己只要实例稳定,但还没有完成其生命周期,我们就可以成功地执行CodeDeploy。
我们必须使用角色策略来授予实例列出和创建标签的权限:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"ec2:DescribeTags",
"ec2:CreateTags",
"ec2:DeleteTags"
],
"Resource": [
"*"
]
}
]
}
userdata脚本是通用的和参数驱动的,因此我们可以使用任何环境和函数设置启动任何实例。当然,同样的方法也适用于Linux。
这种方法解决了您所描述的问题。
您必须在自动扩展组中添加自定义生命周期挂钩,并在CodeDeploy中使用它们。请记住,钩子执行的顺序不是可预测的。