Home > Software design >  Ho to provision Terraform Azure Linux VM - You have not accepted the legal terms on this subscriptio
Ho to provision Terraform Azure Linux VM - You have not accepted the legal terms on this subscriptio

Time:03-20

I am using terraform with azure to provision an ubuntu virtual machine and I am getting the below error:

creating Linux Virtual Machine: (Name "test-bastion" / Resource Group "ssi-test"): compute.VirtualMachinesClient#CreateOrUpdate: Failure sending request: StatusCode=400 -- Original Error: Code="ResourcePurchaseValidationFailed" Message="User failed validation to purchase resources. Error message: 'You have not accepted the legal terms on this subscription: 'xxxxx-xxxxx-xxxxx-xxxx' for this plan.

I can spin up VM's through azure portal but not with terraform.

Here's my terraform module

resource "azurerm_linux_virtual_machine" "linux_virtual_machine" {
  name                = join("-", [var.environment, "bastion"])
  resource_group_name = var.resource_group_name
  location            = var.location
  size                = var.bastion_size
  admin_username      = var.bastion_admin_username
  computer_name       = join("-", [var.project, var.environment, "bastion"])
  custom_data         = filebase64(var.bastion_custom_data_path)
  network_interface_ids = [
    azurerm_network_interface.bastion_nic.id
  ]

  admin_ssh_key {
    username   = var.bastion_admin_username
    public_key = file(var.bastion_public_key_path)
  }

  source_image_reference {
    publisher = var.bastion_publisher
    offer     = var.bastion_offer
    sku       = var.bastion_sku
    version   = var.bastion_version
  }

  plan {
    name      = var.bastion_sku
    publisher = var.bastion_publisher
    product   = var.bastion_offer
  }

  os_disk {
    name                 = join("-", [var.project, var.environment, "bastion-os-disk"])
    storage_account_type = "Standard_LRS"
    caching              = "ReadWrite"
    disk_size_gb         = var.bastion_os_disk_size_gb
  }
}

# Create network interface
resource "azurerm_network_interface" "bastion_nic" {
  name                = join("-", [var.project, var.environment, "bastion-nic"])
  location            = var.location
  resource_group_name = var.resource_group_name
  depends_on          = [azurerm_public_ip.bastion_public_ip]

  ip_configuration {
    name                          = join("-", [var.project, var.environment, "bastion-nic-conf"])
    subnet_id                     = var.bastion_subnet_id
    private_ip_address_allocation = "Dynamic"
    public_ip_address_id          = azurerm_public_ip.bastion_public_ip.id
  }

  tags = var.default_tags
}

and here are the variable values (some are removed)

bastion_admin_username = "ubuntu"
bastion_os_disk_size_gb = "60"
bastion_public_key_path = "./data/keys/bastion.pub"
bastion_size = "Standard_B2s"
bastion_publisher = "canonical"
bastion_offer = "0001-com-ubuntu-server-focal"
bastion_sku = "20_04-lts-gen2"
bastion_version = "latest"
bastion_custom_data_path = "./data/scripts/bastion.sh"

Can someone help me?

CodePudding user response:

Accept the agreement first, with this resource: https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/marketplace_agreement

CodePudding user response:

Plan block is mostly for BYOS images like RedHat, Arista & Palo Alto. Below flavor doesn't need any plan as this can be used without accepting marketplace terms first before using them via automation.

> az vm image list-skus -l westeurope -p canonical -f 0001-com-ubuntu-server-focal
{
    "extendedLocation": null,
    "id": "/Subscriptions/b500a058-6396-45db-a15d-3f31913e84a5/Providers/Microsoft.Compute/Locations/westeurope/Publishers/canonical/ArtifactTypes/VMImage/Offers/0001-com-ubuntu-server-focal/Skus/20_04-lts-gen2",
    "location": "westeurope",
    "name": "20_04-lts-gen2",
    "properties": {
      "automaticOSUpgradeProperties": {
        "automaticOSUpgradeSupported": false
      }
    },
    "tags": null
  }

If you remove below plan block from azurerm_linux_virtual_machine resource, it should work for the image flavor you picked.

plan {
    name      = var.bastion_sku
    publisher = var.bastion_publisher
    product   = var.bastion_offer
  }

The reason why it's working via portal because ARM template doesn't add plan block there. You can download and verify ARM template before creating VM on portal if you want.

  • Related