arm-artifacts/shared-templates/synapse-workspace.json

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "_artifactsLocation": {
      "type": "string"
    },
    "_artifactsLocationSasToken": {
      "type": "securestring"
    },
    "workspaceName": {
      "type": "string"
    },
    "location": {
      "type": "string"
    },
    "defaultDataLakeStorageAccountName": {
      "type": "string"
    },
    "defaultDataLakeStorageFilesystemName": {
      "type": "string"
    },
    "setWorkspaceIdentityRbacOnStorageAccount": {
      "type": "bool"
    },
    "allowAllConnections": {
      "type": "bool",
      "defaultValue": true
    },
    "grantWorkspaceIdentityControlForSql": {
      "type": "string",
      "allowedValues": [
        "Enabled",
        "Disabled"
      ]
    },
    "managedVirtualNetwork": {
      "type": "string",
      "allowedValues": [
        "default",
        ""
      ],
      "defaultValue": ""
    },
    "tagValues": {
      "type": "object",
      "defaultValue": {}
    },
    "storageSubscriptionID": {
      "type": "string",
      "defaultValue": "[subscription().subscriptionId]"
    },
    "storageResourceGroupName": {
      "type": "string",
      "defaultValue": "[resourceGroup().name]"
    },
    "storageLocation": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "isNewStorageAccount": {
      "type": "bool",
      "defaultValue": false
    },
    "isNewFileSystemOnly": {
      "type": "bool",
      "defaultValue": false
    },
    "adlaResourceId": {
      "type": "string",
      "defaultValue": ""
    },
    "storageAccountType": {
      "type": "string"
    },
    "storageSupportsHttpsTrafficOnly": {
      "type": "bool"
    },
    "storageIsHnsEnabled": {
      "type": "bool"
    },
    "datalakeContributorGroupId": {
      "type": "string",
      "defaultValue": ""
    },
    "sqlAdministratorPrincipalName": {
      "type": "string"
    },
    "sqlAdministratorPrincipalId": {
      "type": "string"
    },
    "setSbdcRbacOnStorageAccount": {
      "type": "bool",
      "defaultValue": false
    },
    "defaultSparkPoolName": {
      "type": "string",
      "defaultValue": ""
    },
    "defaultSparkPoolVersion": {
      "type": "string",
      "defaultValue": "2.4"
    },
    "defaultSparkPoolNodeSize": {
      "type": "string",
      "allowedValues": [
        "Large",
        "Medium",
        "None",
        "Small",
        "XLarge",
        "XXLarge",
        "XXXLarge"
      ],
      "defaultValue": "Small"
    },
    "defaultSparkPoolNodeSizeFamily": {
      "type": "string",
      "allowedValues": [
        "MemoryOptimized",
        "None"
      ],
      "defaultValue": "MemoryOptimized"
    },
    "defaultSparkPoolNodeCount": {
      "type": "int",
      "defaultValue": 3
    },
    "defaultSparkPoolAutoScaleEnabled": {
      "type": "bool",
      "defaultValue": false
    },
    "defaultSparkPoolAutoScaleMinNodes": {
      "type": "int",
      "defaultValue": 0
    },
    "defaultSparkPoolAutoScaleMaxNodes": {
      "type": "int",
      "defaultValue": 0
    },
    "defaultSparkPoolAutoPauseEnabled": {
      "type": "bool",
      "defaultValue": true
    },
    "defaultSparkPoolAutoPauseDelayMinutes": {
      "type": "int",
      "defaultValue": 15
    },
    "synapsePrivateEndpointSubnetResourceId": {
      "type": "string",
      "defaultValue": ""
    },
    "synapsePrivateEndpointServices": {
      "type": "array",
      "defaultValue": [],
      "allowedValues": [
        "Dev",
        "Sql",
        "SqlOnDemand"
      ]
    },
    "workspaceRepositoryConfiguration": {
      "type": "object",
      "defaultValue": {}
    }
  },
  "variables": {
    "readerRoleId": "acdd72a7-3385-48ef-bd42-f606fba81ae7",
    "storageBlobDataContributorRoleID": "ba92f5b4-2d11-453d-a403-e96b0029c9fe",
    "defaultDataLakeStorageAccountUrl": "[concat('https://', parameters('defaultDataLakeStorageAccountName'), '.dfs.core.windows.net')]",
    "defaultDataLakeStorageDeployName": "[concat(deployment().name, '-defsa')]",
    "synapseManagedIdentityRoleAssignmentIdBaseEntropy": "[concat(resourceGroup().id, '/', parameters('defaultDataLakeStorageAccountName'), '/', variables('storageBlobDataContributorRoleID'), '/', parameters('workspaceName'))]",
    "defaultDatalakeDataContributorRoleAssignmentId": "[guid(concat(resourceGroup().id, '/', parameters('defaultDataLakeStorageAccountName'), '/', variables('storageBlobDataContributorRoleID'), '/', parameters('datalakeContributorGroupId'), '/', 'datalake-contributor-group'))]",
    "defaultDatalakeResourceReaderRoleAssignmentId": "[guid(concat(resourceGroup().id, '/', parameters('defaultDataLakeStorageAccountName'), '/', variables('readerRoleID'), '/', parameters('datalakeContributorGroupId'), '/', 'datalake-contributor-group'))]",
    "defaultSparkPoolNameSafe": "[if(equals(parameters('defaultSparkPoolName'),''), 'not-required', parameters('defaultSparkPoolName'))]",
    "localTags": {
      "displayName": "[parameters('workspaceName')]"
    },
    "tags": "[union(parameters('tagValues'), variables('localTags'))]"
  },
  "resources": [
    {
      "apiVersion": "2019-06-01-preview",
      "name": "[parameters('workspaceName')]",
      "location": "[parameters('location')]",
      "type": "Microsoft.Synapse/workspaces",
      "identity": {
        "type": "SystemAssigned"
      },
      "properties": {
        "defaultDataLakeStorage": {
          "accountUrl": "[variables('defaultDataLakeStorageAccountUrl')]",
          "filesystem": "[parameters('defaultDataLakeStorageFilesystemName')]"
        },
        "adlaResourceId": "[parameters('adlaResourceId')]",
        "managedVirtualNetwork": "[parameters('managedVirtualNetwork')]",
        "workspaceRepositoryConfiguration": "[parameters('workspaceRepositoryConfiguration')]"
      },
      "resources": [
        {
          "type": "bigDataPools",
          "condition": "[not(equals(parameters('defaultSparkPoolName'), ''))]",
          "apiVersion": "2019-06-01-preview",
          "name": "[variables('defaultSparkPoolNameSafe')]",
          "location": "[parameters('location')]",
          "dependsOn": [
            "[concat('Microsoft.Synapse/workspaces/', parameters('workspaceName'))]"
          ],
          "properties": {
            "sparkVersion": "[parameters('defaultSparkPoolVersion')]",
            "nodeCount": "[parameters('defaultSparkPoolNodeCount')]",
            "nodeSize": "[parameters('defaultSparkPoolNodeSize')]",
            "nodeSizeFamily": "[parameters('defaultSparkPoolNodeSizeFamily')]",
            "autoScale": {
              "enabled": "[parameters('defaultSparkPoolAutoScaleEnabled')]",
              "minNodeCount": "[parameters('defaultSparkPoolAutoScaleMinNodes')]",
              "maxNodeCount": "[parameters('defaultSparkPoolAutoScaleMaxNodes')]"
            },
            "autoPause": {
              "enabled": "[parameters('defaultSparkPoolAutoPauseEnabled')]",
              "delayInMinutes": "[parameters('defaultSparkPoolAutoPauseDelayMinutes')]"
            },
            "isComputeIsolationEnabled": false,
            "sessionLevelPackagesEnabled": false
          },
          "tags": "[parameters('tagValues')]"
        },
        {
          "type": "firewallRules",
          "condition": "[parameters('allowAllConnections')]",
          "apiVersion": "2019-06-01-preview",
          "dependsOn": [
            "[concat('Microsoft.Synapse/workspaces/', parameters('workspaceName'))]"
          ],
          "location": "[parameters('location')]",
          "name": "allowAll",
          "properties": {
            "startIpAddress": "0.0.0.0",
            "endIpAddress": "255.255.255.255"
          },
          "tags": "[parameters('tagValues')]"
        },
        {
          "type": "managedIdentitySqlControlSettings",
          "apiVersion": "2019-06-01-preview",
          "dependsOn": [
            "[concat('Microsoft.Synapse/workspaces/', parameters('workspaceName'))]"
          ],
          "location": "[parameters('location')]",
          "name": "default",
          "properties": {
            "grantSqlControlToManagedIdentity": {
              "desiredState": "[parameters('grantWorkspaceIdentityControlForSql')]"
            }
          },
          "tags": "[parameters('tagValues')]"
        },
        {
          "type": "administrators",
          "name": "activeDirectory",
          "apiVersion": "2019-06-01-preview",
          "location": "[parameters('location')]",
          "properties": {
            "administratorType": "ActiveDirectory",
            "login": "[parameters('sqlAdministratorPrincipalName')]",
            "sid": "[parameters('sqlAdministratorPrincipalId')]",
            "tenantId": "[subscription().tenantId]"
          },
          "dependsOn": [
            "[concat('Microsoft.Synapse/workspaces/', parameters('workspaceName'))]"
          ],
          "tags": "[parameters('tagValues')]"
        }
      ],
      "dependsOn": [
        "[variables('defaultDataLakeStorageDeployName')]",
        "[concat('Microsoft.Resources/deployments/', parameters('defaultDataLakeStorageFilesystemName'))]"
      ],
      "tags": "[variables('tags')]"
    },
    {
      "condition": "[not(empty(parameters('synapsePrivateEndpointServices')))]",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2020-10-01",
      "name": "[concat(deployment().name, '-private-endpoints')]",
      "dependsOn": [
        "[concat('Microsoft.Synapse/workspaces/', parameters('workspaceName'))]"
      ],
      "properties": {
        "expressionEvaluationOptions": {
          "scope": "inner"
        },
        "mode": "Incremental",
        "parameters": {
          "synapsePrivateEndpointSubnetResourceId": {
            "value": "[parameters('synapsePrivateEndpointSubnetResourceId')]"
          },
          "synapsePrivateEndpointServices": {
            "value": "[parameters('synapsePrivateEndpointServices')]"
          },
          "location": {
            "value": "[parameters('location')]"
          },
          "workspaceName": {
            "value": "[parameters('workspaceName')]"
          },
          "tags": {
            "value": "[parameters('tagValues')]"
          }
        },
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {
            "synapsePrivateEndpointSubnetResourceId": {
              "type": "string"
            },
            "synapsePrivateEndpointServices": {
              "type": "array",
              "allowedValues": [
                "Dev",
                "Sql",
                "SqlOnDemand"
              ]
            },
            "workspaceName": {
              "type": "string"
            },
            "location": {
              "type": "string"
            },
            "tags": {
              "type": "object",
              "defaultValue": {}
            }
          },
          "variables": {
            "privateEndpointBaseName": "[concat('private-endpoint-synapse-', parameters('workspaceName'))]",
          },
          "resources": [
            {
              "type": "Microsoft.Network/privateEndpoints",
              "apiVersion": "2020-06-01",
              "name": "[toLower(concat(variables('privateEndpointBaseName'), '-', parameters('synapsePrivateEndpointServices')[copyIndex()]))]",
              "copy": {
                "name": "endpointCopy",
                "count": "[length(parameters('synapsePrivateEndpointServices'))]"
              },
              "location": "[parameters('location')]",
              "properties": {
                "subnet": {
                  "id": "[parameters('synapsePrivateEndpointSubnetResourceId')]"
                },
                "privateLinkServiceConnections": [
                  {
                    "name": "[toLower(concat(variables('privateEndpointBaseName'), '-', parameters('synapsePrivateEndpointServices')[copyIndex()]))]",
                    "properties": {
                      "privateLinkServiceId": "[resourceId('Microsoft.Synapse/workspaces/', parameters('workspaceName'))]",
                      "groupIds": [
                        "[parameters('synapsePrivateEndpointServices')[copyIndex()]]"
                      ]
                    }
                  }
                ]
              },
              "tags": "[parameters('tags')]"
            }
          ]
        }
      }
    },
    {
      "condition": "[parameters('setWorkspaceIdentityRbacOnStorageAccount')]",
      "apiVersion": "2019-05-01",
      "name": "storageRoleDeploymentResource",
      "type": "Microsoft.Resources/deployments",
      "subscriptionId": "[parameters('storageSubscriptionID')]",
      "resourceGroup": "[parameters('storageResourceGroupName')]",
      "dependsOn": [
        "[concat('Microsoft.Synapse/workspaces/', parameters('workspaceName'))]"
      ],
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {},
          "variables": {},
          "resources": [
            {
              "type": "Microsoft.Storage/storageAccounts/providers/roleAssignments",
              "apiVersion": "2018-09-01-preview",
              "name": "[concat(parameters('defaultDataLakeStorageAccountName'), '/Microsoft.Authorization/', guid(concat(variables('synapseManagedIdentityRoleAssignmentIdBaseEntropy'), '/', reference(concat('Microsoft.Synapse/workspaces/', parameters('workspaceName')), '2019-06-01-preview', 'Full').identity.principalId)))]",
              "location": "[parameters('storageLocation')]",
              "properties": {
                "roleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', variables('storageBlobDataContributorRoleID'))]",
                "principalId": "[reference(concat('Microsoft.Synapse/workspaces/', parameters('workspaceName')), '2019-06-01-preview', 'Full').identity.principalId]",
                "principalType": "ServicePrincipal"
              }
            },
            {
              "condition": "[parameters('setSbdcRbacOnStorageAccount')]",
              "type": "Microsoft.Storage/storageAccounts/providers/roleAssignments",
              "apiVersion": "2018-09-01-preview",
              "name": "[concat(parameters('defaultDataLakeStorageAccountName'), '/Microsoft.Authorization/', variables('defaultDatalakeDataContributorRoleAssignmentId'))]",
              "properties": {
                "roleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', variables('storageBlobDataContributorRoleID'))]",
                "principalId": "[parameters('datalakeContributorGroupId')]",
                "principalType": "Group"
              }
            },
            {
              "condition": "[parameters('setSbdcRbacOnStorageAccount')]",
              "type": "Microsoft.Storage/storageAccounts/providers/roleAssignments",
              "apiVersion": "2018-09-01-preview",
              "name": "[concat(parameters('defaultDataLakeStorageAccountName'), '/Microsoft.Authorization/', variables('defaultDatalakeResourceReaderRoleAssignmentId'))]",
              "properties": {
                "roleDefinitionId": "[resourceId('Microsoft.Authorization/roleDefinitions', variables('readerRoleId'))]",
                "principalId": "[parameters('datalakeContributorGroupId')]",
                "principalType": "Group"
              }
            }
          ]
        }
      }
    },
    {
      "condition": "[parameters('isNewStorageAccount')]",
      "name": "[variables('defaultDataLakeStorageDeployName')]",
      "type": "Microsoft.Resources/deployments",
      "apiVersion": "2019-03-01",
      "dependsOn": [],
      "resourceGroup": "[parameters('storageResourceGroupName')]",
      "properties": {
        "mode": "Incremental",
        "templateLink": {
          "uri": "[concat(parameters('_artifactsLocation'), '/shared-templates/storage-account.json', parameters('_artifactsLocationSasToken'))]",
          "contentVersion": "1.0.0.0"
        },
        "parameters": {
          "storageAccountType": {
            "value": "[parameters('storageAccountType')]"
          },
          "storageAccountName": {
            "value": "[parameters('defaultDataLakeStorageAccountName')]"
          },
          "storageContainerNames": {
            "value": "[array(parameters('defaultDataLakeStorageFilesystemName'))]"
          },
          "supportsHttpsTrafficOnly": {
            "value": "[parameters('storageSupportsHttpsTrafficOnly')]"
          },
          "isHnsEnabled": {
            "value": "[parameters('storageIsHnsEnabled')]"
          },
          "tagValues": {
            "value": "[parameters('tagValues')]"
          }
        }
      }
    },
    {
      "condition": "[parameters('isNewFileSystemOnly')]",
      "apiVersion": "2019-05-01",
      "name": "[parameters('defaultDataLakeStorageFilesystemName')]",
      "type": "Microsoft.Resources/deployments",
      "subscriptionId": "[parameters('storageSubscriptionID')]",
      "resourceGroup": "[parameters('storageResourceGroupName')]",
      "properties": {
        "mode": "Incremental",
        "template": {
          "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
          "contentVersion": "1.0.0.0",
          "parameters": {},
          "variables": {},
          "resources": [
            {
              "type": "Microsoft.Storage/storageAccounts/blobServices/containers",
              "name": "[concat(parameters('defaultDataLakeStorageAccountName'), '/default/', parameters('defaultDataLakeStorageFilesystemName'))]",
              "apiVersion": "2018-02-01",
              "properties": {
                "publicAccess": "None"
              }
            }
          ]
        }
      }
    }
  ],
  "outputs": {
    "synapseManagedIdentity": {
      "type": "string",
      "value": "[reference(concat('Microsoft.Synapse/workspaces/', parameters('workspaceName')), '2019-06-01-preview', 'Full').identity.principalId]"
    },
    "defaultDatalakeAccessKey": {
      "type": "string",
      "value": "[reference(variables('defaultDataLakeStorageDeployName')).outputs.storageAccountKey.value]"
    }
  }
}