Docs / Strand / connectors/aws-s3
AWS S3
Direction: Read / Write | Type: aws.s3
Amazon Simple Storage Service connector for reading and writing objects to S3 buckets.
Required Permissions
The IAM user or role must have the following permissions:
| Operation | Required IAM Permissions |
|---|---|
put_object |
s3:PutObject |
get_object |
s3:GetObject |
list_objects |
s3:ListBucket |
Tip: Scope permissions to specific bucket ARNs (e.g.,arn:aws:s3:::my-bucketfor bucket-level andarn:aws:s3:::my-bucket/*for object-level actions) to follow the principle of least privilege.
Operations
| Operation | Direction | Description |
|---|---|---|
put_object |
Write | Upload data to an S3 bucket |
get_object |
Read | Read an object's contents into the workflow as JSON |
list_objects |
Read | List objects in a bucket |
The get_object operation reads the object content into the node's output payload as JSON. It does not download or save files to disk.
Connector Configuration
| Field | Required | Default | Description |
|---|---|---|---|
| Authentication Type | No | api_key |
api_key for explicit credentials, role to use the host's IAM role / default credential chain |
| Region | Yes | - | AWS region code (e.g., us-east-1, eu-west-1) |
| Endpoint URL | No | - | Custom endpoint for an S3-compatible store — MinIO, Cloudflare R2, Backblaze B2, Wasabi — or an AWS VPC endpoint. Leave empty for AWS. Path-style addressing is used automatically when set. |
| Access Key ID | Conditional | - | AWS access key (encrypted). Required when Authentication Type is api_key |
| Secret Access Key | Conditional | - | AWS secret key (encrypted). Required when Authentication Type is api_key |
| Role ARN | Conditional | - | Your IAM role ARN for cross-account access via STS AssumeRole. Required when Authentication Type is role. The role must trust the Tendrl AWS account. |
| External ID | No | - | External ID for STS AssumeRole (encrypted). Recommended with role auth to prevent confused-deputy attacks. |
| Bucket | No | - | Default S3 bucket name (can be overridden at node level) |
With role authentication you do not store static access keys; Strand authenticates using the host's default credential chain (EC2 instance profile, ECS task role, or environment credentials). You must still provide a Role ARN when creating the connector (the role should trust the Tendrl AWS account); an optional External ID hardens the trust policy.
S3-compatible storage
The connector speaks the S3 API, so it works against anything that does. Set Endpoint URL to your provider's endpoint and leave the rest of the fields as they are — the access key, secret and bucket all mean the same thing.
| Provider | Endpoint URL |
|---|---|
| MinIO | https://minio.example.com (your own host) |
| Cloudflare R2 | https://<account-id>.r2.cloudflarestorage.com |
| Backblaze B2 | https://s3.<region>.backblazeb2.com |
| Wasabi | https://s3.<region>.wasabisys.com |
Region still has to be set — most S3-compatible providers accept us-east-1 as a placeholder — and path-style addressing is applied automatically, which is what these providers expect.
Test Connection reports that it reached the endpoint but does not verify your credentials against it. S3-compatible providers do not implement AWS STS, which is what the credential check uses. Run the connector once to confirm the keys work.
Node Configuration
| Field | Required | Description |
|---|---|---|
| Operation | Yes | put_object, get_object, or list_objects |
| Bucket | No | S3 bucket name (overrides connector default) |
| Key | Depends | Object key/path. Required for put_object and get_object. Supports Jinja2. |
Output
put_object
{
"success": true,
"status": "uploaded",
"data": {
"bucket": "my-bucket",
"key": "path/to/file.json",
"etag": "abc123"
},
"service": "aws.s3",
"operation": "put_object"
}
get_object
{
"success": true,
"status": "downloaded",
"data": {
"bucket": "my-bucket",
"key": "path/to/file.json",
"content": {"your": "data"}
},
"service": "aws.s3",
"operation": "get_object"
}
Access the content in subsequent nodes:
{{ payload.data.content }}
{{ payload.data.content.your }}
Example
Connector Setup:
{
"region": "us-east-1",
"access_key_id": "AKIAIOSFODNN7EXAMPLE",
"secret_access_key": "wJalrXUtnFEMI/K7MDENG...",
"bucket": "my-data-bucket"
}
Connector Setup (role-based):
{
"auth_type": "role",
"region": "us-east-1",
"role_arn": "arn:aws:iam::123456789012:role/strand-access",
"bucket": "my-data-bucket"
}
Node Configuration (upload):
- Operation:
put_object - Key:
events/{{ meta.received_at }}/{{ payload.id }}.json
Node Configuration (read):
- Operation:
get_object - Key:
config/settings.json
Tendrl