VISASQ Dev Blog

ビザスク開発ブログ

クライアントログイン情報フロー + Bulk API 2.0によるSalesforce一括データクエリ

はじめに

こんにちは! 開発部 Salesforceチームの伊藤です。

今回はSalesforce組織にOAuth 2.0 クライアントログイン情報フローの接続アプリケーション設定を行い、Bulk API 2.0による一括データクエリを試してみたのでご紹介します。

OAuth 2.0 クライアントログイン情報フロー

Winter'23 リリースからサポートが開始された、ブラウザを介したユーザー認証を必要としないサーバー間連携に最適化された認証フローです。

Salesforceの接続アプリケーションから取得できる「コンシューマー鍵(client_id)」と「コンシューマーの秘密(client_secret)」によってアクセストークンを発行します。

接続アプリケーションにはあらかじめ連携用ユーザーを設定しておく必要があります。

Bulk API 2.0

Salesforceでは大量データの処理に最適化されたAPIとしてBulk APIが提供されていますが、Bulk API 2.0は従来のBulk APIと比較するとクライアント側のコーディングがシンプルにできたりジョブ状況が容易に監視できたりするなど、いくつかの点で優れています。

設定手順

1. 接続アプリケーションの作成

Salesforce環境にログインし、接続アプリケーションを作成します。 外部クライアントアプリケーション > 設定 >「新規接続アプリケーション」を押下します。

以下の設定内容で接続アプリケーションを保存します。
(「基本情報」セクションは環境に合わせて任意に設定)

  • OAuth 設定の有効化:TRUE
  • コールバック URL:任意のURL
    (入力必須ですが、クライアントログイン情報フローでは使用しないため任意の値でOKです)
  • 選択した OAuth 範囲:
    API を使用してユーザーデータを管理 (api)
  • サポートされる認証フローに Proof Key for Code Exchange (PKCE) 拡張を要求:TRUE
  • Web サーバーフローの秘密が必要:TRUE
  • 更新トークンフローの秘密が必要:FALSE
  • クライアントログイン情報フローを有効化:TRUE

2. ポリシーの編集

作成した接続アプリケーションの「Manage」ボタン押下後「ポリシーを編集」を押下します。
「クライアントログイン情報フロー」セクションの「別のユーザーとして実行」に連携用ユーザーを設定します。

3. コンシューマー鍵、コンシューマーの秘密の取得

アプリケーションマネージャー > 作成した接続アプリケーション > 参照 を押下します。
「コンシューマーの詳細を管理」を押下し、コンシューマー鍵、コンシューマーの秘密を取得します。

注: コンシューマー鍵、コンシューマーの秘密はそれぞれアクセストークン取得時のパラメーター(client_id, client_secret)として使用するため、手元に控えておきます。

4. 権限セットの作成および割り当て

連携用ユーザーに必要な権限を付与します。
(すでに必要な権限を持ったユーザーを設定している場合は、この手順をスキップしてください)

今回はBulk API 2.0の一括データクエリ検証を目的とするため、以下の権限を追加した権限セットを作成して接続アプリケーションに設定した連携用ユーザーに割り当てます。

  • APIの有効化
  • すべてのデータの参照

注: 2.のポリシー編集で「許可されているユーザー」に「管理者が承認したユーザーは事前承認済み」を設定する場合は、権限セットの「割り当てられた接続アプリケーション」に1.で作成した接続アプリケーションを登録する必要があります。

検証

接続アプリケーションの設定が終わったので、Bulk API 2.0の呼び出しを試してみます。

アクセストークンの発行

Bulk API 2.0を使用する前に、まず以下のコマンドを実行してSalesforceと接続します。
※ [私のドメイン]のURLは、設定 > 私のドメイン から確認できます。

curl -X POST https://{[私のドメイン]のURL}/services/oauth2/token \
-d 'client_id={コンシューマー鍵}' \
-d 'client_secret={コンシューマーの秘密}' \
-d 'grant_type=client_credentials' 

以下のようなレスポンスが返却され、access_tokenの値からアクセストークンを取得できます。

{
    "access_token":"{アクセストークン}",
    "signature":"xxxxxxxxxx",
    "scope":"api",
    "instance_url":"https://{[私のドメイン]のURL}",
    "id":"{連携用ユーザ識別用ID URL}",
    "token_type":"Bearer",
    "issued_at":"xxxxxxxxxx"
}

Bulk API 2.0 一括データクエリジョブ作成

アクセストークンが取得できたので、これを使用してBulk API 2.0の一括データクエリを試してみます。
リクエストボディとして使用するために、以下内容のJSONファイルをカレントディレクトリに作成します。(ここではdata.jsonと名付けます)

{
    "operation": "query",
    "query": "SELECT Id, Name FROM {オブジェクト名}"
}

JSONファイルが用意できたら、以下のコマンドを実行してBulk API 2.0 の一括クエリジョブを発行します。

curl -X POST https://{[私のドメイン]のURL}/services/data/{APIバージョン}/jobs/query \
-H 'Authorization: Bearer {アクセストークン}' \
-H 'Content-Type:application/json' \
-d @data.json

以下のようなレスポンスが返却され、クエリジョブが作成されたことを確認できます。

{
    "id":"{ジョブID}",
    "operation":"query",
    "object":"{オブジェクト名}",
    "createdById":"{連携用ユーザID}",
    "createdDate":"xxxxxxxxxx",
    "systemModstamp":"xxxxxxxxxx",
    "state":"UploadComplete",
    "concurrencyMode":"Parallel",
    "contentType":"CSV",
    "apiVersion":{APIバージョン},
    "lineEnding":"LF",
    "columnDelimiter":"COMMA"
}

処理結果の確認

一括クエリジョブの処理結果は、設定 > 一括データ読み込みジョブ から確認することができます。

今回の検証では、70万件超のレコードデータをわずか5分程度で取得完了という結果となりました。

まとめ

クライアントログイン情報フローを利用したBulk API 2.0の呼び出しについて説明しました。

クライアントログイン情報フローを利用すると、ログイン情報をクライアント側に保持することなくシンプルな設定でAPI連携を実現できます。
(コンシューマー情報の管理には十分ご注意を!)

また、本記事でご紹介したBulk API 2.0は簡易な記述で大量データを効率よく操作できるため、Salesforceと接続した外部プログラムから呼び出すことでSalesforce内に蓄積された業務データを幅広く活用することも可能となります。

本記事の内容が、Salesforceの外部連携やBulk API 2.0の利用を検討されている方のご参考になれば幸いです!

おわりに

ビザスクではエンジニアの仲間を募集しています! 少しでもビザスク開発組織にご興味を持たれた方は、ぜひ一度カジュアルにお話ししましょう! recruit.visasq.co.jp