What the identity covers
Normal blob uploads, downloads, and deletes still use
AZURE_STORAGE_CONNECTION_STRING. See Azure Blob Storage authentication for a SAS connection string on an account with shared-key access disabled.
Set up the identity
- Create a user-assigned managed identity in your Entra tenant.
- Add a federated identity credential that trusts your cluster’s OIDC issuer. Set the subject to
system:serviceaccount:<namespace>:<release>-reducto. Its audience must equalazureWorkloadIdentity.audience(defaultapi://AzureADTokenExchange). If your tenant created the credential with another audience, set the chart value to match. - Assign the roles in the table above for the services you use.
- Mount the federated token on the pods, with the AKS webhook or the chart’s
azureWorkloadIdentityvalues. Follow Mount the federated token. With the webhook, label every Reducto component (http,worker, and every streaq worker pool). The chart fails the render whenAZURE_AI_SERVICES_AUTH=workload_identityis set and a component has no identity. - Allow outbound HTTPS from the pods to the Entra authority host (
login.microsoftonline.usin Azure Government; theAzureActiveDirectoryservice tag). Token exchange has no private endpoint, also when your Azure services use private endpoints.
Helm values (explicit projection)
AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_AUTHORITY_HOST, and AZURE_FEDERATED_TOKEN_FILE on every Reducto pod.
Azure AI services
AZURE_AI_SERVICES_AUTH controls Azure Vision OCR and Azure OpenAI together. It defaults to key.
With
workload_identity:
- Remove
AZURE_VISION_KEY, everykeyinAZURE_VISION_ARRAY, andAZURE_OPENAI_API_KEY. Reducto refuses to start with a key in this mode, so a leftover key cannot keep authenticating calls. - Use each resource’s custom subdomain as its endpoint, for example
https://<resource-name>.cognitiveservices.azure.us/orhttps://<resource-name>.openai.azure.us/. Entra ID authentication does not work with a regional endpoint. - Private endpoints work for the services. The custom subdomain resolves to the private IP address through your private DNS zone. Token exchange still needs outbound HTTPS to the Entra authority host.
helm templateandhelm upgradefail, and name the component, whenAZURE_AI_SERVICES_AUTH=workload_identityis set and a component has no workload identity.- A pod fails to start when
AZURE_VISION_KEY,AZURE_OPENAI_API_KEY, or akeyinAZURE_VISION_ARRAYis still set in this mode.
Azure Government and other clouds
Reducto takes the cloud fromAZURE_AUTHORITY_HOST, which the chart sets from azureWorkloadIdentity.authorityHost, and requests every Azure AI services token for that cloud’s audience. A custom domain or a gateway in front of a service therefore gets the right audience.
With
AZURE_AI_SERVICES_AUTH=workload_identity, an authority host of no known cloud fails the first OCR or Azure OpenAI call instead of sending a token for the wrong cloud. Blob Storage tokens use the storage account’s own host as the audience, which works in every cloud.
Troubleshooting
OCR or LLM calls fail with an authentication error and no retry. The identity is missing, its token file cannot be read, or Entra rejected the token exchange. Reducto does not retry it, because every attempt and every endpoint fails the same way. For OCR, the job fails at once with an internal error. For an LLM call, Reducto skips the Azure OpenAI model and tries your other configured models; if every model fails this way, the job fails with an internal error that names the identity. Check the token mount (/var/run/secrets/azure/tokens/azure-identity-token), the federated credential’s issuer and subject, and the role assignments.
Azure returns 401 with a valid token. The token audience does not match the resource’s cloud, or the endpoint is a regional endpoint. Check azureWorkloadIdentity.authorityHost, and use the custom subdomain of the resource.
Calls time out getting a token. The pods cannot reach the Entra authority host. Allow outbound HTTPS to it. Each token attempt waits at most 5 seconds to connect and 10 seconds to read, with one retry, so a page fails within about 30 seconds instead of hanging.
Azure returns 403. The identity lacks the role on that resource. Role assignments can take several minutes to apply.
Roll back
SetAZURE_AI_SERVICES_AUTH=key and restore the keys, then restart the pods. A Reducto release older than the one that added AZURE_AI_SERVICES_AUTH ignores the setting and needs the keys, so restore the keys before you roll back the release. During an upgrade, disable key authentication on your Azure resources only after every Reducto pod runs the new release. Blob Storage signing switches back to account-key signing when you restore AccountKey in the connection string or AZURE_STORAGE_ACCOUNT_KEY.