我仍然是Terraform的初学者。我有一个场景,假设只需要重新创建一个AWS组件,但它依赖于不需要任何更改的其他组件,例如,如果存在AutoScaling组,则无法更改Launch配置组件。即使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文件并尝试执行它,它将失败。
以上问题的答案是使用"name_prefix"属性,如下所示。这已经解决了这个问题。非常感谢@jstill不断提供可能的选择。
resource "aws_launch_configuration" "sample-launch-configuration" {
name_prefix = "sample-lc"
image_id = "ami-706cca12"
根据地形图文档,以下片段为
与自动缩放组一起使用使用Amazon Web Service API创建后,无法更新启动配置。为了更新启动配置,Terraform将销毁现有资源并创建一个替换资源。为了有效地将"启动配置"资源与AutoScaling Group资源一起使用,建议在生命周期块中指定create_befo_destroy。省略"启动配置名称"属性,或指定一个带有name_prefix的部分名称。
文档可以在这里看到
重读这篇文章和附带的配置,我想我错过了真正的问题。我将留下以下解释,因为它可能在某个时候对某人有所帮助。至于real问题,您在启动配置中指定了create_before_destroy
,但它有一个静态名称。启动配置在创建后无法编辑,必须销毁并重新创建(https://www.terraform.io/docs/providers/aws/r/launch_configuration.html),所以TF试图先创建一个新的,但不能,因为它使用的名称与已经存在的名称相同。
原始回复(我完全错过了真正的问题(:
看起来您正在尝试创建启动配置和自动缩放组(因为您将两者都定义为resource
s(。如果ASG已经存在并且不由terraform管理,那么您可能希望使用data
源引用ASG(请参阅此处的文档(。如果你想让ASG由上面的terraform配置管理,但目前还没有,你可以考虑导入它(见底部的文档(。如果ASG由不同的地形管理,您将需要查看配置之间的共享状态(请参阅此处的文档(。