gpt4 book ai didi

terraform - 如何调试具有并发问题的 Terraform 外部提供程序?

转载 作者:行者123 更新时间:2023-12-05 06:50:01 27 4
gpt4 key购买 nike

我使用 Terraform 0.14.7 来部署我的基础设施。由于我使用 AWS Lambda 作为我的 Whook API 的部署目标,我有很多脚本(7 个不同但一个为所有 lambdas ~200 运行)来检索关于 API 和每个 lambdas 的各种信息(见这个例子: https://github.com/nfroidure/whook/pull/108/files#diff-47625134d02e23a98ccff7918d11baa19c2ac409f4c90d76520b031b613b555cR74-R78 ).

为此,我使用了 external 提供程序,它期望返回一些 JSON。我的各种命令确实返回 JSON,但事实是我的 terraform plan -out=terraform.plan 失败并显示一条消息:“错误:命令“env”产生了无效的 JSON:JSON 输入的意外结束” .

到目前为止我尝试了什么:

  • 运行 TF_LOG=TRACE terraform plan -out=terraform.plan 2>&1:计划正确执行。我对这种意外成功的猜测是,在某种程度上,某些资源(文件描述符、内存?)存在并发问题,因为写入大量跟踪日志这一事实的背压可能会降低并发性。也就是说,我不确定,也许跟踪/ Debug模式本身会降低并发性?
  • 运行 TF_LOG=TRACE terraform plan -out=terraform.plan 2>&1 | grep terraform-provider-external > out.txt:它重现了错误,但是,日志中没有任何异常……甚至上面的错误似乎是合法的。也许你有一个 grep 想法,它可以在减少日志容量的同时捕获更多信息以避免上述背压
  • env 创建别名以至少知道哪个命令失败了,但 terraform 似乎不喜欢别名
  • 通过注入(inject)器中的调试日志服务记录命令的 JSON 输出,但一切正常。

我目前正在使用 tee 命令创建外部脚本以在 bash 级别输出,但我怀疑它需要更多的文件描述符,所以不确定这是好方法去。

除此之外,我真的不知道如何解决这个问题,所以我在创建问题之前尝试在这里为 Terraform 中的外部提供者获取更详细的输出。

感谢您的帮助:)

更新:通过这样做,我设法找出了错误的 JSON:

data "external" "lambdas" {
program = [
"bash", "-ec",
<<-EOF
echo \"env NODE_ENV=${terraform.workspace} npx whook terraformValues --type='lambdas'\" >> lambdas-stderr.log
env NODE_ENV=${terraform.workspace} npx whook terraformValues --type='lambdas' 2>> lambdas-stderr.log | tee lambdas-stdout.log
EOF
]
working_dir = ".."
}

它基本上将 stderr 写入一个文件,将 stdout 写入另一个文件,同时仍然将 stdout 代理到命令输出。

有了它,我可以遍历所有已保存的文件,并发现错误的 JSON 是截断为 65536 字节 (2^16) 的 JSON,因此我认为某处存在一些限制。如果我设法找出限制 JSON 大小的因素,我会让您了解最新情况。

为了每次都重现这个问题,我不得不将 parallelism 选项设置为 100。它认为它可能与管道缓冲区大小有关(请参阅 https://unix.stackexchange.com/questions/11946/how-big-is-the-pipe-buffer )并且在某些情况下,输出读取 block 并且没有背压机制将其计算在内。

最佳答案

我终于找到问题了。 JSON 被截断,因为子进程在没有主要刷新输出的情况下退出。在此处查看 NodeJS 子进程的详细信息:https://nodejs.org/api/process.html#process_process_exit_code

背压生效,因此只有标准输出缓冲区大小 (64kb) 被传输,JSON 的其余部分被截断。最后,与 Terraform 无关。

关于terraform - 如何调试具有并发问题的 Terraform 外部提供程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66490152/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com