我使用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输入的意外结束”。
到目前为止我尝试过的是:
TF_LOG=TRACE terraform plan -out=terraform.plan 2>&1:正确执行计划。我对这种意外成功的猜测是,在某种程度上,某些资源(文件描述符、内存?)存在并发问题。由于背压的事实,写大量的跟踪日志可能会减少并发性。尽管如此,我不确定,也许跟踪/调试模式本身降低了并发性?TF_LOG=TRACE terraform plan -out=terraform.plan 2>&1 | grep terraform-provider-external > out.txt:它会复制错误,但是,没有异常情况出现在日志中.甚至以上的错误似乎都是合理的。也许您有一个grep,它可以在减少日志容量的同时捕获更多的信息,以避免上面提到的用于back-pressureenv别名,以便至少知道哪个命令失败了,但是terraform似乎不喜欢别名目前,我正在使用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),在某些情况下,输出读取块和没有背压机制考虑到这一点。
发布于 2021-04-12 09:06:07
我终于发现了这个问题。JSON被截断,因为子进程是退出的,而主要是不刷新输出。有关NodeJS子进程:https://nodejs.org/api/process.html#process_process_exit_code,请参见此处的详细信息
背压实际上是有效的,因此只有stdout缓冲区大小被传输(64 of ),其余的JSON被截断。终于和Terraform无关了。
https://stackoverflow.com/questions/66490152
复制相似问题