Terraform 0.12:提供商生成的最终计划不一致

时间:2019-12-20 17:39:10

标签: terraform terraform-provider-aws

我有一个Terraform配置,它在应用阶段从aws_api_gateway_usage_plan资源中使用计算值来创建local_file资源。

resource "aws_api_gateway_usage_plan" "api_plan" {
  name         = var.usage_plan_name

  api_stages {
    api_id = jsondecode(file("dev.json")).resources[1].rest_api_id
    stage  = "api"
  }

  # Have to wait for the API to be created before we can create the usage plan
  depends_on = [local_file.chalice_config]
}

如您所见,我读了dev.json以确定api_id Terraform的需求。问题是,当我运行terraform apply时,here中描述的新安全检查会注意到api_id评估为的先前值已​​更改!

Provider produced inconsistent final plan: When expanding the plan for aws_api_gateway_usage_plan.api_plan
to include new values learned so far during apply, provider "aws" produced an invalid new value 
for .api_stages[0].api_id: was cty.StringVal("****"), but now cty.StringVal("****").

如该文档所述,解决此错误的正确方法是指定在plan阶段,此api_id实际上尚未达到computed。问题是我不确定如何通过Terraform配置执行此操作-我参考的文档是针对实际Terraform提供程序的作者的。

看看GitHub上的问题,将初始值设置为null似乎不是一种合理的方法。

有什么想法吗?我正在考虑降级到Terraform 0.11来解决此新的安全检查,但我希望在0.12中可以做到这一点。

谢谢!

2 个答案:

答案 0 :(得分:0)

好吧,在想了一会儿之后,我想到了一个愚蠢的解决方法,使我能够“欺骗” Terraform,使他们相信api_id的值将在apply阶段进行计算,因此无视安全检查。

我所做的是将api_id表达式替换为以下内容:

api_id = replace("=${aws_security_group.sg.vpc_id}=${jsondecode(file("files/handler/.chalice/deployed/dev.json")).resources[1].rest_api_id}", "=${aws_security_group.sg.vpc_id}=", "")

基本上,我在说的是api_id的值取决于计算变量-即我创建的名为vpc_id的{​​{1}}的{​​{1}}。这样,Terraform识别出该值将在以后计算,因此安全检查将被忽略。

很明显,我实际上不想在这里使用aws_security_group,所以我使用了Terraform的字符串函数将其从最终表达式中删除。

这是一个非常棘手的解决方法,我愿意寻求更好的解决方案-只是认为我会分享我现在拥有的内容,以防其他人遇到相同的问题。

谢谢!

答案 1 :(得分:0)

在我添加为仅使用user_data或{{的地方}对filebase64脚本(使用base64encodefile进行编码时,我遇到了相同的错误1}}:

templatefile

(*)我无法100%复制它,但我添加此解决方案是收到上述错误的另一个可能原因。


也请阅读here