我有一个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中可以做到这一点。
谢谢!
答案 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
脚本(使用base64encode
或file
进行编码时,我遇到了相同的错误1}}:
templatefile
(*)我无法100%复制它,但我添加此解决方案是收到上述错误的另一个可能原因。
也请阅读here。