Portal Community

When to Use

Configuration

Connection

FieldRequiredDescription
accessKeyIdRequiredAWS Access Key ID. Store in BizFirst Credentials Manager.
secretKeyRequiredAWS Secret Access Key. Never log or expose.
sessionTokenOptionalSTS session token for temporary credentials.
regionRequiredAWS region of the source bucket.

Operation Fields

FieldRequiredDescription
bucketNameRequiredName of the S3 bucket containing the object.
objectKeyRequiredFull key path of the object to download (e.g. reports/2026/05/summary.pdf).
versionIdOptionalSpecific version ID to download. Omit to retrieve the latest version. Only applicable to versioned buckets.
downloadPathOptionalLocal file system path to save the downloaded file (e.g. /tmp/report.pdf). If omitted, the content is held in memory and passed downstream.
rangeStartOptionalStarting byte offset for a range request. Default: 0 (beginning of file).
rangeEndOptionalEnding byte offset for a range request. Default: 0 (means full file — no range applied).

Sample Configuration

{
  "connection": {
    "accessKeyId": "{{ $credentials.s3_prod.accessKeyId }}",
    "secretKey": "{{ $credentials.s3_prod.secretKey }}",
    "region": "us-east-1"
  },
  "operation": {
    "resource": "object",
    "action": "download",
    "bucketName": "acme-prod-reports",
    "objectKey": "{{ $node.GetInvoiceRecord.output.s3Key }}",
    "downloadPath": "/tmp/invoice-{{ $node.GetInvoiceRecord.output.invoiceId }}.pdf"
  }
}

Validation Errors

Error CodeCause & Resolution
NoSuchKeyThe specified objectKey does not exist in the bucket. Verify the key using bucket/search before downloading.
NoSuchVersionThe specified versionId does not exist. The version may have been deleted. Omit versionId to download the latest version.
AccessDeniedThe IAM identity lacks s3:GetObject permission. Update the IAM policy to include s3:GetObject scoped to the bucket ARN.
InvalidRangeThe byte range (rangeStartrangeEnd) is invalid (e.g. start exceeds file size). Verify range values against the known object size.

Output

Success Port

FieldTypeDescription
statusstringsuccess on successful download.
errorCodestringEmpty string on success.
bucketNamestringSource bucket name.
objectKeystringKey of the downloaded object.
downloadPathstringLocal path where the file was saved (if downloadPath was specified).
sizelongSize of the downloaded object in bytes.
eTagstringETag of the object — use for integrity verification.
downloadedAtstringISO 8601 timestamp of the download.

Error Port

On failure, activates with errorCode, errorMessage, and httpStatusCode. Handle NoSuchKey to trigger fallback generation or alerting when expected files are missing.

Sample Output

{
  "status": "success",
  "errorCode": "",
  "bucketName": "acme-prod-reports",
  "objectKey": "monthly/2026/05/billing-summary-2026-05.pdf",
  "downloadPath": "/tmp/invoice-INV-20260526.pdf",
  "size": 204800,
  "eTag": "\"d41d8cd98f00b204e9800998ecf8427e\"",
  "downloadedAt": "2026-05-26T11:45:22Z"
}

Expression Reference

ExpressionResult
{{ $node.DownloadInvoice.output.downloadPath }}Local file path — pass to an email attachment or document processing node.
{{ $node.DownloadInvoice.output.size }}File size in bytes — validate before processing large files.
{{ $node.DownloadInvoice.output.eTag }}ETag — compare against stored value to verify the correct version was downloaded.
{{ $node.DownloadInvoice.output.downloadedAt }}Download timestamp — log in the workflow execution audit trail.
{{ $node.DownloadInvoice.output.objectKey }}Confirm which S3 key was retrieved in log/notification messages.

Node Policies & GuardRails

Policy AreaRecommendation
Credential StorageStore credentials in BizFirst Credentials Manager. Never hardcode.
IAM PermissionsGrant s3:GetObject scoped to the specific bucket ARN and key prefix. Add s3:GetObjectVersion if downloading versioned objects.
Key ValidationAlways validate the object key expression before download — prevent downloading the wrong file by resolving keys from trusted workflow variable sources.
Temp File CleanupDelete temporary files from downloadPath after processing completes to prevent sensitive data accumulation on the workflow executor's file system.
Versioned DownloadsSpecify versionId when reproducibility matters (e.g. legal holds, audit reviews). Omit for general-purpose downloads to always get the latest version.
Range Request UseUse byte-range requests (rangeStart/rangeEnd) to extract headers or metadata from large binary files without downloading the full object.
ETag VerificationCompare the downloaded object's eTag against a stored expected value to detect unintended overwrites or corruption.
Sensitive Data HandlingDo not log downloadPath contents or pass file data through notification nodes that may store or display content.

Examples

Example 1: Invoice Retrieval and Email Delivery

A customer requests a copy of their invoice. The workflow retrieves the stored PDF from S3 and delivers it as an email attachment.

// Node: LookupInvoice (Database → returns s3Key)
// Node: DownloadInvoicePDF (S3 — object/download)
{
  "bucketName": "acme-billing-archive",
  "objectKey": "{{ $node.LookupInvoice.output.s3Key }}",
  "downloadPath": "/tmp/invoice-{{ $node.LookupInvoice.output.invoiceId }}.pdf"
}
// Node: EmailInvoice (EmailSmtp — send with attachment downloadPath)

Example 2: Runtime Configuration Fetch

At workflow start, fetch the current environment configuration JSON from S3 and parse it for use throughout the workflow.

// Node: FetchConfig (S3 — object/download)
{
  "bucketName": "acme-workflow-configs",
  "objectKey": "environments/{{ $env.DEPLOY_ENV }}/config.json"
}
// Node: ParseConfig (JSON Transform → parse downloadPath contents)
// Sets $workflow.config = parsed JSON object

Example 3: Versioned Document Retrieval for Legal Review

A legal hold workflow retrieves a specific version of a contract document as it existed on a particular date.

// Node: GetSpecificVersion (S3 — object/download)
{
  "bucketName": "acme-contracts",
  "objectKey": "contracts/{{ $node.HoldRequest.output.contractId }}.pdf",
  "versionId": "{{ $node.HoldRequest.output.requiredVersionId }}",
  "downloadPath": "/tmp/hold-{{ $node.HoldRequest.output.contractId }}.pdf"
}
// Node: LogAccess (Jira — create issue for legal tracking)