見出し画像

Flow in Slackをショートカット・スラッシュから直接呼べるようになったので試してみた

こんにちは、遠藤です。

この記事は、Salesforce Advent Calendar 2023 の14日目の記事となります。

まだベータですが、いつの間にかFlow in SlackがSalck アプリのショートカットから呼べるようになっていたのに気がつき試してみました。

Run a Screen Flow from a Slack Shortcut (Beta)

SlackのコマンドがApexではなくフローで開発できるようになって「ノーコードでSlackと連携できるぜー!」という内容にしたかったのですが、今のところフローの呼び出しはApex SDK for Slack (Beta)の中の1機能で、設定画面も無く、sfdx-cliを使用した開発が必要となります。

そのためこの記事では、どうしてもApex SDK for Slackの解説にかなりの量を割く必要がありました。Apex SDK for Slackを使用するために前提となる以下の知識についての詳細な解説はしていませんので、読み進めるにあたっては前提として必要になります。

  • Slackアプリについてと作成のしかた

  • sfdxを利用した開発

  • 2GPパッケージ開発(なくても読み進むことはできます)

実際に試してみようと思う方は、各セクションで紹介している参考リンクを併せてお読みください。


Flow in Slackでいままでできたこと

Flow in Slackは、ゆるっとSalesforceトーク #11でも紹介させていただきましたが、画面フローをSlackのモーダルに表示できる機能です。

ここで言う画面フローはSlack用に機能制限されたフローで、フローの設定で「Slack で使用できるようにする」を有効化したものになります。

これまで、このSlack専用の画面フローは、Slackを起点に呼び出すことはできず、SalesforceからのSlack投稿に埋め込んだボタンなどからしか起動できませんでした。

このボタンは、フローでメッセージを投稿する場合はアクション「Slack のフローコアアクション: メッセージを送信してフローを起動 (ベータ)」を利用して送信することができます。

Salesforce起点でしか使えないという点でだいぶ片手落ちな機能だったわけですが、Slackのショートカットやスラッシュコマンドから呼び出せるようになるとこの問題が解消されユースケースが増えそうです。

ノーコードでSlackのショートカット・スラッシュコマンドが実装可能に!

一方で、少し前にリリースされたApex SDK for Slackを使うと、SalesforceプラットフォームのみでSlackアプリが実装可能となっていました。こちらは、ショートカットやスラッシュコマンドなども定義できるものとなっています。

Apex SDK for Slackについては「ゆるっとSalesforce #19」 にて取り上げました。

ここからさらに、Apexを書かなくてもSlack用のアプリを実装できるようになったのが、この記事で紹介するRun a Screen Flow from a Slack Shortcut (Beta)になります。(フローの呼び出しのみで、botのような機能はまだ作れません)

しかし、ヘルプを見てもざっくりした手順と、以下のyamlが貼ってあるだけで、これだけ見てもよくわかりませんでした。。

description: App configuration for running flows in slack
commands:
  /getPetName:
    action:
      definition: flow__requestHandler
      properties:
        flowApiName: Get_Pet_Name
    title: Launch flow command
    description: Launches a flow in a modal from slack

このyamlの設定何なのか?このページだけではわかりませんが、よく見るとページの下の「SEE ALSO」にApex SDK for Slackのドキュメントのリンクが並んでおり、どうやらApex SDK for Slackの機能であることがわかります。

実際に、このyamlはSlackAppというメタデータのコードで、Apex SDK for Slackの開発ガイドの中で紹介されています。

前置きが長くなりましたが、Slack用の画面フローをSlackアプリから呼び出す機能を実装するためには、Apex SDK for Slackについて予め把握しておく必要があります。

また、見出しにノーコードと書きましたが、プログラムを書かないまでもSlackAppのメタデータはテキストエディタで記述して組織にデプロイする必要があり、今のところ開発者としての知識もある程度は必要になります。

いずれは、設定から追加できるようになり、管理者の方が気軽にSlack連携を追加するといったことが可能となると期待したいところです。

Apex SDK for Slackのシステム的な話

SlackアプリはSlackプラットフォーム側の拡張機能を実装する単位で、ショートカット、スラッシュコマンドやWebフックなどを定義することができます。
Slackアプリを実装するには、これまでは通常自分でホスティングしたサーバーを用意する必要があったわけですが、Salesforceのプラットフォームのみで実装可能にするのがApex SDK for Slackです。

ここでは、具体的な実装手順の解説の前に、SlackアプリとSalesforce組織の関係、メタデータ SlackAppに定義することについて整理しておきます。

また、この解説を踏まえて、Apex SDK for SlackはSalesforceのプラットフォームの開発ガイドも読んでいただくとわかりやすいかもしれません。

一部は、ドキュメントから想像される内容を記載していますのでSalesforce内の実装とは異なっているかもしれませんが、あくまでここは概念として理解していただければと思います。

SlackワークスペースとSalesfrce組織の関係

SlackワークスペースとSlackアプリ、Salesforce組織の関係については「Work with Salesforce Orgs and Users | Apex SDK for Slack (Beta)」で解説されています。

ワークスペースにインストールされたアプリとSalesforce組織の関係

SlackのワークスペースとSalesforce組織は、SlackのワークスペースからSalesforce組織へ認証し、接続を許可して初めて接続されるようです。

ワークスペースにインストールしたアプリを呼び出すと、初回以下のような接続ボタンが表示されるので、対象のSalesforce組織で認証し接続を許可します。

Salesforce組織への接続ボタン

ですので、Slackユーザー単位で組織の接続情報を保持するため、1つのワークスペースからユーザーごとに別の組織を接続も可能そうです。

SlackワークスペースにインストールしたSalesforce for Slackのアプリで接続する組織を管理できるようですが今回は試せていません。詳細はApex SDK for Slackのドキュメント「Org Connections」を参照ください。

Salesforce組織共通のエンドポイントが用意されている

Slackアプリには、通常自分でホスティングしたサーバーのエンドポイントを各コマンドに対して設定しますが、Salesforceと連携する場合は、FlowやApexのアクションを呼び出す共通のエンドポイント「slack-apps.salesforce.com:9443」が提供されており、それを指定します。

Salesforce組織共通のエンドポイントを指定

イメージはこんな感じでしょうか、このエンドポイントの裏のルーティングがどうなっているかはブラックボックスです。(ドキュメントのどこかに書いてあるかもしれません)

SlackアプリからSalesforce組織への通信のイメージ

Slackアプリの接続情報はSalesforceのどこに設定するのか?

Slackアプリに指定したエンドポイント側には、SlackアプリのクライアントIdやシークレットなど接続情報を保持する必要がありますが、Salesforceにこれらを保存する仕組みがSlackAppメタデータです。

SlackAppメタデータに含まれるのは、先程紹介したxxx.slackappというファイル名のyamlとxxx.slackapp-mata.xmlの2つのファイルになります。

yamlには以下のようにSlackアプリのID、認証情報などを定義しており、これをSalesforce組織にデプロイすると組織からSlackにアクセスできるようになります。

<?xml version="1.0" encoding="UTF-8"?>
<SlackApp xmlns="http://soap.sforce.com/2006/04/metadata">
    <appKey>A0XXXXXXXXXXX</appKey>
    <appToken>
        xapp-1-XXXXXXXXX</appToken>
    <botScopes>
        chat:write,chat:write.public,incoming-webhook,channels:history,groups:history,channels:read,reactions:read,commands
    </botScopes>
    <clientKey>11111111111.2222222222222</clientKey>
    <clientSecret>xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx</clientSecret>
    <isProtected>false</isProtected>
    <masterLabel>Hello Slack App</masterLabel>
    <signingSecret>99999999999999999999999</signingSecret>
    <userScopes>
        im:read,im:write,channels:read,channels:write,chat:write,groups:read,mpim:read,mpim:write,users:read,groups:write
    </userScopes>
</SlackApp>

参照

Slackアプリのショートカットと画面フローをどう関連付けは?

Slackアプリ側に定義されたショートカットやスラッシュコマンドは、Salesforce側のSlackAppメタデータのyamlに定義された名前が一致するアクションを呼び出す仕組みとなっています。

Apexを呼び出すかフローを実行するかは、actionに定義します。
上記では、apex-helloがApexクラスを呼び出し、flow-helloが画面フローを呼び出すように定義してあります。

参照: Shortcuts and Slash Commands | Apex SDK for Slack (Beta)

スクラッチ組織によるSlack連携開発と動作確認

前のセクションでは概要について解説しましたが、ここでは具体的な実装手順について解説していきます。

画面フローをSlackのモーダルとして利用するまでの実装の流れを簡単にまとめると以下の手順があります。

  1. Salesforce組織のセットアップ

  2. Slackアプリを作成

  3. 対象Salesforce組織で画面フローを作成

  4. SlackAppメタデータを作成して、対象Salesforce組織にデプロイ

以下、順を追って解説しますが、使用するコードは以下のリポジトリにアップしてありますので適時参照ください。

https://github.com/hrendoh/run-flow-in-slack-using-shortcut

1. Salesforce組織のセットアップ

フローやApexを呼び出す、Slack連携機能を利用するには、Slackから呼び出されるSalesforce組織で機能の有効化や権限の設定が必要となります。また、ここでは、Apex SDK for Slack (Beta) に沿って、スクラッチ組織を利用したパッケージ開発する手順で解説しますので、Dev Hub組織でも同様にSlackの機能の有効化が必要となります。

1-1. Dev Hub組織でのSlack機能の有効化

Slackの機能の有効化は、Dev Hub組織、開発を進めるスクラッチ組織、パッケージをインストールする組織それぞれで必要となります。

まずは、Dev Hub組織で有効化します。有効化の手順に自体についてはここでは割愛します。「Slack機能の有効化 | Apex SDK for Slack触ってみた」 以下を参照して設定して下さい。

1-2. スクラッチ組織はSLACK機能を有効化して作成する

次に開発用のスクラッチ組織でSlack連携機能が使えるようにします。スクラッチ組織の場合はスクラッチ組織定義ファイルの機能に「SLACK」を追加しておくだけでOKです。

"features": ["EnableSetPasswordInApi", "SLACK"],

参考ソース: config/project-scratch-def.json

「SLACK」を指定するには、Dev Hub組織ででのSlack機能の有効化が必須です。Dev Hub組織で有効化されていない場合はエラーとなります。

1-3. Slackアクションを実行するユーザに権限を付与

スクラッチ組織を作成したら、Slackアクションを実行するユーザ、とりあえずデフォルトで作成されるシステム管理者に、システム権限「Salesforce を Slack に接続(UserSlackCapabilities)」を有効にした権限セットを作成して付与します。

参考ソース: force-app/main/default/permissionsets/Salesforce_Slack.permissionset-meta.xml

2. Slackアプリを作成

次にショートカット・スラッシュコマンドを定義するSlackアプリを作成していきます。
Slack APIのサイトにサクセスしてアプリを作成します。アプリの作成方法については「Slackアプリの作成 | Apex SDK for Slack触ってみた」を参照ください。

アプリを作成時のプロンプトで「From an app manifest」を選択し、以下のyamlを入力してください。
「<App ID>」の箇所は、アプリ作成後に編集するのでそのままで良いです。(不要な定義もあるのでもう少しコンパクトになりそうです)

display_information:
  name: Say Hello App
  description: Say Hello Example App
features:
  app_home:
    home_tab_enabled: true
    messages_tab_enabled: false
    messages_tab_read_only_enabled: false
  bot_user:
    display_name: Say Hello
    always_online: false
  slash_commands:
    - command: /apex-hello
      url: https://slack-apps.salesforce.com:9443/a/<App ID>
      description: Say Hello
      should_escape: false
    - command: /add-task
      url: https://slack-apps.salesforce.com:9443/a/<App ID>
      description: Create a new task record
      should_escape: false
oauth_config:
  redirect_urls:
    - https://auth.slack-apps.salesforce.com/slack_oauth_callback/<App ID>
  scopes:
    user:
      - reactions:read
      - chat:write
    bot:
      - channels:read
      - chat:write
      - commands
      - groups:read
      - reactions:read
      - users:read
settings:
  event_subscriptions:
    request_url: https://slack-apps.salesforce.com:9443/a/<App ID>
    bot_events:
      - app_home_opened
      - app_uninstalled
      - grid_migration_finished
      - grid_migration_started
      - team_access_granted
      - team_access_revoked
      - tokens_revoked
  interactivity:
    is_enabled: true
    request_url: https://slack-apps.salesforce.com:9443/a/<App ID>
    message_menu_options_url: https://slack-apps.salesforce.com:9443/a/<App ID>
  org_deploy_enabled: false
  socket_mode_enabled: false
  token_rotation_enabled: false

作成できたら、アプリ設定の左のメニューから「Basic Information」を開き、App IDをコピーしたあと、「App Manifest」を開き、マニフェストの「<App ID>」の箇所を置き換えます。

アプリは動作を確認するワークスペースにインストールしておきます。

3. 対象Salesforce組織で画面フローを作成

Slack用の画面フローを作成します。

具体的には、フロー保存時に指定する「Slack で使用できるようにする」が有効化された画面フローを作成するだけでOKです。

詳しくは、 「1.[画面フロー]を作成する| SlackでSalesforceの画面フローを呼び出してみた(Flow in Slack)」を参照してください。

実際には、「Slack で使用できるようにする」を有効化しないと、画面作成時にSlackで利用できないコンポーネントが並んだままになってしまうので、フローを開いたら空のまま一旦「Slack で使用できるようにする」にチェックをして保存することをお勧めします。

画面フローが定義できたら、ソースをプルしてsfdxプロジェクトにフローのメタデータを落としておきます。

参考ソース: force-app/main/default/flows/CreateTask.flow-meta.xml

4. SlackAppメタデータを作成して、対象Salesforce組織にデプロイ

SlackAppメタデータは、yamlとxmlファイルをそれぞれ手動で作成します。

アクションは動作確認のためApexも入れてあります。

description: Hello World Example App
commands:
  /apex-hello:
    action:
      definition: apex__action__SayHello
    title: Say Hello
    description: A command to say Hello
  /flow-hello:
    action:
      definition: flow__requestHandler
      properties:
        flowApiName: UpdateAccountRecordInSlack
    title: Update Account
    description: A command to update Account

参考ソース: force-app/main/default/slackapps/HelloSlackApp.slackapp

SlackアプリのBasic Informationページを開き、対応する値に置き換えます。

<?xml version="1.0" encoding="UTF-8"?>
<SlackApp xmlns="http://soap.sforce.com/2006/04/metadata">
    <appKey>{{App ID}}</appKey>
    <appToken>{{生成したApp-Level Token}}</appToken>
    <botScopes>
        chat:write,chat:write.public,incoming-webhook,channels:history,groups:history,channels:read,reactions:read,commands
    </botScopes>
    <clientKey>{{Client ID}}</clientKey>
    <clientSecret>{{Client Secret}}</clientSecret>
    <isProtected>false</isProtected>
    <masterLabel>Hello Slack App</masterLabel>
    <signingSecret>{{Signing Secret}}</signingSecret>
    <userScopes>
        im:read,im:write,channels:read,channels:write,chat:write,groups:read,mpim:read,mpim:write,users:read,groups:write
    </userScopes>
</SlackApp>

参考ソース: force-app/main/default/slackapps/HelloSlackApp.slackapp-meta.xml

App-Level Tokenが未生成の場合は、「Generate Token and Scopes」をクリックして新規に作成してください。スコープは「connections:write」でOKです。

できたらソースをプッシュします。

5. スクラッチ組織で動作確認

Slackで、スラッシュコマンド「/add-task」を実行すると、初回はSalesforceへの認証を促すメッセージが表示されます。
「connect」ボタンをクリックしてスクラッチ組織に認証します。


スクラッチ組織なので、SandboxのURLでログインする必要があります。ログイン画面で、「Would you rather connect to a sandbox?」リンクをクリックするとURLが切り替わります。アドレスバーでtest.salesforce.comを打ち直してもOKです。

あとは、SlackとSalesforce側の認可画面で許可をすれば接続できます。

選択したチャンネルに以下のメッセージが表示されれば接続完了です。

接続してから、動作可能になるまでは少し時間がかかるようです。エラーが出る場合は少し待ってから再実行してみてください。

再び「/add-task」を実行すると、Slackのモーダル上で作成した画面フローが実行されます。

Salesforceで確認するとレコードが追加されました。

作成したSlack連携パッケージを本番組織でセットアップ

最後に、Getting Startedで作成したパッケージを本番組織にインストールして利用する手順についてまとめておきます。

ここでは社内利用を想定して、Unlockedパッケージを作成し、それをインストールする手順を解説します。

なんとなくな作業手順イメージはこんな感じ

  • ① Slackアプリを作成してスクラッチ組織で動作確認までを行います。前のセクションの手順です。

  • ② スクラッチ組織のソースをプルして、ロック解除済みパッケージを作成します。

  • ③ 本番組織にパッケージをインストールします。前提条件としてインストールする前にSlack機能の有効化はしておきます。

  • ④ Slackワークスペースから本番組織に認証します。

0. Slackの接続を解除しておく

本番組織に繋ぐ前にやっておかないとならないこととして、Slackアプリをワークスペースから削除して、インストールし直しておく必要があります。

スクラッチ組織に接続していたSlackワークスペースを本番組織など他の組織に接続しようとした場合、アプリを削除して再インストールするという方法しか今のところなさそうです。Salesforce組織側でRevokeも試しましたが、Slackのユーザーが接続した組織の情報がどこかに残ってしまっているようでした。

参考: Moving Orgs & Sandbox Refreshes | Apex SDK for Slack (Beta)

この手順はSandboxで開発をしていて、本番組織に変更セットなどで適用する場合でも同様かと思います。

別の組織に接続しようとして以下のエラーが出た場合は試してみてください。

参照: Org Connections | Apex SDK for Slack (Beta)

1. Unlockedパッケージの作成

Unlockedパッケージを作成して、パッケージバージョンを作成します

$ sfdx package create --name FlowInSlackDemo --package-type Unlocked --path force-app --no-namespace --target-dev-hub DevHub
$ sfdx package version create --package FlowInSlackDemo --version-name v0.1.0 --version-number 0.1.0.NEXT --installation-key-bypass --wait 10

参考ソース: sfdx-project.json

2. 本番組織にパッケージをインストール

作成したパッケージはSlackが有効化されている組織でないとインストールできません。

インストールする組織の、Slack機能を有効化しておきます。

設定のクイック検索ボックスに「Slack」と入力し、「Slack の初期設定」を選択します。Slack の初期設定画面で契約条件に同意します。

続けて、クイック検索ボックスに「Slack」と入力し、「Apex で Slack アプリケーションを作成」を選択します。「Apex で Slack アプリケーションを作成」画面でサービス利用規約に同意します。

Slackの機能を有効化したら、作成したパッケージバージョンをインストールURLまたはsfdxコマンドでインストールします。

インストールURLからパッケージをインストール

次に、利用ユーザーにシステム権限「Salesforce を Slack に接続(UserSlackCapabilities)」を付与します。

パッケージに含まれる権限セット「SalesforceをSlackに接続」にはこのシステム権限が付与してありますので、こちらを利用ユーザーに付与することもできます。

3. 動作確認

インストールできたら、ワークスペースで再度「/add-task」を起動してみます。

以下のメッセージが表示されたら、「接続」をクリックして、パッケージをインストールした組織と接続します。

「Would you rather connect to a sandbox?」のリンクがログイン画面に表示されない場合は、アドレスバーで直にtest.salesforce.comをlogin.salesforce.comに書き換えます。

再び、「/add-task」を実行して画面フローを起動し、タスクを追加してみます。

パッケージをインストールした組織にToDoが追加されたことを確認できました。

まとめ

ながながと解説してきましたが、以上の手順で本番組織でもSlackアプリからフローが起動できるようになりました。

Slackアプリとフローを繋げるところまでは、ちょっと手間がかかりますが、接続してしまえば、あとはフローのみの修正で機能を拡張していけることはかなり魅力ではないでしょうか。

とはいえ、まだベータなのでリスクを考慮して利用する必要がありますので、利用の際は自己責任でお願いします。社内利用などであれば使ってしまっても良さそうですね。