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
| Operation | What it does | IAM action |
|---|---|---|
getObject | Download an object | s3:GetObject (plus s3:GetObjectVersion for a specific version) |
headObject | Get object metadata | s3:GetObject — HEAD is authorized as a read of the object |
getObjectAttributes | Get object attributes | s3:GetObjectAttributes |
listObjects | List objects | s3:ListBucket — granted on the BUCKET, not on the objects |
listObjectVersions | List object versions | s3:ListBucketVersions |
getSignedUrl | Create a presigned URL | the 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
| Operation | What it does | IAM action |
|---|---|---|
putObject | Upload an object | s3:PutObject (plus s3:PutObjectAcl to set an ACL and s3:PutObjectTagging to set tags in the same call) |
copyObject | Copy an object | s3:GetObject on the source and s3:PutObject on the destination |
deleteObject | Delete an object | s3:DeleteObject (plus s3:DeleteObjectVersion for a specific version) |
deleteObjects | Delete many objects | s3:DeleteObject on every key in the batch |
restoreObject | Restore from Glacier | s3:RestoreObject |
Object tags, permissions and lock
| Operation | What it does | IAM action |
|---|---|---|
getObjectTagging | Get object tags | s3:GetObjectTagging |
putObjectTagging | Set object tags | s3:PutObjectTagging |
deleteObjectTagging | Remove object tags | s3:DeleteObjectTagging |
getObjectAcl | Get object ACL | s3:GetObjectAcl |
putObjectAcl | Set object ACL | s3:PutObjectAcl |
getObjectLegalHold | Get legal hold | s3:GetObjectLegalHold |
putObjectLegalHold | Set legal hold | s3:PutObjectLegalHold |
getObjectRetention | Get retention | s3:GetObjectRetention |
putObjectRetention | Set retention | s3:PutObjectRetention (plus s3:BypassGovernanceRetention to shorten a GOVERNANCE retention) |
Object annotations
| Operation | What it does | IAM action |
|---|---|---|
putObjectAnnotation | Attach an annotation | s3:PutObjectAnnotation |
getObjectAnnotation | Read an annotation | s3:GetObjectAnnotation |
listObjectAnnotations | List annotations | s3:ListObjectAnnotations |
deleteObjectAnnotation | Delete an annotation | s3:DeleteObjectAnnotation |
Large uploads (multipart)
| Operation | What it does | IAM action |
|---|---|---|
createMultipartUpload | Start a multipart upload | s3:PutObject |
uploadPart | Upload a part | s3:PutObject |
uploadPartCopy | Copy a range into a part | s3:GetObject on the source and s3:PutObject on the target |
completeMultipartUpload | Finish a multipart upload | s3:PutObject |
abortMultipartUpload | Abort a multipart upload | s3:AbortMultipartUpload |
listMultipartUploads | List multipart uploads | s3:ListBucketMultipartUploads |
listParts | List uploaded parts | s3:ListMultipartUploadParts |
Buckets
| Operation | What it does | IAM action |
|---|---|---|
listBuckets | List buckets | s3:ListAllMyBuckets — granted on arn:aws:s3:::* , not a bucket |
headBucket | Check a bucket exists | s3:ListBucket |
createBucket | Create a bucket | s3:CreateBucket |
deleteBucket | Delete an empty bucket | s3:DeleteBucket |
getBucketLocation | Get a bucket's region | s3:GetBucketLocation |
getBucketVersioning | Get versioning | s3:GetBucketVersioning |
putBucketVersioning | Set versioning | s3:PutBucketVersioning |
getBucketTagging | Get bucket tags | s3:GetBucketTagging |
putBucketTagging | Set bucket tags | s3:PutBucketTagging |
deleteBucketTagging | Remove bucket tags | s3:PutBucketTagging — removal is authorized as a write |
Bucket CORS, lifecycle and encryption
| Operation | What it does | IAM action |
|---|---|---|
getBucketCors | Get CORS rules | s3:GetBucketCORS |
putBucketCors | Set CORS rules | s3:PutBucketCORS |
deleteBucketCors | Remove CORS rules | s3:PutBucketCORS — removal is authorized as a write |
getBucketLifecycleConfiguration | Get lifecycle rules | s3:GetLifecycleConfiguration |
putBucketLifecycleConfiguration | Set lifecycle rules | s3:PutLifecycleConfiguration |
getBucketEncryption | Get default encryption | s3: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:
| Field | Value | Notes |
|---|---|---|
key | invoices/{{ myTrigger.invoiceId }}.pdf | The object to hand over; a . or .. segment here is refused rather than silently addressing a different object |
presignMethod | GET | GET for a download. Choose PUT instead to hand someone an UPLOAD link - the node could only ever presign GET before SW20.4 |
expiresIn | 86400 | Seconds. 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 |
responseContentDisposition | attachment; 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.