首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何调试具有并发问题的Terraform外部提供程序?

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

Stack Overflow用户
提问于 2021-03-05 09:42:34
回答 1查看 801关注 0票数 3

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

为此,我使用了external提供程序,它期望得到一些JSON作为回报。我的各种命令确实返回JSON,但事实是,我的terraform plan -out=terraform.plan失败了,其中的消息是:"Error:命令“env生成无效的JSON: JSON输入的意外结束”。

到目前为止我尝试过的是:

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

目前,我正在使用tee命令创建外部脚本,以使输出达到bash级别,但我怀疑它将占用更多的文件描述符,因此不能确定它是否可行。

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

(谢谢你的帮助:)

更新:通过这样做,我找到了坏的JSON:

代码语言:javascript
复制
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),在某些情况下,输出读取块和没有背压机制考虑到这一点。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-04-12 09:06:07

我终于发现了这个问题。JSON被截断,因为子进程是退出的,而主要是不刷新输出。有关NodeJS子进程:https://nodejs.org/api/process.html#process_process_exit_code,请参见此处的详细信息

背压实际上是有效的,因此只有stdout缓冲区大小被传输(64 of ),其余的JSON被截断。终于和Terraform无关了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66490152

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档