Depois de postar esse problema, enquanto eu estava trabalhando, percebi que não conseguia nem fazer ping no servidor EC2 ou telnet nele. Então algo básico tinha que estar errado. Finalmente um amigo me ajudou com o problema. Como eu esperava, o problema era muito específico do EC2.
Os detalhes são os seguintes:
Quando criamos uma instância do EC2, obtemos um endereço IP externo semelhante a:ec2-XX-XXX-XXX-XX.ap-southeast-1.compute.amazonaws.com
Ao definir as permissões no mysql eu estava concedendo as permissões para o endereço IP acima, ou seja:
GRANT ALL PRIVILEGES on . to [email protected]'ec2-XX-XXX-XXX-XX.ap-southeast1.compute.amazonaws.com' IDENTIFIED BY 'password';
Isso não funciona quando você tenta se comunicar com uma instância do EC2 de outra instância local do EC2. Para isso, você precisa fornecer o 'endereço ip interno' da instância do EC2, que pode ser encontrado usando o comando ip:
ip a:
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 16436 qdisc noqueue state UNKNOWN
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 12:31:41:02:58:47 brd ff:ff:ff:ff:ff:ff
inet **XX.XX.XX.XXX/23** brd YY.YYY.YY.YYY scope global eth0
inet6 fe80::1031:41ff:fe02:5847/64 scope link
valid_lft forever preferred_lft forever
Para que as coisas funcionem corretamente, você precisa conceder a permissão ao endereço IP --"XX.XXX.XX.XXX/23", e deve funcionar. Da mesma forma, ao conectar-se ao banco de dados "mysql", o nome do host fornecido ao comando mysql também deve ser o "endereço IP interno" da instância do host EC2.