代码之家  ›  专栏  ›  技术社区  ›  Todd

启动模板名称已在使用中错误

  •  -1
  • Todd  · 技术社区  · 7 年前

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

    1. 建立新的发布模板(由于它 使用刚刚创建的AMI)
    2. 使用

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

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

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

    有没有一种方法可以实现我想要的目标(不必在启动模板中使用名称前缀而不是名称,因为这会破坏版本的全部目的)?

      ~ 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
      }
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Vaibhav Jain    7 年前

    在launchconfiguration方面,我也遇到过类似的问题。当您在创建过程中为launchconfiguration/launchtemplate提供一个名称,并且如果此LC/LT需要重新创建时,terraform首先尝试在销毁现有资源之前创建新资源,并开始抛出表示资源存在的错误。

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

    以防发布模板需要更清晰。使用nameprifix或namesuffix而不是name。