Salesforce の Data Loader(データローダ)をコマンド(CUI)で操作する方法

##概要

Salesforceプラットフォームを利用している人向けの内容です。
Data Loader は Salesforceのデータを操作するために利用するためのものだが、通常はアプリで操作するために作られており、必要な時にデータを操作(insertやexportなど)する使い方が一般的です。今回は定期的なデータ取得のため、バッチ化したくなったので方法をまとめました。ちなみにWindows版はバッチが用意されているのでWindowsの人はバッチを使えばよいです。本記事はLinux上(検証はMac)で実行するためのものです。


##実行環境

macOS Mojave 10.14.5
Java 12.0.1

## 手順

以下のように進めていきます。

1. パスワード暗号鍵ファイルを生成
2. パスワードを暗号化
3. 項目の対応付けファイルを作成
4. 設定ファイルの作成
5. 実行(今回はexport)

#### 進める前に Data Loader の構造について

Data Loader をインストールすると下記のような構造になっている。(dataloader.commandはMac版には存在する、他は未確認)

```:DataLoader
├── configs
│   ├── config.properties
│   └── log-conf.xml
├── dataloader-45.0.0-uber.jar
└── dataloader.command

```

dataloader-45.0.0-uber.jar を使って操作することになる。



## 1. パスワード暗号鍵ファイルを生成

-k オプションを使います。キー名はなんでもOK

```
java -cp dataloader-45.0.0-uber.jar com.salesforce.dataloader.security.EncryptionUtil -k ~/dataloader.key
```


## 2. パスワードを暗号化

-e オプションを使います。
passwordにはSalesforceにログインするときのユーザのパスワードを入力してください。
dataloader.key は先ほど作成したパスワード暗号鍵を指定してください。

```
java -cp dataloader-45.0.0-uber.jar com.salesforce.dataloader.security.EncryptionUtil -e password ~/dataloader.key
```

## 3. 項目の対応付けファイルを作成

sdlという拡張子のファイルを作成します。
このファイルはSalesforceのデータと、CSV出力する際のカラムをマッピングするものになります。
CSV出力では不等号の左側にSalesforceのデータ項目、右側にCSV出力先の項目になります。
更新系ではこのルールが逆になるので注意です。
以下、例です。

```:sdlファイル
#Salesforceデータ=CSVカラム名
Id=ID
CreatedById=CREATEDBYID
...
```

## 4. 設定ファイルの作成

設定ファイルにはプロセスの詳細を書きます。
以下、必要な箇所だけ番号付きで書いていきます。（説明用なのでファイルには書かないように）
※ key "sfdc.extractionSOQL" に SELECT * FROM Account と記載していましたが、SOQLでアスタリスクは利用できないのでミスです。必要なカラムをすべて列挙する必要があります。

```:process-conf.xml
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans>
   <bean id="process_id" ← ① プロセスID このIDを指定して、コマンドを実行することになります
         class="com.salesforce.dataloader.process.ProcessRunner"
         singleton="false">
     <description>"salesforce and saves info into a CSV file."</description>
       <property name="name" value="process_id"/>
       <property name="configOverrideMap">
           <map>
               <entry key="sfdc.debugMessages" value="false"/>
　　　　　　　　　↓ ② ログのパス
               <entry key="sfdc.debugMessagesFile" value="/Users/name/dataloader/v45.0.0/query_data/status/sfdcSoapTrace.log"/>
　　　　　　　　　↓ ③ エンドポイント。ブラウザでログインする場合と同じURLになります。
               <entry key="sfdc.endpoint" value="https://mysalesforce.com"/>
　　　　　　　　　↓ ④ ユーザ名。ブラウザでログインする時のIDと同じ。
               <entry key="sfdc.username" value="username@mail.co.jp"/>
　　　　　　　　　↓ ⑤ 暗号化したパスワード。 2. パスワードを暗号化 で暗号化したパスワードを設定します。
               <entry key="sfdc.password" value="11110167ekc9180135do941c95b045kdoac9a288f7102po01f7f90390b4f30o"/>
　　　　　　　　　↓ ⑥ パスワード暗号鍵ファイル。1. パスワード暗号鍵ファイルを生成　で生成した暗号鍵のパスを設定します。
               <entry key="process.encryptionKeyFile" value="/Users/name/dataloader/v45.0.0/query_data/secret/dataloader.key"/>
               <entry key="sfdc.timeoutSecs" value="600"/>
               <entry key="sfdc.loadBatchSize" value="200"/>
　　　　　　　　　↓ ⑦ エンティティ名
               <entry key="sfdc.entity" value="Account"/>
               <entry key="sfdc.extractionRequestSize" value="500"/>
　　　　　　　　　↓ ⑧ SQL。エンティティに対して取得したいSQLを書きます。
               <entry key="sfdc.extractionSOQL" value="SELECT 必要なカラム FROM Account"/>
               <entry key="process.operation" value="extract"/>
　　　　　　　　　↓ ⑨ マッピングファイルのパス。 3. 項目の対応付けファイルを作成　で作成したファイルのパスを設定します。
               <entry key="process.mappingFile" value="/Users/name/dataloader/v45.0.0/query_data/conf/csvAccountExtract.sdl"/>
               <entry key="dataAccess.type" value="csvWrite"/>
　　　　　　　　　↓ ⑩ CSVファイル名。出力するCSVのパスを設定します。
               <entry key="dataAccess.name" value="/Users/name/dataloader/v45.0.0/query_data/data/csvAccountExtract.csv"/>
           </map>
       </property>
   </bean>
</beans>
```

設定ファイルにはbeanを複数設定することもでき、コマンド実行時にbeanのIDを指定してプロセスを実行することになります。


## 5. 実行(今回はexport)

下記コマンドで実行します。
Dsalesforce.config.dir は 4. 設定ファイルの作成 で作成したファイルの配置されているディレクトリになります。設定ファイル名そのものではないので注意。
process.name には 4. 設定ファイルの作成 で設定した bean の ID を入力します。
このコマンド実行でCSV出力ができます。


```
java -cp dataloader-45.0.0-uber.jar -Dsalesforce.config.dir=/Users/name/dataloader/v45.0.0/sample/conf com.salesforce.dataloader.process.ProcessRunner process.name=process_id
```


ちょっと試したのですが、設定ファイルに複数のbeanを設定し、実行時にカンマ区切りでプロセスを複数実行させようとしたのですができなかったです。何か方法があるのだろうか。結局、複数のプロセスを実行したい場合は、コマンドを必要なだけ実行する方法を使っています。


以上になります。