質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

2回答

3528閲覧

SpringBootを使ってAWS上のMysqlにアクセスする(ssh接続)

kym_dki

総合スコア4

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

SSH

SSH(Secure Shell)は、セキュアチャネルを通してデータを交換するためのネットワークプロトコルです。リモートサーバーへのコマンド実行やファイル転送を行う時に一般的に使用されます。

AWS(Amazon Web Services)

Amazon Web Services (AWS)は、仮想空間を機軸とした、クラスター状のコンピュータ・ネットワーク・データベース・ストーレッジ・サポートツールをAWSというインフラから提供する商用サービスです。

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/07/14 11:58

編集2021/07/15 01:09

前提・実現したいこと

Springを勉強中の初学者です。お世話になります。

Spring Bootを利用して、AWSEC2上に構築したMysqlにssh接続し、
データを取得して、コンソールに表示するプログラムを作っています。

SpringBoot自体の知識が乏しく、解決できないためこちらで質問させてください。

発生している問題・エラーメッセージ

参考にした記事によると、SpringBootではアプリケーションが起動する前にデータベースのコネクションを作成するらしく、先にポートフォワディングが必要とのことでした。
そのため、ポートフォワディングするために以下のように実装しましたが、
NullPointerExceptionが発生してしまいました。

該当のソースコード

java

1@SpringBootApprication 2public class DbConnectTest{ 3 public static void main(String[] args){ 4 DbConnectTest app = new DbConnectTest(); 5 app.connect(); 6 SpringApplication.run(DbConnectTest.class, args); 7 } 8 9 @Autowired 10 private JdbcTemplate jdbcTemplate; 11 12 public void connect(){ 13 Session session = null; 14 try{ 15 // SSH接続情報 16 String sshHost = "xx.xxx.xxx.xxx"; 17 int sshhPort = 22; 18 String sshUser = "user" 19 String sshPassword = ""; 20 21 // DBサーバー接続情報 22 String remoteHost = "xxx.xx.x.xxx"; 23 int localPort = 3306; 24 int remotePort = 3306; 25 26 final JSch jsch = new JSch(); 27 28 jsch.addIdentity = ("pemファイルのパス"); 29 30 session = jsch.getSession(sshUser, sshHost, sshhPort); 31 session.setPassword(sshPassword); 32 33 final Properties config = new Properties(); 34 config.put("StrictHostKeyChecking", "no"); 35 session.setConfig(config); 36 37 session.connect(); 38 session.setPortForwarding(localPort, remoteHost, remotePort); 39 40 if(jdbc == null){ 41 System.out.println("jdbc is null"); 42 } 43 44 List<Map<String, Object>> list = this.jdbc.queryForList("select * from table"); 45 list.forEach(System.out::println) 46 }catch(JSchException e){ 47 e.printStackTrace(); 48 }finally{ 49 session.disconnect(); 50 } 51 } 52}
Exception in thread "main" java.lang.NullPointerExceotion

.

デバッグしてみたところ、以下の部分でjdbcの中身がnullであるため落ちていました。

List<Map<String, Object>> list = this.jdbc.queryForList("select * from table");

いろいろ解決方法を探して、SpringBootでnewすると@Autowiredが無効になる旨が書いてある記事を見つけました。
ただ、newしないで実装しようとすると、connectメソッドがstaticでないため、呼び出すことができません。
(これは私自身のjavaの知識が無いことも原因の一つだと思っております。申し訳ありません)

試したこと

ssh接続するためにJSchをMavenに追加しました。
mysql-connectorをMavenに追加しました。

補足情報(FW/ツールのバージョンなど)

java8
SpringBoot2.3.0

以下の記事を参考に作りました。
JDBCでSSHトンネルを経由してMySQLに接続する方法
Spring Bootで踏み台をSSHで通して本来アクセスできないDBに接続する

どうすればやりたいことが実現できるのか、ご教示いただけますと幸いです。
長くなりましたが最後までお読みいただきありがとうございます。
よろしくお願いいたします。

7/15 追記

LOVE-KANON様
ご指摘、ご教示くださりありがとうございます。
ご指摘の内容も受け止め勉強に励みたいと思います。

私自身言葉足らずだったところがあるので訂正いたします。申し訳ありません。
参考にした記事の通りに実装した経緯があり説明が抜けておりました。
実際に実装したところ、以下のようなエラーが出てしまい今の状況になった次第です。

// 一部抜粋 [main] INFO org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor Initializing ExecutorService 'applicationTaskExecutor' [main] INFO com.zaxxer.hikari.HikariDataSource - HikariPool-1 - Starting... [main] ERROR com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Exception during pool initialization. com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. at com.mysql.cj.jdbc.exceptions.SQLError.createCommunicationsException(SQLError.java:174) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:64) .. .. at jp.go.DbConnectTest.main(DbConnectTest.java:22) Caused by: com.mysql.cj.exceptions.CJCommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server. at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) .. .. at com.mysql.cj.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:823) ... 48 more Caused by: java.net.ConnectException: Connection refused: connect at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) .. .. at com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63) ... 51 more .. ..

こちらのエラーの解決方法として2つ目の参考にしたサイトの実装を追加したという状況です。
また、こちらのエラーの解決方法自体が見当違いでしたらご教示いただけますと助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

【解決(?)しました】
springBootを理解できていなかったため、フレームワークを使用せずに実装することにしました。
SpringBootを使用したSSH接続はまた別の機会に勉強しようと思います。
ご教示、アドバイスくださったLOVE-KANON様、ありがとうございました。

投稿2021/07/15 05:11

kym_dki

総合スコア4

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2021/07/15 18:32

ご返事できなくて申し訳ございません。。。 解決したようでよかったです! SpringBoot便利なので、また機会があれば勉強してみるとよいかもしれません!
guest

0

どこからお教えしたらよいのか。。。

まず以下について回答します。

SpringBootでnewすると@Autowiredが無効になる旨が書いてある記事を見つけました。

ただ、newしないで実装しようとすると、connectメソッドがstaticでないため、呼び出すことができません。

staticはJavaのオブジェクト指向において静的リソースを表すもので、@AutowiredはSpringBootのDI(依存性注入の概念です。)
Javaの理解と、SpringBootの理解は切り離して学習するべきだと思います。

SpringBootではアプリケーションが起動する前にデータベースのコネクションを作成するらしく、先にポートフォワディングが必要とのことでした。

今jdbcTemplateのコネクション情報をconnect内で設定しようとしてますが
ご参考になられたサイトではconnectメソッドの設定をどのように実装してますか?
SpringBootの概念が理解できていれば、newとか@Autowiredの話にならないと思います。
DBのコネクション設定よりも先にSpringBootの概念を理解した方がよいと思います。

何にしても、まずはご参考になられたサイトの実装通りに実装してください。
例えばJDBCでSSHトンネルを経由してMySQLに接続する方法では
コネクション情報を設定するmethodメソッドをどのように設定してますか?

投稿2021/07/14 17:12

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問