我还是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文件并尝试执行此操作,它将失败。
答案 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上查看文档