Slackからkintoneへレコード登録する方法 ~AWS Lambdaでつなぐ~ 後編

目次

caution
警告

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

それでは、 前編 に引き続きSlackとkintoneを連携させるためのAWSの設定をしていきたいと思います。

Amazon Lambdaの設定

まずは、お馴染みAWS Lambdaです。

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

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

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

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

  • kintone環境のサブドメイン、アプリID、APIトークンは環境に合わせて変更してください。
  • Slackで「ToDo」をトリガーワードとする想定です。トリガーワードによって14行目の文字列を変更してください。
 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

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 skackinAPI
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さんからお返事がきました。

BOTさんからお返事がきました。最後に、kintoneアプリを確認してみます。

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

まとめ

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

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

最後にここまでお読みいただき、kintoneを触ってみたいけど触れる環境を持っていない方に朗報です。
本サイトcybozu developer networkでは、1年間無償のkintone developerライセンスを申し込みできます。
kintone開発者ライセンス(開発環境)
この機会に、ぜひ開発者ライセンスを申し込みして、連携を始めてみてください。