今天来分享一个实际工作中遇到的一个问题,首先来描述下场景和问题,我们之前在使用terrafrom来部署一些logic apps, 具体部署的方法之后准备单独写博客来分享下,其实也是挺值得谈谈的
这次先来简单分析下遇到的问题,logic apps里其实包含了很多子组件,包括trigger,action等等,都用terraform部署的话是很麻烦的,所以这里采用的方法是在图形化界面编辑好logic apps之后,导出arm template,然后直接用logic apps部署arm template,这样相对来说就很简单了,用来部署的一部分代码片段大概是这样,其实就是个template deployment,直接读取arm template的JSON文件
data "template_file" "logicapps" {
template = file(local.logic_apps_file_path)
}
resource "azurerm_resource_group_template_deployment" "logicapps_lnx" {
name = local.logic_apps_deployment_name_lnx
resource_group_name = azurerm_api_connection.arm.resource_group_name
deployment_mode = "Incremental"
template_content = data.template_file.logicapps.template
parameters_content = jsonencode({
LApp_workflows_name = { value = local.LApp_workflows_name_lnx }
connections_arm_externalid = { value = azurerm_api_connection.arm.id }
})
}
然后在JSON文件里会预先定义好参数,由terrafrom将参数传进去
那么遇到的问题是什么呢?第一次部署的时候是很顺利的,但是之后的部署里发现每一次都会提示logic apps这个resource要被replace
开始的时候猜测是不是terraform里的parameter的值是LApp-Win-KongSN,传到ARM Template里变成了lApp-Win-KongSN,导致出现了这个问题,但是仔细对比之后发现两者是完全一样的,实际部署出来的资源也是LApp-Win-KongSN
仔细观察之后,可以看到实际上有问题的是parameter的名字,但是实际上在terraform文件里和arm template文件里,这两个parameter也是完全一样的,猜测可能是不是jsonencode这个function本身的一些问题
为了快速解决这个问题,其实最简单的办法就是直接都改成小写
resource "azurerm_resource_group_template_deployment" "logicapps_lnx" {
name = local.logic_apps_deployment_name_lnx
resource_group_name = azurerm_api_connection.arm.resource_group_name
deployment_mode = "Incremental"
template_content = data.template_file.logicapps.template
parameters_content = jsonencode({
logicapp_workflows_name = { value = local.logicapp_workflows_name_lnx }
connections_arm_externalid = { value = azurerm_api_connection.arm.id }
})
}
这样就不会再有这个问题了,可以看到正常应该是提示no changes才对