Skip to main content

AWS S3 Adapter

Three nodes for moving messages through S3 or any S3-compatible object store:

NodePalette groupWhat it does
S3 SourceSource CustomPolls a prefix, downloads new objects, pushes each one downstream
S3 DestinationTransform CustomUploads every message it receives as a new object
S3 ExplorerSource HTTPServes a page for listing and viewing objects in the bucket

Part of the Linkiir Adapters package — see requesting the package.

bucket → S3 Source → your workflow → S3 Destination → bucket

Before you start

Collect:

  • The region and bucket name.
  • An access key ID and secret access key for an IAM user or role with access to that bucket.

The identity needs these actions on the target bucket:

{
"Effect": "Allow",
"Action": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:ListBucket"],
"Resource": [
"arn:aws:s3:::your-bucket-name",
"arn:aws:s3:::your-bucket-name/*"
]
}
PlaceholderReplace with
your-bucket-nameThe name of your bucket, in both entries

s3:ListBucket applies to the bucket itself, the other three to the objects inside it. Drop s3:DeleteObject if you leave Delete After Download off, and drop s3:PutObject if you only ever read.

Set it up

  1. Open each S3 node in the Workflow Builder, click Edit, and enter the connection fields:

    FieldValue
    RegionThe bucket's region, for example us-east-1
    Bucket NameThe bucket to connect to
    Access KeyThe IAM access key ID
    Secret KeyThe IAM secret access key

    Region matters beyond routing: it is part of how each request is signed, so a mismatch fails even when the bucket name is right.

  2. Configure the behavior fields for the node you are using, from the tables below.

  3. Leave Live Mode off — the S3 nodes ship that way — and start the node. It builds and signs each request and logs it without sending anything.

  4. Turn Live Mode on when the log looks right.

Talking to an S3-compatible service

Set Endpoint Override to point the same nodes at MinIO, LocalStack, Backblaze B2, Cloudflare R2, or another S3-compatible API. Leave it empty for AWS. For a service with a self-signed certificate, and only on a local test service, turn Verify TLS off.

Configuration reference

Shared connection fields

FieldTypeDefaultPurpose
Regionstring(empty)Bucket region. Part of the request signature
Bucket Namestring(empty)Bucket to connect to
Access Keypassword(empty)IAM access key ID
Secret Keypassword(empty)IAM secret access key
Endpoint Overridestring(empty)Base URL of an S3-compatible service. Empty means AWS
Verify TLSbooltrueVerify the endpoint's TLS certificate
Live ModeboolfalseOff signs and logs the request without sending it

S3 Source

FieldTypeDefaultPurpose
Intervalnumber60000Milliseconds between polls
Prefixstringincoming/Key prefix to watch
Minimum Object Agenumber60Seconds an object must exist before it is picked up
Max Objects Per Pollnumber10Cap on objects handled in one cycle
Delete After DownloadbooltrueRemove the object from the bucket after a successful push
Why objects must age

An object being written is visible in a listing before the write finishes. Minimum Object Age makes the poller ignore anything newer than the age you set, so it never downloads half a file. Lower it only when you know the writer uploads atomically.

S3 Destination

FieldTypeDefaultPurpose
Key Prefixstringincoming/Prepended to every object key
Key NaminglistTimestamp + GUIDHow the unique part of the key is generated
Key ExtensionstringjsonFile extension, without the dot
Content Typestringapplication/jsonContent type stored with the object
Key Naming optionResultTrade-off
Timestamp + GUIDSorts chronologically and never collidesLongest keys
TimestampSorts chronologicallyTwo messages in the same second collide
GUIDNever collidesNo ordering

S3 Explorer

FieldTypeDefaultPurpose
Route Pathstring(supplied)The URL path the page is served on
Allowed Prefixstring(supplied)The viewer refuses any key outside this prefix
Max View Bytesnumber256 KBCap on the size of an object the page will display
The Explorer page has no authentication

Anyone who can reach the node's HTTP port can read every object under Allowed Prefix. Use it on a local or isolated network for setup and demonstration, and do not expose it from a production installation or through a public endpoint. Allowed Prefix and Max View Bytes limit the blast radius; they are not access control. See Security.

Verify it worked

  • With Live Mode off, the node logs the request it would have sent, including the signed key and bucket.
  • Upload a file into the source prefix, wait for Minimum Object Age to pass, and the source node's next poll pushes it and logs the key.
  • Send a message through the destination node and the object appears in the bucket under Key Prefix.

If it didn't work

SymptomCauseFix
403 AccessDeniedWrong credentials, or the IAM identity lacks a required actionVerify the keys; grant GetObject, PutObject, DeleteObject, ListBucket
403 SignatureDoesNotMatchThe secret key has a typo or trailing whitespaceRe-enter Secret Key cleanly
404 NoSuchBucketBucket name or region is wrongBoth must match — region is part of the signature
failed to decrypt fieldThe project was imported to a different installationRe-enter Access Key and Secret Key on this installation
Poller finds nothingObjects are younger than Minimum Object Age, or Prefix does not match where they landWait for the age gate; check the prefix
Objects remain after downloadListings take a moment to catch up, or Delete After Download is offRe-check shortly after; confirm the field
Explorer page lists nothingNothing in the bucket under Allowed PrefixUpload something first

Next