我正在使用Terraform启动我的云环境。
似乎即使很小的配置更改也会影响许多幕后资源。
例如,在我创建AWS实例的情况下-进行很小的更改将导致自动生成所有实例:
-/+ aws_instance.DC (new resource required)
id: "i-075deb0aaa57c2d" => <computed> (forces new resource) <----- How can we avoid that?
ami: "ami-01e306baaaa0a6f65" => "ami-01e306baaaa0a6f65"
arn: "arn:aws:ec2:ap-southeast-2:857671114786:instance/i-075deb0aaa57c2d" => <computed>
associate_public_ip_address: "false" => <computed>
availability_zone: "ap-southeast-2a" => <computed>
.
.
我的问题专门与AWS作为提供者有关:我们如何避免每次破坏/创造资源?
也许是Terraform中的相关标志?
相关线程:
Terraform > ipv6_address_count: "" => "0" (forces new resource)
terraform > forces new resource on security group
编辑:
深入研究[[plan输出,似乎其中一种资源发生了变化:
security_groups.#: "0" => "1" (forces new resource)
security_groups.837544107: "" => "sg-0892062659392afa9" (forces new resource)
从如何避免重新创建的角度来看,问题仍然很重要。
ForceNew: true
标志,可以在提供程序级别完成此操作。示例显示为ami
parameter on the aws_instance
resource:
ami
这告诉Terraform如果aws_instance
参数被更改,则它不应尝试执行更新,而应销毁资源并创建一个新资源。您可以使用
Schema: map[string]*schema.Schema{ "ami": { Type: schema.TypeString, Required: true, ForceNew: true, },
块覆盖销毁然后创建行为:
ami
如果您更改了create_before_destroy
lifecycle configuration或其他无法更新的参数,那么Terraform将创建一个新实例,然后销毁旧实例。如何处理资源的零宕机时间可能很棘手,并且很大程度上取决于资源是什么以及如何处理。
create_before_destroy
中有关于此的更多信息。
在您非常特定的用例中,它是已更改的resource "aws_instance" "example" { # ... lifecycle { create_before_destroy = true } }
,在ami
上提到:注意:如果要在VPC中创建实例,请改用vpc_security_group_ids。这是因为Terraform的AWS提供程序和Terraform使用的EC2 API向后兼容早于VPC的旧EC2 Classic AWS帐户。使用这些帐户,您可以在VPC之外创建实例,但是在创建实例后便无法更改其安全组。如果要更改实例的入口/出口,则需要在已附加到该实例的组中工作。通过基于VPC的实例,AWS允许用户修改实例安全组而无需替换实例,因此提供了在API中进行指定的另一种方式。
如果您改为使用official blog而不是
security_groups
,则可以在不替换实例的情况下对其进行修改。