Thanks for all your helpful suggestions - I've now got it working. It was down to a combination of things.
1. A missing rule in a security group 2. A missing DNS name for the new node, so its default name was defaulting to localhost 3. Google DNS caching the failed DNS lookup for the full duration of the SOA's TTL In order to avoid the whole problem with assigning IPs using the internal/external trick and using up elastic IPs, I found this service which I'd not seen before: http://www.ducea.com/2009/06/01/howto-update-dns-hostnames-automatically-for-your-amazon-ec2-instances/ This means you can reliably set (and reset as necessary) a listen address with this command: sed -i "s/^listen_address:.*/listen_address: `curl http://169.254.169.254/latest/meta-data/local-ipv4`/" /etc/cassandra/cassandra.yaml It's not quite as good as having a true dynamic hostname, but at least you can drop it in a startup script and forget it. Marcus