risingwavelabs/risingwave · critical

OBS_ENDPOINT not found from environment variables

Error message

OBS_ENDPOINT not found from environment variables

What it means

new_obs_engine requires the Huawei OBS endpoint via the OBS_ENDPOINT environment variable and panics when it is unset, since the OpenDAL obs builder needs an endpoint to build the client. The process aborts during object store initialization.

Source

Thrown at src/object_store/src/object/opendal_engine/obs.rs:38

use risingwave_common::config::ObjectStoreConfig;

use super::{MediaType, OpendalObjectStore, new_operator};
use crate::object::ObjectResult;
use crate::object::object_metrics::ObjectStoreMetrics;

impl OpendalObjectStore {
    /// create opendal obs engine.
    pub fn new_obs_engine(
        bucket: String,
        root: String,
        config: Arc<ObjectStoreConfig>,
        metrics: Arc<ObjectStoreMetrics>,
    ) -> ObjectResult<Self> {
        // Create obs backend builder.
        let mut builder = Obs::default().bucket(&bucket).root(&root);

        let endpoint = std::env::var("OBS_ENDPOINT")
            .unwrap_or_else(|_| panic!("OBS_ENDPOINT not found from environment variables"));
        let access_key_id = std::env::var("OBS_ACCESS_KEY_ID")
            .unwrap_or_else(|_| panic!("OBS_ACCESS_KEY_ID not found from environment variables"));
        let secret_access_key = std::env::var("OBS_SECRET_ACCESS_KEY").unwrap_or_else(|_| {
            panic!("OBS_SECRET_ACCESS_KEY not found from environment variables")
        });

        builder = builder
            .endpoint(&endpoint)
            .access_key_id(&access_key_id)
            .secret_access_key(&secret_access_key);

        let op = new_operator(
            &config,
            Operator::new(builder)?.layer(LoggingLayer::default()),
        );

        Ok(Self {
            op,

View on GitHub (pinned to 6469eb736d)

Solutions

  1. Export OBS_ENDPOINT (e.g. https://obs.<region>.myhuaweicloud.com) before starting RisingWave
  2. Add the env var to your Kubernetes/docker deployment config
  3. Verify the variable is visible to the process (env | grep OBS)
  4. Set OBS_ACCESS_KEY_ID and OBS_SECRET_ACCESS_KEY as well — the next panic will otherwise come from those

Example fix

# before
docker run risingwave/risingwave ...  # OBS_ENDPOINT unset -> panic
# after
docker run -e OBS_ENDPOINT=https://obs.cn-north-4.myhuaweicloud.com \
  -e OBS_ACCESS_KEY_ID=... -e OBS_SECRET_ACCESS_KEY=... risingwave/risingwave ...
Defensive patterns

Strategy: validation

Validate before calling

// Preflight all three OBS variables before starting
for var in ["OBS_ENDPOINT", "OBS_ACCESS_KEY_ID", "OBS_SECRET_ACCESS_KEY"] {
    if std::env::var(var).is_err() {
        eprintln!("{} must be set for obs:// object store", var);
        std::process::exit(1);
    }
}

Prevention

When it happens

Trigger: Using an obs:// remote store without OBS_ENDPOINT exported in the environment of the RisingWave process.

Common situations: Deploying to Huawei Cloud OBS but forgetting to inject the endpoint env var into the container/pod, or misspelling the variable name.

Understand the failure class

Background: "environment variable is not set" and "Missing keys in environment" errors: what missing required env var messages mean and how to fix them — this error's family across 28 libraries.

Related errors


AI-assisted analysis of risingwavelabs/risingwave@6469eb736d (2026-09-11). Data as JSON: /api/errors/7d87dd20733e90e6. Report an issue: GitHub.