0
votes

I am trying to deploy Azure Function with ARM template , but I am not able to create the function itself. Is it possible to create the actual function using ARM template?

I have zipped the source code for the function and placed it in a public location, I have added the MSBuild section to the template and although the deployment finished successfully - the App function was created but not the function itself

here is the template

{
"parameters": {
    "name": {
        "type": "string"
    },
    "storageName": {
        "type": "string"
    },
    "location": {
        "type": "string"
    },
    "subscriptionId": {
        "type": "string"
    },
    "storage_account_endpoint": {
        "type": "string"
    }
},
"resources": [
    {
        "apiVersion": "2016-03-01",
        "name": "[parameters('name')]",
        "type": "Microsoft.Web/sites",
        "properties": {
            "name": "[parameters('name')]",
            "siteConfig": {
                "appSettings": [
                    {
                        "name": "FUNCTIONS_WORKER_RUNTIME",
                        "value": "node"
                    },
                    {
                        "name": "AzureWebJobsStorage",
                        "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2015-05-01-preview').key1)]"
                    },
                    {
                        "name": "FUNCTIONS_EXTENSION_VERSION",
                        "value": "~2"
                    },
                    {
                        "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
                        "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2015-05-01-preview').key1)]"
                    },
                    {
                        "name": "WEBSITE_CONTENTSHARE",
                        "value": "[concat(toLower(parameters('name')), 'bd58')]"
                    },
                    {
                        "name": "WEBSITE_NODE_DEFAULT_VERSION",
                        "value": "8.11.1"
                    },
                    {
                        "name": "storage_account_connection",
                        "value": "[parameters('storage_account_endpoint')]"
                    }
                ]
            },
            "clientAffinityEnabled": false,
            "reserved": false
        },
        "dependsOn": [
            "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageName'))]"
        ],
        "resources": [
            {
                "name": "MSDeploy",
                "type": "Extensions",
                "apiVersion": "2015-02-01",
                "dependsOn": [
                    "[resourceId('Microsoft.Web/Sites', parameters('name'))]"
                ],
                "properties": {
                    "packageUri": "<URL to zip>"
                }
            }
        ],
        "location": "[parameters('location')]",
        "identity": {
            "type": "SystemAssigned"
        },
        "kind": "functionapp"
    },
    {
        "apiVersion": "2015-05-01-preview",
        "type": "Microsoft.Storage/storageAccounts",
        "name": "[parameters('storageName')]",
        "location": "[parameters('location')]",
        "properties": {
            "accountType": "Standard_LRS"
        }
    }
],
"$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
"contentVersion": "1.0.0.0"
}
3
Did you zip the folder of your code, and not just the contents? See mythoughtlab.azurewebsites.net/azure/…Ken W MSFT
yes - this is exactly what I didli-raz

3 Answers

8
votes

In short No - ARM can only create the infrastructure for you but not deploy the code (**see comment). But as always there is a way. A while back MS release a new feature 'Run from ZIP' on web apps (including Function Apps). All you need is the actual project (code published as ZIP) to be in a location where the function app can access it.

We use VSTS (Azure Dev Ops) for CI/CD. So we build the solution add the ZIP to the artifact. Then in the Release we copy the ZIP to blob storage, create a SAS Token and pass the location of the blob Container with the SAS Token to ARM. In the ARM template we build the connection string to the ZIP, using input parameter. As soon as ARM is done then the Function is up and running.

Eg.

{ 
"parameters": {
"name": {
    "type": "string"
},
"storageName": {
    "type": "string"
},
"location": {
    "type": "string"
},
"subscriptionId": {
    "type": "string"
},
"storage_account_endpoint": {
    "type": "string"
},
 "artifactsUri": {
  "type": "string"
},
"artifactsBlobContainer": {
  "type": "string"
},    
"artifactsLocationSasToken": {
  "type": "string"
}
},
"resources": [
{
    "apiVersion": "2016-03-01",
    "name": "[parameters('name')]",
    "type": "Microsoft.Web/sites",
    "properties": {
        "name": "[parameters('name')]",
        "siteConfig": {
            "appSettings": [
                {
                    "name": "FUNCTIONS_WORKER_RUNTIME",
                    "value": "node"
                },
                {
                    "name": "AzureWebJobsStorage",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2015-05-01-preview').key1)]"
                },
                {
                    "name": "FUNCTIONS_EXTENSION_VERSION",
                    "value": "~2"
                },
                {
                    "name": "WEBSITE_CONTENTAZUREFILECONNECTIONSTRING",
                    "value": "[concat('DefaultEndpointsProtocol=https;AccountName=',parameters('storageName'),';AccountKey=',listKeys(resourceId('Microsoft.Storage/storageAccounts', parameters('storageName')), '2015-05-01-preview').key1)]"
                },
                {
                    "name": "WEBSITE_CONTENTSHARE",
                    "value": "[concat(toLower(parameters('name')), 'bd58')]"
                },
                {
                    "name": "WEBSITE_NODE_DEFAULT_VERSION",
                    "value": "8.11.1"
                },
                {
                    "name": "storage_account_connection",
                    "value": "[parameters('storage_account_endpoint')]"
                },
                {
                  "name": "WEBSITE_RUN_FROM_ZIP",
                  "value": "[concat(parameters('artifactsUri'), '/', parameters('artifactsBlobContainer'),'/','blahbla.FA.zip',parameters('artifactsLocationSasToken'))]"
                }
            ]
        },
        "clientAffinityEnabled": false,
        "reserved": false
    },
    "dependsOn": [
        "[resourceId('Microsoft.Storage/storageAccounts', parameters('storageName'))]"
    ],
    "resources": [
        {
            "name": "MSDeploy",
            "type": "Extensions",
            "apiVersion": "2015-02-01",
            "dependsOn": [
                "[resourceId('Microsoft.Web/Sites', parameters('name'))]"
            ],
            "properties": {
                "packageUri": "<URL to zip>"
            }
        }
    ],
    "location": "[parameters('location')]",
    "identity": {
        "type": "SystemAssigned"
    },
    "kind": "functionapp"
},
{
    "apiVersion": "2015-05-01-preview",
    "type": "Microsoft.Storage/storageAccounts",
    "name": "[parameters('storageName')]",
    "location": "[parameters('location')]",
    "properties": {
        "accountType": "Standard_LRS"
    }
}
],
"$schema": "http://schema.management.azure.com/schemas/2014-04-01-preview/deploymentTemplate.json#",
"contentVersion": "1.0.0.0"
}

'Run from ZIP' is achieved with the 'WEBSITE_RUN_FROM_ZIP' app setting. Hope this helps

3
votes

I just use this FunctionWebDeploy.json template. I download the app content(zip file)from the existing function app and upload it to the public address. Finally I can deploy function app including code.

enter image description here

0
votes
  1. Go to Azure portal portal.azure.com, and create a new Azure Function.

enter image description here

2.Go to Resource Group. 3.Go to Export template. 4.You will see something like this.

This is the ARM Template for all resources/componets.

enter image description here