CData JDBC ドライバーで AWS Batch からリアルタイムデータにアクセスする



AWS Batch は、コンテナ化されたワークロードを大規模に実行できるフルマネージドサービスです。基盤となるコンピューティングインフラのプロビジョニングや管理は一切不要です。データチームにとっては、定期的なデータ抽出のスケジュール実行、夜間の同期ジョブ、オンデマンドでのデータパイプラインのトリガーなどを安定して行える便利な仕組みです。

CData JDBC Driver for Salesforce を使えば、Java アプリケーションから標準 SQL で Salesforce のリアルタイムデータにアクセスできます。Salesforce REST API に直接コードを書いて認証・ページネーション・フィールドマッピングを自前で処理する代わりに、JDBC URL で接続して、使い慣れた SQL 構文で Account、Opportunity、Case などのオブジェクトをクエリできます。

この記事では、CData JDBC Driver for Salesforce で Salesforce データをクエリする Java プログラムを作成し、Docker コンテナにパッケージ化して、そのイメージを Amazon Elastic Container Registry(ECR)にプッシュし、AWS Batch でスケジュール実行されるバッチジョブとして動かすまでの一連の流れを解説していきます。

事前準備

始める前に、以下のものを用意してください。

  1. CData JDBC Driver for Salesforcecdata.jdbc.salesforce.jarcdata.jdbc.salesforce.lic が含まれます)
  2. Java Development Kit(JDK)17 以降
  3. インストール済みで稼働中の Docker Desktop または Docker Engine
  4. インストール済みで IAM 認証情報を設定した AWS CLI
  5. ECR リポジトリ、Batch コンピューティング環境、ジョブキュー、ジョブ定義を作成する権限を持つ AWS アカウント
  6. API アクセスが有効で、有効な セキュリティトークン を持つ Salesforce アカウント

全体の流れ

手順の概要は次のとおりです。

  1. JDBC 経由で Salesforce に接続し、結果を CSV にエクスポートする Java プログラムを作成する
  2. プログラムをコンパイルして Docker イメージをビルドする
  3. イメージを Amazon ECR にプッシュする
  4. AWS Batch を設定してジョブを送信する

ステップ 1: Java プログラムを作成する

このプログラムは、CData JDBC Driver を使って Salesforce に接続し、SQL クエリを実行して、その結果を CSV ファイルに書き出します。cdata.jdbc.salesforce.jarcdata.jdbc.salesforce.lic は、どちらもコンパイル済みクラスと同じ作業ディレクトリに配置しておく必要があります。

import java.sql.*;
import java.io.FileWriter;

public class SalesforceBatchJob {

    public static void main(String[] args) {

        String url = "jdbc:salesforce:"
            + "SecurityToken=your_security_token;"
            + "User=your_username;"
            + "Password=your_password;"
            + "APIVersion=64.0;"
            + "AuthScheme=Basic;"
            + "UseSandbox=false;"
            + "RTK=your_rtk_key;";

        try {
            System.out.println("Connecting to Salesforce...");
            Connection conn = DriverManager.getConnection(url);
            System.out.println("Connection successful.");

            String query = "SELECT Id, Name FROM Account ORDER BY Name LIMIT 10";
            Statement stmt = conn.createStatement();
            ResultSet rs = stmt.executeQuery(query);

            FileWriter writer = new FileWriter("output.csv");
            writer.write("Id,Name\n");

            while (rs.next()) {
                String id = rs.getString("Id");
                String name = rs.getString("Name");
                writer.write(id + "," + name + "\n");
                System.out.println(id + " - " + name);
            }

            writer.close();
            conn.close();
            System.out.println("Job completed successfully.");

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

JDBC URL で使用している主な接続プロパティは次のとおりです。

プロパティ 説明
SecurityToken Salesforce のセキュリティトークン。API 認証の際にパスワードと併せて使用します。
User Salesforce のログイン用メールアドレス。
Password Salesforce アカウントのパスワード。
APIVersion 対象とする Salesforce API のバージョン(例: 64.0)。
AuthScheme ユーザー名 + パスワード + セキュリティトークンで認証する場合は Basic を指定します。
UseSandbox 本番環境では false、サンドボックス環境では true を指定します。
RTK CData のランタイムキー。ドライバーのライセンスに付属しています。詳しくはライセンスのドキュメントを参照してください。

ステップ 2: プログラムをコンパイルする

CData JDBC JAR をクラスパスに含めて Java ソースファイルをコンパイルします。ソースファイルと JAR の両方が置かれているディレクトリで、次のコマンドを実行してください。

# Compile the Java program
javac -cp cdata.jdbc.salesforce.jar SalesforceBatchJob.java

# To target a specific Java version (e.g., Java 17)
javac --release 17 -cp cdata.jdbc.salesforce.jar SalesforceBatchJob.java

これで、同じディレクトリに SalesforceBatchJob.class が生成されます。


ステップ 3: Dockerfile を作成する

コンパイル済みクラス、JAR、ライセンスファイルと同じディレクトリに、Dockerfile という名前のファイル(拡張子なし)を作成します。この Dockerfile は、Eclipse Temurin JDK 17 をベースにアプリケーションをコンテナイメージにパッケージ化します。

FROM eclipse-temurin:17-jdk-jammy

WORKDIR /app

COPY SalesforceBatchJob.class .
COPY cdata.jdbc.salesforce.jar .
COPY cdata.jdbc.salesforce.lic .

CMD ["java", "-cp", ".:cdata.jdbc.salesforce.jar", "SalesforceBatchJob"]

注意: cdata.jdbc.salesforce.lic ファイルは必ずコンテナにコピーしてください。これがないとドライバーが初期化されません。ビルドの前に、3 つのファイルすべてが同じディレクトリにあることを確認しましょう。


ステップ 4: Docker イメージをローカルでビルドしてテストする

ECR にプッシュする前に、イメージをビルドしてローカルでテストしてみましょう。

# Build the Docker image
docker build -t salesforce-batch-job .

# Test the image locally
docker run salesforce-batch-job

コンテナが Salesforce の Account レコードをコンソールに出力し、正常に終了すれば、イメージはデプロイ可能な状態です。接続エラーが出た場合は、先に進む前に解消しておきましょう。


ステップ 5: Amazon ECR リポジトリを作成する

  1. Amazon ECR コンソール を開きます。
  2. Create repository をクリックします。
  3. リポジトリ名を入力します。たとえば salesforce-batch-job などです。
  4. 設定はデフォルトのままにして、Create repository をクリックします。
  5. 確認ページから Repository URI をコピーします。形式は your-account-id.dkr.ecr.your-region.amazonaws.com/salesforce-batch-job のようになります。

ステップ 6: Docker イメージを ECR にプッシュする

ローカルの Docker クライアントを ECR レジストリに認証させたうえで、イメージにタグを付けてプッシュします。プレースホルダーの値は、ご自身の AWS アカウント ID とリージョンに置き換えてください。

# Authenticate Docker to your ECR registry
aws ecr get-login-password --region your-region |
  docker login --username AWS `
    --password-stdin your-account-id.dkr.ecr.your-region.amazonaws.com

# Tag the image for ECR
docker tag salesforce-batch-job:latest `
  your-account-id.dkr.ecr.your-region.amazonaws.com/salesforce-batch-job:latest

# Push the image to ECR
docker push `
  your-account-id.dkr.ecr.your-region.amazonaws.com/salesforce-batch-job:latest

これらのコマンドを実行する前に、ECR へのプッシュ権限を持つ AWS アクセスキー ID とシークレットアクセスキーを用意しておく必要があります。


ステップ 7: AWS Batch を設定する

AWS Batch では、コンテナ化されたジョブを実行するために、コンピューティング環境、ジョブキュー、ジョブ定義という 3 つのリソースを使います。この順番で作成していきましょう。

コンピューティング環境を作成する

  1. AWS Batch コンソールCompute environments に移動し、Create をクリックします。
  2. コンピューティング環境のタイプとして Managed を選択します。
  3. ワークロードに合わせて、インスタンスタイプ、vCPU、メモリの設定を行います。
  4. Create compute environment をクリックします。

ジョブキューを作成する

  1. Job queues に移動し、Create をクリックします。
  2. キューに名前を付けて、先ほど作成したコンピューティング環境と関連付けます。
  3. Create をクリックします。

ジョブ定義を作成する

  1. Job definitions に移動し、Create をクリックします。
  2. Image フィールドに ECR の Repository URI を設定します。たとえば your-account-id.dkr.ecr.your-region.amazonaws.com/salesforce-batch-job のようになります。
  3. Salesforce のクエリワークロードに適した vCPU とメモリの上限を設定します。
  4. Create をクリックします。

ジョブを送信する

  1. Jobs に移動し、Submit new job をクリックします。
  2. 作成したジョブ定義とジョブキューを選択します。
  3. Submit をクリックします。

AWS Batch はコンピューティングインスタンスをプロビジョニングし、ECR からイメージを取得してコンテナを実行し、ジョブが完了するとインスタンスを終了します。コンソールでジョブのステータスを確認して、正常に実行されたことを確かめましょう。


Amazon EventBridge で定期ジョブをスケジュールする

1 回限りのジョブ送信はテストには便利ですが、多くのチームではこれをスケジュール実行したいはずです。たとえば、夜間のデータ抽出、1 時間ごとの同期、終業時のレポート作成ジョブなどです。Amazon EventBridge Scheduler を使えば、追加のインフラを用意しなくても、cron スケジュールで AWS Batch ジョブをトリガーできます。

  1. Amazon EventBridge Scheduler コンソール を開き、Create schedule をクリックします。
  2. Recurring schedule を選択し、cron 式を設定します。たとえば、UTC の午前 2 時に毎日実行するには cron(0 2 * * ? *) とします。
  3. ターゲットには AWS BatchSubmitJob を選択します。
  4. ステップ 7 で作成したジョブ定義とジョブキューを指定します。
  5. EventBridge に Batch ジョブを送信する権限を付与する IAM ロールを割り当てて、保存します。

有効化すると、EventBridge は定義したスケジュールに従って Batch ジョブを実行します。実行と実行の間にサーバーを起動し続ける必要はなく、手動でのトリガーも不要です。


Salesforce のリアルタイムデータをクエリしてみましょう

CData JDBC Driver for Salesforce を使えば、バッチジョブ、ETL パイプライン、マイクロサービスなど、あらゆる Java アプリケーションを、Salesforce のリアルタイムデータに対応した SQL クライアントに変えられます。REST 呼び出しの保守も、ページネーションのロジックも、手作業でのフィールドマッピングも必要ありません。

CData JDBC Driver for Salesforce の無償トライアルをダウンロード して、数分でリアルタイムデータのクエリを始めてみましょう。


関連リソース


ご質問や問題が発生した場合は、CData サポートフォームからお気軽にお問い合わせください。また、CData JDBC Drivers のラインアップ全体もぜひご覧ください。同じやり方で、Java アプリケーションを数百種類のデータソースに接続できます。