AWS support got back to me, and asked me to run this to get a list of the old transactions across all nodes:
SELECT server_id, IF(session_id = 'master_session_id', 'writer', 'reader') AS ROLE, replica_lag_in_msec, oldest_read_view_trx_id , oldest_read_view_lsn from mysql.ro_replica_status;
That told me that a reader was holding a transaction. Found a select
statement on that reader that had been stuck for several days. Killed that query and the problem is resolved.