BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【AWS】Lambda/Batchへのコンテナ利用 -01.5_事前準備-

コンニチハBFT名古屋支店のヤタテです。
今回は、Lambda/Batchへのコンテナイメージを利用する為の事前準備について書いてみます。

Lambda/Batchへのコンテナ利用 -01.5_事前準備-

背景

AWS Lambda/Batchにて、コンテナイメージによる実装を開始。

検証内容

  1. Lambdaへのコンテナイメージによる関数実装
  2. Batchへのコンテナイメージ流用が可能であるか確認
     → Lambda専用の作りにする必要がありそう

内容

  1. 検証で使うPostgreSQL関連の準備
  2. 検証で使う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での初めてのコーディング~プログラムの実行方法まで解説

プロジェクトの中身作成

作成したプロジェクトで以下を順に作成する。
※作成時は、プロジェクト名またはパッケージ名を右クリック→「新規」からそれぞれ選ぶ

  1. パッケージ  //srcフォルダ内にパッケージが作成される
  2. クラス    //パッケージ内にクラスが作成される (コーディング対象)
  3. フォルダ - lib //ライブラリ格納場所

ライブラリの導入

今回は、PostgreSQLJDBCドライバを使用する。
導入方法は、以下参照。
※ライブラリの導入方法は参考以外の手段もあるため、適宜選択。

参考:https://nompor.com/2018/01/23/post-2399/

Javaコーディング

  1. 前項で作成したクラスを右クリックし、「開く」を選択する。
  2. xxx.javaのエディタ画面が表示される。
  3. 書きたいコードを書く。

今回書きたいコード

■動作概要 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を作成。 作成方法は、以下参照。

参考:Eclipse での 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!!