AWS LambdaでCData JDBC Driverを使う

by 浦邊信太郎 | 2020年11月27日

こんにちは。CData Software Japanエンジニアの浦邊です。 本記事ではAWS LambdaでCData JDBC Driverを使用する方法を紹介します。

今回は例としてCData Salesforce JDBC Driverを使用します。 Salesforceの製品情報が格納されている「Product2」オブジェクトを参照し、入力した製品コードから製品名を取得します。

CData Salesforce JDBC Driverのインストール

CData Software Japan社のCData Salesforce JDBC Driverダウンロードページにアクセスしてください。 ダウンロードページの[ダウンロード 評価版]をクリックすると必要事項入力画面が表示されます。

f:id:urabe_shintaro:20201127142628p:plain

必要事項を入力し、[ダウンロード]をクリックするとCData Salesforce JDBC Driver評価版のインストーラがダウンロードされます。 ダウンロードしたファイルをダブルクリックするとインストーラが起動しますので、ウィザードに従ってインストールしてください。 途中、ライセンスサーバーへのオンラインアクティベーションが行われるためネットワーク環境に接続されている必要があります。 ライセンスサーバにアクセス出来ないネットワーク環境の場合は、CData Software Japan テクニカルサポートまでお問い合わせください。

テストシナリオ

データ取得対象の「Product2」オブジェクトの内容を以下に示します。 今回のテストではLambda関数に製品コード「GC3060」を入力し、「Product2」を参照してこのコードに該当する製品名「GenWatt Propane 1500kW」を取得します。

f:id:urabe_shintaro:20201127151000p:plain

テストプログラム

Lambdaの関数として動作させるJavaプログラムを作成します。 テストプログラムではSalesforceの製品データが格納されている「Product2」オブジェクトを参照し、関数の入力値として指定した製品コードをもとに製品名を取得します。

また、今回は依存ライブラリの取得とパッケージングにMavenを使用します。 作成したJavaコード(GetProductName.java)とpom.xmlを以下に載せます。

Javaコード

テストプログラムは以下の3つのステップで構成されています。

  1. アカウント情報を設定しSalesforceに接続
  2. データを取得するクエリを発行
  3. 取得したデータを出力オブジェクトに設定

Lambda上でのライセンス認証にはRTK(ランタイムキー)が必要になります。 評価版のRTKはCDataサポートデスクまでお問い合わせください。

package test;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;
import com.amazonaws.services.lambda.runtime.Context;
import com.amazonaws.services.lambda.runtime.RequestHandler;

public class GetProductName implements RequestHandler<Map<String, Object>, Map<String, Object>> {

    public Map<String, Object> handleRequest(Map<String, Object> input, Context context) {
        Map<String, Object> output = new HashMap<String, Object>();
        try {
            Class.forName("cdata.jdbc.salesforce.SalesforceDriver");

            // 1. 接続プロパティを指定して接続
            Properties prop = new Properties();
            prop.setProperty("User","your-user-name");
            prop.setProperty("Password","your-password");
            prop.setProperty("SecurityToken","your-security-token");
            prop.setProperty("RTK", "your-rtk"); // RTKを指定
            Connection conn = DriverManager.getConnection("jdbc:salesforce:",prop);

            // 2. Product2オブジェクトを参照し、製品コードをもと製品名を取得するクエリを実行
            String query = "Select * from Product2 where ProductCode = ? ";
            PreparedStatement stat = conn.prepareStatement(query);

            // 製品コードは入力オブジェクト(input)から取得
            stat.setString(1, (String)input.get("ProductCode"));

            stat.execute();

            ResultSet rs=stat.getResultSet();
            if(rs.next()) {
                // 3. 取得した製品名を出力オブジェクト(output)に登録
                output.put("Name",rs.getString("Name"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

        output.put("input", input);
        output.put("context", context);
        return output;
    }
}

pom.xml

<project xmlns="http://maven.apache.org/POM/4.0.0"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>lambda-test-01</groupId>
    <artifactId>test</artifactId>
    <packaging>jar</packaging>
    <version>0.0.1-SNAPSHOT</version>
    <dependencyManagement>
        <dependencies>
            <dependency>
                <groupId>com.amazonaws</groupId>
                <artifactId>aws-java-sdk-bom</artifactId>
                <version>1.11.156</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-s3</artifactId>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-core</artifactId>
            <version>1.1.0</version>
        </dependency>
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-lambda-java-events</artifactId>
            <version>1.3.0</version>
        </dependency>
        <dependency>
            <groupId>jdbc.cdata</groupId>
            <artifactId>cdata-salesforce</artifactId>
            <version>20.0.7632</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-shade-plugin</artifactId>
                <version>3.0.0</version>
                <executions>
                    <execution>
                        <phase>package</phase>
                        <goals>
                            <goal>shade</goal>
                        </goals>
                    </execution>
                </executions>
            </plugin>
        </plugins>
    </build>
</project>

デプロイパッケージの作成

LambdaではJavaコードと依存関係を1つのjarファイルにまとめたものをデプロイパッケージとしてアップロードします。

f:id:urabe_shintaro:20201127154921p:plain

リポジトリへのCData Driverの追加

デプロイパッケージにCData JDBC Driverを含めるために、ローカルにインストールされているCData JDBC Driverのjarをリポジトリに追加します。 以下のコマンドを実行してください。

mvn install:install-file -Dfile=<ドライバのファイルパス> -DgroupId=<Group Id> -DartifactId=<Artifact Id> -Dversion=<バージョン> -Dpackaging="jar" -DgeneratePom=true

実行例:

mvn install:install-file -Dfile="C:\Program Files\CData\CData JDBC Driver for Salesforce 2020J\lib\cdata.jdbc.salesforce.jar" -DgroupId="jdbc.cdata" -DartifactId="cdata-salesforce" -Dversion="20.0.7632" -Dpackaging="jar" -DgeneratePom=true

jarの作成

以下のコマンドでデプロイパッケージのjarを作成します。

mvn package

パッケージの作成に成功するとTargetフォルダにjarファイルが生成されます。

Lambda関数の作成と実行

AWS Lambdaのトップから[関数を作成]をクリックします。

f:id:urabe_shintaro:20201127142703p:plain

[関数の作成]画面で関数の設定を行います。 今回は自前のコードを使用するため、オプションから[一から作成]を選択します。 [関数名]に適当な関数名を指定し、[ランタイム]にJava(バージョンは任意)を選択します。

f:id:urabe_shintaro:20201127142717p:plain

設定が完了したら右下の[関数を作成]ボタンをクリックしてください。

jarパッケージのアップロード

[関数コード]セクションから[アクション]メニューを開き[.zipまたはjarファイルをアップロード]を選択します。

f:id:urabe_shintaro:20201127142731p:plain

[アップロード]ボタンをクリックするとファイル選択画面が開きます。 作成したデプロイパッケージのjarファイルを選択し[保存]をクリックします。

f:id:urabe_shintaro:20201127142743p:plain

ハンドラの指定

[Runtime settings][Edit]をクリックして[ランタイム設定]画面を開きます。 [ハンドラ]に作成したデプロイパッケージのクラス名とメソッド名を入力し[保存]をクリックします。

f:id:urabe_shintaro:20201127150515p:plain

イベントの作成

続いてテストイベントを作成します。 テストイベントが選択されていない状態で[テスト]をクリックすると[テストイベントの設定]ダイアログが表示されます。

f:id:urabe_shintaro:20201127142801p:plain

[イベント名]に任意の名前を入力し、関数の入力値を指定します。 今回は製品コード(ProductCode)を指定します。

f:id:urabe_shintaro:20201127142819p:plain

入力が完了したら[作成]ボタンをクリックしてください。

関数の実行

作成したテストイベントが選択されていることを確認し[テスト]をクリックしてください。

f:id:urabe_shintaro:20201127142836p:plain

実行が完了すると以下のように結果が表示されます。 指定した製品コード「GC3060」に該当する製品名「GenWatt Propane 1500kW」が取得できていることが確認できました。

f:id:urabe_shintaro:20201127143100p:plain

タイムアウトエラーの対応

ドライバによる外部サービスへの接続には時間がかかる場合があります。 このとき以下のようにTask Timed Outのエラーが発生して実行に失敗することがあります。

f:id:urabe_shintaro:20201127142945p:plain

このエラーが発生した際にはタイムアウトの時間を変更してください。

関数の[基本設定]セクションの[編集]をクリックし、[基本設定の編集]画面を開きます。 [タイムアウト]の時間を1分など長い時間に変更し、[保存]をクリックしてください。

f:id:urabe_shintaro:20201127143020p:plain

おわりに

本記事ではAWS LambdaでCData JDBC Driverを使う方法を紹介しました。 CDataドライバを使うことでSalesforce, kintone, NetSuiteなど様々なクラウドサービスと連携する関数を効率的に作成することができます。 Lambdaでのクラウドサービス連携をご検討の方はぜひお試しください。

関連コンテンツ

トライアル・お問い合わせ

30日間無償トライアルで、CData のリアルタイムデータ連携をフルにお試しいただけます。記事や製品についてのご質問があればお気軽にお問い合わせください。