我当前正在将我的配置管理迁移到AWS上,以使其更容易插入。我喜欢的是,有可能将滚动更新到一个自动级别组,Terraform等待直到新实例进行服务,然后才能破坏旧的基础架构。这可以与"裸"基础架构一起使用。但是,当更新实际的应用程序实例时,我遇到了问题。该代码是通过AWS编码部署的,我可以告诉Terraform将新自动式组的生成名称用作部署目标,但它并未将代码部署到启动时的新实例。当我手动选择"部署更改部署组"时,部署成功开始。有什么想法如何自动化此步骤?
https://www.terraform.io/docs/provisioners/local-exec.html可能能够做到这一点。夫妇假设
- 您已经在运行Terraform的地方安装了AWS-CLI之类的东西。
- 您已经设置了依赖项设置,因此您的编码台阶将是执行的最后一件事之一。如果不是这种情况,您可以使用
depends_on
https://www.terraform.io/intro/getting-started/depperencies.html#implitic-and-------------------------------------------------------------------------
发布代码后,您只需添加
resource "something" "some_name" {
# Whatever config you've setup for the resource
provisioner "local-exec" {
command = "aws deploy create-deployment"
}
}
fyi AWS部署创建部署命令尚未完成,因此您必须在环境中使用它,直到您获得触发推出所需的值,但希望这足以让您开始启动。<<<<<<
您可以直接在
中的用户数据中触发部署resource "aws_launch_configuration" "my-application" {
name = "my-application"
...
user_data = "${data.template_file.node-init.rendered}"
}
data "template_file" "node-init" {
template = "${file("${path.module}/node-init.yaml")}"
}
我的node-init.yaml的内容,遵循此文档的建议:https://aws.amazon.com/premiumsupport/knowledge-center/codedeedeploy-agent-launch-configuration/
write_files:
- path: /root/configure.sh
content: |
#!/usr/bin/env bash
REGION=$(curl 169.254.169.254/latest/meta-data/placement/availability-zone/ | sed 's/[a-z]$//')
yum update -y
yum install ruby wget -y
cd /home/ec2-user
wget https://aws-codedeploy-$REGION.s3.amazonaws.com/latest/install
chmod +x ./install
./install auto
# Add the following line for your node to update itself
aws deploy create-deployment --application-name=<my-application> --region=ap-southeast-2 --deployment-group-name=<my-deployment-group> --update-outdated-instances-only
runcmd:
- bash /root/configure.sh
在此实现中,节点负责触发部署本身。到目前为止,这对我来说非常完美,但是如果ASG同时创建多个实例,则可能导致部署失败(在这种情况下,由于不健康,失败的实例将很快终止)。
当然,您需要在与节点相关的角色触发部署的角色中添加足够的权限。
这仍然是解决方法,如果有人知道解决方案的行为与CFN-Init相同,我很感兴趣。