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
- Retry the operation — TransientException signals a retriable failure; use exponential backoff.
- Verify the conductor instance's AWS credentials/role have s3:GetObject and s3:PutObject on the configured bucket.
- 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
- Grant the IAM role s3:GetObject and s3:PutObject on the payload bucket.
- Keep credentials/STS sessions valid long enough for presign + use windows.
- Confirm region/endpoint match the bucket.
- Wrap getLocation in a bounded retry for TransientException only.
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
- Error uploading to S3 - path:%s, payloadSize: %d
- Error downloading from S3 - path:%s
- Error generating presigned URL
- Failed to get workflow: %s
- Error creating workflow definition: %s/%d
AI-assisted analysis of conductor-oss/conductor@cf7c3e4a8a (2026-08-14).
Data as JSON: /api/errors/cd618a17df25a0a0.
Report an issue: GitHub.