1

我仍然是 Terraform 的初学者。我有一个场景,假设只需要重新创建一个 AWS 组件,但它依赖于不需要任何更改的其他组件,例如,如果 AutoScaling 组存在,则无法更改启动配置组件。即使 ASG 被标记为受污染,terraform 仍然会抛出错误“”

  • 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 文件并尝试执行它会失败。

4

2 回答 2

2

上述问题的答案是使用“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 组资源一起使用,建议在生命周期块中指定 create_before_destroy。要么省略启动配置名称属性,要么使用 name_prefix 指定部分名称。

可以在此处查看文档

于 2018-08-13T08:38:22.927 回答
1

重新阅读帖子和附加的配置,我想我错过了实际问题。我将留下以下解释,因为它可能在某些时候对某人有所帮助。至于您的真正问题,您正在指定create_before_destroy启动配置,但它有一个静态名称。启动配置创建后无法编辑,必须销毁并重新创建(https://www.terraform.io/docs/providers/aws/r/launch_configuration.html),因此 TF 尝试先创建新配置,但不能,因为它使用的名称与已经存在的名称相同。


原始回复(我完全错过了真正的问题):

看起来您正在尝试创建启动配置自动缩放组(因为您将两者都定义为s)。如果 ASG 已经存在并且不受 terraform 管理,您可能希望使用源来引用 ASG (请参阅此处的文档)。如果您希望 ASG 由上面的 terraform 配置管理,但目前不是,您可以查看导入它(请参阅底部的文档。如果 ASG 由不同的terraform 管理,您需要查看配置之间的共享状态(请参阅此处的文档)。resourcedata

于 2018-08-08T15:56:57.777 回答