{"record":{"id":"62d7cc91ba57aa2b","repo":"risingwavelabs/risingwave","slug":"s3-configuration-is-required-for-snowflake-s3-sink","errorCode":null,"errorMessage":"S3 configuration is required for Snowflake S3 sink","messagePattern":"S3 configuration is required for Snowflake S3 sink","errorType":"validation","errorClass":"SinkError::Config","httpStatus":null,"severity":"error","filePath":"src/connector/src/sink/snowflake_redshift/snowflake.rs","lineNumber":602,"sourceCode":"        config: SnowflakeV2Config,\n        is_append_only: bool,\n        writer_param: SinkWriterParam,\n        param: SinkParam,\n    ) -> Result<Self> {\n        let schema = param.schema();\n        let database = config.snowflake_database.ok_or_else(|| {\n            SinkError::Config(anyhow!(\"database is required for Snowflake JDBC sink\"))\n        })?;\n        let schema_name = config.snowflake_schema.ok_or_else(|| {\n            SinkError::Config(anyhow!(\"schema is required for Snowflake JDBC sink\"))\n        })?;\n        let table_name = config.snowflake_target_table_name.ok_or_else(|| {\n            SinkError::Config(anyhow!(\"table.name is required for Snowflake JDBC sink\"))\n        })?;\n        if config.with_s3 {\n            let s3_writer = SnowflakeRedshiftSinkS3Writer::new(\n                config.s3_inner.ok_or_else(|| {\n                    SinkError::Config(anyhow!(\n                        \"S3 configuration is required for Snowflake S3 sink\"\n                    ))\n                })?,\n                schema,\n                is_append_only,\n                table_name,\n            )?;\n            Ok(Self::S3(s3_writer))\n        } else {\n            let jdbc_writer = SnowflakeRedshiftSinkJdbcWriter::new(\n                is_append_only,\n                writer_param,\n                param,\n                build_full_table_name(&database, &schema_name, &table_name),\n            )\n            .await?;\n            Ok(Self::Jdbc(jdbc_writer))\n        }","sourceCodeStart":584,"sourceCodeEnd":620,"githubUrl":"https://github.com/risingwavelabs/risingwave/blob/6469eb736d691e8e9b8a419a57edd6429ca77417/src/connector/src/sink/snowflake_redshift/snowflake.rs#L584-L620","documentation":"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`.","triggerScenarios":"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`.","commonSituations":"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.","solutions":["Provide the S3 configuration options required by the Snowflake S3 sink (bucket, region, AWS credentials) alongside S3 mode","Or disable S3 mode to use the pure JDBC writer path","Verify the S3 config parsed correctly (correct option names and values)"],"exampleFix":"-- before\nWITH (connector='snowflake', snowflake.s3=true, ...)\n-- after\nWITH (connector='snowflake', snowflake.s3=true,\n      s3.bucket.name='my-bucket', s3.region='us-east-1',\n      aws.credentials.access_key_id='...', aws.credentials.secret_access_key='...', ...)","handlingStrategy":"validation","validationCode":"if opts.get(\"snowflake.s3\").map_or(false, |v| v == \"true\") {\n    assert!(opts.contains_key(\"s3.bucket.name\"), \"S3 options required for snowflake S3 sink\");\n}","typeGuard":null,"tryCatchPattern":null,"preventionTips":["When enabling S3 mode, supply the full S3 option set at once","Test the sink in a dev environment before production"],"tags":["snowflake","sink","config","s3"],"backgroundTag":"missing-required-config-field","analyzedSha":"6469eb736d691e8e9b8a419a57edd6429ca77417","analyzedAt":"2026-09-11T21:06:21.487Z","contentChangedAt":"2026-09-11T21:06:21.487Z","schemaVersion":2},"datasetVersion":"2026-09-23T08:17:48.524Z"}