quickwit-oss/quickwit · error · anyhow::Error

no stream summary was returned from AWS

Error message

no stream summary was returned from AWS

What it means

When describing a Kinesis stream, AWS may respond without the `stream_description` member. The client expects exactly one StreamDescriptionSummary and treats a missing one as an unexpected response, failing with this error instead of proceeding with `None`.

Source

Thrown at quickwit/quickwit-indexing/src/source/kinesis/api.rs:183

    /// Provides a summarized description of the specified Kinesis data stream without the shard
    /// list. https://docs.aws.amazon.com/kinesis/latest/APIReference/API_DescribeStreamSummary.html
    pub(crate) async fn describe_stream(
        kinesis_client: &KinesisClient,
        stream_name: &str,
    ) -> anyhow::Result<StreamDescription> {
        let response = aws_retry(&DEFAULT_RETRY_PARAMS, || async {
            kinesis_client
                .describe_stream()
                .stream_name(stream_name.to_string())
                .send()
                .await
        })
        .await?;

        response
            .stream_description
            .ok_or_else(|| anyhow!("no stream summary was returned from AWS"))
    }
    /// Lists the Kinesis data streams.
    /// https://docs.aws.amazon.com/kinesis/latest/APIReference/API_ListStreams.html
    pub(crate) async fn list_streams(
        kinesis_client: &KinesisClient,
        mut exclusive_start_stream_name: Option<String>,
        limit_per_request: Option<usize>,
    ) -> anyhow::Result<BTreeSet<String>> {
        let mut stream_names = BTreeSet::new();
        let mut has_more_streams = true;
        let limit_per_request = limit_per_request.map(|limit| limit as i32);
        while has_more_streams {
            let response = aws_retry(&DEFAULT_RETRY_PARAMS, || async {
                kinesis_client
                    .list_streams()
                    .set_exclusive_start_stream_name(exclusive_start_stream_name.clone())
                    .set_limit(limit_per_request)
                    .send()

View on GitHub (pinned to a39730c5cd)

Solutions

  1. Verify the stream name and region in the Kinesis source config point to an existing active stream.
  2. Retry the source startup once the stream is in ACTIVE state (check `aws kinesis describe-stream-summary`).
  3. If using a custom endpoint (LocalStack/proxy), verify it returns a full DescribeStream response.
  4. Check IAM permissions for `kinesis:DescribeStream` and confirm no deletion of the stream is in progress.
Defensive patterns

Strategy: retry

Try / catch

match result {
    Err(e) if e.to_string().contains("no stream summary was returned from AWS") => {
        // verify stream exists and is ACTIVE, then retry with backoff
    }
    other => other?,
}

Prevention

When it happens

Trigger: Calling `describe_stream` (used by `wait_for_stream_status` while a source starts up) against an AWS Kinesis endpoint whose DescribeStream response lacks `stream_description` — e.g. stream in a transient/deleting state or a proxied/misbehaving endpoint returning a partial response.

Common situations: Source startup racing with stream deletion/recreation, wrong AWS region or endpoint (custom endpoint/proxy like LocalStack) returning minimal responses, or IAM-limited setups where the response shape is altered.

Understand the failure class

Background: "invalid response format", "malformed payload", "missing data field": when an API returns 200 but the response shape is wrong — this error's family across 23 libraries.

Related errors


AI-assisted analysis of quickwit-oss/quickwit@a39730c5cd (2026-09-08). Data as JSON: /api/errors/8651ac47eb806597. Report an issue: GitHub.