leongross
leongross

Reputation: 427

Microsoft Azure Managed Application ARM Template from SIG

I am having trouble to create a managed application from an ARM template while using a shared image I created as a basis. This image is stored in my SIG. The code below is from my mainTemplate.json:

"storageProfile": {
      "imageReference": {
        "offer": "TESTOFFER ",
        "publisher": "TESTPUB ",
        "sku": "1.0.0",
        "id ": "/subscriptions/<subid>/resourceGroups/managed_gallery/providers/Microsoft.Compute/galleries/managed_gallery_instance/images/gallery_image/versions/1.0.0"
      },
      "osDisk": {
        "createOption": "fromImage"
      }

In my target resource group the nsg, ip, nic, nsg and vnet get created, only the vm fails. This is the error output I get in azure portal:

{
  "code": "DeploymentFailed",
  "message": "At least one resource deployment operation failed. Please list deployment operations for details. Please see https://aka.ms/DeployOperations for usage details.",
  "details": [
    {
      "code": "BadRequest",
      "message": "Could not find member 'id ' on object of type 'ImageReference'. Path 'properties.storageProfile.imageReference['id ']', line 1, position 1101."
    }
  ]
}

I found this article in the docs that does not state any usage. I did a lot of googling but I did not find any good examples covering my case.

Is this even the intended way of passing a custom image to a ma? I appreciate any suggestions.

Thanks in advance!

EDIT
This is the whole ARM template:

{
    "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "projectName": {
            "type": "string",
            "defaultValue": "managedApp",
            "metadata": {
                "description": "Specifies a name for generating resource names."
            }
        },
        "location": {
            "type": "string",
            "defaultValue": "[resourceGroup().location]",
            "metadata": {
                "description": "Specifies the location for all resources."
            }
        },
        "adminUsername": {
            "type": "string",
            "defaultValue": "azureAdmin",
            "metadata": {
                "description": "Specifies a username for the Virtual Machine."
            }
        },
        "adminPublicKey": {
            "type": "string",
            "defaultValue": "KEY",
            "metadata": {
                "description": "Specifies the SSH rsa public key file as a string. Use \"ssh-keygen -t rsa -b 2048\" to generate your SSH key pairs."
            }
        }
    },
    "variables": {
        "vNetName": "[concat(parameters('projectName'), '-vnet')]",
        "vNetAddressPrefixes": "10.0.0.0/16",
        "vNetSubnetName": "default",
        "vNetSubnetAddressPrefix": "10.0.0.0/24",
        "vmName": "[concat(parameters('projectName'), '-vm')]",
        "publicIPAddressName": "[concat(parameters('projectName'), '-ip')]",
        "networkInterfaceName": "[concat(parameters('projectName'), '-nic')]",
        "networkSecurityGroupName": "[concat(parameters('projectName'), '-nsg')]",
        "networkSecurityGroupName2": "[concat(variables('vNetSubnetName'), '-nsg')]"
    },
    "resources": [
        {
            "type": "Microsoft.Network/networkSecurityGroups",
            "apiVersion": "2020-05-01",
            "name": "[variables('networkSecurityGroupName')]",
            "location": "[parameters('location')]",
            "properties": {
                "securityRules": [
                    {
                        "name": "ssh_rule",
                        "properties": {
                            "description": "Locks inbound down to ssh default port 22.",
                            "protocol": "Tcp",
                            "sourcePortRange": "*",
                            "destinationPortRange": "22",
                            "sourceAddressPrefix": "*",
                            "destinationAddressPrefix": "*",
                            "access": "Allow",
                            "priority": 123,
                            "direction": "Inbound"
                        }
                    }
                ]
            }
        },
        {
            "type": "Microsoft.Network/publicIPAddresses",
            "apiVersion": "2020-05-01",
            "name": "[variables('publicIPAddressName')]",
            "location": "[parameters('location')]",
            "properties": {
                "publicIPAllocationMethod": "Dynamic"
            },
            "sku": {
                "name": "Basic"
            }
        },
        {
            "comments": "Simple Network Security Group for subnet [variables('vNetSubnetName')]",
            "type": "Microsoft.Network/networkSecurityGroups",
            "apiVersion": "2020-05-01",
            "name": "[variables('networkSecurityGroupName2')]",
            "location": "[parameters('location')]",
            "properties": {
                "securityRules": [
                    {
                        "name": "default-allow-22",
                        "properties": {
                            "priority": 1000,
                            "access": "Allow",
                            "direction": "Inbound",
                            "destinationPortRange": "22",
                            "protocol": "Tcp",
                            "sourceAddressPrefix": "*",
                            "sourcePortRange": "*",
                            "destinationAddressPrefix": "*"
                        }
                    }
                ]
            }
        },
        {
            "type": "Microsoft.Network/virtualNetworks",
            "apiVersion": "2020-05-01",
            "name": "[variables('vNetName')]",
            "location": "[parameters('location')]",
            "dependsOn": [
                "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName2'))]"
            ],
            "properties": {
                "addressSpace": {
                    "addressPrefixes": [
                        "[variables('vNetAddressPrefixes')]"
                    ]
                },
                "subnets": [
                    {
                        "name": "[variables('vNetSubnetName')]",
                        "properties": {
                            "addressPrefix": "[variables('vNetSubnetAddressPrefix')]",
                            "networkSecurityGroup": {
                                "id": "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName2'))]"
                            }
                        }
                    }
                ]
            }
        },
        {
            "type": "Microsoft.Network/networkInterfaces",
            "apiVersion": "2020-05-01",
            "name": "[variables('networkInterfaceName')]",
            "location": "[parameters('location')]",
            "dependsOn": [
                "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))]",
                "[resourceId('Microsoft.Network/virtualNetworks', variables('vNetName'))]",
                "[resourceId('Microsoft.Network/networkSecurityGroups', variables('networkSecurityGroupName'))]"
            ],
            "properties": {
                "ipConfigurations": [
                    {
                        "name": "ipconfig1",
                        "properties": {
                            "privateIPAllocationMethod": "Dynamic",
                            "publicIPAddress": {
                                "id": "[resourceId('Microsoft.Network/publicIPAddresses', variables('publicIPAddressName'))]"
                            },
                            "subnet": {
                                "id": "[resourceId('Microsoft.Network/virtualNetworks/subnets', variables('vNetName'), variables('vNetSubnetName'))]"
                            }
                        }
                    }
                ]
            }
        },
        {
            "type": "Microsoft.Compute/virtualMachines",
            "apiVersion": "2019-12-01",
            "name": "[variables('vmName')]",
            "location": "[parameters('location')]",
            "dependsOn": [
                "[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]"
            ],
            "properties": {
                "osProfile": {
                    "computerName": "[variables('vmName')]",
                    "adminUsername": "[parameters('adminUsername')]",
                    "linuxConfiguration": {
                        "disablePasswordAuthentication": true,
                        "ssh": {
                            "publicKeys": [
                                {
                                    "path": "[concat('/home/', parameters('adminUsername'), '/.ssh/authorized_keys')]",
                                    "keyData": "[parameters('adminPublicKey')]"
                                }
                            ]
                        }
                    }
                },
                "storageProfile": {
                    "imageReference": {
                        "id ": "id"
                    },
                    "osDisk": {
                        "createOption": "fromImage"
                    }
                },
                "networkProfile": {
                    "networkInterfaces": [
                        {
                            "id": "[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]"
                        }
                    ]
                }
            }
        }
    ]
}

Upvotes: 1

Views: 717

Answers (1)

bmoore-msft
bmoore-msft

Reputation: 8737

Might need to see the rest of the template, but if you want to use a managed image for the disk, the "id" property is the only property you supply (remove publisher, offer, sku).

The error sounds like you might have more than one problem, but that's a start.

UPDATE

Try this for your properties node on the vm:

"properties": {
    "hardwareProfile": {
        "vmSize": "Standard_D2ds_v4"
    },
    "osProfile": {
        "computerName": "[variables('vmName')]",
        "adminUsername": "[parameters('adminUsername')]",
        "linuxConfiguration": {
            "disablePasswordAuthentication": true,
            "ssh": {
                "publicKeys": [
                    {
                        "path": "[concat('/home/', parameters('adminUsername'), '/.ssh/authorized_keys')]",
                        "keyData": "[parameters('adminPublicKey')]"
                    }
                ]
            }
        }
    },
    "storageProfile": {
        "imageReference": {
            "id": "/subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName}/providers/Microsoft.Compute/galleries/{galleryName}/images/{imageName}/versions/{version}"
        }
    },
    "networkProfile": {
        "networkInterfaces": [
            {
                "id": "[resourceId('Microsoft.Network/networkInterfaces', variables('networkInterfaceName'))]"
            }
        ]
    }
}

Changes I made:

  • you need a hardware profile with the vmSize
  • remove the osDisk property
  • remove the space from the id property name under imageReference

Upvotes: 1

Related Questions