はじめまして。新人エンジニアでJava,MySQLについて半年ほど学び、只今WEBアプリケーションについて勉強しています。
環境はMacにてEclipse(Luna)を使用し、Java(SE8),JSP,MySQL(5.6),Tomcat(8.0)を使用してWEBアプリを作ろうとしております。
この度WEBアプリケーションをローカルではなく実際にFacebookアプリとして申請してみようと考え、AWSを利用することとなりました。
RDSインスタンス(MySQL)を作り、簡単なテストデータを入れ、同様に簡単なテストJSPからサーブレットを利用してDBのテーブルの表示を行ってみようと、Beanstalkを使用しプロジェクトをデプロイしたのですが、うまくDBに接続できないのでこちらで質問をさせていただきました。
まず、localhostでプロジェクトを実行した時、上記のテストデータはしっかりと動き、RDSのDBに接続できます。
同様にターミナル上でEC2にSSH接続し、RDSに接続もできます。
しかし、Beanstalkを使いEC2にデプロイするとDBに接続できなくなります。
調べた結果セキュリティグループが合っていないことが原因かと推測したのですが、RDS,EC2インスタンスそれぞれのセキュリティグループで互いのセキュリティグループを解放にしても全アドレス(0.0.0.0/0)を解放しても接続出来ませんでした。
次にAvilability Zoneが、それぞれでp-northeast-1cとp-northeast-1aで違うことが原因かと推測し、作り直し統一させてみましたがこちらもうまくいかず、理由がみつかりません。
localhost上で(DBには接続していますが)うまくいくのにサーバーに上げるとうまくいかないことを考えるとソースが間違えている可能性も少ないかと考えています。試しにhttp://codezine.jp/article/detail/7875こちらにあるサンプルのプロジェクトをデータベースのurl部分だけ変えて、テストデータを作り使用してみましたが同様でした。
VPCはデフォルトのまま使用しているのですが、同一のVPCを使っているので関係ないかなぁとも考えています。
またPublicly AccessibleはYESとなっております。
考えられる原因がなく四苦八苦しています。よろしければご教授お願いいたします。
以下上記サイトのサンプルのservlet部分になります。名前やパスワード、DBのURLなどは適時変えています。
public class TestModel {
private final static String DRIVER = "com.mysql.jdbc.Driver";
// 1.データベースの接続先情報を指定
private final static String URI = "jdbc:mysql://testdb.xxx.rds.amazonaws.com:3306/testdb";
// 2.データベースに接続するときのユーザ名とパスワードを指定
private final static String DBUSER = "dbuser";
private final static String PASSWORD = "password";
// コンストラクタ
public TestModel(){
}
/**
* DBから値を取得するメソッド(JDBC)
* *
* @return SQL実行結果
*
*/
public List<BookBean> connectDB(){
// 戻り値
List<BookBean> result = new ArrayList<BookBean>();
// DB接続オブジェクト
Connection con = null;
try {
// JDBCドライバのロード
Class.forName(DRIVER);
// データベースへの接続
con = DriverManager.getConnection(URI, DBUSER, PASSWORD);
Statement st = con.createStatement();
// SQLの実行
ResultSet rs = st.executeQuery("select id, name, price, authorname from bookview");
// データベースの検索結果をBookBeanに格納する
if (rs != null) {
while (rs.next()) {
BookBean bb = new BookBean();
bb.setId(rs.getString("id"));
bb.setName(rs.getString("name"));
bb.setPrice(rs.getInt("price"));
bb.setAuthorname(rs.getString("authorname"));
result.add(bb);
}
}
// データベース切断処理
rs.close();
st.close();
con.close();
} catch (Exception e) {
// エラー処理
}finally{
// データベース切断処理
try {
// データベース切断処理
con.close();
}catch(Exception e){
// エラー処理
}
}
// データベースの検索結果が格納されたList<BookBean>を返す
return result;
}
}