azureazure-logic-appsazure-resource-managerazure-bicep

Deploy logic app using bicep - Convert JSON to valid Bicep


I want to generate a bicep for building a Logic App. The boilerplate for this would be

resource logicApp 'Microsoft.Logic/workflows@2019-05-01' = {
  name: 'lapp-${options.suffix}'
  location: options.location
  properties: {
    definition: {
      // here comes the definition
    }
  }
}

My comment shows the point where the definition of the app itself would be placed. If I take the JSON from an existing logic app (I spared some stuff for brevity):

{
    "definition": {
        "$schema": "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#",
        "actions": {},
        "contentVersion": "1.0.0.0",
        "outputs": {},
        "parameters": {},
        "triggers": {
            "manual": {
                "inputs": {

                },
                "kind": "Http",
                "type": "Request"
            }
        }
    },
    "parameters": {}
}

you would have to tranform this to something like this:

{
    definition: {
        '$schema': "https://schema.management.azure.com/providers/Microsoft.Logic/schemas/2016-06-01/workflowdefinition.json#"
        actions: {}
        contentVersion: '1.0.0.0'
        outputs: {}
        parameters: {}
        triggers: {
            'manual': {
                inputs: {

                }
                kind: 'Http'
                type: 'Request'
            }
        }
    }
    parameters: {}
}

That means for instance:

Is there any converter which can transform a JSON structure into a valid bicep? I do not mean bicep decompile because this assumes that you've got an already valid ARM template.


Solution

  • One approach is to keep your definition in a separate file and pass the json as a parameter.

    main.bicep:

    // Parameters
    param location string = resourceGroup().location
    param logicAppName string
    param logicAppDefinition object
    
    // Basic logic app
    resource logicApp 'Microsoft.Logic/workflows@2019-05-01' = {
      name: logicAppName
      location: location
      properties: {
        state: 'Enabled'
        definition: logicAppDefinition.definition
        parameters: logicAppDefinition.parameters
      }
    }
    

    Then you can deploy your template like that (using az cli and powershell here):

    $definitionPath="full/path/of/the/logic/app/definition.json"
    az deployment group create `
      --resource-group "resource group name" `
      --template-file "full/path/of/the/main.bicep" `
      --parameters logicAppName="logic app name" `
      --parameters logicAppDefinition=@$definitionPath
      
    

    With this approach you dont have to modify your "infra-as-code" every time you update the logic app.