Reputation: 2127
I'm trying to send a message from my Azure Spring App into my Azure Service Bus Queue. The Spring App has a system-assigned managed identity with the Azure Service Bus Data Sender RBAC assigned to it. However, the error still complains that Send claims are missing:
logger: com.azure.core.amqp.implementation.RetryUtil
message: ReactorSender connectionId[MF_1b9f17_166...] linkName[testapptestapp]: Waiting for send and receive handler to be ACTIVE
Unauthorized access. 'Send' claim(s) are required to perform this operation. Resource: 'sb://servicebus-namespace.servicebus.windows.net/testapp'. TrackingId:8479..., SystemTracker:gateway5, Timestamp:2022-08-10T09:46:42, errorContext[NAMESPACE: servicebus-namespace.servicebus.windows.net. ERROR CONTEXT: N/A, PATH: testapp, REFERENCE_ID: testapptestapp, LINK_CREDIT: 0]
One thing that is strange here is that the linkName[testapptestapp] is doubled, shouldn't it only be testapp, not testapptestapp?
This is my Java Code I'm using in my Azure Spring App:
TokenCredential credential = new DefaultAzureCredentialBuilder()
.build(); // the credential is managed in Azure AD (Role: Azure Service Bus Data Sender)
ServiceBusSenderClient senderClient = new ServiceBusClientBuilder()
.credential("servicebus-namespace.servicebus.windows.net", credential)
.sender()
.queueName("testapp")
.buildClient();
senderClient.sendMessage(new ServiceBusMessage("test-message"));
Additional info: These additional logs are logged just before the above error message gets logged (in ascending order, the first message gets logged just before the error gets logged):
logger: com.azure.core.amqp.implementation.ActiveClientTokenManager
message: { [-]
az.sdk.message: Scheduling refresh token task.
scopes: https://servicebus.azure.net/.default
logger: com.azure.identity.ManagedIdentityCredential
message: Azure Identity => Managed Identity environment: AZURE VM IMDS ENDPOINT
logger: com.azure.identity.ManagedIdentityCredential
message: Azure Identity => getToken() result for scopes [https://servicebus.azure.net/.default]: SUCCESS
logger: com.azure.identity.ChainedTokenCredential
message: Azure Identity => Attempted credential ManagedIdentityCredential returns a token
logger: com.azure.identity.ChainedTokenCredential
message: Azure Identity => Attempted credential EnvironmentCredential is unavailable.
Why is there a token refresh just before the error gets logged? Could that be the reason for it to fail, the refresh token was not received yet?
Upvotes: 0
Views: 831
Reputation: 2127
Our Service Bus is not in the resource group of the Spring App, so the scope for the role assignment was wrong. I changed the scope to the whole subscription with scope = data.azurerm_subscription.current.id
, then it worked:
resource "azurerm_spring_cloud_app" "myApp" {
name = var.spring_cloud_app_name
resource_group_name = data.azurerm_resource_group.main.name
service_name = var.spring_cloud_name
is_public = true
identity {
type = "SystemAssigned"
}
}
data "azurerm_subscription" "current" {}
resource "azurerm_role_assignment" "myApp-asb-sender" {
scope = data.azurerm_subscription.current.id
role_definition_name = "Azure Service Bus Data Sender"
principal_id = azurerm_spring_cloud_app.myApp.identity[0].principal_id
}
Upvotes: 0