Install
$ agentstack add skill-estuary-agent-skills-materialize-redshift-create ✓ scanned · ✓ verified — works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
About
Create Redshift Materialization
Create a Redshift materialization using flowctl to stream data from Estuary collections into Amazon Redshift tables.
Applies to: materialize-redshift (Redshift Provisioned and Serverless)
Step 0: Load Connector Documentation
Before proceeding, fetch the official connector docs for prerequisites, config reference, and setup instructions.
Load the docs page: https://docs.estuary.dev/reference/Connectors/materialization-connectors/amazon-redshift/
Use WebFetch to load this page. It covers:
- Prerequisites (Redshift cluster, S3 bucket, IAM credentials)
- Full config property reference
- SSH tunnel configuration
- Network access and IP allowlisting
Search Kapa for tribal knowledge (if the Estuary MCP is configured):
Search kapa ai knowledge sources for "materialize redshift common issues"
If Kapa MCP is not configured, the user can set it up: https://docs.estuary.dev/features/mcp-integration/
This skill provides the flowctl workflow and troubleshooting that docs don't cover.
Step 1: Gather Requirements
Before writing any YAML, ask the user:
- Redshift endpoint? — Cluster hostname and port (default: 5439)
- Database and schema? — Target database name, schema (default:
public) - S3 staging bucket? — Bucket name and region (same region as Redshift cluster is recommended for best performance)
- AWS credentials? — Access key ID and secret access key with S3 read/write
- Network path? — Direct connection (with IP allowlist) or SSH tunnel
- Non-default data plane? — Most users use the default. Ask if they need a non-default data plane.
- Source collections? — Which Estuary collections to materialize
- Hard deletes? — Off by default. Without it, deleted rows stay in Redshift marked with
_meta/op: 'd'. Enable to physically remove them. - Delta updates? — Off by default. Switches from one-row-per-key (standard merge) to append-only. Use for event logs or history tables.
- Sync schedule? — Controls how often batches are written to Redshift (default: 30 minutes,
0sfor real-time). Affects latency and compute cost.
Key constraints to communicate upfront:
- Best practice: one materialization per schema (multiple bindings, not multiple materializations)
- All identifiers are lowercase unless
enable_case_sensitive_identifieris enabled on the cluster - Maximum document size is 4 MB per document
Step 2: Find the Correct Connector Version
Always use the latest numbered version tag. Query the connector registry:
flowctl raw get --table connector_tags \
--query 'documentation_url=eq.https://go.estuary.dev/materialize-redshift' \
--query 'select=image_tag,documentation_url' \
--output yaml
Use the returned image_tag — never hardcode a version.
Step 3: Help User Complete Prerequisites
Walk the user through prerequisites from the docs loaded in Step 0:
- Redshift accessible — Cluster publicly accessible or SSH tunnel configured
- S3 bucket — Same region as Redshift cluster, for staging data
- IAM user — With read/write access to the S3 bucket
- Redshift user — With CREATE TABLE permissions on the target schema
Refer to the docs page for exact setup steps.
Step 4: Create the Spec File
Build flow.yaml using the config reference from the docs. Minimal required config:
materializations:
//materialize-redshift:
endpoint:
connector:
image: ghcr.io/estuary/materialize-redshift:
config:
address: ":5439"
user: ""
password: ""
database: ""
schema: "public"
awsAccessKeyId: ""
awsSecretAccessKey: ""
bucket: ""
region: ""
bucketPath: "estuary-staging"
bindings:
- source: /
resource:
table: ""
Important: Table names should be lowercase. The bucket field is just the bucket name — no s3:// prefix.
For SSH tunnel, add networkTunnel.sshForwarding block — see docs for full config.
Step 5: Publish
flowctl catalog publish --source flow.yaml --auto-approve
Step 6: Verify
# Check status
flowctl catalog status //materialize-redshift
# View logs
flowctl logs --task //materialize-redshift --since 5m | jq -c '{ts, message}'
Status progression:
PENDING— Normal for ~30 seconds during shard assignmentBACKFILLING— Initial data sync from collectionsOK— Running normally with real-time updates
Troubleshooting
"column does not exist" (SQLSTATE 42703)
Cause: Column was dropped or renamed directly in Redshift outside of Estuary
Fix: Avoid altering connector-created tables directly. If the schema drifted, you may need to drop the table and let the connector recreate it (trigger a backfill by incrementing backfill counter on the binding).
"cannot drop sort key column"
Cause: The connector tried to alter a table but can't drop a sort key column
Fix: If using always_drop_tables_on_backfill, disable it. Otherwise, manually drop and recreate the table.
OOM on Serverless
Cause: Query ran out of memory on Redshift Serverless with low RPU
Fix: Increase RPU (Redshift Processing Units) on the Serverless workgroup, or reduce the number of fields being materialized using field selection.
S3 timeout errors
Cause: Network or region mismatch between S3 bucket and Redshift cluster
Fix:
- Verify S3 bucket is in the same AWS region as Redshift
- Check S3 bucket permissions (IAM user needs read/write)
- Verify Redshift cluster can reach S3 (VPC endpoints or internet access)
Slow type migrations on large tables
Cause: Redshift performs full table rewrite for type changes
Fix: This is expected behavior. Do not interrupt — let it complete. For very large tables, consider scheduling during low-traffic periods.
Materialization stuck in PENDING
Wait 30-60 seconds — this is normal during shard assignment. If still stuck:
flowctl logs --task //materialize-redshift --since 5m | jq 'select(.level == "error")'
Documents exceeding 4 MB limit
Cause: Individual documents are larger than Redshift's 4 MB per-document limit
Fix: Use field selection to exclude large fields (e.g., binary blobs, nested arrays), or create a derivation to truncate/filter before materializing.
Related Skills
schema-field-selection— Reduce materialized fields to avoid size limitsconnector-disable-enable— Pause/restart existing materializationsconnector-delete-recreate— Nuclear option for stuck materializationsestuary-logs— Deep log analysisestuary-catalog-status— Status checking
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: estuary
- Source: estuary/agent-skills
- License: Apache-2.0
- Homepage: https://estuary.dev
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet — be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.