导入手动创建的Azure Function App时,Terraform隐藏链接处理方案咨询
我手动在Azure门户创建的Function App导入Terraform配置后,执行terraform plan发现该应用带有三个和Application Insights相关的hidden links标签:
"hidden-link: /app-insights-conn-string" = "InstrumentationKey=********;IngestionEndpoint=********/" "hidden-link: /app-insights-instrumentation-key" = "********" "hidden-link: /app-insights-resource-id" = "/subscriptions/********/resourceGroups/*******/providers/microsoft.insights/components/*******"
但用相同Terraform配置从头创建Function App时,无需这些隐藏链接,仅配置application_insights_connection_string就能正常工作。现在有两种处理方案,想咨询合理性:
- 方案1:将这些隐藏链接导入配置,后续新创建的Function App也会附带这些链接
- 方案2:在
lifecycle中添加ignore_changes块忽略这些链接,示例配置:
lifecycle { ignore_changes = [ tags["hidden-link: /app-insights-instrumentation-key"], tags["hidden-link: /app-insights-resource-id"], tags["hidden-link: /app-insights-conn-string"] ] }
方案分析与建议
方案1的合理性:
这些hidden links是Azure门户手动创建资源时自动添加的关联标签,用于在门户层面维护Function App和Application Insights的关联关系。导入后保留这些标签,对Function App的实际功能没有负面影响——因为Terraform已经通过application_insights_connection_string完成了监控配置。但缺点是后续Terraform创建的所有Function App都会带上这些冗余标签,增加配置的不必要复杂度,不符合Terraform声明式配置的简洁性原则。方案2的合理性:
这是更推荐的方案。通过ignore_changes忽略这些自动生成的隐藏标签,既可以让现有导入的资源在Terraform管理下不被强制移除这些标签(避免和门户自动维护的内容冲突),又能保证新创建的资源只包含你显式定义的配置,保持代码整洁。这种方式完全贴合Terraformignore_changes的设计初衷——忽略那些由平台自动生成、无需纳入声明式管理的属性。
实际经验中,多数团队会选择方案2,因为它平衡了现有资源的兼容性和新资源的配置一致性,不会引入冗余配置,也避免了后续维护时的混淆。
内容的提问来源于stack exchange,提问作者Somsubhra Mukherjee

