配置更改后,有什么方法可以使用 Terraform 触发 CodeDeploy 部署?

Any way to trigger a CodeDeploy deployment with Terraform after changes in configuration?

我目前正在将我在 AWS 上的配置管理迁移到 Terraform 以使其更易于插入。我喜欢的是可以管理对 Autoscaling Group 的滚动更新,其中 Terraform 在破坏旧基础设施之前等待新实例投入使用。 这适用于 "bare" 基础设施。但是我 运行 在更新实际的应用程序实例时遇到了问题。 代码是通过 AWS CodeDeploy 部署的,我可以告诉 Terraform 使用新自动缩放组的生成名称作为部署目标,但它不会在启动时将代码部署到新实例。当我手动 select "deploy changes to the deployment group" 部署成功启动。 对如何自动执行此步骤有任何想法吗?

https://www.terraform.io/docs/provisioners/local-exec.html 或许可以做到这一点。偶数假设

发布代码后,您只需添加一个

resource "something" "some_name" {
    # Whatever config you've setup for the resource
    provisioner "local-exec" {
        command = "aws deploy create-deployment"
  }
}

仅供参考,aws deploy create-deployment 命令不完整,所以您必须在您的环境中使用它,直到您获得触发推出所需的值,但希望这足以让您开始.

您可以直接在

中的 user-data 中触发部署
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 相同,我很感兴趣。