QA@IT

AWSでRDSとEC2の接続ができない(java)

4531 PV

はじめまして。新人エンジニアで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;

    }


}

ウォッチ

この質問への回答やコメントをメールでお知らせします。