Terraform上的AWS-如何避免“强迫使用新资源”

问题描述 投票:0回答:1

我正在使用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)
从如何避免重新创建的角度来看,问题仍然很重要。
amazon-web-services terraform terraform-provider-aws
1个回答
3
投票
Terraform资源仅在修改资源以匹配新配置时没有明确的升级路径时才强制使用新资源。通过在参数上设置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,则可以在不替换实例的情况下对其进行修改。

© www.soinside.com 2019 - 2024. All rights reserved.