{"record":{"id":"3347973556693976","repo":"apache/druid","slug":"set-account-to-the-storage-account-that-needs-to","errorCode":null,"errorMessage":"Set 'account' to the storage account that needs to be configured in the azure config. Please refer to azure documentation.","messagePattern":"Set 'account' to the storage account that needs to be configured in the azure config\\. Please refer to azure documentation\\.","errorType":"validation","errorClass":"ISE","httpStatus":null,"severity":"critical","filePath":"extensions-core/azure-extensions/src/main/java/org/apache/druid/storage/azure/AzureStorageDruidModule.java","lineNumber":118,"sourceCode":"    JsonConfigProvider.bind(binder, \"druid.indexer.logs\", AzureTaskLogsConfig.class);\n    binder.bind(AzureTaskLogs.class).in(LazySingleton.class);\n    binder.install(new FactoryModuleBuilder()\n                       .build(AzureByteSourceFactory.class));\n    binder.install(new FactoryModuleBuilder()\n                       .build(AzureEntityFactory.class));\n    binder.install(new FactoryModuleBuilder()\n                       .build(AzureCloudBlobIteratorFactory.class));\n    binder.install(new FactoryModuleBuilder()\n                       .build(AzureCloudBlobIterableFactory.class));\n  }\n\n\n  @Provides\n  @LazySingleton\n  public AzureClientFactory getAzureClientFactory(final AzureAccountConfig config)\n  {\n    if (StringUtils.isEmpty(config.getAccount())) {\n      throw new ISE(\"Set 'account' to the storage account that needs to be configured in the azure config.\"\n          + \" Please refer to azure documentation.\");\n    }\n\n    if (StringUtils.isEmpty(config.getKey()) && StringUtils.isEmpty(config.getSharedAccessStorageToken()) && BooleanUtils.isNotTrue(config.getUseAzureCredentialsChain())) {\n      throw new ISE(\"Either set 'key' or 'sharedAccessStorageToken' or 'useAzureCredentialsChain' in the azure config.\"\n          + \" Please refer to azure documentation.\");\n    }\n\n    /* Azure named keys and sas tokens are mutually exclusive with each other and with azure keychain auth,\n    but any form of auth supported by the DefaultAzureCredentialChain is not mutually exclusive, e.g. you can have\n    environment credentials or workload credentials or managed credentials using the same chain.\n    **/\n    if (!StringUtils.isEmpty(config.getKey()) && !StringUtils.isEmpty(config.getSharedAccessStorageToken()) ||\n        !StringUtils.isEmpty(config.getKey()) && BooleanUtils.isTrue(config.getUseAzureCredentialsChain()) ||\n        !StringUtils.isEmpty(config.getSharedAccessStorageToken()) && BooleanUtils.isTrue(config.getUseAzureCredentialsChain())\n    ) {\n      throw new ISE(\"Set only one of 'key' or 'sharedAccessStorageToken' or 'useAzureCredentialsChain' in the azure config.\"\n          + \" Please refer to azure documentation.\");","sourceCodeStart":100,"sourceCodeEnd":136,"githubUrl":"https://github.com/apache/druid/blob/9b90983fd291f26935af934383ce360473179e4d/extensions-core/azure-extensions/src/main/java/org/apache/druid/storage/azure/AzureStorageDruidModule.java#L100-L136","documentation":"At Guice provider getAzureClientFactory time, the AzureAccountConfig must specify a storage account. If druid.azure.account is empty the module throws IllegalStateException immediately, preventing the Azure extension from initializing with incomplete auth configuration.","triggerScenarios":"Starting a Druid node with the Azure extension loaded but druid.azure.account not set (empty/missing) in the runtime properties; AzureStorageDruidModule.getAzureClientFactory validates it when the factory is provisioned.","commonSituations":"Copying runtime.properties from a non-Azure setup; typo in the property name; account key removed during config cleanup while the azure storage type is still enabled.","solutions":["Set druid.azure.account to your storage account name in runtime.properties","Ensure the azure extension is intentionally enabled and its druid.azure.* config present on all relevant nodes","Check for typos/whitespace in the account value"],"exampleFix":"// before\n# runtime.properties (azure storage type but no account)\ndruid.storage.type=azure\n// after\ndruid.storage.type=azure\ndruid.azure.account=mystorageaccount","handlingStrategy":"validation","validationCode":"String account = config.get(\"druid.azure.account\");\nif (account == null || account.isBlank()) throw new IllegalStateException(\"druid.azure.account must be set when using Azure deep storage\");","typeGuard":null,"tryCatchPattern":"try { injector.getInstance(AzureClientFactory.class); } catch (ProvisionException e) { /* surface the ISE about druid.azure.account at deploy time */ }","preventionTips":["Preflight-validate druid.azure.* properties in deployment scripts before node start","Use a shared config template for Azure deep storage","Fail fast in CI by constructing the injector with the production properties"],"tags":["azure","config","startup","missing-property"],"backgroundTag":"missing-required-config-field","analyzedSha":"9b90983fd291f26935af934383ce360473179e4d","analyzedAt":"2026-09-07T13:32:30.957Z","contentChangedAt":"2026-09-07T13:32:30.957Z","schemaVersion":2},"datasetVersion":"2026-09-14T05:17:10.506Z"}