🍩

Slack オートメーションプラットフォームについて

2023/12/14に公開
1

この記事は GENDA Advent Calendar 2023 の 14日目の記事です。
https://qiita.com/advent-calendar/2023/genda

昨日の記事は、shinnoki さんによる、「フロントエンドのキャッチアップ大変だよねという話 2023」 でした。自分もキャッチアップも頑張っていきたいと思いながら読んでいました。

Slackオートメーションプラットフォームとは?

Slack の最新のワークフロービルダーやその基盤を総称してオートメーションプラットフォームと呼びます (ベータの期間では 「次世代プラットフォーム」 と呼ばれていました[1])。今回は、この新しいプラットフォームを実際に使用してみてわかったことを紹介しようと思います。

今までのSlackアプリとの違いは?

Slack API的には基本的には使えていたものを使うことができるみたいですが、ワークフローに特化しているフレームワークというのが1番の特徴であり、違う点です。スラッシュコマンドやユーザトークンを用いた操作は使用不可になっており、今まで動いていたSlackアプリがすべてこのプラットフォームに置き換わるというものではないです(というのが私の理解です)。

ワークフロービルダーでは「トリガー」と呼ばれる起点が一つあってそこに「ステップ」と呼ばれる小さな処理が直列に連なる形で「ワークフロー」を構成します。この「ステップ」を自作できるのが次世代プラットフォームです。[2]

詳細な説明がこちらの記事で解説されています。
https://qiita.com/seratch/items/ecc16b845483c9d6f9e1

目玉機能 👀

オートメーションプラットフォームでの開発には、以下の2つの API(SDK) を用いて開発することになります。

今までの開発体験とは異なり、とても開発がしやすくなっています。いくつか目玉機能を紹介します。
(この記事では、フレームワークの詳細な説明は省きます)

Slack CLIで全部できる

なにかワークフローなど自動化のツールを作成したいと思ったときに、Slackの管理画面をいじって設定をする必要がありません。認証からデプロイ、ログの操作までをCLIで網羅しています。tokenの取り扱いなども特に意識することはないのでとても楽です。

アプリ、データのホスティング

これまでSlackアプリを運用する際には、AWS LambdaやGoogle Apps Scriptなどの外部サービスを組み合わせてWebhookやStorage環境を準備し、開発を進める必要がありました。しかし、これからはこれらのサービスを用意することなく、インタラクティブにコマンドを実行するだけで、Slackのクラウド環境上に実行環境を構築できるようになります(ローカル環境も自動的に設定されます)。さらに、永続化が必要なデータについては、DynamoDB互換のデータベースが提供されており、導入がより簡単になりました。

Denoでの開発

Denoランタイムで実行されます(言語としては TypeScript を使用します)。強力な型システムが提供されており、VSCodeなどのIDEを使用すると、優れた補完機能が利用できるため、非常に開発がしやすくなっています。

GUIとの差

最近だとGUIで提供されているワークフロービルダーがよく出来ていて、コードを書かなくてもある程度のことはやりたいことをポチポチと選択していくことでできるようになっています。

例えば、特定のreactionをしたらGoogle MeetのLinkが用意されるような ワークフロー (coffee meeting開催のワークフローのようなもの) も数分で作成することができます。

トリガーをより柔軟に設定できる

GUI で設定できるトリガーは以下の5つが用意されています。
より柔軟なトリガーを設定するにはGUI操作だけでは実現できません。

デフォルトのトリガー

例えば、特定の(絵)文字が含まれている投稿があったときにワークフローを開始するトリガーを設定したい場合は、コードを書くしかないです (2023年12月現在)。
実際に、弊社の勤怠チャンネルで使われている、:ohayo:という絵文字がメッセージに含まれていたら発火するというトリガーは下記のようなコードで表現することができます。

const ohayoEmojiTrigger: Trigger<typeof OhayoReaction.definition> = {
  type: TriggerTypes.Event,
  name: "ohayo emoji trigger",
  description: "Trigger when user input the ohayo emoji",
  workflow: `#/workflows/${OhayoReaction.definition.callback_id}`,
  event: {
    event_type: TriggerEventTypes.MessagePosted,
    channel_ids: ["AAAHOGE111", "AAAFUGA123"], // 特定のチャンネルのみ
    filter: {
      version: 1,
      root: {
        statement: "{{data.text}} CONTAINS ':ohayo:'",
      },
    },
  },
  inputs: {
    channel_id: { value: TriggerContextData.Event.ReactionAdded.channel_id },
    message_ts: { value: TriggerContextData.Event.ReactionAdded.message_ts },
  },
};

サポートされているトリガーは一覧でこちらにありますので、実現したいことができそうか一度確認してみるとよさそうです。

Functionを作成するとGUIでも使いまわすことができる

独自で作成した Functionは、カスタムステップとして (ステップは、ワークフローに追加できるアクションのこと) GUIのワークフローでも選択することができるようになります。デフォルトの連携で用意されているステップは、一部の機能のみ提供されている (Google Calendar や Githubの連携サービスも同様) ので、使いたい機能だけ実装して (Function を追加して) GUIでワークフローとして取り込むような使い方も便利なのではないかと考えております。

例えば、(GUIのデフォルトでは用意されていない)指定されたメッセージに特定のリアクションをするというステップが選択できるようにするには、以下のようなコードで表現することができます。

export const AddReactionFunctionDefinition = DefineFunction({
  callback_id: "add_reation_funciton",
  title: "Add a reaction",
  description: "Add a reaction to a message",
  source_file: "functions/add_reaction.ts",
  input_parameters: {
    properties: {
      channel_id: {
        type: Schema.slack.types.channel_id,
        description: "Channel where the message to add reaction to was posted.",
      },
      name: { type: Schema.types.string, description: "Reaction (emoji) name" },
      message_ts: {
        type: Schema.types.string,
        description: "Timestamp of the message to add reaction to.",
      },
    },
    required: ["channel_id", "name", "message_ts"],
  },
  output_parameters: {
    properties: {},
    required: [],
  },
});

/**
 * SlackFunction takes in two arguments: the CustomFunction
 * definition (see above), as well as a function that contains
 * handler logic that's run when the function is executed.
 * https://api.slack.com/automation/functions/custom
 */
export default SlackFunction(
  AddReactionFunctionDefinition,
  async ({ inputs, token }) => {
    const client = SlackAPI(token);

    await client.reactions.add({
      channel: inputs.channel_id,
      name: inputs.name,
      timestamp: inputs.message_ts,
    });

    return { outputs: {} };
  },
);
GUIのメッセージで選択できるステップ カスタムで選択可能になったステップ

まとめ

簡単にはなりますが、Slackオートメーションプラットフォームを使用してわかったことをご紹介しました。GUIのワークフロービルダーと併用して、便利なワークフローを構築できるようになったというのが伝わっていれば幸いです。

明日は、numasea さんによる、1人目BizDev&Analysisの入社半年徒然草 です。普段きけないアミューズメント業界の裏側がきけると思います。お楽しみに。

よもやま話

公式のサンプルコードをみていて、最新の型が適応されていなかったのでPR作成して取り込んでもらうことができました。小さい修正ですが、OSS活動にも繋げることができてよかったです。

https://github.com/slack-samples/deno-reverse-string/pull/80

Special Thanks

  • seratch さん
    • 記事や解説を、引用と注釈に使わせていただきました。ありがとうございます。
  • ほいシュー
    • グループ企業ですが、キャラクターのアイコンを使わせていただいています。ありがとうございます。

脚注
  1. https://qiita.com/seratch/items/8df4cb0b41e756edc578 ↩︎

  2. https://zenn.dev/seratch/articles/c370cf8de7f9f5#余談:ワークフロービルダーのための次世代プラットフォーム ↩︎

GENDA

Discussion