Skip to main content
This guide covers setting up Hybrid VPC with AWS S3 as your storage backend. Reducto assumes an IAM role in your AWS account to read and write documents.

Prerequisites

  • AWS account(s): Can use separate accounts for development, staging, and production
  • Terraform 1.2+: For infrastructure provisioning
  • Values from Reducto (provided during onboarding):
    • Principal ARNs for Reducto’s compute services
    • ExternalId for secure role assumption
    • Endpoint Service name and region (if using PrivateLink)
  • If using PrivateLink: Send Reducto every AWS account ID that will create a VPC endpoint, including separate dev, staging, production, or organizational accounts. Reducto must allow-list each account on the VPC Endpoint Service before endpoint creation succeeds.

Principal ARNs

Use the appropriate ARNs for your deployment region:

VPC Endpoint Service Configuration

If using PrivateLink, use the endpoint service closest to your region:
VPC endpoints support cross-region connections. You can create a VPC endpoint in your region that connects to any Reducto endpoint service above, regardless of your VPC’s region.
PrivateLink endpoint creation only works after Reducto has allow-listed the AWS account that creates the endpoint. If your organization uses separate AWS accounts for dev, staging, production, or separate business units, provide each account ID before setup.

Setup

1

Clone the infrastructure repository

2

Create terraform.tfvars

3

Initialize and apply

4

Share outputs with Reducto

Example output:

Components provisioned

Access Modes

For private-only API access without traversing the public internet:
1

Request PrivateLink enablement

Provide the following to your Reducto team:
  • AWS Account ID(s): Every account where you’ll create a VPC endpoint, including dev, staging, production, or separate organizational accounts
  • Region(s): Where you need PrivateLink connectivity
Reducto will add each account root as an allowed principal on the VPC Endpoint Service. Wait for Reducto’s confirmation before you create the endpoint.
2

Configure VPC endpoint

Add to your Terraform configuration:
3

Configure your client

Use the region-specific DNS name matching your VPC endpoint:
You must enable private DNS resolution in your VPC endpoint configuration. This is required for the DNS alias to resolve correctly within your VPC.

Validation Checklist

After terraform apply, verify your setup:
  • Terraform apply succeeded without errors
  • S3 bucket has lifecycle rule:
  • S3 bucket blocks public access: All public access settings should be blocked
  • IAM role trust policy is correct: Verify Reducto principals and ExternalId condition
  • If PrivateLink enabled: Reducto has confirmed that every endpoint-creating AWS account is allow-listed
  • If PrivateLink enabled: Endpoint status shows “available”
  • Smoke test: Run a small Reducto job and verify objects appear in the bucket

Troubleshooting

VPC endpoint service does not exist

Problem: AWS returns InvalidServiceName or says the VPC Endpoint Service does not exist, but the service name and region match the table above. Solution: Send Reducto the AWS account ID for the account creating the endpoint. Reducto will allow-list the account root on the endpoint service. After Reducto confirms the change, retry endpoint creation. Repeat this for each account that will create an endpoint.

Multi-Region Setup

Deploy separate infrastructure in each region with region-specific Principal ARNs:
Each region requires its own IAM role with the region-specific Principal ARNs from the table above.

Multi-Environment Setup

For organizations with separate AWS accounts for dev/staging/prod:
Each environment should use a separate Terraform state file and its own S3 bucket and IAM role. If the environments share the same Reducto org, Reducto can register them as named Hybrid VPC environments instead of separate orgs.

Multiple Buckets for One Reducto Org

For workflows that need client-specific buckets under one Reducto organization, register each bucket/role pair as a named environment:
Then select the environment on each request:

Security

ExternalId protection

The ExternalId in the IAM role trust policy prevents confused deputy attacks. Only requests with the correct ExternalId can assume the role.

Principle of least privilege

The IAM role grants only the permissions necessary for Reducto operations:
  • s3:GetObject — Read documents
  • s3:PutObject — Write results and artifacts
  • s3:DeleteObject — Clean up temporary files
  • s3:ListBucket — List objects for batch operations
  • s3:AbortMultipartUpload, s3:ListMultipartUploadParts — Handle large file uploads

Automatic data cleanup

Objects expire automatically based on the lifecycle configuration (default: 24 hours). This ensures no long-term data persistence, compliance with retention policies, and automatic cleanup of intermediate artifacts.