diff --git a/cli/azd/resources/scaffold/base/modules/set-servicebus-namespace-connection-string.bicep b/cli/azd/resources/scaffold/base/modules/set-servicebus-namespace-connection-string.bicep new file mode 100644 index 00000000000..42f0779bb9d --- /dev/null +++ b/cli/azd/resources/scaffold/base/modules/set-servicebus-namespace-connection-string.bicep @@ -0,0 +1,20 @@ +param serviceBusNamespaceName string +param connectionStringSecretName string +param keyVaultName string + +resource serviceBusNamespace 'Microsoft.ServiceBus/namespaces@2022-10-01-preview' existing = { + name: serviceBusNamespaceName +} + +resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' existing = { + name: keyVaultName +} + +resource serviceBusConnectionStringSecret 'Microsoft.KeyVault/vaults/secrets@2022-07-01' = { + name: connectionStringSecretName + parent: keyVault + properties: { + value: listKeys(concat(resourceId('Microsoft.ServiceBus/namespaces', serviceBusNamespaceName), '/AuthorizationRules/RootManageSharedAccessKey'), serviceBusNamespace.apiVersion).primaryConnectionString + } +} + diff --git a/cli/azd/resources/scaffold/templates/azure-service-bus.bicept b/cli/azd/resources/scaffold/templates/azure-service-bus.bicept deleted file mode 100644 index 1504934841f..00000000000 --- a/cli/azd/resources/scaffold/templates/azure-service-bus.bicept +++ /dev/null @@ -1,60 +0,0 @@ -{{define "azure-service-bus.bicep" -}} -param serviceBusNamespaceName string -{{- if .AuthUsingConnectionString }} -param keyVaultName string -{{end}} -param location string -param tags object = {} - -resource serviceBusNamespace 'Microsoft.ServiceBus/namespaces@2022-10-01-preview' = { - name: serviceBusNamespaceName - location: location - tags: tags - sku: { - name: 'Standard' - tier: 'Standard' - capacity: 1 - } -} - -{{- range $index, $element := .Queues }} -resource serviceBusQueue_{{ $index }} 'Microsoft.ServiceBus/namespaces/queues@2022-01-01-preview' = { - parent: serviceBusNamespace - name: '{{ $element }}' - properties: { - lockDuration: 'PT5M' - maxSizeInMegabytes: 1024 - requiresDuplicateDetection: false - requiresSession: false - defaultMessageTimeToLive: 'P10675199DT2H48M5.4775807S' - deadLetteringOnMessageExpiration: false - duplicateDetectionHistoryTimeWindow: 'PT10M' - maxDeliveryCount: 10 - autoDeleteOnIdle: 'P10675199DT2H48M5.4775807S' - enablePartitioning: false - enableExpress: false - } -} -{{end}} - -{{- if .AuthUsingConnectionString }} - -resource keyVault 'Microsoft.KeyVault/vaults@2022-07-01' existing = { - name: keyVaultName -} - -resource serviceBusConnectionString 'Microsoft.KeyVault/vaults/secrets@2022-07-01' = { - parent: keyVault - name: 'serviceBusConnectionString' - properties: { - value: listKeys('${serviceBusNamespace.id}/AuthorizationRules/RootManageSharedAccessKey', serviceBusNamespace.apiVersion).primaryConnectionString - } -} -{{end}} - -output serviceBusNamespaceId string = serviceBusNamespace.id -output serviceBusNamespaceApiVersion string = serviceBusNamespace.apiVersion -{{- if .AuthUsingConnectionString }} -output serviceBusConnectionStringKey string = 'serviceBusConnectionString' -{{end}} -{{ end}} \ No newline at end of file diff --git a/cli/azd/resources/scaffold/templates/resources.bicept b/cli/azd/resources/scaffold/templates/resources.bicept index b1b655333ee..a5564fed40f 100644 --- a/cli/azd/resources/scaffold/templates/resources.bicept +++ b/cli/azd/resources/scaffold/templates/resources.bicept @@ -197,11 +197,57 @@ module storageAccount 'br/public:avm/res/storage/storage-account:0.14.3' = { ] networkAcls: { defaultAction: 'Allow' - } + } tags: tags } } {{end}} + +{{- if .AzureServiceBus }} + +module serviceBusNamespace 'br/public:avm/res/service-bus/namespace:0.10.0' = { + name: 'serviceBusNamespace' + params: { + // Required parameters + name: '${abbrs.serviceBusNamespaces}${resourceToken}' + // Non-required parameters + location: location + roleAssignments: [ + {{- if (and .AzureServiceBus .AzureServiceBus.AuthUsingManagedIdentity) }} + {{- range .Services}} + { + principalId: {{bicepName .Name}}Identity.outputs.principalId + principalType: 'ServicePrincipal' + roleDefinitionIdOrName: subscriptionResourceId('Microsoft.Authorization/roleDefinitions', '090c5cfd-751d-490a-894a-3ce6f1109419') + } + {{- end}} + {{- end}} + ] + {{- if (and .AzureServiceBus .AzureServiceBus.AuthUsingConnectionString) }} + disableLocalAuth: false + {{- end}} + queues: [ + {{- range $queue := .AzureServiceBus.Queues}} + { + name: '{{ $queue }}' + } + {{- end}} + ] + } +} + +{{- if (and .AzureServiceBus .AzureServiceBus.AuthUsingConnectionString) }} +module serviceBusConnectionString './modules/set-servicebus-namespace-connection-string.bicep' = { + name: 'serviceBusConnectionString' + params: { + serviceBusNamespaceName: serviceBusNamespace.outputs.name + connectionStringSecretName: 'SERVICEBUS-CONNECTION-STRING' + keyVaultName: keyVault.outputs.name + } +} +{{end}} +{{end}} + {{- range .Services}} module {{bicepName .Name}}Identity 'br/public:avm/res/managed-identity/user-assigned-identity:0.2.1' = { @@ -234,7 +280,7 @@ var {{bicepName .Name}}Env = map(filter({{bicepName .Name}}AppSettingsArray, i = module {{bicepName .Name}} 'br/public:avm/res/app/container-app:0.8.0' = { name: '{{bicepName .Name}}' params: { - name: '{{.Name}}' + name: '{{containerAppName .Name}}' {{- if ne .Port 0}} ingressTargetPort: {{.Port}} {{- end}} @@ -287,6 +333,13 @@ module {{bicepName .Name}} 'br/public:avm/res/app/container-app:0.8.0' = { keyVaultUrl: '${keyVault.outputs.uri}secrets/EVENT-HUBS-CONNECTION-STRING' } {{- end}} + {{- if (and .AzureServiceBus .AzureServiceBus.AuthUsingConnectionString) }} + { + name: 'servicebus-connection-string' + identity:{{bicepName .Name}}Identity.outputs.resourceId + keyVaultUrl: '${keyVault.outputs.uri}secrets/SERVICEBUS-CONNECTION-STRING' + } + {{- end}} ], map({{bicepName .Name}}Secrets, secret => { name: secret.secretRef @@ -414,6 +467,42 @@ module {{bicepName .Name}} 'br/public:avm/res/app/container-app:0.8.0' = { value: {{bicepName .Name}}Identity.outputs.clientId } {{- end}} + + {{- if .AzureServiceBus }} + { + name: 'SPRING_CLOUD_AZURE_SERVICEBUS_NAMESPACE' + value: serviceBusNamespace.outputs.name + } + {{- end}} + {{- if (and .AzureServiceBus .AzureServiceBus.AuthUsingManagedIdentity) }} + { + name: 'SPRING_CLOUD_AZURE_SERVICEBUS_CONNECTION_STRING' + value: '' + } + { + name: 'SPRING_CLOUD_AZURE_SERVICEBUS_CREDENTIAL_MANAGEDIDENTITYENABLED' + value: 'true' + } + { + name: 'SPRING_CLOUD_AZURE_SERVICEBUS_CREDENTIAL_CLIENTID' + value: {{bicepName .Name}}Identity.outputs.clientId + } + {{- end}} + {{- if (and .AzureServiceBus .AzureServiceBus.AuthUsingConnectionString) }} + { + name: 'SPRING_CLOUD_AZURE_SERVICEBUS_CONNECTION_STRING' + secretRef: 'servicebus-connection-string' + } + { + name: 'SPRING_CLOUD_AZURE_SERVICEBUS_CREDENTIAL_MANAGEDIDENTITYENABLED' + value: 'false' + } + { + name: 'SPRING_CLOUD_AZURE_EVENTHUBS_CREDENTIAL_CLIENTID' + value: '' + } + {{- end}} + {{- if .Frontend}} {{- range $i, $e := .Frontend.Backends}} { @@ -527,4 +616,7 @@ output AZURE_POSTGRES_FLEXIBLE_SERVER_ID string = postgreServer.outputs.resource {{- if .AzureEventHubs }} output AZURE_EVENT_HUBS_ID string = eventHubNamespace.outputs.resourceId {{- end}} +{{- if .AzureServiceBus }} +output AZURE_SERVICE_BUS_ID string = serviceBusNamespace.outputs.resourceId +{{- end}} {{ end}}