Skip to main content
Version: 3.0 (next)

AWS S3 Nodes

Amazon S3 and S3-compatible stores (MinIO, Ceph, Wasabi, …) hold the objects a plant produces and consumes: exports, reports, model artifacts, archives. MaestroHub provides two dedicated nodes for fetching an object into a pipeline and writing one out, against the bucket and prefix of the connection.

Configuration Quick Reference​

FieldWhat you chooseDetails
ParametersConnection, Function, Function Parameters, Timeout OverrideSelect the connection profile, function, configure function parameters with expression support, and optionally override timeout.
SettingsDescription, Timeout (seconds), Retry on Timeout, Retry on Fail, On ErrorNode description, maximum execution time, retry behavior on timeout or failure, and error handling strategy. All execution settings default to pipeline-level values.

S3 Fetch Node​

Read one object. objectKey may be an exact key, a wildcard or regex pattern, or a template; versionId reads a specific version of a versioned bucket. When a pattern matches several objects, the function's When Several Objects Match setting picks one: the most recently modified (the default) or the one whose key sorts last. If the listing under the pattern's prefix holds more objects than the discovery limit, the node fails rather than choosing among part of them.

Function NamePurposeCommon Use Cases
Fetch ObjectRead the object at objectKey (optionally versionId, maxFileSizeMB, discoveryLimit)Daily report ingestion, picking up partner drops, hydrating a dataset

Output Structure​

{
"result": {
"data": "aWQsbmFtZSx2YWx1ZQoxLGFscGhhLDEwMAo...",
"metadata": {
"objectKey": "reports/orders.csv",
"fileName": "orders.csv",
"fileType": "csv",
"sizeBytes": 2048,
"discoveryPattern": "^reports/.*\\.csv$",
"selectedBy": "lastModified",
"matchCount": 3,
"contentType": "text/csv",
"etag": "\"9b2cf535f27731c974343645a3985328\"",
"lastModified": "2026-09-07T08:30:00Z",
"storageClass": "STANDARD"
}
},
"_metadata": { "success": true, "functionId": "<function-id>", "durationMs": 178, "timestamp": "2026-09-07T10:30:00Z" }
}
FieldTypeDescription
result.datastringThe object content, always base64-encoded — decode it downstream, or feed it to a File Extractor with Input Field result.data
result.metadata.objectKeystringThe key read — the resolved one when objectKey was a pattern
result.metadata.fileNamestringBasename of the key
result.metadata.fileTypestringExtension without the leading dot
result.metadata.sizeBytesnumberObject size in bytes
result.metadata.discoveryPatternstringThe pattern that resolved the key (only when objectKey was a pattern)
result.metadata.selectedBystringThe rule that picked the object among the matches: lastModified or name (only when objectKey was a pattern)
result.metadata.matchCountnumberHow many objects the pattern matched (only when objectKey was a pattern)
result.metadata.contentTypestringMIME content type (when S3 reports it)
result.metadata.etagstringObject ETag (when S3 reports it)
result.metadata.lastModifiedstringLast modification timestamp, RFC 3339 UTC (when S3 reports it)
result.metadata.versionIdstringThe version read (versioned buckets)
result.metadata.serverSideEncryptionstringEncryption at rest (AES256, aws:kms) when the object is encrypted
result.metadata.storageClassstringStorage class (when S3 reports it)

S3 Write Node​

Write one object from data (plain text or base64) to objectKey, with optional contentType, storageClass, serverSideEncryption, cacheControl, metadata and tags. With Overwrite Existing off, an existing key is kept and a timestamped variant is written instead. Generate Presigned URL adds a time-limited download link to the result.

Function NamePurposeCommon Use Cases
Write ObjectUpload data to objectKeyExporting pipeline results, publishing reports, archiving

Output Structure​

{
"result": {
"objectKey": "exports/orders.csv",
"bytesWritten": 4096,
"contentType": "text/csv",
"storageClass": "STANDARD",
"etag": "\"9b2cf535f27731c974343645a3985328\"",
"presignedUrl": "https://bucket.s3.amazonaws.com/exports/orders.csv?X-Amz-Signature=...",
"presignedUrlExpiry": 3600
},
"_metadata": { "success": true, "functionId": "<function-id>", "durationMs": 245, "timestamp": "2026-09-07T10:30:00Z" }
}
FieldTypeDescription
result.objectKeystringThe key written — a timestamped variant when the object existed and Overwrite Existing was off
result.bytesWrittennumberBytes uploaded
result.contentTypestringThe content type stored
result.storageClassstringThe storage class stored
result.etagstringThe object's ETag (when S3 reports it)
result.versionIdstringThe version S3 assigned (versioned buckets)
result.serverSideEncryptionstringThe encryption applied (when the object is encrypted at rest)
result.presignedUrlstringA presigned GET URL — only when Generate Presigned URL is on and signing succeeded
result.presignedUrlExpirynumberThe URL's lifetime in seconds — with result.presignedUrl
result.presignedUrlErrorstringWhy the presigned URL could not be made — only when it was requested and signing failed; the write itself succeeded

Common Use Cases​

  • Pick up a partner drop: a Schedule trigger → S3 Fetch with objectKey inbound/orders-*.csv → File Extractor (Input Field result.data) → downstream.
  • Publish a report: a SQL Query → Data Serializer (CSV) → S3 Write with objectKey {{ 'reports/' + ($execution.startedAt | date: 'YYYY-MM-DD') + '/orders.csv' }} and Generate Presigned URL on → a Slack or Teams message carrying {{ $node["S3 Write"].result.presignedUrl }}.

The call's own facts ride along under _metadata next to the four every connected node carries: $node["S3 Fetch"]._metadata.bucket names the bucket the call ran against and $node["S3 Fetch"]._metadata.method the operation (s3.fetch.object or s3.write.object).