You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 21:50:40