Slack から手軽に kintone へレコード登録する方法

著者名:北川 恭平(サイボウズ株式会社)

目次

caution
警告

記事内で利用しているライブラリ「 request (External link) 」は、非推奨(deprecated)になりました。
HTTP リクエストができる他のライブラリ( axios (External link) など)や、 https.requst (External link) に書き換えることをおすすめします。

はじめに

皆さんこんにちは。

今回は、拡張性の高さから開発者の間で人気を集めているコミュニケーションツール「 Slack (External link) 」と kintone の連携について紹介します。
kintone から Slack に通知を送る方法 では kintone から Slack というパターンがありました。
今回はその逆パターンとして、Slack から kintone にレコード登録をしてみたいと思います。

Slack はフロー型のコミュニケーションツールで、リアルタイムのコミュニケーションに向いています。
ただ、情報をストックしておきたいことがあるかと思います。
もちろん Slack にも POST 機能など情報をストックできる標準機能はありますが、kintone と組み合わせることで、プロセス管理を組み合わせたり過去の情報を検索できたりといったメリットが出てきます。

Slack を仕事で使っていて情報のストックがいまいちしっくりきていない!という方は、ご参考いただき Slack と kintone で強力なビジネスツールを作り上げましょう。

途中で Amazon Lambda(以下 Lambda)と Amazon API Gateway(以下 API Gateway)を使います。
最後まで読んでいただくと分りますが、今回はほぼ AWS の設定方法を紹介する記事になってしまいました。
すぐにやってみたい!という方は、まず AWS のアカウントを取得後この記事にて試していただければと思います。

概要

Slack 上で特定の文字を打つと、kintone の ToDo アプリにレコードを登録するシンプルな連携です。

Slack の Outgoing webhooks を使うことで、Slack のコメントなどの情報を外部の URL に POST できます。
問題は、この渡された情報を kintone のフィールド形式に合わせて成形した後、さらに kintone の REST API を使ってレコード登録をする必要があります。

中間でいろいろごにょごしょ自作するのはとても手間なので、今回は AWS のサービスを利用します。
ちなみに、AWS 連携は別セクションでも記事を出しているので参照してください。

cybozu developer network > 連携Tips

今回作成する連携の全体概要図は以下です。

ざっくり説明すると、次の流れで設定します。

  1. Slack の Outgoing Webhook で、Amazon API Gateway で発行した API に POST する。
  2. Amazon API Gateway は、あらかじめ作成した Amazon Lambda の function を呼び出す。
  3. この Lambda function で、Slack から受け取った情報を元に、kintone へのリクエストデータを作成し、kintone REST API を実行しレコード登録する。

若干複雑に見えますが、そこまでたいへんな設定ではありません。
それでは、順を追って設定方法を紹介していきたいと思います。

kintone アプリ

今回は「シンプル ToDo」というシンプルな ToDo アプリを作成します。

フィールド名 フィールドタイプ フィールドコード
タイトル 文字列(1行) title
詳細 文字列(複数行) detail

また、 kintoneヘルプページ (External link) を参考に API トークンを発行しておきましょう。アクセス権は、「レコード追加」のみでかまいません。
発行した API トークンは後程使うので、テキストエディタなどにメモしておきましょう。

Amazon Lambda

アップロード用 Zip ファイルの作成

今回、Lambda では、Javascipt(Node.js)で作成したプログラム一式を Zip 化して Lambda にアップロードしていきます。

方法は以下の記事とほぼ同様なので、以下の記事を参考にしましょう。
kintone APIを使ってスペースを有効活用する(サーバーレスで) (External link)

今回は以下のコードを index.js として保存します。

  • kintone 環境のサブドメイン、アプリ ID、API トークンは環境に合わせて変更してください。
  • Slack で"ToDo"をトリガーワードとする想定です。
    トリガーワードによって 23 行目の文字列を変更してください。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/*
 * kintone x Slack
 * Copyright (c) 2020 Cybozu
 *
 * Licensed under the MIT License
 * https://opensource.org/license/mit/
 */

// eslint-disable-next-line no-unused-vars
const aws = require('aws-sdk');
const request = require('request');

/* kintone用のパラメータ*/
const DOMAIN = '{subdomain}.cybozu.com'; // kintone環境のドメイン
const APP_ID = '1'; // シンプルToDoアプリのアプリID
const BASE_URL = 'https://' + DOMAIN + '/k/v1/';
const APITOKEN = 'XXX';
const headers = {'X-Cybozu-API-Token': APITOKEN};

exports.handler = function(event, context) {
  const returnMessage = JSON.stringify(event);
  let temp = returnMessage.split('&');
  temp = temp[9].split('=')[1].replace(/Todo\+/g, '');
  temp = decodeURIComponent(temp);
  const title = temp.split('+')[0];
  let message = '';
  if (temp.split('+')) {
    message = temp.split('+')[1];
  }
  const body_post = {
    app: APP_ID,
    record: {
      title: {
        value: title
      },
      detail: {
        value: message
      }
    }
  };
  const options_getsalesamount = {
    url: BASE_URL + 'record.json',
    method: 'POST',
    headers: headers,
    'Content-Type': 'application/json',
    json: body_post
  };
    // レコードを取得
  request(options_getsalesamount, (error, response, body) => {
    context.done(null, {text: 'kintone POST success!'});
  });
};

index.js を作成し、Node.js の request モジュールをインストールたら以下のコマンドで zip ファイルを作成します。

1
zip -r slackin.zip index.js node_modules/

zip ファイル「slackin.zip」を作成したら Lambda の設定に移ります。

Lambda の設定

AWS のコンソールにログイン後、Lambda を選択し「Create a Lambda fuction」をクリックします。

今回 blueprint は指定せず「skip」を押します。

Configure function は以下のように設定しました。

大項目 中項目 設定値
Configure function Name slackinSample
Description This is a sample.
Runtime Node.js
Lambda function code Code entry type Upload a Zip file にて先ほど作成した「slackin.zip」をアップロードします。
Lambda function handler and role Handler index.handler
Role Basic execution role より IAM ロールを新規に作成
Advanced settings Memory(MB) 128
Timeout 0min 3sec

これで、設定したら「Next」>「Createfunction」を押します。

Lambda function の作成はこれで完了です。

この段階でテストしてもエラーがでるかと思いますが、気にせず次に進みます。

Amazon API Gateway の設定

AWS のコンソール画面で「Amazon API Gateway」を選択後、「Create API」より API を作成します。

今回は以下のように設定しました。

項目 設定値
API name slackinAPI
Clone from API Do not clone from existing API
Description sample API

「Create API」ボタンを押して画面遷移後、「Create Resource」より以下の設定でリソースを作成しました。

項目 設定値
Resource Name slackin
Resource Path slackin

次に、セットアップ画面で以下を設定します。
今回は Slack から POST されるので「Create Method」より、「POST」を作成します。

設定情報として以下を設定します。

Integration type Lambda Function
Lambda Region Lambda Function がある任意の region
Lambda Function slackinSample

「Save」を押すと、Permission 設定が出るので「OK」を押します。

Slack からの Outgoing Webhooks をトリガーにする場合、API Gateway の設定で Content-Type を指定しておく必要があります。
Integration Request の設定から、「Mapping Templates」を開き application/x-www-form-urlencoded に対して、Mapping Template で以下を指定します。

1
$input.json('$')

参考: API Gateway Mapping Template Reference (External link)

次にこの API をデプロイします。
「Deploy API」ボタンを押します。
今回は以下の設定でデプロイしました。

項目 設定値
Deployment stage New Stage
Stage name slackinstage
Stage description My first stage
Deployment description This is my first deploy

デプロイしたら、Invoke URL をコピーしておきます。

Slack Outgoing Webhooks の設定

最後に、Slack 側の設定をしていきます。あと一息です。
ページ左上の Slack ドメイン名をクリックし、「Customize Slack」を押します。

「Configure Apps」で遷移後、ヘッダーの検索窓より「Outgoing WebHooks」をインストールします。

インストール後に、次の設定を入力します。

項目 設定値
Channel 任意のチャンネル(今回は kintone )
Trigger Word(s) ToDo
URL API GateWay で作成した URL
Token
初期値のまま
Descriptive Label 任意
Customize Name 初期値のまま
Customize Icon イカしたアイコン

これで、設定は完了です!

試してみよう

それではさっそくためしてみましょう!

設定したトリガーワード「ToDo」に続けて、タイトルとなる文字を指定します。
また今回のサンプルでは「+」を区切り文字にすると詳細を設定できるので、以下のように呟いてみました。

しばらく待つと BOT さんからお返事がきました。

最後に、kintone アプリを確認してみます。

無事 Slack からレコード登録ができました!

まとめ

今回は、Slack と kintone を連携させるために AWS をふんだんに使いました。
Slack 以外でも、Webhook が利用できるサービスなら同様の連携ができるかと思います。

いろいろなサービスと kintone を組み合わせてさらに便利な業務システムを作ってみましょう!