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」になっているので、変にいじらなければ大丈夫です!