JusDB
Free DB Audit
NoSQL Databases

Migrating Redis OSS to Valkey on AWS: ElastiCache and MemoryDB Runbook

Move ElastiCache and MemoryDB from Redis OSS to Valkey: prerequisites, parameter groups, client checks, reserved nodes, and why only Valkey 7.2 can roll back to Redis OSS 7.1.

JusDB Team
Published October 28, 2026
Updated November 10, 2026
18 min read

The AWS console offers an "Upgrade to Valkey" button on every ElastiCache for Redis OSS cluster, and the change is one call: aws elasticache modify-replication-group --engine valkey. Endpoints keep their DNS names, and each shard fails over once. The hard part is going back. AWS documents an in-place rollback only from Valkey 7.2 to Redis OSS 7.1, so going straight to Valkey 8.x or 9.x leaves a snapshot restore as the only fallback. The dates add pressure: Redis OSS 4 and 5 caches have paid Extended Support since 1 February 2026, and Redis OSS 6 standard support ends on 31 January 2027. This runbook covers ElastiCache node-based clusters, Serverless, and MemoryDB, plus the client checks to run before the failover.

TL;DR
  • ElastiCache changes the engine in place with one failover per shard: a few seconds from Redis OSS 5.0.6 or later, 30 to 60 seconds from older versions. DNS endpoints stay; node IPs change.
  • The only documented in-place rollback is Valkey 7.2 to Redis OSS 7.1. Use 7.2 as a burn-in stage, and treat the later move to 8.x or 9.x as one-way.
  • Recreate custom parameter groups in the valkey7, valkey8 or valkey9 family with the same static values, and pass the new group in the upgrade call.
  • Redis OSS reserved nodes keep applying to Valkey nodes. Valkey reserved nodes cover only Valkey, so buy them after the rollback point.
  • If you target Valkey 9.1, upgrade go-redis to v9.20.1 or later first. Older versions reject the new availability-zone field in CLUSTER SHARDS.

Scope and review date: November 2026. This post covers Amazon ElastiCache for Redis OSS (node-based and Serverless) and Amazon MemoryDB for Redis OSS moving to Valkey. Commands and version lists were checked against the AWS documentation, and prices against AWS's price list for US East (N. Virginia), on 10 November 2026. The commands were not run in a lab, so rehearse them on staging.


Which Valkey versions can you move to on AWS?

As of November 2026, the ElastiCache engine versions page lists Valkey 7.2, 8.0, 8.1, 8.2, 9.0 and 9.1. ElastiCache 8.2 is Valkey 8.1 plus the valkey-search module. Each major version has its own parameter group family: valkey7, valkey8 (8.0 to 8.2) and valkey9 (9.0 and 9.1). On the Redis OSS side, node-based clusters still run 4.0.10 through 7.1.

MemoryDB is behind. Its engine versions page lists only Valkey 7.2.6 and MemoryDB 7.3, the version that MemoryDB Multi-Region needs. We found no AWS announcement of Valkey 8 or 9 for MemoryDB, so check the live list in your Region:

bash
aws --version   # v2 must be 2.18.2 or later, v1 must be 1.35.2 or later

aws elasticache describe-cache-engine-versions --engine valkey \
  --query 'CacheEngineVersions[].[EngineVersion,CacheParameterGroupFamily]' \
  --output table

aws memorydb describe-engine-versions --engine valkey \
  --query 'EngineVersions[].[EngineVersion,EnginePatchVersion,ParameterGroupFamily]' \
  --output table

Interpretation: older CLIs do not know the cross-engine options. The tables list the versions and parameter group families you can target in this Region; anything missing is not a target here.

Three places your Redis OSS workload can land on AWS

Switch tabs to compare versions, rollback, support and price; prices are US East (N. Virginia), read 10 November 2026

ElastiCache Redis OSS

AreaElastiCache for Redis OSS
Engine versionsRedis OSS 4.0.10 to 7.1
Way back after an engine changeNot applicable; the API does not allow downgrades
Support statusv4 and v5 on Extended Support since 1 Feb 2026; v6 standard support ends 31 Jan 2027
On-demand r7g.xlarge$0.437 per hour (cache.r7g.xlarge)
Serverless$0.125 per GB-hour, $0.0034 per million ECPUs, 1 GB minimum
Reserved nodesRedis OSS reservations apply

ElastiCache Valkey

AreaElastiCache for Valkey
Engine versionsValkey 7.2, 8.0, 8.1, 8.2, 9.0, 9.1
Way back after an engine changeIn place only from Valkey 7.2 to Redis OSS 7.1
Support statusNo Extended Support dates published for Valkey
On-demand r7g.xlarge$0.3496 per hour (cache.r7g.xlarge)
Serverless$0.084 per GB-hour, $0.0023 per million ECPUs, 100 MB minimum
Reserved nodesRedis OSS reservations apply and cover about 20% more nodes; Valkey reservations cover Valkey only

MemoryDB Valkey

AreaMemoryDB for Valkey
Engine versionsValkey 7.2.6 and MemoryDB 7.3
Way back after an engine changeNone; create a new cluster on the older engine
Support statusNo Extended Support dates published for Valkey
On-demand r7g.xlarge$0.4319 per hour (db.r7g.xlarge; Redis OSS is $0.617)
ServerlessNo serverless prices in the MemoryDB price list; node-based clusters
Reserved nodesRedis OSS reservations apply; Valkey priced 30% lower

Prices: read from the AWS Price List for us-east-1 (ElastiCache file published 28 October 2026, MemoryDB file 11 September 2026) and the ElastiCache pricing page. Check your own Region before you plan around them.

Why does the rollback depend on which Valkey version you pick?

The ElastiCache upgrade guide says it "only supports rolling back from Valkey 7.2 to Redis OSS 7.1". It also adds: "This is true even if you upgraded to Valkey 7.2 from an earlier version than Redis OSS 7.1." So a cluster that started on Redis OSS 6.2 rolls back to 7.1, not to 6.2. Plan for that: your rollback target is itself a version change.

A rollback behaves like the upgrade: same DNS endpoints, new node IPs, and a write pause of a few seconds per shard. You can also restore a Valkey 7.2 snapshot as a new Redis OSS 7.1 cache. One condition is easy to miss: every user and user group attached to the cache must have engine type REDIS.

Past 7.2 there is no documented path. The ModifyReplicationGroup API reference states that you "cannot downgrade to an earlier engine version", and AWS documents snapshot restores into Redis OSS 7.1 only for Valkey 7.2 snapshots. AWS does not say why. For background only: open-source Valkey 9.0 and 9.1 write RDB format version 80, a number outside the range Redis ever used.

Do not park on 7.2 for good. The Valkey project's supported versions table ends community maintenance of 7.2 on 16 April 2027.

MemoryDB is stricter still. Its engine versions page says you "can't downgrade to an older engine version", and it describes no Valkey-to-Redis exception.

Redis OSS to Valkey on ElastiCache: the two-stage path

Stop at Valkey 7.2 while you still want a way back; the second hop has no in-place rollback

Two-stage upgrade from Redis OSS to Valkey with rollback paths Step 1: an ElastiCache Redis OSS cluster on version 5.0.6 to 7.1 changes engine in place to Valkey 7.2, where it runs a burn-in period. Step 2: after the burn-in, the cluster upgrades to Valkey 8.x or 9.x. From Valkey 7.2 a dashed path leads back to Redis OSS 7.1 through an in-place rollback. From Valkey 8.x or 9.x the only dashed path leads to a new cluster restored from a Redis OSS snapshot taken before the upgrade. Redis OSS 5.0.6 to 7.1 Valkey 7.2 burn-in stage Valkey 8.x / 9.x one-way Redis OSS 7.1 in-place rollback New cluster from Redis snapshot 1 2 engine change after burn-in rollback to 7.1 no in-place way back dashed: fallback paths

Rollback point: the in-place way back exists only while the cluster runs Valkey 7.2. After step 2, a fallback means restoring a pre-upgrade Redis OSS snapshot into a new cluster and losing every write made since that snapshot.

Two stages cost a second failover per shard and a second change window, usually cheaper than a restore. If even one write pause is unacceptable, use a blue/green copy instead, as MaiCoin did with RedisShake (AWS case study, January 2026).

What has to be true before ElastiCache will change the engine?

Check each point with the cluster still on Redis OSS.

  • Single-node clusters. A cluster mode disabled cache with one node must first become a replication group. The documented procedure wraps the existing node as the primary.
  • Cluster mode. An engine upgrade cannot switch cluster mode disabled to enabled. That is a separate backup, seed and reshard project.
  • Pending scale-ups. A pending scale-up blocks an immediate engine upgrade. Apply it first, or combine both changes in one call with --apply-immediately.
  • Global Datastore. Secondary Regions upgrade first; the call is modify-global-replication-group, which also takes --engine.
  • No Multi-AZ. Without Multi-AZ, AWS says the primary cannot serve requests during the upgrade. Leave free memory for the sync.
bash
# Engine, cluster mode, Multi-AZ and state of every replication group
aws elasticache describe-replication-groups \
  --query 'ReplicationGroups[].[ReplicationGroupId,Engine,ClusterMode,MultiAZ,Status]' \
  --output table

# Engine version and parameter group per node
aws elasticache describe-cache-clusters \
  --query 'CacheClusters[].[CacheClusterId,ReplicationGroupId,EngineVersion,CacheParameterGroup.CacheParameterGroupName]' \
  --output table

Interpretation: an empty ReplicationGroupId marks a standalone node that needs wrapping first. A parameter group not named default.* needs a Valkey copy. Note the current engine version, because a rollback lands on 7.1 regardless.

bash
# Wrap a standalone node (redis01) as the primary of a new replication group
aws elasticache create-replication-group \
  --replication-group-id app-cache \
  --replication-group-description "app cache, pre-Valkey" \
  --num-cache-clusters 3 \
  --primary-cluster-id redis01

Interpretation: the existing node becomes the primary and the new replicas inherit its settings. Wait for available before going further.

bash
# Which user groups (RBAC) are attached, and with which engine type?
aws elasticache describe-user-groups \
  --query 'UserGroups[].[UserGroupId,Engine,Status]' --output table

Interpretation: keep user groups on REDIS during the burn-in. Valkey clusters accept both REDIS and VALKEY groups, but a rollback needs every attached user and group to be REDIS. Move to VALKEY user groups, which need password or IAM authentication, only after the final hop.

How do you recreate a custom parameter group for Valkey?

With a default parameter group, the engine flags are enough. With a custom one, AWS requires a custom Valkey group in the same call, and it "must have the same Redis OSS static parameter values as the existing Redis OSS custom parameter group". Static parameters are the ones with ChangeType set to requires-reboot. There is no copy-across-families command, so you diff and recreate.

bash
# Only the parameters someone changed from the family default
aws elasticache describe-cache-parameters \
  --cache-parameter-group-name app-redis7 --source user \
  --query 'Parameters[].[ParameterName,ParameterValue,ChangeType]' --output table

Interpretation: this is your whole migration list. Each requires-reboot row must be set to the same value in the Valkey group. The immediate rows should match too, unless you mean to change them.

bash
aws elasticache create-cache-parameter-group \
  --cache-parameter-group-name app-valkey7 \
  --cache-parameter-group-family valkey7 \
  --description "app-redis7 values on Valkey 7.2"

aws elasticache modify-cache-parameter-group \
  --cache-parameter-group-name app-valkey7 \
  --parameter-name-values \
    "ParameterName=maxmemory-policy,ParameterValue=allkeys-lru" \
    "ParameterName=notify-keyspace-events,ParameterValue=Ex"

# Diff the two groups' user-set values before the upgrade call
diff <(aws elasticache describe-cache-parameters --cache-parameter-group-name app-redis7 \
         --source user --query 'Parameters[].[ParameterName,ParameterValue]' --output text) \
     <(aws elasticache describe-cache-parameters --cache-parameter-group-name app-valkey7 \
         --source user --query 'Parameters[].[ParameterName,ParameterValue]' --output text)

Interpretation: an empty diff means the groups match. The values are examples; copy yours. Keep app-redis7 until you are past the rollback point.

Plan the second hop now. Per the engine parameter reference, valkey9 groups are incompatible with Valkey 8.x and Redis OSS, so each hop needs a new group. The valkey8 family drops the lazyfree-lazy-* parameters, raises the repl-backlog-size default to 10 MB, and adds extended-redis-compatibility (AWS lists its default as yes), which makes HELLO report redis 7.2.4.

Will your applications notice the switch?

Mostly through the failover. ElastiCache closes connections during the change, so clients need retries with backoff and must rediscover the new node IPs. A few behaviour changes also reach applications, listed on AWS's Valkey behaviour differences page:

FromChangeWho notices
Redis OSS 7.1 to Valkey 7.2Blocked stream commands released by a deleted key return -NOGROUP or -WRONGTYPE instead of -UNBLOCKED; client-side tracking in scripts follows keys read, not keys declaredStream consumers, tracking clients
Valkey 8.0Nested MULTI or WATCH aborts the transaction; SCAN skips lazily expired keys; BITCOUNT and BITPOS error on bad arguments for missing keys; error text drops "Redis"Error matching, transaction wrappers
Valkey 9.0Authentication is checked before the command, so unauthenticated clients get an auth error, not "unknown command"Health checks without AUTH
Valkey 9.1CLUSTER SHARDS and CLUSTER SLOTS carry an availability-zone field per nodeStrict topology parsers

The 9.1 change has already broken one client. Valkey issue #3909 reports that go-redis rejects the new CLUSTER SHARDS field. It was still open in November 2026. The fix shipped in go-redis v9.20.1 on 11 June 2026, and it skips unknown shard and node fields.

bash
# Every Go service that talks to the cache
go list -m github.com/redis/go-redis/v9

# Code that matches on error text or on the server name
grep -rnE "UNBLOCKED|ERR unknown command|\"redis_version\"|Redis is loading" ./src

Interpretation: a go-redis version below v9.20.1 must be upgraded before any cluster goes to 9.1. Each grep hit is code that matches error text that changes across these versions, or that reads redis_version, which Valkey reports as the fixed compatibility value 7.2.4. Test each one on staging.

bash
# On the staging copy after its upgrade (cluster mode enabled, TLS on)
valkey-cli -h clustercfg.app-cache-stg.xxxxxx.use1.cache.amazonaws.com \
  -p 6379 --tls CLUSTER SHARDS

Interpretation: on 9.1, each node map includes availability-zone. Point your real services at this endpoint too, because the parser that breaks lives in the client library.

Upgrade the clients first

The go-redis fix is a client-side change that also works against Redis OSS. Ship client upgrades a week before the engine change, so a client bug and an engine bug never arrive in the same window.

What does the rehearsal, cutover and rollback runbook look like?

Rehearse on a staging copy restored from a production snapshot, with the same node type and shard count. Time the upgrade and the rollback, and run your client tests between them.

Redis OSS to Valkey on ElastiCache: change runbook

Eight steps; steps 5 and 7 each fail over every shard, and step 8 is the one-way hop

  1. Inventory and pick the target

    Record engine version, cluster mode, parameter group, user groups and reserved nodes for each cluster.

  2. Ship client upgrades

    go-redis v9.20.1 or later before 9.1. Confirm retries with backoff and topology refresh on reconnect.

  3. Recreate custom parameter groups

    Create the valkey7 copy with identical static values, and diff it against the Redis OSS group.

  4. Rehearse upgrade and rollback on staging

    Restore a production snapshot, run steps 5 and 7, and time each failover.

  5. Snapshot, then change the engine to Valkey 7.2

    Failover per shard

    The manual snapshot is the fallback for step 8. Writes pause for a few seconds per primary.

    aws elasticache modify-replication-group \ --replication-group-id app-cache \ --engine valkey --engine-version 7.2 \ --cache-parameter-group-name app-valkey7 \ --apply-immediately
  6. Burn in on Valkey 7.2

    Run a full business cycle. Keep user groups on REDIS and keep the old parameter group.

  7. Roll back if needed

    Failover per shard

    Same call with the Redis OSS engine. Only possible while the cluster runs Valkey 7.2.

    aws elasticache modify-replication-group \ --replication-group-id app-cache \ --engine redis --engine-version 7.1 \ --cache-parameter-group-name app-redis7 \ --apply-immediately
  8. Upgrade to Valkey 8.x or 9.x

    One-way

    Pass a valkey8 or valkey9 parameter group. After this step, buy Valkey reserved nodes and move to VALKEY user groups.

    aws elasticache modify-replication-group \ --replication-group-id app-cache \ --engine-version 9.1 \ --cache-parameter-group-name app-valkey9 \ --apply-immediately

Rollback point: until step 8, the way back is step 7. After step 8, a fallback is the step 5 snapshot restored into a new Redis OSS cluster. Every write made after that snapshot is lost, so plan the step 8 window as if there were no fallback.

Step 7 is the upgrade call with the target swapped. AWS describes the rollback ("the same console, API, or CLI steps as an engine upgrade") but prints no command, so confirm it on staging. Without --apply-immediately, the change waits for the next maintenance window, because ApplyImmediately defaults to false.

Starting the engine change and watching it

Illustrative output, trimmed; the response is the replication group in state modifying

ops@bastion:~
$ aws elasticache modify-replication-group \ --replication-group-id app-cache --engine valkey --engine-version 7.2 \ --cache-parameter-group-name app-valkey7 --apply-immediately{ "ReplicationGroup": { "ReplicationGroupId": "app-cache", "Status": "modifying", "MultiAZ": "enabled", "AutomaticFailover": "enabled", "ClusterMode": "enabled", ... }}

Done when: the group returns to available and every node reports Engine valkey in describe-cache-clusters. Until then, watch the replication group's events.

bash
# Events for the last two hours: node replacements and failovers per shard
aws elasticache describe-events --source-type replication-group \
  --source-identifier app-cache --duration 120

Interpretation: line each shard's failover event up against your client error graphs. AWS warns that old and new nodes are briefly both visible during each swap, so errors from replicas still loading data are expected then and should stop when the swap ends.

How do ElastiCache Serverless and MemoryDB differ?

ElastiCache Serverless

Serverless takes a major version rather than a full version. AWS says major version upgrades on Serverless run without downtime to the application. The rollback requirements in the upgrade guide also name serverless caches, which suggests the 7.2 rule applies there too. Rehearse that before you rely on it.

bash
aws elasticache modify-serverless-cache \
  --serverless-cache-name app-sessions \
  --engine valkey --major-engine-version 7

Interpretation: AWS's own example uses --major-engine-version 9. Choosing 7, if your Region still offers it for Serverless, keeps you on the rollback-capable stage. In the console, AWS also tells you to pick a Valkey parameter group, such as default.valkey8, when the serverless cache moves.

MemoryDB

MemoryDB uses update-cluster, with the same rule about custom parameter groups. The MemoryDB modify guide shows Valkey 7.2 as the target.

bash
aws memorydb update-cluster \
  --cluster-name orders-db \
  --engine valkey --engine-version 7.2 \
  --parameter-group-name orders-valkey7

Interpretation: MemoryDB has no rollback. It is often the system of record, so take a snapshot and test its restore into a new Redis OSS cluster first; that is your only fallback.

What happens to reserved nodes and the bill?

AWS's launch note of 8 October 2024 put ElastiCache for Valkey at 20% lower for node-based clusters and 33% lower for Serverless, and the US East prices in the comparison card match. MemoryDB for Valkey is 30% lower per node hour. In the us-east-1 price list, the first 10 TB of data written each month costs $0 on Valkey and $0.04 per GB after that, against $0.20 per GB on Redis OSS.

Reserved nodes carry over. The ElastiCache reserved nodes guide says Redis OSS reservations apply to Valkey nodes in the same family and Region. A cache.r7g.4xlarge counts as 32 units on Redis OSS and 25.6 units on Valkey. The freed 6.4 units cover, for example, one cache.r7g.xlarge Valkey node. The reverse does not hold: "Valkey reserved nodes apply only to running Valkey nodes". If you buy Valkey reservations during the burn-in and then roll back, they cover nothing.

bash
aws elasticache describe-reserved-cache-nodes \
  --query 'ReservedCacheNodes[].[ReservedCacheNodeId,CacheNodeType,ProductDescription,CacheNodeCount,State]' \
  --output table

Interpretation: ProductDescription shows each reservation's engine. Redis OSS reservations survive a rollback, so renew them as Valkey only after the one-way hop.

Extended Support is the cost of waiting

The pricing page puts it at an 80% premium in years 1 and 2 and 160% in year 3. Redis OSS 4 and 5 have paid it since 1 February 2026; Redis OSS 6 starts on 1 February 2027.

Frequently asked questions

Can I roll back ElastiCache from Valkey to Redis OSS?

Only from Valkey 7.2, and only to Redis OSS 7.1. You run the same modify call as the upgrade, with Redis OSS 7.1 as the target, or restore a Valkey 7.2 snapshot as a new Redis OSS 7.1 cache. Every attached user and user group must have engine type REDIS. From Valkey 8.x or 9.x, AWS documents no way back, so stage the upgrade through 7.2.

Does upgrading ElastiCache from Redis OSS to Valkey cause downtime?

For a replication group on Redis OSS 5.0.6 or later, reads continue and writes pause for a failover of a few seconds per shard. Older versions can see 30 to 60 seconds during DNS propagation. Existing connections are closed and node IPs change, so clients need retries with backoff. Single-node clusters must become a replication group first.

Do my ElastiCache reserved nodes still apply after moving to Valkey?

Yes. Redis OSS reserved nodes apply to Valkey nodes in the same instance family and Region. Because Valkey is priced 20% lower, the same reservation covers about 20% more Valkey capacity. Valkey reserved nodes, however, apply only to Valkey nodes, so buy them after you are past the rollback point.

Which Valkey versions does Amazon MemoryDB support?

As of November 2026, the MemoryDB engine versions page lists Valkey 7.2.6 and MemoryDB 7.3, which Multi-Region requires. ElastiCache already offers Valkey 8.x and 9.x, but MemoryDB does not. Run aws memorydb describe-engine-versions --engine valkey to see the list in your Region. MemoryDB cannot be downgraded after an engine change.

Key takeaways

  • Move ElastiCache to Valkey 7.2 first and burn it in. That is the only stage AWS lets you roll back from in place, and the rollback lands on Redis OSS 7.1.
  • Recreate custom parameter groups in the matching Valkey family with identical static values, and keep the Redis OSS group until you are past the rollback point.
  • Upgrade clients first, especially go-redis for 9.1, and make sure every client retries and rediscovers topology after a failover.
  • Keep user groups on REDIS, and buy no Valkey reserved nodes, until the one-way hop to 8.x or 9.x is done.
  • MemoryDB stops at Valkey 7.2.6 and 7.3 and has no downgrade, so a tested snapshot restore is its only fallback.

Plan your ElastiCache or MemoryDB move to Valkey with JusDB

JusDB's Valkey migration team can review your ElastiCache and MemoryDB estate, recreate and diff parameter groups, check client libraries against each Valkey version's behaviour changes, and write a rehearsed upgrade and rollback runbook for each cluster.

Bring your cluster inventory, client libraries, reserved node list, and change windows. Your team approves every production change. For the product comparison, see Redis vs Valkey.

Share this article

Database engineering notes

Articles like this one, in your inbox. No spam, unsubscribe anytime.

JusDB Team

Official JusDB content team

Keep reading

Moving a Multi-Database Valkey Instance into a 9.x Cluster

Move a Valkey instance that uses SELECT 1 to 15 into a 9.x cluster: keep or remap databases, copy each one, verify counts per database, and keep a way back.

Redis18 minNov 10, 2026
Read

Valkey Keyspace Notifications in Production: Expired Events, hexpired and Cluster Mode

Run Valkey keyspace notifications in production: why expired and hexpired events lag the TTL, how to subscribe on every cluster node, and when a stream is safer.

Redis20 minNov 10, 2026
Read

Valkey GLIDE in Production: AZ-Affinity Reads and Migrating from Legacy Clients

Configure Valkey GLIDE AZ-affinity reads on servers and clients, learn what GLIDE 2.5.3 does not support, and migrate from redis-py, Jedis, ioredis, or go-redis one service at a time.

Redis20 minNov 10, 2026
Read