我目前正在将我在AWS上的配置管理迁移到Terraform,以使其更具可插拔性。我喜欢的是管理滚动更新到Autrasaling Group的可能性,在这种情况下,Terraform会在新实例运行之前等待,直到它破坏旧的基础设施。 这适用于"裸"基础设施。但是在更新实际的应用实例时遇到了问题。 代码通过AWS CodeDeploy部署,我可以告诉Terraform使用新的Autoscaling Group的生成名称作为部署目标,但它不会在启动时将代码部署到新实例。当我手动选择"将更改部署到部署组时#34;部署成功启动。 任何想法如何自动化这一步骤?
答案 0 :(得分:1)
https://www.terraform.io/docs/provisioners/local-exec.html也许可以做到这一点。夫妻假设
depends_on
https://www.terraform.io/intro/getting-started/dependencies.html#implicit-and-explicit-dependencies 您的代码发布后,您只需添加
resource "something" "some_name" {
# Whatever config you've setup for the resource
provisioner "local-exec" {
command = "aws deploy create-deployment"
}
}
仅供参考aws deploy create-deployment命令未完成,因此您必须在您的环境中使用它,直到您获得触发推出所需的值,但希望这足以获得你开始了。
答案 1 :(得分:0)
您可以直接在
中的用户数据中触发部署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/codedeploy-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相同,我感兴趣。