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を組み合わせてさらに便利な業務システムを作ってみましょう!