Slack-kintone連携をAzureでもやってみた

目次

caution
警告

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

はじめに

このところ、kintone と Azure を連携する記事がいくつか公開されています。
cybozu developer network ではこれまで AWS を使った連携例を紹介していますが、今回は Azure を使った同様の連携を紹介し、比較してみたいと思います。

AWS は使い慣れているけれど Azure はちょっと良くわからないという方や、どちらを使ったらよいか迷っている方は参考にしていただけたら幸いです。
この記事では、 Slackから手軽にkintoneへレコードを登録する方法 を題材に、同じことを Azure Functions を使って実現させてみます。

kintone と Azure の連携関連の記事

概要

Slack 上で「ToDo」で始まる文字列を入力すると、kintone の ToDo アプリにレコードを登録します。
詳細は、AWS を使った Slack から手軽に kintone へレコード登録する方法 を参照してください。

Azure を使った連携の全体概要図は以下です。

流れは以下のとおりで、AWS を使うときと比べ 1 工程減ります。

  1. Slack の Outgoing Webhook で、Azure Functions の function を呼び出す。
  2. この function で、Slack から受け取った情報を基に、kintone へのリクエストデータを作成&kintone REST API を実行しレコード登録

kintoneアプリ

AWS 版と同じく「シンプル ToDo」アプリを使うので、ここでは説明を割愛します。
アプリの詳細は Slack から手軽に kintone へレコード登録する方法 を参照してください。
アプリを作成したら、API トークンを発行しておきましょう。アクセス権は「レコード追加」のみでかまいません。
発行した API トークンはのちほど使うので、テキストエディタなどにメモしておきましょう。

Azure Functions

Azure Functions の準備に関しては詳しくは、 kintoneとMicrosoft Azureを連携してみよう(Azure Functionsその1) を参照してください。
本記事では簡単に記載させていただきます。

関数の作成

関数の作成手順は以下のとおりです。
関数名を指定したい場合は、クイックスタートではなく「+新しい関数」から関数を作成してください。

  1. Funciton App の画面からクイックスタート画面を開きます。
  2. シナリオ選択では、「Webhook + API」を選択します。
  3. 言語の選択は、「JavaScript」を選択します。

この段階で、Slack に設定する関数 URL が作成され、画面の上部に表示されます。

パッケージモジュールのインストール

  1. Kudu を開きます。画面上部にあるフォルダー名のリンクを選択し、作成した Funciton のフォルダーに移動します。

    1
    
    D:\\home\\site\\wwwroot\\<function\_name>
  2. npm コマンドを実行します。

    1
    
    npm init
  3. namedescripstion のみ指定して package.json を生成します。

  4. request パッケージをインストールします。

    1
    
    npm install request --save-dev
package.json の例
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
  "name": "posttodo",
  "version": "1.0.0",
  "private": true,
  "description": "posttodo",
  "main": "index.js",
  "scripts": {
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "request": "^2.74.0"
  }
}

プログラム

Amazon Lambda での連携 Tips では、Javascipt(Node.js)で作成したプログラム一式を Zip 化してアップロードする方法が紹介されていました。
しかし、Azure Functions ではツール内のエディターにプログラムを直接書くことができるため、プログラムファイルをアップロードする必要がありません

以下のコードを index.js のエディターに貼り付け、kintone 環境のドメインアプリ番号API トークン をご自身の環境に合わせて変更し、保存してください。

 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
const request = require('request');

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

/* webhookを受けた後の処理*/
module.exports = function(context, event) {
  const obj = {};
  let temp = event.body.split('&');

  for (let i = 0; i < temp.length; i += 1) {
    const item = temp[i].split('=');
    obj[item[0]] = item[1];
  }
  temp = obj.text.replace(/Todo/g, '').replace(/\+/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 post_text = {
    url: BASE_URL + 'record.json',
    method: 'POST',
    headers: headers,
    'Content-Type': 'application/json',
    json: body_post
  };
    // レコードを登録
  request(post_text, (error, response, body) => {
    context.res = {text: 'kintone POST success!'};
    context.done();
  });
};

基本的には、AWS を使った Slack から手軽に kintone へレコード登録する方法 と同じプログラムで動作しますが、AWS と Azure で異なる部分は以下のとおりです。
この 3 ヵ所は必ず変更してください。

AWS と Azure で異なる部分
  • AWS:

    1
    
    const aws = require('aws-sdk');

    Azure: AWS SDK を呼び出すためのコードにつき不要

  • AWS:

    1
    
    exports.handler = function(event, context) {};

    Azure:

    1
    
    module.exports = function(context, event) {};
  • AWS:

    1
    
    context.done(null, {text: 'kintone POST success!'});

    Azure:

    1
    2
    
    context.res = {text: 'kintone POST success!'};
    context.done();

以上で Azure Functions 側の準備は完了です。

Slack Outgoing Webhooksの設定

Slack 側の設定は過去記事と同じですが、当時と多少設定方法が変わっています。
投稿するチャネルのあるチームにログインしておく必要があります。
該当チームにログインした状態で設定作業を行うため、インストールという行為は発生せず「Outgoing Webhooks」を検索して選択するだけとなっています。

下の図のような画面が表示されたら、「Add Configuration」をクリックして設定してください。

URL の欄には、Azure Functions で作成した関数の URL をコピーして貼り付けてください。

試してみよう

設定したトリガーワード ToDo に続けて、タイトルとなる文字を入力します。 今回のサンプルでは + を区切り文字として、以下のように投稿しました。

次に、kintone アプリを確認してみましょう。

Azure Functions を使っても無事に Slack から kintone にレコードを登録できました!

AzureとAWSとの比較

Slackから手軽にkintoneへレコード登録する方法 に記載されている方法と比較すると、以下のような違いがあります。

違い1

AWS の場合は 2 つのサービスを使いますが、Azureの場合はAzure Functionsのみでエンドポイントの作成とコードの実行を行えます。

違い2

Azure の場合は他システム連携の設定について、クイックスタートやテンプレートなどが用意されています。そのため、ある程度自動でできます。

違い3

ログの確認方法は、AWS の場合は Amazon CloudWatch で確認することになりますが、Azure では、エディターの下に表示させることができます。
ただし、AWSの最新バージョンを使うことで、その差はほとんどなくなるようです。
興味のある方は、 Amazon API Gatewayを使ってAWS LambdaをSDKなしでHTTPS越しに操作する (External link) を参照してみてくださいね。

まとめ

今回は Webhook を使った連携を Azure で行いました。
試した結果、Azure でも簡単に Slack と kintone を連携できることがわかりました。AWS と Azure に大きな差はなさそうです。

ハマった点としては、関数の設定部分のモード設定を「Standard」のままにしておく、というところでした。
Webhook を使った連携だからといって「Webhook」を選択すると動きません。
ログも出ないので、原因にたどり着くまで時間がかかりました。
クイックスタートを使って関数を作った場合には、初期値で「Standard」になっているので、変にいじらなければ大丈夫です!