【问题标题】:Deploy Azure Function with ARM template使用 ARM 模板部署 Azure Function
【发布时间】:2018-10-30 00:59:24
【问题描述】:

我正在尝试使用 ARM 模板部署 Azure 函数,但我无法创建函数本身。是否可以使用 ARM 模板创建实际功能?

我已压缩函数的源代码并将其放置在公共位置,我已将 MSBuild 部分添加到模板中,尽管部署成功完成 - 已创建 App 函数但未创建函数本身

这是模板

{
"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"
}

【问题讨论】:

标签: azure azure-functions


【解决方案1】:

简而言之,不能 - ARM 只能为您创建基础架构,但不能部署代码(**见评论)。 但一如既往,有办法。不久前,MS 在 Web 应用程序(包括功能应用程序)上发布了一项新功能“从 ZIP 运行”。您只需要将实际项目(以 ZIP 形式发布的代码)放在函数应用可以访问的位置。

我们将 VSTS(Azure Dev Ops)用于 CI/CD。因此,我们构建了解决方案,将 ZIP 添加到工件中。然后在 Release 中,我们将 ZIP 复制到 blob 存储,创建一个 SAS 令牌并将带有 SAS 令牌的 blob 容器的位置传递给 ARM。在 ARM 模板中,我们使用输入参数构建到 ZIP 的连接字符串。一旦 ARM 完成,函数就会启动并运行。

例如。

{ 
"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"
}

“从 ZIP 运行”是通过“WEBSITE_RUN_FROM_ZIP”应用设置实现的。 希望这会有所帮助

【讨论】:

  • arm 模板可以为你部署代码,如果你将代码内联在一个文件中:{...} 字段
  • 我们现在或许可以通过模板进行部署了。 docs.microsoft.com/en-us/azure/azure-functions/…。请参阅sourcecontrols 类型的资源。您可以指定 RepoUrl 和 Branch。
  • 我想现在是WEBSITE_RUN_FROM_PACKAGE。
【解决方案2】:

我只是使用这个FunctionWebDeploy.json 模板。我从现有的函数应用程序中下载应用程序内容(zip文件)并上传到公共地址。最后我可以部署包含代码的功能应用程序。

【讨论】:

  • 但是,如果上传的 zip 文件可以公开访问,您如何确保安全?我假设您正在上传到存储空间并使用 url 公开访问它。
【解决方案3】:
  1. 转到 Azure 门户 portal.azure.com,然后创建一个新的 Azure Function。

2.转到资源组。 3.转到导出模板。 4.你会看到这样的东西。

这是所有资源/组件的 ARM 模板。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-19
    • 1970-01-01
    相关资源
    最近更新 更多