コンニチハBFT名古屋支店のヤタテです。
今回は、Lambda/Batchへのコンテナイメージを利用する為の事前準備について書いてみます。
Lambda/Batchへのコンテナ利用 -01.5_事前準備-
背景
AWS Lambda/Batchにて、コンテナイメージによる実装を開始。
検証内容
- Lambdaへのコンテナイメージによる関数実装
- Batchへのコンテナイメージ流用が可能であるか確認
→ Lambda専用の作りにする必要がありそう
内容
- 検証で使うPostgreSQL関連の準備
- 検証で使うJavaコードの準備
1. PostgreSQL関連の準備
サンプルデータ
■テーブル1----
id | prefecture | city | population_mil |
---|---|---|---|
1 | 岩手 | 遠野 | 122 |
2 | 長野 | 軽井沢 | 203 |
3 | 愛知 | 名古屋 | 753 |
4 | 福岡 | 博多 | 510 |
〇データ型
- id/population_mil…integer
- prefecture/city…varchar(20)
■テーブル2----
id | city | specialty |
---|---|---|
1 | 遠野 | 羊肉 |
2 | 軽井沢 | わさび |
3 | 名古屋 | 手羽先 |
4 | 博多 | もつ鍋 |
〇データ型
- id…integer
- city/specialty…varchar(20)
■テーブル3----
※テーブル1/2を内部結合し、
クエリ結果を取得するテーブル
id | prefecture | city | specialty | timestamp |
---|---|---|---|---|
<自動採番> | <県名> | <市名> | <名物> | <追加日> |
〇データ型
- id…integer
- prefecture/city/specialty…varchar(20)
- timestamp…timestamp without time zone
2. 検証で使うJavaコードの準備
Eclipseの準備
Eclipseのインストールは、以下参照。 今回は、Pleiades All in OneのJava - Full Edition(windows x64)を選択。
参考:Eclipse入門~初めてのインストールから起動、概要までを基礎から解説
プロジェクトの作成
Eclipseでプログラムを作成する際は、
1プログラム(jarアプリ) = 1プロジェクト
で考える。
Javaプロジェクトの作成は、以下参照。
参考:Eclipseでの初めてのコーディング~プログラムの実行方法まで解説
プロジェクトの中身作成
作成したプロジェクトで以下を順に作成する。
※作成時は、プロジェクト名またはパッケージ名を右クリック→「新規」からそれぞれ選ぶ
- パッケージ //srcフォルダ内にパッケージが作成される
- クラス //パッケージ内にクラスが作成される (コーディング対象)
- フォルダ - lib //ライブラリ格納場所
ライブラリの導入
今回は、PostgreSQLのJDBCドライバを使用する。
導入方法は、以下参照。
※ライブラリの導入方法は参考以外の手段もあるため、適宜選択。
参考:https://nompor.com/2018/01/23/post-2399/
Javaコーディング
- 前項で作成したクラスを右クリックし、「開く」を選択する。
- xxx.javaのエディタ画面が表示される。
- 書きたいコードを書く。
今回書きたいコード
■動作概要 tstbl1とtstbl2を参照し、「県、市、名物」をtstbl3へレコード追加する。 追加後、tstbl3の全レコードを参照する。
■コード ※見よう見まねで書いたものなので、コードの内容自体はあまり参考にならず。。。
package poc001; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class Sqldo { public static void main(String[] args) { Connection conn = null; Statement stmtIst = null; Statement stmtSct = null; ResultSet rset = null; //接続文字列 String url = "jdbc:postgresql://rds-pgdb.abcdef12345678.ap-northeast-1.rds.amazonaws.com:5432/tsdb"; String user = "usr001"; String password = "passw0rd"; try { //PostgreSQLへ接続 conn = DriverManager.getConnection(url, user, password); //自動コミットOFF conn.setAutoCommit(false); //INSERT文の実行 stmtIst = conn.createStatement(); String sqlIst = "insert into tschema.tstbl3 " + "(prefecture, city, specialty, timestamp) " + "select " + "prefecture, " + "tstbl1.city, " + "specialty, " + "timezone('JST',current_timestamp) " + "from tschema.tstbl1 inner join tschema.tstbl2 " + "on tschema.tstbl1.city = tschema.tstbl2.city " ; stmtIst.executeUpdate(sqlIst); conn.commit(); //SELECT文の実行 stmtSct = conn.createStatement(); String sqlSct = "select " + "id, " + "prefecture, " + "city," + "specialty, "+ "to_char(current_timestamp, 'YYYY-MM-DD HH24:MI:SS')" + "from tschema.tstbl3"; rset = stmtSct.executeQuery(sqlSct); //更新後の確認 rset = stmtSct.executeQuery(sqlSct); //クエリ結果の受取 while(rset.next()) { String colIds = rset.getString(1); String colPre = rset.getString(2); String colCty = rset.getString(3); String colPop = rset.getString(4); String colTim = rset.getString(5); System.out.println(colIds + "\t" + colPre + "\t" + colCty + "\t" + colPop + "\t" +colTim) ; } } catch (SQLException e) { e.printStackTrace(); } finally { try { if(rset != null)rset.close(); if(stmtIst != null)stmtIst.close(); if(stmtSct != null)stmtSct.close(); if(conn != null)conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }
実行
※「実行(>)」ボタンを押下する
実行前 ※実行前はpsqlでselect実施。
id | prefecture | city | specialty | timestamp ----+------------+------+-----------+----------- (0 rows)
1回目
1 岩手 遠野 羊肉 2021-03-25 11:36:47 2 長野 軽井沢 わさび 2021-03-25 11:36:47 3 愛知 名古屋 手羽先 2021-03-25 11:36:47 4 福岡 博多 もつ鍋 2021-03-25 11:36:47
→idは自動採番、timestampは実行時間、その他はtstbl1とtstbl2からそれぞれ引っ張れていることを確認。
2回目
1 岩手 遠野 羊肉 2021-03-25 11:36:47 2 長野 軽井沢 わさび 2021-03-25 11:36:47 3 愛知 名古屋 手羽先 2021-03-25 11:36:47 4 福岡 博多 もつ鍋 2021-03-25 11:36:47 5 岩手 遠野 羊肉 2021-03-25 12:40:34 6 長野 軽井沢 わさび 2021-03-25 12:40:34 7 愛知 名古屋 手羽先 2021-03-25 12:40:34 8 福岡 博多 もつ鍋 2021-03-25 12:40:34
→追加4レコードのタイムスタンプが、実施に合わせて異なっていることを確認。
実行後をpsqlでselect実施
id | prefecture | city | specialty | timestamp ----+------------+--------+-----------+---------------------------- 1 | 岩手 | 遠野 | 羊肉 | 2021-03-25 11:36:47.150405 2 | 長野 | 軽井沢 | わさび | 2021-03-25 11:36:47.150405 3 | 愛知 | 名古屋 | 手羽先 | 2021-03-25 11:36:47.150405 4 | 福岡 | 博多 | もつ鍋 | 2021-03-25 11:36:47.150405 5 | 岩手 | 遠野 | 羊肉 | 2021-03-25 12:40:34.865189 6 | 長野 | 軽井沢 | わさび | 2021-03-25 12:40:34.865189 7 | 愛知 | 名古屋 | 手羽先 | 2021-03-25 12:40:34.865189 8 | 福岡 | 博多 | もつ鍋 | 2021-03-25 12:40:34.865189 (8 rows)
JARファイルの作成
ライブラリ込みでJARを作成。 作成方法は、以下参照。
作成したJARファイルを実行してみる。
JAR実行用バッチ ※実行後、3秒後にJARを実行する
@echo off set dir=C:\work\JavaWork\ set jar=SqlDo8_v3.jar echo 3秒後に、%jar%を実行します。 timeout /nobreak 3 java -jar %dir%%jar% pause
実行結果
3秒後に、SqlDo8_v3.jarを実行します。 0 秒待っています。終了するには CTRL+C を押してください ... 1 岩手 遠野 羊肉 2021-03-25 13:06:58 2 長野 軽井沢 わさび 2021-03-25 13:06:58 3 愛知 名古屋 手羽先 2021-03-25 13:06:58 4 福岡 博多 もつ鍋 2021-03-25 13:06:58 続行するには何かキーを押してください . . .
以上、JARの作成完了。
番外編 -Gradleを使用した手動ビルド-
Gradleを導入し、以下の通りHelloWorldで検証。
※途中まで手動でやろうとしていたが、結局Eclipseで実施したため、付録として。
1. ディレクトリ準備
プロジェクトディレクトリ:C:\work\JavaWork\hello_project 以下、PJディレクトリ配下
build.gradle src L main L java L hello HelloWorld.java
■Javaコード
package hello; public class HelloWorld { public static void main(String[] args) { System.out.println("HelloWorld!!"); } }
■build.gradle
group 'helloworld' version '1.0' apply plugin: 'java' sourceCompatibility = 1.8 jar { manifest { attributes 'Main-Class': 'hello.HelloWorld' ←パッケージ名入れるのポイント(つまづいた箇所) } }
■ビルドコマンド
前提:カレントディレクトリがbuild.gradleファイルの配置されたディレクトリであること
> cd "C:\work\JavaWork\hello_project" > dir →build.gradleファイルが存在することを確認 > gradle build BUILD SUCCESSFUL in 1s 2 actionable tasks: 2 executed
■ビルド結果出力先
.gradle ←実行結果のログ等が出力される build.gradle src build ←ビルド後のファイルが出力される L classes ←クラスファイルが格納される L generated L libs ←jarファイルが格納される L tmp
■jarの実行
> java -jar "C:\work\JavaWork\hello_project\build\libs\hello_project-1.0.jar" HelloWorld!!