conductor-oss/conductor · error · NonTransientException

Error generating presigned URL

Error message

Error generating presigned URL

What it means

Thrown as NonTransientException by getLocation's generic catch (Exception) when presigned-URL generation fails with something that is NOT an SdkException. Because it is not an SDK/network error, conductor treats it as a configuration/programming problem that retrying will not fix. The message is generic, so the chained exception 'e' holds the real cause.

Source

Thrown at awss3-storage/src/main/java/com/netflix/conductor/s3/storage/S3PayloadStorage.java:137

                                .getObjectRequest(getObjectRequest)
                                .build();

                presignedUrl = s3Presigner.presignGetObject(presignRequest).url().toString();
            }

            externalStorageLocation.setUri(presignedUrl);
            return externalStorageLocation;
        } catch (SdkException e) {
            String msg =
                    String.format(
                            "Error communicating with S3 - operation:%s, payloadType: %s, path: %s",
                            operation, payloadType, path);
            LOGGER.error(msg, e);
            throw new TransientException(msg, e);
        } catch (Exception e) {
            String msg = "Error generating presigned URL";
            LOGGER.error(msg, e);
            throw new NonTransientException(msg, e);
        }
    }

    /**
     * Uploads the payload to the given s3 object key. It is expected that the caller retrieves the
     * object key using {@link #getLocation(Operation, PayloadType, String)} before making this
     * call.
     *
     * @param path the s3 key of the object to be uploaded
     * @param payload an {@link InputStream} containing the json payload which is to be uploaded
     * @param payloadSize the size of the json payload in bytes
     */
    @Override
    public void upload(String path, InputStream payload, long payloadSize) {
        try {
            PutObjectRequest request =
                    PutObjectRequest.builder()
                            .bucket(bucketName)

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Read the chained exception 'e' — it names the real cause (often NPE on bucket/key).
  2. Ensure conductor.payload-storage.s3.bucket (or equivalent) is set to a non-empty value.
  3. Validate the path argument and signatureDuration before calling getLocation.
  4. Do not retry — NonTransientException indicates retrying will keep failing until config changes.

Example fix

// before — bucket name unset, NPE thrown, wrapped as NonTransientException
// after
conductor.payload-storage.s3.bucket=my-payload-bucket
conductor.payload-storage.s3.region=us-east-1
Defensive patterns

Strategy: validation

Validate before calling

import org.apache.commons.lang3.StringUtils;
if (StringUtils.isBlank(bucketName)) {
    throw new IllegalStateException("conductor.payload-storage.s3.bucket is not configured");
}
if (StringUtils.isBlank(path)) {
    throw new IllegalArgumentException("path is required for getLocation");
}
if (signatureDuration == null || signatureDuration.isNegative()) {
    throw new IllegalStateException("signatureDuration is invalid: " + signatureDuration);
}

Try / catch

try {
    return storage.getLocation(operation, payloadType, path);
} catch (NonTransientException e) {
    // Read chained cause (often NPE on bucket/key) — fix config, do not retry
    log.error("Non-transient S3 presign failure: {}", e.getCause(), e);
    throw e;
}

Prevention

When it happens

Trigger: NullPointerException or IllegalStateException during request building (e.g. null bucket name, null objectKey), an invalid signatureDuration, or a misconfigured S3Presigner. Falls through the SdkException catch into the generic Exception catch.

Common situations: bucketName property unset (null) so the builder throws; signatureDuration misconfigured; an empty path producing an invalid key; S3Presigner not initialized correctly.

Related errors


AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14). Data as JSON: /api/errors/56eb904bffebe947. Report an issue: GitHub.