customEngineConfig.storage points at object storage.
With Azure Blob Storage as the backing store, durability does not depend on the per-pod data volumes mounted to each engine. Even a complete loss of those volumes does not cause data loss, because the authoritative copy of managed table data lives in object storage.
You configure object storage on the engine through customEngineConfig.storage, which the chart passes through unchanged into the engine’s config.yaml. The type, api_scheme, and bucket_name keys match the Firebolt Core configuration schema, and the chart does not validate them. The engine reads Azure credentials from the pod’s Azure identity, which you provide with Microsoft Entra Workload ID.
The chart passes
customEngineConfig.storage through unchanged and does not validate the type. The abs backend requires an engine image that supports it. An unsupported type is written verbatim into the engine config.yaml, so the engine fails at startup rather than at install time.Prerequisites
Before you begin, ensure that you have the following installed and configured:- A Kubernetes cluster running on Azure Kubernetes Service with workload identity and the OIDC issuer enabled.
kubectlconfigured to access your cluster.helmv3 installed on your local machine.azconfigured for your subscription.- An Azure subscription with permissions to create storage accounts, containers, and managed identities.
- An engine image that supports the
absstorage backend.
Use Azure Blob Storage
The following examples use a storage account namedfireboltenginedemo with a container named firebolt-managed, but you can choose any names you like. Storage account names must be globally unique and use only lowercase letters and numbers.
Create a storage account and container
Create a storage account and container for engine object storage:Grant the engine an Azure identity
Create a user-assigned managed identity, grant it blob access on the storage account, and federate it with the engine’s Kubernetes ServiceAccount:Point the chart at the container
Run the engine pods under the annotated ServiceAccount, label them so Workload ID injects credentials, and set the storage block to the container. The default scheme forabs is azure://, bucket_name is the container name, and azure.storage_account_name is the storage account that holds it.
Confirm that object storage works
Create a table, insert a row, and list the container to confirm the engine wrote data through to Azure Blob Storage:Restrict external access with an intermediary service principal
The container you set undercustomEngineConfig.storage holds the engine’s managed tablet data, and the engine reaches it with the engine pod’s own Azure identity. Queries that read from or write to external locations, such as external tables that point at a different container, follow a separate credential path.
By default, external access also uses the engine pod’s own Azure identity. That identity belongs to this chart release, so it is not a convenient identity for the owner of an external container to reference when they grant access.
An intermediary service principal gives external access a stable identity instead. When you set one, the engine uses the intermediary service principal for external access rather than its own pod identity. Because the service principal is stable and known ahead of time, you can share it with third parties and reference it in container role assignments, including on Azure subscriptions outside your own organization. Access to the object storage container always uses the engine pod’s own identity, so the intermediary service principal applies only to external locations.
Create the intermediary service principal and grant it the permissions it needs to reach the external data.
Set its application client ID under customEngineConfig.storage.azure.intermediary_service_principal_client_id:
storage.azure block through unchanged. The block is valid when type is abs or azurite.
Storage scope
customEngineConfig is global to the release. Multiple engines under the same engines: list share the same customEngineConfig.storage block, and therefore the same container. To run engines against different containers, install the chart twice in separate releases, each with its own customEngineConfig.storage.