【问题标题】:Any way to trigger a CodeDeploy deployment with Terraform after changes in configuration?在更改配置后,有什么方法可以使用 Terraform 触发 CodeDeploy 部署?
【发布时间】:2017-08-01 01:57:52
【问题描述】:

我目前正在将我在 AWS 上的配置管理迁移到 Terraform,以使其更具可插拔性。我喜欢的是管理自动缩放组的滚动更新的可能性,其中 Terraform 等待新实例投入使用,然后再破坏旧的基础设施。 这适用于“裸”基础设施。但是在更新实际的应用程序实例时遇到了问题。 该代码是通过 AWS CodeDeploy 部署的,我可以告诉 Terraform 使用新 Autoscaling Group 的生成名称作为部署目标,但它不会在启动时将代码部署到新实例。当我手动选择“将更改部署到部署组”时,部署成功启动。 任何想法如何自动化这一步?

【问题讨论】:

    标签: amazon-web-services terraform aws-code-deploy


    【解决方案1】:

    您可以直接在您的用户数据中触发部署

    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 相同,我很感兴趣。

    【讨论】:

      【解决方案2】:

      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 命令不完整,因此您必须在您的环境中使用它,直到获得触发推出所需的值,但希望这足以让您开始。

      【讨论】:

      • 感谢您的意见。是的,我知道 Terraform 中的本地 exec 选项,到目前为止,这似乎是实现此“功能”的唯一选项。由于这对于我们的用例(多个 AWS 账户、aws cli 不是强制性的、不同的角色等)来说还不够“可移植/无状态”,我们再次改变了我们的工作流程。
      猜你喜欢
      • 1970-01-01
      • 2019-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-11
      • 2017-12-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多