在配置更改后,是否可以使用Terraform触发CodeDeploy部署?

时间:2017-03-10 16:27:05

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

我目前正在将我在AWS上的配置管理迁移到Terraform,以使其更具可插拔性。我喜欢的是管理滚动更新到Autrasaling Group的可能性,在这种情况下,Terraform会在新实例运行之前等待,直到它破坏旧的基础设施。 这适用于"裸"基础设施。但是在更新实际的应用实例时遇到了问题。 代码通过AWS CodeDeploy部署,我可以告诉Terraform使用新的Autoscaling Group的生成名称作为部署目标,但它不会在启动时将代码部署到新实例。当我手动选择"将更改部署到部署组时#34;部署成功启动。 任何想法如何自动化这一步骤?

2 个答案:

答案 0 :(得分:1)

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

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