2010-08-28 12 views
7

Ho un sito piccolo che ho creato utilizzando il framework Play che sto cercando di eseguire su un server EC2 contro un'istanza di Amazon RDS. Posso eseguire l'app sulla mia macchina contro l'istanza RDS e tutto funziona correttamente. Ma quando schiero al mio server EC2 si ottiene questo errore:Connessione EC2 a RDS utilizzando Play framework

 
The last packet successfully received from the server was 1,282,977,731,085 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago. 
     at play.db.DBPlugin.onApplicationStart(DBPlugin.java:87) 
     at play.Play.start(Play.java:381) 
     at play.Play.init(Play.java:247) 
     at play.server.Server.main(Server.java:85) 
Caused by: java.net.ConnectException: Connection refused 

Il mio primo pensiero è stato che era una sorta di impostazioni di sicurezza, ma ho un'applicazione basata Primavera in esecuzione in Tomcat sullo stesso server EC2 connessione a la stessa istanza RDS con lo stesso nome utente e password, e funziona perfettamente. Solo l'app Play presenta problemi di connessione.

Non riesco a trovare alcuna spiegazione sul motivo per cui questo sta accadendo, o idee su come risolverlo.

Qualcuno ha mai visto qualcosa di simile?

+0

ho aggiunto "Java" al tuo elenco dei tag nel caso in cui si tratta di un problema specifico-java. –

risposta

2

Il problema è con il file application.conf. Se si specifica vostro DB locale come questo:

db=mysql:root:[email protected] 

e il vostro prod DB in questo modo:

%prod.db.url=jdbc:mysql://<your-db-ip>:3306/db 
%prod.db.user=db_user 
%prod.db.pass=db_pass 

Otterrete questo errore quando si tenta di eseguire in produzione, perché giocare! sta in realtà cercando di usare il parametro db = mysql: root: pass @ db per connettersi poiché i parametri prod non sovrascrivono quel parametro in modo specifico. Per risolvere questo problema, assicurarsi di connettersi al DB nello stesso modo in locale e in prod.Questo ha funzionato per me:

db.url=jdbc:mysql://localhost:3306/db 
db.user=root 
db.pass=pass 

%prod.db.url=jdbc:mysql://<your-db-ip>:3306/db 
%prod.db.user=db_user 
%prod.db.pass=db_pass 
0

Non so nulla di nessuno di questi framework (o Java in generale), ma ho una certa esperienza con entrambi questi servizi Amazon - potrebbe essere possibile che questi framework comunichino utilizzando protocolli diversi o in porte diverse ? Se è così, potrebbe comunque essere un problema di sicurezza.

Se questa è una possibilità, poi vai a EC2> Gruppi di protezione e se non si dispone di queste tre linee, provate ad aggiungerli:

All | icmp | -1 | -1 | default group 
All | tcp | 0 | 65535 | default group 
All | udp | 0 | 65535 | default group 

("gruppo di default" è il nome di default, e quello che ho chiamato il mio, ma il nome del tuo gruppo potrebbe essere diverso - in ogni caso assicurati che siano il nome del gruppo e non "0.0.0.0/0")

Inoltre, se sei a conoscenza di particolari protocolli/porte hai bisogno apri, poi ovviamente aggiungili anche tu.

0

L'errore può essere causato da un numero qualsiasi di cose e sembra che si verifichi a un livello inferiore dello stack del protocollo rispetto a quello che si sta guardando. Raccomando di eseguire un analizzatore di pacchetti (ad esempio wireshark) sul server di invio per cercare di capire cosa sta succedendo. Forse i pacchetti non arrivano? Forse il tuo cliente sta confondendo qualcosa a causa del diverso ambiente in cui si trova? Uno sniffer di pacchetti può essere prezioso per svelare il mistero della disconnessione.

Se il server è senza testa o non è possibile inoltrare una sessione grafica, è sempre possibile utilizzare uno strumento da riga di comando, come tcpdump su sistemi * nix.

0

Ho chiesto la stessa domanda qui

Amazon RDS and Elastic Beanstalk connectivity

Molto probabilmente il problema sarà ottenere fisso dopo aver aggiunge il gruppo di protezione "elasticbeanstalk-default" in RDS gruppo di protezione predefinito

Problemi correlati