読者です 読者をやめる 読者になる 読者になる

Fusicきばんブログ

Fusic基盤ユニットの非公式技術ブログ

mockmock × Google Cloud Platform( × Slack)

こんにちは。Fusic 基盤ユニットの濱野です。
今日は、先日 4/6 に正式リリースされた 弊社サービス mockmock を使ってみた話を書いてみようと思います。

mockmock とは?

- mockmockはIoTの開発支援サービス。
- クラウド上に仮想デバイスを作成し、開発中のサーバーに疑似データを送ってくれる。
- デバイスの制約を受けずにIoTのサーバーアプリの開発が進められるので、とっても楽。

というサービスです。

目標

mockmock から Google Cloud Platform(以下、GCP) に作ったAPI を叩き、
Slack に通知を飛ばす
とりあえず、シンプルにWeb API を叩けるようになる!!!

まず最初に、GCPにAPI サーバーを作ります。

使用したのは、永年無料で使用できると噂の f1-microです(※1)。
こちらのサイト https://blog.apar.jp/web/6966/ を参考にさせて頂きました。

環境は、

$ nginx -v
nginx version: nginx/1.10.2

$ php -v
PHP 7.0.17 (cli) (built: Mar 14 2017 15:14:30) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies

です。

ちなみに、f1-micro では、メモリが 0.6 GB しかありません。
docker の mysql image をrun しようとしましたが、
メモリ不足で起動すらできませんでした。
後日、省メモリについても調べます。。。

PHP のコード

docroot に、2種類のファイルを作成しました。

1つめ
index.php

<?php
if ($_SERVER['REQUEST_METHOD'] == 'GET') {
  echo json_encode(['key' => '鍵']);
}

こちら、後ほど説明しますが、
mockmock のプロジェクトを作る際に必要になる処理です。
‘鍵’ と書いたところに、mockmock のプロジェクト作成時に提示される 認証キー を入れます。

2つめ
success.php

<?php
function send_to_slack($message) {
  $webhook_url = 'https://hooks.slack.com/services/カスタムインテグレーションのURL';
  $options = array(
    'http' => array(
      'method' => 'POST',
      'header' => 'Content-Type: application/json',
      'content' => json_encode($message),
    )
  );
  $response = file_get_contents($webhook_url, false, stream_context_create($options));
  return $response === 'ok';
}
$message = array(
  'username' => 'mockmock',
  'text' => 'fooooo!!!',
);
if ($_SERVER['REQUEST_METHOD'] == 'POST') {
  // request body に json が送られてくる際、$_POST は空になるので、この処理が必要。
  $json = file_get_contents('php://input');
  $array = json_decode($json, true);
  if ($array['status'] == 'success') {
    $date = new DateTime();
    $now = $date->format('Y-m-d\TH:i:s.u');
    $message['text'] = 'success'.$now;
  } else {
    $message['text'] = 'error';
  }
   send_to_slack($message);
} else {
  echo send_to_slack($message);
}

とりあえず動くことを目標に頑張りました。
slack 通知の送り方は、この辺を参考にしました。ありがとうございます。
http://qiita.com/hoto17296/items/621a6e16f23785a543f3 http://qiita.com/gorogoroyasu/items/a73ba2180d0934f51485 (これ、自分の記事です。)

これで、サーバー側完成です。

(file_get_contents(‘php://input’) を知らなくて、結構ハマリました。 普段はCakePHPを使って開発しているので、素書きのPHPが難しい。。。)

mockmock 側の設定

次に、mockmock 側の設定の話を書いていきます。

公式のヘルプ
を参考にさせていただきました。

ヘルプに沿って、こんな感じの設定を書きます。

f:id:adiboy:20170409233749p:plain

そして、疎通確認を行います。 注意点は、mockmockからのリクエストが GETで飛んでくることです。 まあ、URL にアクセスしてるだけだから当たり前といえば当たり前なのですが。。。

次に、mockグループの新規作成を行います。

と言っても、適当に名前をつけるだけです。

そのあと、mockステータス を設定します。 新規作成を押したあと、 f:id:adiboy:20170409233829p:plain こんな感じで設定します。 f:id:adiboy:20170409233842p:plain

データテンプレート というのは、どのようなデータを送信するか のテンプレートのことです。
ヘルプが参考になります。 https://console.mock-mock.com/help#help_data_template
デフォルトで、 {'hello': 'world'} というデータを送るようなテンプレートがセットされます。
ここを自由にカスタマイズできる仕組みです。

その後、 mock のタブを開き、新規登録を押すと、準備完了です。
f:id:adiboy:20170409233915p:plain

あとは、操作 ボタンから、 起動 を選択するだけ。
数秒 ~ 数十秒 したら、 mockからAPI にデータが飛んできます。

ということで

mockmock は、本来IoT のデバイスの代わりとして使うものですが、 任意のデータをWebAPIに送れるので、GCPに作ったAPI を叩き、Slack に通知を飛ばしてみました。 ハローワールドすることはできたかな? と思います。
少しでもとっつきやすいと思っていただけたら幸いです。

次回は、もう少し mockmock を掘り下げてみようと思います。
楽しい週末でした(※3)!

Slack のスクショ f:id:adiboy:20170409234915p:plain

※1
GCP を使うのは、完全に今回が初めてです。
SSH するのが大変でした。
普通に ~/.SSH/authorized_keys に公開鍵を設定するだけではだめらしい。
http://qiita.com/kosuke_nishaya/items/3d9a95f559d0c22d8134
のような設定が必要らしいです。

※2
もともと、 AWS の API Gateway を叩いて、 Lambda からSlack に通知を飛ばす的な、
サーバーレス的なやつをしたかったのですが、
どうもうまく行きませんでした。

まあ、AWS の知識は皆無に等しいので、詳しい方々は問題ないと思いますが。。。
それで、こんな感じでGCP を使うことにしたのです。

※3
http://ghostshell.jp/ を見に行く予定だったのに、
予定が大幅にずれ込んだため、泣く泣く延期します。
ネタバレはしないでください。