conductor-oss/conductor · error · TransientException

Error communicating with S3 - operation:%s, payloadType: %s,

Error message

Error communicating with S3 - operation:%s, payloadType: %s, path: %s

What it means

Thrown as TransientException (wrapping an SdkException) by S3PayloadStorage.getLocation when an AWS SDK call during presigned-URL generation fails with an SdkException. SdkException covers transport/credential/throttling/5xx-class failures that are typically retried by the SDK but can still propagate; conductor marks them Transient so callers can retry. The message embeds operation (READ/WRITE), payloadType, and path for diagnostics.

Source

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

                GetObjectPresignRequest presignRequest =
                        GetObjectPresignRequest.builder()
                                .signatureDuration(signatureDuration)
                                .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) {

View on GitHub (pinned to cf7c3e4a8a)

Solutions

  1. Retry the operation — TransientException signals a retriable failure; use exponential backoff.
  2. Verify the conductor instance's AWS credentials/role have s3:GetObject and s3:PutObject on the configured bucket.
  3. Check the region/endpoint configuration matches the bucket.

Example fix

// before — single attempt that propagates TransientException
String uri = storage.getLocation(Operation.WRITE, PayloadType.WORKFLOW_INPUT, key).getUri();
// after — retry with backoff for TransientException
RetryUtils.retryOn(TransientException.class, 5, Duration.ofMillis(200),
    () -> storage.getLocation(Operation.WRITE, PayloadType.WORKFLOW_INPUT, key).getUri());
Defensive patterns

Strategy: retry

Validate before calling

import com.netflix.conductor.common.run.ExternalStorageLocation;
import software.amazon.awssdk.services.s3.model.S3Exception;
// Pre-flight: validate inputs that, if null, would yield NonTransient instead
if (StringUtils.isBlank(bucketName) || StringUtils.isBlank(path)) {
    throw new IllegalArgumentException("bucketName and path are required for getLocation");
}

Try / catch

// TransientException => retriable; retry with exponential backoff
int maxAttempts = 5;
for (int attempt = 1; attempt <= maxAttempts; attempt++) {
    try {
        return storage.getLocation(operation, payloadType, path);
    } catch (TransientException e) {
        if (attempt == maxAttempts) throw e;
        Thread.sleep(Math.min(1000L * attempt, 5000L));
    } catch (NonTransientException e) {
        throw e; // config error — do not retry
    }
}

Prevention

When it happens

Trigger: Network error reaching S3, expired/invalid AWS credentials, IAM denial on the bucket/object, S3 throttling (SlowDown), or a 5xx from S3 during presignPutObject/presignGetObject. Caught in the SdkException handler of getLocation.

Common situations: IAM role without s3:GetObject/s3:PutObject on the payload bucket; transient network blip; S3 regional outage/throttling; STS credentials expired before the presign call; misconfigured region/endpoint.

Related errors


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