练习 - 使用 ARM 模板部署和导出 Azure 逻辑应用工作流

已完成

在上一个练习中,我们使用基本 Azure 资源管理器模板部署了逻辑应用。 此模板并不灵活,因为所有内容都是硬编码的。 例如,若要更改工作流名称或应用的部署位置,必须编辑模板。 在脚本环境中进行多个部署的情况下,手动编辑模板会变得很麻烦。 更好的方法是提供值作为参数来自定义资源部署。

更新模板以使用模板参数

  1. 使用下面的 cp 命令复制我们在上一个练习中使用的基本模板:

    cp basic-template.json template-with-params.json
    
  2. 使用下面的 code 命令在内置编辑器中打开模板:

    code template-with-params.json
    

    第一步是添加参数,以便我们可以轻松地自定义应用的名称和运行应用的位置。

  3. 将模板中的 parameters 部分替换为以下代码片段,这会添加两个新参数 logicAppNamelocation

    "parameters": {
        "logicAppName": {
            "type": "string",
            "metadata": {
              "description": "The name of the logic app to create."
            }
          },
        "location": {
        "type": "string",
        "defaultValue": "[resourceGroup().location]",
        "metadata": {
              "description": "Location for all resources."
            }
        }
    },
    

    两个参数都是字符串。 我们不为 logicAppName 参数提供默认值,这意味着需要在部署时提供。 与此相反,如果提供默认值,location 将为可选。

    location 参数的默认值是部署应用的资源组的位置。 通过引用 resourceGroup() 模板函数返回的资源组中的“位置”属性来获取该值。 表达式分别以左括号和右括号 ([ ]) 开头和结尾。 模板完成部署时,会计算表达式的值。 表达式可以返回字符串、整数、布尔值、数组或对象。 在模板中,最多可以将 256 个参数。

    现在我们已经定义了两个新参数,接下来在模板中使用它们,方法是将硬编码值替换为对新参数的引用。

  4. 替换模板资源部分中的 namelocation 字段以使用我们的新参数,如以下代码片段所示:

    "name": "[parameters('logicAppName')]",
    "location": "[parameters('location')]",
    
  5. 使用以下代码替换模板底部的 outputs 部分。 我们正在更新 logicAppUrl 模板变量的值,以便使用 logicAppName 参数,如下面的代码片段所示:

    "outputs": {
        "logicAppUrl": {
           "type": "string",
           "value": "[listCallbackURL(concat(resourceId('Microsoft.Logic/workflows/', parameters('logicAppName')), '/triggers/manual'), '2017-07-01').value]"
        }
     }
    
  6. Ctrl + S 将所有更改保存到 template-with-params.json

使用参数化模板部署逻辑应用资源

在部署期间,有两种方法可以使用 az deployment group create 命令中的 --parameters 标志为模板提供参数。 我们可以传入远程参数文件的 URI 或本地文件的名称。 让我们使用本地文件。

创建参数 JSON 文件

  1. 使用以下命令在内置代码编辑器中创建名为 params.json 的新文件:

    code params.json
    
  2. 将以下 JSON 粘贴到 params.json 并按 Ctrl + S 保存更改

    { 
        "logicAppName": { 
            "value": "myLogicApp" 
        } 
    }
    

验证模板

  1. 在 Cloud Shell 中,运行 az deployment group validate 来验证该模板:

    az deployment group validate \
    --resource-group "<rgn>[sandbox resource group name]</rgn>" \
    --template-file template-with-params.json \
    --parameters @params.json
    

    --template-file 参数指向本地模板。 模板的文件名是“template-with-params.json”。

    输出中会显示一个大型 JSON 块,告诉你该模板已通过验证。

    Azure 资源管理器填充模板参数,并检查模板是否在订阅中成功运行。

    如果验证失败,输出中会显示失败的详细说明。

使用本地文件中的参数部署模板

  1. 在 Cloud Shell 中运行以下命令,以使用从“params.json”文件中获取的应用名称部署逻辑应用资源。 在 params.json 文件中,未设置 location 参数,因此使用默认值。

    az deployment group create \
    --resource-group "<rgn>[sandbox resource group name]</rgn>" \
    --template-file template-with-params.json \
    --parameters @params.json
    

    部署将花费一些时间,你可在 Cloud Shell 命令行中查看进度。 部署完成后,应可在 JSON 结果中看到 provisioningState,其值为 Succeeded

  2. 要查看应用的运行情况,请在 JSON 结果中找到“logicAppUrl”值。 选择 URL 或将其复制粘贴到新的浏览器窗口。 该页面将显示“Hello Azure Logic Apps Template!”消息。

使用命令行中的参数部署模板

我们不需要每次从命令行部署时都编辑参数文件,而是可以在命令行的 JSON 字符串中提供参数。

  1. 在 Cloud Shell 中运行以下命令,以使用应用的名称及其位置(在命令行上作为 JSON 字符串输入)部署逻辑应用资源:

    az deployment group create \
    --resource-group "<rgn>[sandbox resource group name]</rgn>" \
    --template-file template-with-params.json \
    --parameters '{ "logicAppName": {"value":"MyLogicApp2"}, "location": {"value":"East US"}}'
    

    部署将花费一些时间,你可在 Cloud Shell 命令行中查看进度。 部署完成后,应可在 JSON 结果中看到 provisioningState,其值为 Succeeded

  2. 要查看应用的运行情况,请在 JSON 结果中找到“logicAppUrl”值。 选择 URL 并将其粘贴到新的浏览器窗口。 该页面将显示“Hello Azure Logic Apps Template!”消息。

  3. 运行以下命令以列出我们截止目前已部署的所有 Azure 逻辑应用工作流:

    az resource list \
    --resource-group "<rgn>[sandbox resource group name]</rgn>" \
    --resource-type Microsoft.Logic/workflows \
    --query [*].[name,location] --output tsv
    

    此命令列出我们截止目前已部署的三个 Azure 逻辑应用工作流(全部来自一个模板)。

在 Azure 资源管理器模板中更新应用操作

现在把注意力转移到让我们的应用不仅仅是向我们发送一个静态消息。 我们会一直将应用作为 HTTP 触发的工作流,它仍然会返回 HTTP 响应。 让我们通过请求传递某些值,让应用为我们做一个计算。 我们将进行基本的区域计算。 假设我们传入的输入是矩形的高度和宽度,我们将返回该区域。 然后部署新的应用并查看它的运行情况。

  1. 通过在 Cloud Shell 中运行以下命令,在内置编辑器中打开“template-with-params.json”:

    code template-with-params.json
    
  2. relativePath 字段添加到 HTTP 请求触发器的“输入”部分,如以下代码片段所示:

    "inputs": {
        "method": "GET",
        "relativePath": "{width}/{height}",
        "schema": {}
    }
    

    relativePath 条目指定我们想要 HTTP 终结点 URL 接受的参数。 在这种情况下,我们定义了两个参数,宽度和高度。 我们将使用这些参数值来计算区域并返回结果。

  3. 使用以下行更新“响应”操作的正文:

    "body": "Response from @{workflow().name}  Total area = @{mul( int(triggerOutputs()['relativePathParameters']['height'])  , int(triggerOutputs()['relativePathParameters']['width'])  )}",
    

    更新后的响应执行以下任务:

    • 打印逻辑应用资源的名称。 响应调用 workflow() 函数以返回有关工作流的信息。 根据该结果,我们引用了 name 属性。

    • 返回 URL 参数的高度和宽度字符串值的整数等效部分的乘积。 此任务使用 mul() 函数和 int() 转换函数。

  4. Ctrl + S 将所有更改保存到 template-with-params.json

  5. 使用 Cloud Shell 中的 az deployment group validate 命令在这些更改后验证模板。 在此示例中,我们使用内联参数将应用的名称设置为“CalculateArea”。

    az deployment group validate \
    --resource-group "<rgn>[sandbox resource group name]</rgn>" \
    --template-file template-with-params.json \
    --parameters '{ "logicAppName": {"value":"CalculateArea"}}'
    
  6. 运行以下命令将更改部署到名为“CalculateArea”的逻辑应用。 我们将省略 location 参数的值,只使用默认值。

    az deployment group create \
    --resource-group "<rgn>[sandbox resource group name]</rgn>" \
    --template-file template-with-params.json \
    --parameters '{ "logicAppName": {"value":"CalculateArea"}}'
    

    部署会花费一些时间,但你可以在 Cloud Shell 命令行中查看进度。 部署完成后,应可在 JSON 结果中看到 provisioningState,其值为 Succeeded

  7. 要查看应用的运行情况,请在 JSON 结果中找到“logicAppUrl”值。 选择 URL 并将其粘贴到新的浏览器窗口。

  8. 更新 URL 中的网址,将 /triggers/manual/paths/invoke?api 更改为 /triggers/manual/paths/invoke/{width}/{height}?api,其中“{width}”和“{height}”是我们要计算的区域的宽度和高度的整数值。 例如 /triggers/manual/paths/invoke/6/7?api。 应用的响应将列出工作流的名称和计算的区域,如以下屏幕截图所示:

    Sceenshot of web browser displaying response from our app called calculate area.

  9. 运行以下命令以列出我们截止目前已部署的所有 Azure 逻辑应用工作流:

    az resource list \
    --resource-group "<rgn>[sandbox resource group name]</rgn>" \
    --resource-type Microsoft.Logic/workflows \
    --query [*].[name,location] --output tsv
    

在此练习中,我们通过参数为模板引入了更多灵活性。 我们在命令行上使用本地文件提供了这些参数。 还通过直接更改发回的响应的 body 来更新简单工作流执行的操作。

你可以使用 Cloud Shell 中的以下 curl 命令从 GitHub 下载参数和模板文件。

curl https://github.com/MicrosoftDocs/mslearn-logic-apps-and-arm-templates/blob/master/calculate-area/params.json > params-final.json
curl https://github.com/MicrosoftDocs/mslearn-logic-apps-and-arm-templates/blob/master/calculate-area/template.json > template-with-params-final.json