Salesforce Functions とは
Salesforce Functions は、Winter'22 リリースで正式リリースされた新しい機能のようです。今まで Salesforce アプリケーション上でのビジネスロジックのプログラミングでの拡張というと、Apex コードでの開発一択のみでしたが、オープンソース言語での開発がサポートされたということのようです。
ポイントは
- サーバレス環境でコードベースでのリリース
- Salesforce プラットフォームによって完全に管理され、安全な自動拡張環境でコードが呼び出される
- Salesforce CLI コマンドでリリースできる
- JavaScript, TYpescript, Java 用の Salesforce Functions SDK を使用し、Salesforce 組織と通信する
- Apex から Function を呼び出すことも可能。その際、自動で Salesforce Functions インフラストラクチャが認証され、オンデマンドで実行される
Winter'22 リリースノート "Salesforce Functions" https://help.salesforce.com/s/articleView?id=release-notes.rn_forcecom_functions.htm
今回は、Javascript 用の Salesforce Functions SDK を使ってどのようなことができるのか、公開されているサンプルコードから読み解いていきたいと思います。
サンプルコードから読み解く
公式のサンプルコードが Github で公開されていました。
Functions Recipes https://github.com/trailheadapps/functions-recipes
この中から、いくつか紐解いて紹介します。
ビジネスロジックを記述する場所
Salesforce Functions プロジェクト内で
index.js
という名前のファイルに記述します。
受け取れる引数と戻り値
module.exports = async function(event, context, logger) {
/*
処理を記述
*/
return something;
};
のように、
- 第一引数で event (処理の対象となる、メインの渡されるデータ)
- 第二引数で context (主に接続先の Salesforce 組織に関する情報)
- 第三引数で logger (ログ記録用のハンドラー) を受け取り、戻り値は return するという流れになるようです。
event オブジェクト
{
id: String,
data: Object, //payloadとなるデータ
dataContentType: String,
source: String,
type: String,
time: String // タイムスタンプ
}
のような構造になっており、payload として渡したいデータは data 属性で取得できるようです。
context オブジェクト
context.org には
{
dataApi: DataApi, //DataApi
user: User // 現在ログイン中のユーザ
}
が含まれており、特に DataApi はとても便利で、
const soql = `SELECT Fields(STANDARD) FROM Account WHERE Id = '${recordId}'`;
const queryResults = await context.org.dataApi.query(soql);
のように SOQL を発行したり、
const uow = context.org.dataApi.newUnitOfWork();
const accountId = uow.registerCreate({
type: "Account",
fields: {
Name: payload.accountName
}
});
const contactId = uow.registerCreate({
type: "Contact",
fields: {
FirstName: payload.firstName,
LastName: payload.lastName,
AccountId: accountId
}
});
const response = await context.org.dataApi.commitUnitOfWork(uow);
const result = {
accountId: response.get(accountId).id,
contactId: response.get(contactId).id
};
として、取引先(Account)と取引先責任者(Contact)を一度に作成することができます。
logger オブジェクト
logger.info("ログを残す");
のように、ログを記録できます。
リリース方法、実行手順
今回は Node.js での Salesforce Functions の記述方法を紹介しましたが、次回、実際に Salesforce CLI を使って Function を作ってリリースし、Salesforce 環境からの実行についても触れてみたいと思います。