Alexander Schmidt
Alexander Schmidt

Reputation: 5733

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.

Upvotes: 2

Views: 8026

Answers (2)

Thomas
Thomas

Reputation: 29736

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.

Upvotes: 11

Gopa
Gopa

Reputation: 354

Adding an another approach. Load the workflow file inside the bicep file using loadTextContent(file.json) and parse it as JSON using json() method and access the definition and parameters straight inside the bicep file, avoiding passing the workflow file as parameter to the CLI

param location string = resourceGroup().location
param logicAppName string
var logicAppDefinition = json(loadTextContent('LogicApp.workflow.json'))


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

Upvotes: 6

Related Questions