benbjohnson/litestream · error

invalid s3 access point arn: %s

Error message

invalid s3 access point arn: %s

What it means

splitS3AccessPointARN rejected the string: it does not contain the ':accesspoint/' marker, so it is not a parseable S3 Access Point ARN even though the URL was routed here as one. Malformed or truncated ARN in the replica URL.

Source

Thrown at replica_url.go:148

	// Parse query string if present
	if queryStr != "" {
		query, err = url.ParseQuery(queryStr)
		if err != nil {
			return "", "", "", nil, fmt.Errorf("parse query string: %w", err)
		}
	}

	return "s3", bucket, CleanReplicaURLPath(key), query, nil
}

// splitS3AccessPointARN splits an S3 Access Point ARN into bucket and key components.
func splitS3AccessPointARN(s string) (bucket, key string, err error) {
	lower := strings.ToLower(s)
	const marker = ":accesspoint/"
	idx := strings.Index(lower, marker)
	if idx == -1 {
		return "", "", fmt.Errorf("invalid s3 access point arn: %s", s)
	}

	nameStart := idx + len(marker)
	if nameStart >= len(s) {
		return "", "", fmt.Errorf("invalid s3 access point arn: %s", s)
	}

	remainder := s[nameStart:]
	slashIdx := strings.IndexByte(remainder, '/')
	if slashIdx == -1 {
		return s, "", nil
	}

	bucketEnd := nameStart + slashIdx
	bucket = s[:bucketEnd]
	key = remainder[slashIdx+1:]
	return bucket, key, nil
}

View on GitHub (pinned to 4ed7a308f6)

Solutions

  1. Use the full ARN format arn:aws:s3:us-east-1:ACCOUNT:accesspoint/NAME in the replica URL
Defensive patterns

Strategy: validation

When it happens

Trigger: Thrown at replica_url.go:148 when the library encounters an invalid state.

Common situations: See trigger scenarios.


AI-assisted analysis of benbjohnson/litestream@4ed7a308f6 (2026-09-06). Data as JSON: /api/errors/1252a652494436c7. Report an issue: GitHub.