【问题标题】:Launch Template name already in use error启动模板名称已在使用错误
【发布时间】:2019-07-02 03:39:29
【问题描述】:

我的 Terraform 脚本执行以下操作:

  1. 每次运行都构建一个 AMI
  2. 构建一个新的启动模板(由于它 使用刚刚创建的 AMI)
  3. 使用 启动模板

我希望启动模板的名称保持不变,以便自动缩放组可以简单地更新以使用最新版本的启动模板。

不幸的是,Terraform 尝试构建一个新的启动模板(而不是简单地更新现有的启动模板(如果存在))。这会导致错误:

aws_launch_template.launch_template: InvalidLaunchTemplateName.AlreadyExistsException: 
Launch template name already in use.

有没有办法完成我想要的(而不是在 Launch-Template 中使用名称前缀而不是名称,因为这违背了拥有版本的全部目的)?

编辑:这是计划

  ~ module.continuous_pull_app.aws_autoscaling_group.pull_asg
      launch_template.0.id:                                  "lt-xxxxxxxxxxxxxxxxx" => "${var.launch_template_id}"
      launch_template.0.version:                             "1" => "${var.launch_template_version}"

  -/+ module.create_ami.aws_ami_from_instance.generic_ami (new resource required)
      id:                                                    "ami-xxxxxxxxxxxxxxxxx" => <computed> (forces new resource)
      architecture:                                          "x86_64" => <computed>
      ebs_block_device.#:                                    "1" => <computed>
      ena_support:                                           "true" => <computed>
      ephemeral_block_device.#:                              "0" => <computed>
      image_location:                                        "xxxxxxxxxxxx/generic-usage-ami-2019-02-07T212337Z-nonprod-2" => <computed>
      kernel_id:                                             "" => <computed>
      manage_ebs_snapshots:                                  "true" => <computed>
      name:                                                  "generic-usage-ami-2019-02-07T212337Z-nonprod-2" => "generic-usage-ami-2019-02-08T133220Z-nonprod-2" (forces new resource)
      ramdisk_id:                                            "" => <computed>
      root_device_name:                                      "/dev/xvda" => <computed>
      root_snapshot_id:                                      "snap-xxxxxxxxxxxxxxxxx" => <computed>
      snapshot_without_reboot:                               "false" => "false"
      source_instance_id:                                    "i-xxxxxxxxxxxxxxxxx" => "i-xxxxxxxxxxxxxxxxx"
      sriov_net_support:                                     "simple" => <computed>
      tags.%:                                                "2" => "2"
      tags.Name:                                             "Generic AMI for continuous process nonprod-2" => "Generic AMI for continuous process nonprod-2"
      tags.created-by:                                       "terraform" => "terraform"
      virtualization_type:                                   "hvm" => <computed>

  ~ module.create_ami.aws_instance.ec2
      tags.Name:                                             "generic-usage-ami-2019-02-07T212337Z-nonprod-2" => "generic-usage-ami-2019-02-08T133220Z-nonprod-2"

  + module.create_launch_template.module.pull.aws_launch_template.launch_template
      id:                                                    <computed>
      arn:                                                   <computed>
      block_device_mappings.#:                               "1"
      block_device_mappings.0.device_name:                   "/dev/xvda"
      block_device_mappings.0.ebs.#:                         "1"
      block_device_mappings.0.ebs.0.iops:                    <computed>
      block_device_mappings.0.ebs.0.volume_size:             "16"
      block_device_mappings.0.ebs.0.volume_type:             <computed>
      default_version:                                       <computed>
      iam_instance_profile.#:                                "1"
      iam_instance_profile.0.name:                           "role-foo"
      image_id:                                              "${var.generic_ami_id}"
      instance_market_options.#:                             "1"
      instance_market_options.0.market_type:                 "spot"
      instance_market_options.0.spot_options.#:              "1"
      instance_market_options.0.spot_options.0.valid_until:  <computed>
      instance_type:                                         "t2.micro"
      key_name:                                              "foo"
      latest_version:                                        "0"
      name:                                                  "PullTemplate-nonprod-2"
      user_data:                                             "..."
      vpc_security_group_ids.#:                              "1"
      vpc_security_group_ids.34235319:                       "sg-xxxxxxxx"

启动模板资源:

resource "aws_launch_template" "launch_template" {
  //  If use_spot_pricing is true (which translates to 1), this resource is not created (i.e. count = 0).
  count                = "${1 - var.use_spot_pricing}"
//  name_prefix          = "${var.resource_name_prefix}${var.envSuffix}-"
  name                 = "${var.resource_name_prefix}${var.envSuffix}"
  image_id             = "${var.generic_ami_id}"
  instance_type        = "${var.instance_type}"
  key_name             = "${var.key_name}"
  vpc_security_group_ids = ["${var.vpc_security_group_ids}"]
  user_data            = "${base64encode(data.template_file.lc_user_data.rendered)}"

  iam_instance_profile {
    name = "${var.iam_instance_profile}"
  }

  instance_market_options {
    market_type = "spot"

    spot_options {
      max_price = "${var.max_price}"
    }
  }

  block_device_mappings {
    device_name = "/dev/xvda"

    ebs {
      volume_size = "${var.volume_size}"
    }
  }

  lifecycle {
    create_before_destroy = true
  }
}

data "template_file" "lc_user_data" {
...
}

output "launch_template_id" {
  //  There should only ever be 1 instance
  value = "${ aws_launch_template.launch_template.0.id }"
}

output "launch_template_version" {
  //  There should only ever be 1 instance
  value = "${ aws_launch_template.launch_template.0.latest_version }"
}

ASG 资源:

resource "aws_autoscaling_group" "pull_asg" {

  name                = "Pull${var.envSuffix}"
  vpc_zone_identifier = ["${split(",", var.vpc_private_subnets)}"]

  launch_template = {
    id = "${var.launch_template_id}"
    version = "${var.launch_template_version}"
  }

  termination_policies      = ["OldestInstance"]
  max_size                  = "${var.pull_asg_max_size}"
  min_size                  = "${var.pull_asg_min_size}"
  desired_capacity          = "${var.pull_asg_desired_capacity}"
  health_check_grace_period = "${var.pull_asg_health_check_grace_period}"
  health_check_type         = "${var.health_check_type}"
  load_balancers            = ["${aws_elb.pull_app_elb.name}"]
  wait_for_elb_capacity     = "${var.pull_asg_wait_for_elb_capacity}"

  lifecycle {
    create_before_destroy = true
  }

  tag {
    key                 = "Name"
    value               = "${var.app_instance_name}"
    propagate_at_launch = true
  }

  tag {
    key                 = "spot-enabled"
    value               = "${var.spot_enabled}"
    propagate_at_launch = true
  }
}

【问题讨论】:

  • 你能用你的 terraform 计划输出更新你的问题吗?
  • 看起来同名的模板已经存在,它不是由 terraform 管理的。您必须导入它或更改名称。
  • 不,模板在 Terraform 运行之前不存在。从未手动创建任何启动模板。
  • 您可以为 Auto Scaling 组和启动配置发布您的 .tf 吗?

标签: terraform terraform-provider-aws


【解决方案1】:

我在启动配置方面也遇到了类似的问题。当您在创建过程中为启动配置/启动模板提供名称时,如果存在此 LC/LT 需要重新创建的情况,则 terraform 在销毁现有资源之前首先尝试创建新资源并开始抛出资源存在的错误。

解决此问题的最佳方法是,不要在启动模板中提供 name 参数,让它成为由 terraform 管理的随机名称,并在您的 ASG 中使用参考 id 而不是变量。

aws_launch_template.launchtemplate-terraform-name.id

以防万一启动模板需要更清晰。使用 nameprifix 或 namesuffix 代替 name。

希望这会有所帮助!

【讨论】:

  • 感谢您的回答。不过,我认为这并不能解决我试图避免的问题。我想保持相同的名称,但只是创建一个新版本。除非我遗漏了什么,否则 11.11 版本的 Terraform 似乎不可能做到这一点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-07
  • 2021-05-05
  • 2018-04-05
  • 1970-01-01
  • 1970-01-01
  • 2020-10-17
  • 1970-01-01
相关资源
最近更新 更多