使用Terraform External数据源从Azure Repo下载文件遇错求助
解决Terraform External数据源解析错误问题
问题根源
你的PowerShell脚本中使用了Write-Host输出日志内容("Download the file"、"Url:..."),这些内容会和最终的JSON输出混合在一起,导致Terraform无法正确解析纯JSON格式的结果,触发"invalid character 'D' looking for beginning of value"错误——这里的'D'就是"Download"的首字母。
另外,Invoke-RestMethod请求带download=true的Azure DevOps API时,返回的是文件二进制流而非JSON结构,直接ConvertTo-Json会导致格式不符合Terraform External数据源要求的字符串键值对Map规范。
修复步骤
1. 修正PowerShell脚本
移除所有Write-Host语句,确保脚本只输出合法JSON,同时调整API参数(去掉download=true,获取文件文本内容而非下载流):
$personalToken="PAT_Token" $header = @{Authorization=("Basic {0}" -f [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$($personalToken)")))} # 移除download=true,获取文件文本内容 $uriGetFile = "https://dev.azure.com/<Organisaion>/<Project>/_apis/git/repositories/<Repository_Name>/items?scopePath=settings.json&versionDescriptor.version=<Branch_Name>&api-version=6.1-preview.1" # 获取原始文本并转换为JSON对象 $response = Invoke-WebRequest -UseBasicParsing -Headers $header -Uri $uriGetFile $settingsContent = $response.Content | ConvertFrom-Json # 转换为Terraform要求的字符串键值对JSON $settingsContent | ConvertTo-Json -Compress
2. 确保配置格式合规
settings.json必须是字符串键值对结构,示例如下:
{ "FUNCTION_APP_ENV": "production", "DB_CONNECTION_STRING": "xxx" }
3. 安全优化(可选)
不要在脚本中硬编码PAT,改用Terraform传递环境变量:
- Terraform配置:
data "external" "settings_data" { program = ["powershell.exe", "${path.module}/func_settings.ps1"] environment = { AZDO_PAT = var.azdo_pat } }
- 脚本中读取环境变量:
$personalToken = $env:AZDO_PAT
验证修复
先单独运行PowerShell脚本,确认输出是纯JSON字符串,无任何额外日志内容,再执行terraform apply。
内容的提问来源于stack exchange,提问作者anand malla
相关产品推荐
相关产品推荐

