kintoneを使ってSORACOM Air SIM自動管理アプリ作ってみた

kintoneを使ってSORACOM Air SIM自動管理アプリ作ってみた:


はじめに

案件開発をする際にほぼ必ずSORACOM Air SIMを使うのですが、社内で管理しているSIMの数が多すぎてどのSIMがどの認証情報を使っててどのサービス設定されてて...っていうのを把握しきれなくなり、パッと見てSIMの情報を把握できるアプリを作ろうと思いました。そこで今回AWS lambda, kintoneを使ってSIMの自動管理アプリを作りました。


完成品

今回作ったアプリはこんな感じです。表示内容を「すべて」にしているのでテーブルがはみ出してますが、

表示内容をカスタマイズして必要項目に絞ることもできます



kintone_app_sample.png



構成

今回のアーキテクチャは以下の図のようになってます。



図1.png


毎日9:00にCloudWatch Eventからlambdaをinvokeし、SORACOM APIを使ってkintoneにSIMの情報を更新させています。


kintoneアプリのフォーム設定

フォームの一覧としては以下の形で作成しました。



FireShot Capture 177 - アプリの設定 - https___kyoso.cybozu.com_k_admin_app_flow_app=524#section=form.png


今回一括で知りたかった情報をフォームに入れたため、IPアドレスなどの詳細に関しては扱っていません。

フォーム項目のそれぞれのキー名等は以下のようにしました。

レコード番号 等の自動設定のキー名の変更方法ご存知の方いらっしゃいましたら教えてください...

"レコード番号": { 
        "type": "RECORD_NUMBER", 
        "value": "32" 
    }, 
    "air_check": { 
        "type": "CHECK_BOX", 
        "value": ["VPG"] 
    }, 
    "harvest_radio": { 
        "type": "RADIO_BUTTON", 
        "value": "off" 
    }, 
    "group_name": { 
        "type": "SINGLE_LINE_TEXT", 
        "value": "グループ名" 
    }, 
    "更新者": { 
        "type": "MODIFIER", 
        "value": { 
            "code": "Administrator", 
            "name": "Administrator" 
        } 
    }, 
    "作成者": { 
        "type": "CREATOR", 
        "value": { 
            "code": "Administrator", 
            "name": "Administrator" 
        } 
    }, 
    "imsi": { 
        "type": "SINGLE_LINE_TEXT", 
        "value": "imsi番号" 
    }, 
    "$revision": { 
        "type": "__REVISION__", 
        "value": "1" 
    }, 
    "make_date": { 
        "type": "CREATED_TIME", 
        "value": "YYYY-MM-DDTHH:mm:ssZ" 
    }, 
    "beam_radio": { 
        "type": "RADIO_BUTTON", 
        "value": "on" 
    }, 
    "krypton_radio": { 
        "type": "RADIO_BUTTON", 
        "value": "off" 
    }, 
    "update_date": { 
        "type": "UPDATED_TIME", 
        "value": "YYYY-MM-DDTHH:mm:ssZ" 
    }, 
    "shared_key": { 
        "type": "SINGLE_LINE_TEXT", 
        "value": "事前共有鍵名" 
    }, 
    "sim_name": { 
        "type": "SINGLE_LINE_TEXT", 
        "value": "SIM名" 
    }, 
    "auth_name": { 
        "type": "SINGLE_LINE_TEXT", 
        "value": "認証情報名" 
    }, 
    "endorse_radio": { 
        "type": "RADIO_BUTTON", 
        "value": "off" 
    }, 
    "funnel_radio": { 
        "type": "RADIO_BUTTON", 
        "value": "off" 
    }, 
    "status": { 
        "type": "SINGLE_LINE_TEXT", 
        "value": "active" 
    }, 
    "$id": { 
        "type": "__ID__", 
        "value": "1" 
    } 
} 


lambdaの構成

lambda内の主な処理の構成は

  1. SORACOM APIを使用するのに必要なトークンを取得する
  2. kintoneに現在保存されている情報一覧を取得する
  3. SORACOM APIを使用してSIM情報とグループ情報の一覧を取得する
  4. 3で取得したデータを前項のjson形式に合うように成形する
  5. 2の情報と4の情報を比較して
  • 追加するデータ
  • 更新するデータ
  • 削除するデータ
  • 変更不要のデータ
に分類し、配列に収める

6. 5で作成したデータをそれぞれに対応する処理にかけてアプリを更新する

です。


使用したSORACOM API

今回使用したSORACOM APIは以下の3つです

私が説明するよりリファレンスの方が100億倍わかりやすいのでリンクだけ貼っておきます...


使用したkintone API

今回使用したkintone APIは以下の4つです。

私が説明するよりリファレンスの方が(以下略)


AWS環境の構築

同期が最近「terraform!terraform!」って言っていたのでそんなに推してるなら使ってみよう。と思い

今回lambdaとCloudWatch eventの設定はterraformを使ってみました。

今までserverless frameworkを使っていたので少し抵抗はあったのですが、

基本から教えてもらうとserverless frameworkより直感的でわかりやすかったです。

moduleさえ用意しておけば汎用的に使えるしファイル内に記載するキー名(?)も省略されてないので読めばterraform初心者でも何をしているのか大体理解することができました。

(個人の意見なので異論はもちろん認めます)


躓いたところ


lambdaからkintone APIたたけない?!

kintone APIを使用するにあたって公式サイトを参考に始めたんですけど、

let basicUserName = 'xxxxx'; // basicAuth user name 
let basicPassword = 'xxxxx'; // basicAuth password  
このbasicUserNamebasicPasswordってなに?!ってなりました...

自分のユーザーとパスワード載せてどうすんの...って思って...

ただAPITokenだけでローカルで実行できたしいいやーって思ってそのままにしてたんですけど、

lambdaに乗せたらTypeError: Cannot read property 'id' of nullって怒られてしまいました...

同期に言われて気づいたんですけど、普段社内ネットワークでつないでて気づかなかったんですが、

社内ネットワーク以外でログインしようとするとベーシック認証通さないといけなくてbasicUserNamebasicPasswordはそのときに使うユーザー名とパスワードだったみたいです。

なるほど納得

lambdaなど外部のネットワークからAPIを利用する時はこの部分を設定しないとAPIを使えないみたいです。


1日に1回invokeされるように設定したはずなのに1分に1回invokeされてる?!

CloudWatch eventの設定をtfファイル上でこれを参考にして以下のように設定しました。(以下は一部)

resource "aws_cloudwatch_event_rule" "cloudwatch_event_rule_info" { 
  name        = "soracom_sim_update_event" 
  description = "SORACOM SIM管理アプリ(kintone)の更新lambdaをキックするイベント" 
 
  event_pattern = <<PATTERN 
{ 
  "detail-type": [ 
    "Scheduled Event" 
  ] 
} 
PATTERN 
 
  schedule_expression = "cron(0 0 * * ? *)" 
} 
この状態で実行し、コンソール上で確認してもクーロン式で毎日UTC00:00にinvokeされるな

と思っていたら、なんと1分に1回invokeするようになってました��

同じような内容のルールと比較してみると

{ 
  "detail-type": [ 
    "Scheduled Event" 
  ] 
} 
期待通り動作しているルールには detail-typeが存在していない...

試しにこれを削除して実装してみると無事に1日1回のinvokeに変わりました

根本原因はまだわからず...もしご存知の方がいらっしゃいましたら教えてください...


まとめ

SORACOM APIもkintoneのアプリ作成もterraformも初めてだったんですけどどれも使いやすかったのでわりとすんなり(?)作成できました。SIM管理に困ってる方がいましたらぜひ。


コード内容

github

あまり可読性に自信がないのですが参考にしていただければと思います...

PRお待ちしてます��

nodeはv8.10を使用しています。

※今回メインはkintoneアプリ開発なのでlambdaのコードのみでterraformのコードは載せません。また別の機会に記事にできれば良いなぁと思います。

コメント

このブログの人気の投稿

投稿時間:2021-06-17 22:08:45 RSSフィード2021-06-17 22:00 分まとめ(2089件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)