在 Auto Scaling 缩减事件期间从 Code Deploy 挂钩读取 AWS EC2 标签

Reading AWS EC2 tag from Code Deploy hook during Auto Scaling scale-in event

我非常喜欢使用与 Auto Scaling 集成的 AWS Code Deploy,但在缩减事件期间遇到有关读取标签的问题。

我已将我的 Auto Scaling 组设置为标记使用标签名称 'Environment' 创建的任何新实例。然后,作为我的 Code Deploy 安装后脚本的一部分,我读取了标签并使用它有条件地配置我的应用程序。如果我将修订部署到自动缩放组中的现有实例,这将非常有效。但是,在缩减事件期间,在从 Auto Scaling 调用 Code Deploy 之前,标签似乎没有分配给新的 EC2 实例,所以我的安装后配置失败了。

关于解决这个问题的任何想法?我可以强制标签与管道中较早的 EC2 实例相关联吗?

您必须添加 custom life cycle hook in your auto-scaling group and work with them within CodeDeploy。 请记住,挂钩执行的顺序是不可预测的。

Then as part of my Code Deploy after-install script I read the tag and use it to conditionally configure my apps

您可以尝试使用 CodeDeploy 在部署生命周期事件期间公开的环境变量,而不是使用标签。请查看 https://blogs.aws.amazon.com/application-management/post/Tx1PX2XMPLYPULD/Using-CodeDeploy-Environment-Variables 了解更多信息。

谢谢,
苏里亚

我们在 CodeDeploy 和自定义生命周期挂钩方面遇到了完全相同的问题。直到生命周期完成后才生成标签,这为时已晚,因为我们想在生命周期未决期间执行 CodeDeploy。

我们的解决方案是构建一个用户数据脚本,允许实例在启动时标记自己。该脚本安装到每个 AMI 中,并接受两个参数:环境和功能。

<script>
PowerShell -ExecutionPolicy Bypass -NoProfile -File c:\tools\server_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。

这种方法解决了您描述的问题。