Migrating To Amazon Redshift
AWSOfficialPublished by AWS
- Skill
- Workflow
- Cloud and DevOps
- Apache-2.0
- Low risk
AutoGineer summary
Written by AutoGineer from the skill’s own files, not by the author
This skill provides a structured, text-based framework for migrating Teradata Vantage environments to Amazon Redshift. It covers the entire migration lifecycle, including discovery, schema and SQL conversion, data migration, validation, and performance reporting. The skill acts as an expert guide, instructing the AI to generate execution scripts at runtime rather than providing pre-packaged code. It emphasizes secure, read-only discovery, best practices for Redshift architecture, and the conversion of legacy Teradata constructs like BTEQ, macros, and stored procedures into Redshift-compatible formats.
What it does
- Inventories Teradata source systems using read-only discovery queries.
- Converts Teradata DDL, SQL, stored procedures, and BTEQ scripts to Redshift/RSQL.
- Maps Teradata physical architecture to Redshift distribution and sort keys.
- Generates migration runners for data extraction, S3 staging, and COPY operations.
- Provides validation patterns for verifying data integrity and row counts.
- Assesses migration complexity and generates performance comparison reports.
When to use it
- When planning or executing a migration from Teradata Vantage to Amazon Redshift.
- When you need to convert legacy Teradata DDL or BTEQ scripts to Redshift syntax.
- When assessing the effort and complexity of a Teradata-to-Redshift migration project.
- When you require a structured, repeatable process for data warehouse migration.
Advantages
- Knowledge-based approach avoids dependency drift and vendor lock-in.
- Promotes secure, least-privilege practices for data extraction and migration.
- Provides clear mapping rules for complex Teradata-to-Redshift architectural differences.
- Supports both connected and disconnected migration environments.
- Enables reproducible results through a standardized project-workspace layout.
Usage examples
- “Assess the complexity of migrating my Teradata schema to Redshift.”
- The agent will guide you through the discovery phase, inventorying your Teradata objects and identifying high-complexity constructs that require manual review.
- “Convert this Teradata BTEQ script to RSQL for Redshift.”
- The agent will apply the BTEQ-to-RSQL conversion rules, replacing .IMPORT/.EXPORT with S3-based COPY/UNLOAD commands and adapting transaction logic.
- “How should I choose distribution keys for my Teradata fact tables in Redshift?”
- The agent will analyze your table sizes and join patterns to recommend appropriate DISTKEY or DISTSTYLE settings based on the architecture-mapping reference.
- “Generate a script to validate row counts between Teradata and Redshift.”
- The agent will produce a validation runner script that executes count queries on both systems and generates a comparison report.
Install
Download the skill as a ZIP:
https://autogineer.com/agent-skills/aws/migrating-to-amazon-redshift/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip migrating-to-amazon-redshift.zip -d .agents/skills
Documentation by AWS
Migrating to Amazon Redshift
What this skill is
This skill is AI guidance, not an execution framework. It is entirely Markdown knowledge (rules, mappings, patterns, best practices) — no executable code. All execution — conversion, the discovery/migration/validation runners, dependencies, and infrastructure — you (the AI) generate at runtime from this knowledge, tailored to the customer's environment.
Principle: knowledge over shipped code → less drift, nothing for the customer to run or depend on, reliable first-time results. Do not look for a pyproject, a tools package, an orchestrator engine, or shipped scripts — there are none by design; you generate execution.
Runtime: this skill works with or without the AWS MCP server — step guidance uses AWS CLI syntax. Running it with the AWS MCP server is recommended for sandboxed execution and audit logging; without it, the AI runs the generated scripts on the host shell (assumes Bash, Python 3, and AWS CLI + credentials). Do not assume MCP-only tools are available.
Source routing
This skill migrates a supported source data warehouse to Amazon Redshift. First identify the
source system, then load that source's knowledge under references/<source>/:
Teradata (Vantage) →
references/teradata/— supported (all references below).Other sources (e.g. Snowflake, Oracle) — unsupported; each is added as its own
references/<source>/set when ready.
The workflow is source-agnostic (discovery → convert → migrate → validate → performance → report); only the conversion knowledge is source-specific. Everything below is the Teradata set.
When to use
Migrating a Teradata system (Vantage) to Amazon Redshift.
Converting Teradata DDL, SQL, stored procedures, macros, or BTEQ to Redshift/RSQL.
Assessing Teradata→Redshift migration complexity/effort.
Operating principles
Discovery is strictly read-only (SELECT-only) on the source. Never change production state: no DDL/DML, and never enable logging (
BEGIN/REPLACE QUERY LOGGING). If DBQL is empty, mark itunavailableand fall back to always-onDBC.AMPUsageV— seereferences/teradata/discovery-queries.md.Skill provides knowledge; you generate execution. Read the
references/to reason and convert — apply the rules inreferences/teradata/conversion-rules.mddirectly for conversion, and generate the discovery/migration/validation runners (and the read-only discovery collector fromreferences/teradata/discovery-queries.md) tailored to the environment.Generate, don't assume a framework. Assume the environment has Bash, Python 3, and AWS CLI + credentials. Any Python lib a generated script needs (
teradatasql,boto3, …) ispip install-ed on demand by that script / its run-instructions — pin exact versions. Teradata TTU (BTEQ/TPT) is Linux/Windows-only — not macOS; prefer WRITE_NOS +teradatasql(cross-platform, no client) for discovery/extract unless a TTU/Linux host exists.Credentials: use a read-only Teradata user; prefer IAM roles over IAM users. For production, reference credentials from AWS Secrets Manager or Systems Manager Parameter Store. For local development only, a git-ignored
.envfile or profile may be used — never commit it. Never hard-code or echo secrets. In a portable bundle, reference a co-located credentials file and ship acredentials.env.exampletemplate — the real file is git-ignored.Persist state in files. All generated output goes under a git-ignored
output/in the user's working dir; keepoutput/state.mdcurrent so work is resumable.
Workflow (phases)
Run in order; each phase's result/ feeds the next (see references/teradata/orchestration.md).
Discovery — inventory the source. →
references/teradata/discovery-queries.md(read-only collection SQL + BTEQ driver template the AI generates) →output/discovery/result/inventory.jsonConversion — schema + code. Apply the conversion rules directly, flag the manual-rewrite long tail, and fix Redshift errors from the references. →
references/teradata/conversion-rules.md,references/teradata/data-type-mapping.md,references/teradata/architecture-mapping.md,references/teradata/stored-procedure-migration.md,references/teradata/bteq-to-rsql.md,references/teradata/common-errors.mdData migration — extract → S3 → COPY, restartable. →
references/teradata/data-migration-patterns.mdValidation — counts/aggregates/sampling. →
references/teradata/validation-patterns.mdPerformance — baseline vs Redshift; size the target. →
references/teradata/performance.md,references/teradata/sizing.mdReporting — aggregate all phases. →
references/teradata/reporting.md
Conversion (how the AI applies it)
There is no converter to run — convert by applying the rules in
references/teradata/conversion-rules.md directly (with the type / architecture / stored-procedure /
BTEQ references): apply the deterministic rules to the well-understood bulk, flag the
manual-rewrite constructs with their suggested rewrites, assign a confidence per object,
and fix any Redshift errors using references/teradata/common-errors.md. The reference docs are the
single source of truth; conversion-rules.md includes golden input→output examples to match.
Execution modes (connectivity)
Connected — your host can reach Teradata/Redshift → run the generated scripts in place.
Disconnected — it can't → generate a self-contained bundle under
output/<phase>/(script + co-located credentials template + relativeresult/+run-instructions.md); the operator runs it on a reachable host and copiesresult/back. The copied-backresult/is the durable state — read it (+state.md) and continue.
Project-workspace layout (per migration run)
<project-workspace>/
migration-config.yaml # operator-authored: endpoints, scope, strategy
.gitignore # ignores output/
output/ # everything generated (git-ignored)
state.md # progress cursor
discovery/ … result/inventory.json
conversion/ … result/{ddl,sql,procedures,rsql}/ manual_review.json
data_migration/ … result/{extract,load,templates}/ migration_manifest.json
validation/ … result/validation_report.json
performance/ … result/{perf_baseline,perf_compare}.json
reporting/ result/migration_report.mdSecurity considerations
No shipped code or dependencies. This skill is text-only — the customer runs nothing from it. Any runner the AI generates MUST pin exact dependency versions, validate/sanitize inputs (file paths, SQL, shell args), and never print or log credentials, secrets, or PII.
Least privilege + ephemeral credentials. Use a read-only Teradata user for discovery. On AWS prefer IAM roles over IAM users and IAM auth over username/password. Keep secrets in AWS Secrets Manager / Parameter Store — never hard-code, echo, or commit them (credentials files are git-ignored; ship only
*.exampletemplates).Data in transit / at rest. Use TLS to both engines; stage extracts in an encrypted S3 bucket (SSE) with a least-privilege bucket policy; load via
COPY … IAM_ROLE(not access keys). Enable encryption on the target Redshift cluster.Blast radius. Discovery is read-only by design. Migration writes to the target — validate against a throwaway / non-production Redshift first, and never point a generated write-path at production without explicit operator confirmation.
No secret leakage in artifacts. Generated
output/…(manifests, reports,state.md) MUST NOT embed credentials or endpoints beyond what the operator supplies inmigration-config.yaml.COPY
IAM_ROLEhardening. Scope the role's policy to the specific staging prefix (not bucket-wides3:*), and include condition keys in its trust policy (aws:SourceAccount/aws:SourceArn, orsts:ExternalIdfor cross-account) to prevent confused-deputy assumption — per Redshift IAM-role authorization best practices.Logging & monitoring. Enable CloudTrail (S3 data events on the staging bucket + Redshift management events), Redshift audit logging (connection/user-activity logs to S3 or CloudWatch), and CloudWatch alarms on COPY failures or unusual staging-bucket access during the migration.
The AWS MCP server (recommended runtime) additionally provides sandboxed execution and audit logging for the generated scripts.
References (specialized knowledge)
| File | Topic |
|---|---|
references/teradata/orchestration.md | phase workflow + state model |
references/teradata/conversion-rules.md | the 72 conversion rules (source of truth) |
references/teradata/data-type-mapping.md | TD→RS type mapping |
references/teradata/architecture-mapping.md | PI→DISTKEY, PPI→SORTKEY, Join Index→MV |
references/teradata/stored-procedure-migration.md | SP → PL/pgSQL |
references/teradata/bteq-to-rsql.md | BTEQ → RSQL |
references/teradata/common-errors.md | common Redshift errors + fixes |
references/teradata/discovery-queries.md | DBC system-view inventory queries |
references/teradata/data-migration-patterns.md | COPY/TPT/micro-batch/checkpoint |
references/teradata/validation-patterns.md | row-count/aggregate/sample compare |
references/teradata/performance.md | representative-query extraction + compare |
references/teradata/sizing.md | RG node type + count from the source profile |
references/teradata/reporting.md | migration status-report generation |
Files
- ATTRIBUTION.mdAdded by AutoGineer945 B
- LICENSELicence file added by AutoGineer9.9 KiB
- NOTICELicence file added by AutoGineer67 B
- SKILL.md10.8 KiB
- references/teradata/architecture-mapping.md5.8 KiB
- references/teradata/bteq-to-rsql.md4.1 KiB
- references/teradata/common-errors.md3.7 KiB
- references/teradata/conversion-rules.md16.8 KiB
- references/teradata/data-migration-patterns.md12.9 KiB
- references/teradata/data-type-mapping.md3.4 KiB
- references/teradata/discovery-queries.md14.7 KiB
- references/teradata/orchestration.md7.1 KiB
- references/teradata/performance.md6.6 KiB
- references/teradata/reporting.md4.2 KiB
- references/teradata/sizing.md7.3 KiB
- references/teradata/stored-procedure-migration.md5.1 KiB
- references/teradata/validation-patterns.md5.9 KiB
references/teradata/data-migration-patterns.md
Data migration patterns
AI-facing knowledge: patterns + templates the AI uses to generate extract/load scripts. Distilled from the proven pre-restructure
tools/data_migration/implementation.
Purpose
Move table data from Teradata to Redshift reliably and restartably, producing
output/data_migration/result/migration_manifest.json for validation to consume.
The pipeline, per table
estimate volume ─▶ extract (TD → file) ─▶ stage to S3 ─▶ COPY into Redshift ─▶ confirm row countEach table is independent: a failure on one is recorded and the rest continue (see Checkpointing).
1. Estimate volume (before moving anything)
Drives chunking decisions and is reused by validation as the authoritative source count.
Size:
SELECT SUM(CurrentPerm) AS size_bytes FROM DBC.TableSizeV WHERE DataBaseName = ? AND TableName = ?—CurrentPermis split across AMPs, so it must be summed per table for total on-disk bytes.Row count: exact
SELECT COUNT(*) FROM schema.table. Teradata's catalog has no reliable live row count, and the exact count is reused by validation, so pay theCOUNT(*)cost once.
2. Extract — three paths
All write directly to S3 (no local-disk hop) and return the s3:// prefix (a
directory of split part-files, per §3 — not a single object).
When-to-use matrix
| Path | When to use | Mechanism | Output | Notes |
|---|---|---|---|---|
| WRITE_NOS (canonical) | Vantage ≥ 17.05 (verify per edition) and the cluster is allowed direct S3 egress. Runs in-database — no Teradata client needed (invoke over any SQL client incl. teradatasql), so it works from macOS. Test cluster is 20.00 → default here. | In-database WRITE_NOS — the SQL engine writes Parquet to S3 in parallel, one object per AMP, with no external host. | Parquet | No TPT host to install/operate; parallelism = AMP count; native multi-object output already satisfies the split rule (§3). Needs an AUTHORIZATION object (IAM role / access keys) and outbound S3 access from the DB nodes. |
| TPT | Older Vantage (< 17.05) or locked-down sites with no direct DB→S3 egress. Requires the Teradata client (TTU: tbuild/BTEQ) on a Linux/Windows host — not available on macOS; extract on that TPT host, then stage to S3. | Teradata Parallel Transporter EXPORT operator → DATACONNECTOR CONSUMER file-writer on the dedicated TPT host. | Delimited (pipe/CSV) | High-throughput, partitioned. The DataConnector operator does not natively emit Parquet — its Format values are Delimited/Binary/Text/Formatted/Unformatted. For Parquet use WRITE_NOS; on TPT, extract delimited and COPY as CSV (§4). Verify object-store/format support for your TPT version before relying on it. |
teradatasql (Python driver) | The cross-platform, no-client host-side path (pip-installable — works on macOS). Use when there is no TTU/Linux host for TPT (and WRITE_NOS isn't available), or for small/medium tables and smoke tests. | SELECT * FROM table over teradatasql → pyarrow Parquet, written as multiple row-group part-files → s3.put_object per part. | Parquet | Streams rows through the Python process — not for huge tables. Split into part-files (§3) rather than buffering one giant object in memory. |
Format: prefer Parquet (WRITE_NOS / interim) over delimited — better COPY throughput and type fidelity. Delimited (CSV/pipe) is the fallback, and is the only native option on the TPT path.
Operator-host prerequisites. TPT and BTEQ require the Teradata client (TTU), which is Linux/Windows only — not macOS. On a Mac (or any host without TTU) the viable extract paths are WRITE_NOS (in-database, no client) and
teradatasql(pure-Python, cross-platform); use TPT only when a Linux TTU host exists.
WRITE_NOS export (canonical — template the AI generates)
/* WRITE_NOS export — <schema>.<table> → S3 (parallel Parquet, one object per AMP) */
SELECT * FROM WRITE_NOS (
ON ( SELECT * FROM <schema>.<table> )
USING
LOCATION('/s3/<bucket>.s3.amazonaws.com/<staging-prefix>/<schema>/<table>/<strategy>/')
AUTHORIZATION(<auth-object-or-role>) /* Prefer an IAM-role auth object; access keys only as fallback where roles can't attach. Never inline secrets */
STOREDAS('PARQUET')
/* MAXOBJECTSIZE intentionally omitted — its valid range is narrow + version-specific */
/* (Teradata examples use '4MB'; verify your version). WRITE_NOS then writes objects */
/* smaller than the 100MB–1GB COPY sweet spot — fine: many small Parquet files still */
/* parallelize COPY across slices (§3). */
COMPRESSION('SNAPPY')
) AS d;WRITE_NOS emits multiple Parquet objects under the prefix automatically (one or more per
AMP), so the split rule in §3 is satisfied with no extra work.
Requires Vantage ≥ 17.05 (verify per edition) and DB-node outbound access to S3.
TPT export script (fallback — template the AI generates)
/* TPT EXPORT job — <schema>.<table> (delimited; NOT Parquet — see the matrix above) */
DEFINE JOB EXPORT_<schema>_<table>
(
DEFINE OPERATOR td_export
TYPE EXPORT SCHEMA *
ATTRIBUTES ( VARCHAR TdpId=@TdpId, VARCHAR UserName=@UserName,
VARCHAR UserPassword=@UserPassword,
VARCHAR SelectStmt='SELECT * FROM <schema>.<table>;' );
DEFINE OPERATOR file_writer
TYPE DATACONNECTOR CONSUMER SCHEMA *
ATTRIBUTES ( VARCHAR Format='Delimited', VARCHAR TextDelimiter='|',
VARCHAR FileName='<schema>.<table>-${JOBID}.csv',
VARCHAR OpenMode='Write' );
APPLY TO OPERATOR (file_writer) SELECT * FROM OPERATOR (td_export);
);Connection-dependent attributes (@TdpId, working dirs) stay as named placeholders the
operator fills in. Emit multiple part-files (one per producer instance) to satisfy the
split rule in §3 rather than a single delimited file; then COPY as CSV (§4).
3. Stage to S3 — key layout + file splitting
Staging-bucket security (set up once per migration): enable default encryption (SSE-S3 or
SSE-KMS); deny non-TLS access via a bucket-policy condition ("aws:SecureTransport": "false" →
Deny); enable S3 access logging or CloudTrail S3 data events (audit who touched extracted data);
add a lifecycle rule to auto-expire staged objects after cutover.
Partition by table and strategy so each table's loads are isolated and auditable. Each
table is a prefix (directory) of multiple part-files, not a single object:
<staging-prefix>/<schema>/<table>/<strategy>/ ← the prefix COPY reads
part-0001.parquet
part-0002.parquet
…Parse s3://bucket/prefix/ into (bucket, prefix); keep the trailing slash so keys
concatenate cleanly. The manifest's s3_path records this prefix (see the schema below).
File-splitting rule (why multiple objects)
A single object per table makes Redshift COPY load on one slice, serializing the
whole table through a single stream — needlessly slow for large tables (e.g. Scenario B's
store_sales, ~2.9M rows). Split every table into multiple objects so COPY parallelizes
across slices:
Count: a multiple of the cluster's total slice count (so every slice gets even work). Small tables can stay as one file.
Size: target ~100 MB–1 GB per object (compressed). Below ~100 MB the per-file overhead dominates; above ~1 GB you lose parallelism granularity.
Per path: WRITE_NOS produces one or more objects per AMP automatically (already split — usually nothing more to do); TPT emits one file per producer instance; the interim
teradatasqlpath writes one part-file per row-group batch.
Cluster slice count comes from the sizing profile (sizing.md) / the target node config.
4. Load — Redshift COPY from S3
Full-load is truncate-then-COPY so a re-run is idempotent (no duplicate rows). COPY the prefix (not a single file) so it fans the split part-files (§3) across all slices in parallel:
TRUNCATE <schema>.<table>;
COPY <schema>.<table>
FROM 's3://.../<schema>/<table>/<strategy>/' -- prefix: all part-files under it load in parallel
IAM_ROLE '<role-arn>' -- scope this role to s3:GetObject/List on the staging prefix only (no s3:*);
-- trust policy: add aws:SourceAccount/aws:SourceArn (or sts:ExternalId) condition keys
FORMAT AS PARQUET;COPY reads every object under the prefix, so the file-splitting rule in §3 (slice-multiple
count, ~100 MB–1 GB each) is what makes this load parallel rather than single-slice. Then read
rows loaded with SELECT pg_last_copy_count();.
On the TPT (delimited) path, load the same prefix with
FORMAT AS CSV+ the delimited options in the matrix below instead ofFORMAT AS PARQUET.COPY caveats (learned the hard way):
REGIONis rejected withFORMAT AS PARQUET("REGION argument is not supported for PARQUET based COPY"). The staging bucket must be in the cluster's region. (Region is still needed to build the S3 client, just not in the COPY.)The IAM role must be attached to the cluster and allowed to read the staging bucket.
COPY matches Parquet columns by name — column order need not match, but names must.
COPY option matrix (by format)
| Concern | Parquet (preferred) | Delimited (CSV/text fallback) |
|---|---|---|
| Format clause | FORMAT AS PARQUET | FORMAT AS CSV or DELIMITER '|' |
| NULLs | encoded in Parquet | NULL AS '\\N' (must match extract) |
| Dates/times | native types | TIMEFORMAT 'auto', DATEFORMAT 'auto' |
| Compression | columnar (built-in) | GZIP / BZIP2 on the staged files |
| Bad-row tolerance | n/a (schema-checked) | MAXERROR <n> only if a few bad rows are acceptable — default 0 |
| Encoding | — | ENCODING 'UTF8' |
5. Confirm row count
Immediately compare the exact source COUNT(*) (from step 1) to pg_last_copy_count().
A mismatch is a load failure, not a success — record it in failed_tables with phase
validate; never report a partial load as success. Deeper checks live in validation-patterns.md.
Strategies
| Strategy | Status | Semantics |
|---|---|---|
full-load | implemented | TRUNCATE + COPY. Idempotent; safe to re-run. |
incremental | future | Append rows since a high-water-mark column. Must use an append load, not the truncate path. |
cdc | future | Change-data-capture apply. Needs change feed design. |
Reject unknown strategies loudly; fail unimplemented ones with a clear message rather than silently doing a full load.
Checkpointing (restartability)
Track per-table status so a re-run resumes and skips completed tables. This is the
migration_manifest.json — it is also the hand-off to validation.
migration_manifest.json schema
{
"tables": [
{
"source_table": "sales.orders",
"target_table": "sales.orders",
"s3_path": "s3://stage/sales/orders/full-load/",
"source_row_count": 1280344,
"target_row_count": 1280344,
"status": "success",
"duration_seconds": 84,
"data_size_bytes": 690847232
}
],
"failed_tables": [
{ "table": "sales.returns", "error": "COPY: invalid timestamp", "phase": "load", "retryable": true }
],
"summary": { "total": 2, "success": 1, "failed": 1, "skipped": 0 }
}failed_tables[].phaseis one ofextract|stage|load|validate.retryableflags transient failures (network, throttling) vs structural ones (bad type).summaryis derived: a non-zerofailedcount pauses the pipeline for review (seeorchestration.md).
Security & reliability rules
Use a read-only Teradata user for extraction. Never hard-code or echo credentials. For production, reference credentials from AWS Secrets Manager or Parameter Store; for local development testing only, a git-ignored credentials file (with a committed
credentials.env.exampletemplate) may be used — the real file is never committed.Validate every identifier (schema/table) against
^[A-Za-z_][A-Za-z0-9_]*$before inlining it intoCOUNT(*)orCOPY— those positions can't be parameterized, so this is the injection guard.Make connections injectable so generated scripts are testable without live TD/RS/S3.
Put an explicit timeout on every extract, COPY, and S3 call — no indefinite waits.
See also
architecture-mapping.md/data-type-mapping.md— target table DDL, DISTKEY/SORTKEY, type/encoding caveats.sizing.md— target node config / cluster slice count used by the file-splitting rule (§3).validation-patterns.md— consumesmigration_manifest.json(source counts, table list).orchestration.md— where data migration sits in the phase pipeline and its HITL gate.
Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs an MCP server, Needs Python, Needs Node.js
Security
What our scanner noticed· Low risk
- Instructions that use the network
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- AWS
- Publisher
- AWS (Official)
- Source
- aws/agent-toolkit-for-aws · skills/specialized-skills/analytics-skills/migrating-to-amazon-redshift · commit 0a218f8
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- NOTICE (added by AutoGineer from NOTICE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by AWS or AWS.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download migrating-to-amazon-redshift.zip