使用Terraform部署Azure Ubuntu虚拟机时遇到资源购买验证失败(未接受订阅法律条款)问题求助
解决Terraform部署Azure Ubuntu VM时的ResourcePurchaseValidationFailed错误
这个错误的根源很明确:你使用的Ubuntu 20.04 Gen2镜像是Azure Marketplace提供的授权镜像,你的目标订阅还没有接受该镜像的法律条款和隐私声明。Azure门户创建VM时会主动弹出条款确认弹窗让你手动接受,但Terraform作为自动化工具不会触发这个交互步骤,所以导致部署失败。
下面是几种解决方法,按优先级推荐:
方法一:用Azure CLI手动接受条款(快速解决)
打开终端,登录Azure CLI后,执行以下命令接受对应镜像的条款:
# 如果只有一个订阅,直接执行 az vm image accept-terms --publisher canonical --offer 0001-com-ubuntu-server-focal --sku 20_04-lts-gen2 # 如果你有多个订阅,指定目标订阅ID执行 az vm image accept-terms --publisher canonical --offer 0001-com-ubuntu-server-focal --sku 20_04-lts-gen2 --subscription xxxxx-xxxxx-xxxxx-xxxx
执行成功后,再重新运行terraform apply即可。
方法二:用Terraform自动化接受条款(适合持续部署场景)
如果你希望把条款接受也纳入自动化流程,可以在你的Terraform配置中添加azurerm_marketplace_agreement资源,让Terraform在创建VM前自动完成条款接受:
- 添加协议资源:
resource "azurerm_marketplace_agreement" "ubuntu_bastion_agreement" { publisher = var.bastion_publisher offer = var.bastion_offer plan = var.bastion_sku }
- 修改你的虚拟机资源,添加依赖关系,确保条款先被接受再创建VM:
resource "azurerm_linux_virtual_machine" "linux_virtual_machine" { # 保留你原有的所有配置... # 添加依赖,确保协议先生效 depends_on = [azurerm_marketplace_agreement.ubuntu_bastion_agreement] }
这样后续执行terraform apply时,Terraform会自动处理条款接受,无需手动操作。
方法三:用Azure PowerShell接受条款
如果你习惯用PowerShell,执行以下命令:
# 先获取条款信息,再接受 Get-AzMarketplaceTerms -Publisher canonical -Product 0001-com-ubuntu-server-focal -Name 20_04-lts-gen2 | Set-AzMarketplaceTerms -Accept
补充说明
为什么Azure门户可以正常创建?因为门户在你选择该镜像后,会自动检测订阅是否已接受条款,如果未接受,会立即弹出确认窗口,你点击"接受"后门户会后台完成条款注册,之后就能正常创建VM。而Terraform没有这个交互环节,所以必须提前处理条款接受。
内容的提问来源于stack exchange,提问作者Jananath Banuka
相关产品推荐
相关产品推荐

