[英]AWS on Terraform - How to avoid 'forces new resource'
我正在使用 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"(强制新资源)
编辑:
深入计划输出,似乎其中一种资源发生了变化:
security_groups.#: "0" => "1" (forces new resource)
security_groups.837544107: "" => "sg-0892062659392afa9" (forces new resource)
从如何避免重新创建的角度来看,问题仍然是相关的。
如果在修改资源以匹配新配置时没有明确的升级路径,Terraform 资源只会强制使用新资源。 这是通过在参数上设置ForceNew: true
标志在提供程序级别完成的。
aws_instance
资源上的ami
参数显示了一个示例:
Schema: map[string]*schema.Schema{
"ami": {
Type: schema.TypeString,
Required: true,
ForceNew: true,
},
这告诉 Terraform,如果ami
参数被更改,那么它不应该尝试执行更新,而是销毁资源并创建一个新资源。
您可以使用create_before_destroy
生命周期配置块覆盖先销毁再创建行为:
resource "aws_instance" "example" {
# ...
lifecycle {
create_before_destroy = true
}
}
如果您更改了ami
或其他一些无法更新的参数,那么 Terraform 将创建一个新实例,然后销毁旧实例。
您如何处理资源的零停机升级可能很棘手,并且在很大程度上取决于资源是什么以及您如何处理它。 官方博客中有更多相关信息。
在您非常具体的用例中,它是已更改的security_groups
,在aws_instance
资源文档中提到了这一点:
注意:如果您在 VPC 中创建实例,请改用 vpc_security_group_ids。
这是因为 Terraform 的 AWS 提供商和 Terraform 使用的 EC2 API 向后兼容 VPC 之前的旧 EC2 Classic AWS 账户。 使用这些帐户,您可以在 VPC 之外创建实例,但您无法在实例创建后更改实例的安全组。 如果您想更改实例的入口/出口,您需要在已经附加到实例的组中工作。 对于基于 VPC 的实例,AWS 允许用户在不替换实例的情况下修改实例安全组,因此在 API 中公开了一种不同的指定方式。
如果您转而使用vpc_security_group_ids
而不是security_groups
,那么您将能够在不替换您的实例的情况下修改这些。
我遇到了同样的问题,我用vpc_security_group_ids
替换了security_groups
并且问题已解决。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.