Pipory
Node reference

AWS S3

AWS S3 node reference - all 47 operations, the credential it needs, and a worked example.

Calls the Amazon S3 REST API with an IAM access key across 47 operations, signed with SigV4. Objects: upload from text or base64 (with content type, cache headers, storage class, encryption, custom metadata and tags), download as text or base64 with byte ranges and conditional requests, head, get attributes, server-side copy, delete one key or one version, delete up to 1000 in a single batch, list a prefix with delimiters and continuation tokens, list every version, and restore from Glacier. Presigned URLs perform GET, PUT, HEAD or DELETE - so a workflow can hand someone an UPLOAD link, not only a download link - capped at SigV4's seven-day ceiling. Also object tags, ACLs, Object Lock retention and legal holds, the four S3 Annotations operations that attach model output to an object, the full multipart family for large files, bucket create/delete/list/head/location/versioning/tagging, and bucket CORS, lifecycle and default-encryption configuration. An object key containing a . or .. segment is refused rather than silently normalized onto a different object, and every XML request body escapes the values it carries. A custom endpoint on the credential points the same node at S3-compatible storage such as MinIO, Wasabi, DigitalOcean Spaces or Backblaze B2. No trigger node: S3 event notifications can only be delivered to SNS, SQS, Lambda or EventBridge, never to an arbitrary HTTPS callback.

Credential: AWS IAM access key (accessKeyId, secretAccessKey, region, bucket) - see Credentials.

IAM actions

Each operation below lists the IAM action it needs. IAM actions are allowed on the IAM identity behind the access key, and not denied by the bucket policy. S3 has NO OAuth and no scopes - the equivalent question is which IAM action the key may perform on which resource, which is exactly what an AccessDenied error is asking for. Two of them are commonly missed: s3:ListBucket is granted on the BUCKET arn rather than on bucket/*, so a policy that only names the objects lets you read a key you already know and never lets you list; and s3:ListAllMyBuckets is granted on arn:aws:s3:::*. If a run fails with a permission error, the node names the missing IAM action in the error - grant it and re-run; you do not need to rebuild the workflow.

Operations (47)

Objects — read

OperationWhat it doesIAM action
getObjectDownload an objects3:GetObject (plus s3:GetObjectVersion for a specific version)
headObjectGet object metadatas3:GetObject — HEAD is authorized as a read of the object
getObjectAttributesGet object attributess3:GetObjectAttributes
listObjectsList objectss3:ListBucket — granted on the BUCKET, not on the objects
listObjectVersionsList object versionss3:ListBucketVersions
getSignedUrlCreate a presigned URLthe action the link itself performs — s3:GetObject to presign a download, s3:PutObject to presign an upload. The link carries the signer's own permissions

Objects — write

OperationWhat it doesIAM action
putObjectUpload an objects3:PutObject (plus s3:PutObjectAcl to set an ACL and s3:PutObjectTagging to set tags in the same call)
copyObjectCopy an objects3:GetObject on the source and s3:PutObject on the destination
deleteObjectDelete an objects3:DeleteObject (plus s3:DeleteObjectVersion for a specific version)
deleteObjectsDelete many objectss3:DeleteObject on every key in the batch
restoreObjectRestore from Glaciers3:RestoreObject

Object tags, permissions and lock

OperationWhat it doesIAM action
getObjectTaggingGet object tagss3:GetObjectTagging
putObjectTaggingSet object tagss3:PutObjectTagging
deleteObjectTaggingRemove object tagss3:DeleteObjectTagging
getObjectAclGet object ACLs3:GetObjectAcl
putObjectAclSet object ACLs3:PutObjectAcl
getObjectLegalHoldGet legal holds3:GetObjectLegalHold
putObjectLegalHoldSet legal holds3:PutObjectLegalHold
getObjectRetentionGet retentions3:GetObjectRetention
putObjectRetentionSet retentions3:PutObjectRetention (plus s3:BypassGovernanceRetention to shorten a GOVERNANCE retention)

Object annotations

OperationWhat it doesIAM action
putObjectAnnotationAttach an annotations3:PutObjectAnnotation
getObjectAnnotationRead an annotations3:GetObjectAnnotation
listObjectAnnotationsList annotationss3:ListObjectAnnotations
deleteObjectAnnotationDelete an annotations3:DeleteObjectAnnotation

Large uploads (multipart)

OperationWhat it doesIAM action
createMultipartUploadStart a multipart uploads3:PutObject
uploadPartUpload a parts3:PutObject
uploadPartCopyCopy a range into a parts3:GetObject on the source and s3:PutObject on the target
completeMultipartUploadFinish a multipart uploads3:PutObject
abortMultipartUploadAbort a multipart uploads3:AbortMultipartUpload
listMultipartUploadsList multipart uploadss3:ListBucketMultipartUploads
listPartsList uploaded partss3:ListMultipartUploadParts

Buckets

OperationWhat it doesIAM action
listBucketsList bucketss3:ListAllMyBuckets — granted on arn:aws:s3:::* , not a bucket
headBucketCheck a bucket existss3:ListBucket
createBucketCreate a buckets3:CreateBucket
deleteBucketDelete an empty buckets3:DeleteBucket
getBucketLocationGet a bucket's regions3:GetBucketLocation
getBucketVersioningGet versionings3:GetBucketVersioning
putBucketVersioningSet versionings3:PutBucketVersioning
getBucketTaggingGet bucket tagss3:GetBucketTagging
putBucketTaggingSet bucket tagss3:PutBucketTagging
deleteBucketTaggingRemove bucket tagss3:PutBucketTagging — removal is authorized as a write

Bucket CORS, lifecycle and encryption

OperationWhat it doesIAM action
getBucketCorsGet CORS ruless3:GetBucketCORS
putBucketCorsSet CORS ruless3:PutBucketCORS
deleteBucketCorsRemove CORS ruless3:PutBucketCORS — removal is authorized as a write
getBucketLifecycleConfigurationGet lifecycle ruless3:GetLifecycleConfiguration
putBucketLifecycleConfigurationSet lifecycle ruless3:PutLifecycleConfiguration
getBucketEncryptionGet default encryptions3:GetEncryptionConfiguration

Example

Hand a customer a download link that expires, without making the file public

A workflow generates an invoice PDF and needs to get it to one customer. Making the object public exposes it to anyone who guesses the key, and emailing the bytes does not scale. A presigned URL is a link that carries its own time-limited authorization: it works for exactly as long as you say, for exactly that one object, and needs no AWS account at the other end.

Set Operation to getSignedUrl, then fill in:

FieldValueNotes
keyinvoices/{{ myTrigger.invoiceId }}.pdfThe object to hand over; a . or .. segment here is refused rather than silently addressing a different object
presignMethodGETGET for a download. Choose PUT instead to hand someone an UPLOAD link - the node could only ever presign GET before SW20.4
expiresIn86400Seconds. SigV4's ceiling is 604800 (7 days); a larger number is refused here rather than producing a link that 403s when the customer clicks it
responseContentDispositionattachment; filename="invoice-{{ myTrigger.invoiceId }}.pdf"Makes the browser save the file under a friendly name instead of displaying it under the key

Sets {{link.url}} (the signed link, ready to paste into an email node), plus {{link.method}}, {{link.expiresIn}}, {{link.bucket}} and {{link.key}}. No request is sent to S3 - the signature is computed locally - so this costs nothing and cannot fail on a missing object. The link stops working when it expires, or sooner if the access key behind it is revoked.