risingwavelabs/risingwave · error · SinkError::Config

S3 configuration is required for Snowflake S3 sink

Error message

S3 configuration is required for Snowflake S3 sink

What it means

When the Snowflake sink is configured with `with_s3 = true` (S3-stage based loading), the parsed S3 inner configuration must be present. `new` returns this Config error if the S3 options are missing or failed to parse into `s3_inner`.

Solutions

  1. Provide the S3 configuration options required by the Snowflake S3 sink (bucket, region, AWS credentials) alongside S3 mode
  2. Or disable S3 mode to use the pure JDBC writer path
  3. Verify the S3 config parsed correctly (correct option names and values)

Example fix

-- before
WITH (connector='snowflake', snowflake.s3=true, ...)
-- after
WITH (connector='snowflake', snowflake.s3=true,
      s3.bucket.name='my-bucket', s3.region='us-east-1',
      aws.credentials.access_key_id='...', aws.credentials.secret_access_key='...', ...)
Defensive patterns

Strategy: validation

Validate before calling

if opts.get("snowflake.s3").map_or(false, |v| v == "true") {
    assert!(opts.contains_key("s3.bucket.name"), "S3 options required for snowflake S3 sink");
}

Prevention

When it happens

Trigger: Creating a Snowflake sink with S3 mode enabled (`with_s3`) but without valid S3 options (bucket, region/path, credentials), so `config.s3_inner` is None in `new`.

Common situations: Enabling S3 mode but forgetting s3 bucket/region/credentials options; malformed S3 config values that failed parsing earlier; mixing JDBC-direct and S3 modes inconsistently.

Understand the failure class

Background: "is required", "must be set", "missing required field": configuration validation errors across open-source libraries — this error's family across 36 libraries.

Related errors


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

Appendix: source

Thrown at src/connector/src/sink/snowflake_redshift/snowflake.rs:602

        config: SnowflakeV2Config,
        is_append_only: bool,
        writer_param: SinkWriterParam,
        param: SinkParam,
    ) -> Result<Self> {
        let schema = param.schema();
        let database = config.snowflake_database.ok_or_else(|| {
            SinkError::Config(anyhow!("database is required for Snowflake JDBC sink"))
        })?;
        let schema_name = config.snowflake_schema.ok_or_else(|| {
            SinkError::Config(anyhow!("schema is required for Snowflake JDBC sink"))
        })?;
        let table_name = config.snowflake_target_table_name.ok_or_else(|| {
            SinkError::Config(anyhow!("table.name is required for Snowflake JDBC sink"))
        })?;
        if config.with_s3 {
            let s3_writer = SnowflakeRedshiftSinkS3Writer::new(
                config.s3_inner.ok_or_else(|| {
                    SinkError::Config(anyhow!(
                        "S3 configuration is required for Snowflake S3 sink"
                    ))
                })?,
                schema,
                is_append_only,
                table_name,
            )?;
            Ok(Self::S3(s3_writer))
        } else {
            let jdbc_writer = SnowflakeRedshiftSinkJdbcWriter::new(
                is_append_only,
                writer_param,
                param,
                build_full_table_name(&database, &schema_name, &table_name),
            )
            .await?;
            Ok(Self::Jdbc(jdbc_writer))
        }

View on GitHub (pinned to 6469eb736d)