Terraform-修改仍存在从属组件的单个AWS组件时引发错误

时间:2018-08-03 06:29:20

标签: terraform terraform-provider-aws

我还是Terraform的初学者。我有一种情况,假设只需要重新创建一个AWS组件,但依赖于不需要任何更改的其他组件,例如如果存在AutoScaling组,则无法更改启动配置组件。即使ASG被标记为已污染,地形仍会引发错误“”

  • aws_launch_configuration.sample-launch-configuration:发生1个错误:

  • aws_launch_configuration.sample-launch-configuration:创建启动配置时出错:AlreadyExists:具有此名称的启动配置已存在-已经存在名为sample-lc的启动配置     状态码:400,请求ID:3dc2da6d-96e4-11e8-9086-cb6ff2d21a1c

    在不破坏整个集群的情况下解决这类依赖关系的方法是什么?

编辑:添加源代码。 (部分代码示例)

 resource "aws_autoscaling_group" "sample-autoscaling-group" {
  name                 = "sample-asg"
  max_size             = "${var.max_instance_size}"
  min_size             = "${var.min_instance_size}"
  desired_capacity     = "${var.desired_capacity}"
  vpc_zone_identifier  = ["${var.private-subnets}"]
  launch_configuration = "${aws_launch_configuration.sample-launch-configuration.name}"
  health_check_type    = "EC2"

  lifecycle {
    create_before_destroy = true
  }
}

resource "aws_launch_configuration" "sample-launch-configuration" {
  name                 = "sample-lc"
  image_id             = "ami-706cca12"
  instance_type        = "t2.small"
  iam_instance_profile = "${aws_iam_instance_profile.ecs-ec2-service-profile.id}"

  lifecycle {
    create_before_destroy = true
  }

  security_groups             = ["${aws_security_group.test_public_sg.id}"]
  associate_public_ip_address = "true"
  key_name                    = "${var.ecs-key-pair-name}"

  user_data = "${file("./templates/user_data.sh")}"
}

如果更改,请说说user_data.sh文件并尝试执行此操作,它将失败。

2 个答案:

答案 0 :(得分:1)

重新阅读文章和随附的配置,我想我错过了实际问题。我将保留以下说明,因为在某些时候它可能对某人有所帮助。至于您的 real 问题,您要在启动配置中指定create_before_destroy,但它具有静态名称。启动配置在创建后无法编辑,必须销毁并重新创建(https://www.terraform.io/docs/providers/aws/r/launch_configuration.html),因此TF尝试首先创建一个新配置,但不能执行,因为它使用的名称与该名称相同已经在那里。


最初的回答(我完全错过了真正的问题):

您似乎要同时创建两者和启动配置自动缩放组(因为您将两者都定义为resource)。如果ASG已经存在并且不受terraform管理,则您可能想使用data源引用ASG(请参阅文档here)。如果您希望ASG由上面的terraform配置管理,但当前不是,则可以将其导入(请参阅底部的文档here)。如果ASG由不同地形管理,则需要查看配置之间的共享状态(请参见文档here)。

答案 1 :(得分:1)

解决上述问题的方法是使用“ name_prefix”属性,如下所示。这样就解决了问题。非常感谢@jstill不断提供可能的选项。

    resource "aws_launch_configuration" "sample-launch-configuration" {
      name_prefix                 = "sample-lc"
      image_id                    = "ami-706cca12"

根据terraform文档,以下代码段已给出

  

与AutoScaling组一起使用   使用Amazon Web Service API创建后,无法更新启动配置。为了更新启动配置,Terraform将销毁现有资源并创建替换资源。为了有效地将启动配置资源与AutoScaling Group资源一起使用,建议在生命周期块中指定create_before_destroy。忽略启动配置名称属性,或使用name_prefix指定部分名称。

可以在here上查看文档