Terraform执行apply后未实际创建cloudfoundry_network_policy的排查求助
问题:Terraform创建CloudFoundry网络策略无报错但未生效?
我按照官方文档用Terraform创建CloudFoundry Network Policy以实现容器间网络,HCL代码如下:
resource "cloudfoundry_network_policy" "my-policy" { policy { source_app = "source-app-name" destination_app = "destination-app-name" port = "8080" } }
执行terraform apply看似正常,但实际未创建策略。再次执行时,Terraform会尝试重新创建,输出如下:
~ resource "cloudfoundry_network_policy" "my-policy" { id = "some-GUID-here" + policy { + destination_app = "destination-app-name" + port = "8080" + protocol = "tcp" + source_app = "source-app-name" } }
无论使用真实还是虚假的应用名称,结果均一致:无报错但策略未创建,cf network-policies命令始终看不到新策略。推测错误被隐藏,请问该从何处排查?如何创建可用的cloudfoundry_network_policy资源?
排查方向与修复方案
排查步骤
- 开启Terraform调试日志:执行
TF_LOG=DEBUG terraform apply,查看CloudFoundry Provider与API的交互细节,重点关注策略创建请求的返回值,确认是否存在权限不足、应用不存在等隐性报错。 - 验证CloudFoundry账号权限:确保Terraform使用的CF账号拥有目标空间的
space.developer或全局network.admin权限,部分CF API在无权限时会返回200状态码但不执行实际操作。 - 手动调用CF API测试:用
cf curl直接发起策略创建请求,观察返回的明确错误信息,示例命令:cf curl /v2/network_policies -X POST -d '{ "source_app_guid": "<source-app-guid>", "destination_app_guid": "<destination-app-guid>", "protocol": "tcp", "port": 8080 }'
代码修复核心要点
当前代码的关键问题是使用了应用名称而非GUID,cloudfoundry_network_policy的source_app和destination_app字段要求传入应用的GUID,而非显示名称。修改代码如下:
- 通过数据源获取应用GUID:
data "cloudfoundry_app" "source_app" { name = "source-app-name" space = "<目标空间名称或GUID>" } data "cloudfoundry_app" "dest_app" { name = "destination-app-name" space = "<目标空间名称或GUID>" }
- 在网络策略资源中引用GUID:
resource "cloudfoundry_network_policy" "my-policy" { policy { source_app = data.cloudfoundry_app.source_app.id destination_app = data.cloudfoundry_app.dest_app.id port = 8080 protocol = "tcp" # 建议显式指定,默认值为tcp但显式配置更清晰 } }
额外注意事项
- 确保源应用与目标应用处于同一CloudFoundry空间内,跨空间网络策略需要额外的全局权限配置。
- 执行
terraform plan时,确认数据源能正确拉取到应用GUID,避免因应用名称拼写错误导致GUID为空。
内容的提问来源于stack exchange,提问作者John Skiles Skinner
相关产品推荐
相关产品推荐

