如何避免达到 Terraform 刷新/应用的速率限制,导致操作失败?

And*_*eck 7 terraform

Terraformprovider为大量不同的云提供商(IaaS、PaaS 和 SaaS)提供服务。其中一些提供商的速率限制非常低,一旦您的基础设施达到一定规模,即您在同一 Terraform 状态下拥有数百个资源,您很快就会达到该限制。我在多个提供商处都遇到过此问题,最近是 Azure 资源管理器 (Azure Resource Manager azurerm),其 DNS 速率限制(当前)为每 5 分钟 500 个 GET 请求

处理 Terraform 中的速率限制问题的一种常见且明智的方法是将您的状态拆分为更小的逻辑内聚状态。然而,您最终会达到一个极限,进一步分割状态不再具有语义意义。我不想最终陷入这样的情况:我必须创建语义上应该相同的单独状态,但由于速率限制原因,我必须任意分离它们。

解决此问题的另一种方法是将-parallelism=1标志传递给相应的terraformCLI 命令,以避免向提供程序发出任何并行请求,从而最大限度地减少每分钟执行的请求。

我现在已经用尽这两种方法来解决我目前在一个州遇到的速率限制问题,但问题仍然存在。并行性被禁用,进一步分解状态没有意义。我仍然达到速率限制,因此,此状态下的所有操作都会失败terraform refreshterraform apply

独立于所讨论的特定提供者,是否有任何方法可以告诉 Terraform 更慢地(或以某个最大速率)向提供者执行请求以避免达到速率限制?我在相关 Terraform CLI 命令中没有找到任何与此相关的标志。

Hel*_*eda 1

作为我使用的最后手段time_sleep
https://registry.terraform.io/providers/hashicorp/time/latest/docs/resources/sleep

resource "time_sleep" "wait_3_seconds" {
  create_duration = "3s"
}

resource "null_resource" "test" {
  provisioner "local-exec" {
    when    = create
    command = "foo"
  }
  depends_on = [time_sleep.wait_3_seconds]
}
Run Code Online (Sandbox Code Playgroud)

-parallelism=1旗帜一起让我绕过了最严格的速率限制


但在我看来......
每个资源都应该处理这个问题,当然不是 Terraform 核心的工作,例如,auto_resolve_timeout与那些请求率低的已知资源acknowledgement_timeout中的参数类似pagerduty_service ,应该有一个在重试之前额外暂停的参数。