「Terraform for さくらのIoT Platform」作りましたー!

f:id:febc_yamamoto:20161223153418p:plain

この記事はさくらのアドベントカレンダー(その2)の18日目の記事です。
現在12/25ですが、空いていたので投稿させていただきました。

qiita.com

作ったよー!

ということで、TerraformでさくらのIoT Platformを操作するためのプラグインTerraform for さくらのIoT Platform」をリリースしました!

詳細は以下のGithubを参照ください。ドキュメントもある程度揃っています。

github.com

何ができるの?

さくらのIoT Platformのコントロールパネルでの以下の作業を自動化できます。

  • プロジェクトの登録/更新/削除
  • モジュールの登録/更新/削除
  • 連携サービスの管理
    • WebSocket
    • Incoming Webhook
    • Outgoing Webhook

連携サービスは他にもAWS IoTやMQTT Client、DataStoreなどがあるのですが、
これらはさくらのIoT PlatformのAPIドキュメントが公開され次第実装します。

余談: go言語でAPIクライアントを実装するにあたりgo-swaggerを利用しています。
このため、現在未実装の機能についてはAPIドキュメントにて定義ファイル(yml)が提供された後で実装をする予定です。

使い方は?

準備として、Terraform本体のダウンロード、このプラグインのダウンロード、さくらのIoT PlatformのAPIキーの取得が必要です。
詳しくは以下のページを参照ください。

terraform-provider-sakuraiot/installation.md at master · yamamoto-febc/terraform-provider-sakuraiot · GitHub

その後、以下のようなTerraform定義ファイルを作成してterraformコマンドを実行することで、 さくらのIoT Platformの環境構築が一発で行えます。

サンプル

# ------------------------------------------------------------
# プロジェクトの登録
# ------------------------------------------------------------
resource "sakuraiot_project" "project01" {
    name = "example project"
}

# ------------------------------------------------------------
# モジュールの登録
# ------------------------------------------------------------
resource "sakuraiot_module" "module01" {
    project_id = "${sakuraiot_project.project01.id}"
    name = "example module"
    register_id = "put-your-register-id"      # (要編集)通信モジュール本体に記載されているモジュール登録用ID
    register_pass = "pur-your-register-pass"  # (要編集)通信モジュール本体に記載されているモジュール登録用パスワード
}

# ------------------------------------------------------------
# 連携サービスとしてOutgoing WebhookとIncoming Webhookを登録
# ------------------------------------------------------------
# Outgoing Webhook
resource "sakuraiot_service_outgoing_webhook" "webhook01" {
    project_id = "${sakuraiot_project.project01.id}"
    name = "example outgoing webhook"
    secret = "secret"                         # HMAC-SHA1署名用のシークレット
    url = "https://your-webhook-server.com/"  # Outgoing Webhookの連携先URLを指定
}

# Incoming Webhook
resource "sakuraiot_service_incoming_webhook" "webhook01" {
    project_id = "${sakuraiot_project.project01.id}"
    name = "example incoming webhook"
    secret = "secret"                          # HMAC-SHA1署名用のシークレット
}

どんな時に使うの?

使い所はズバリ「他サービスとの連携がある環境の構築」です! 例えばさくらのIoT Platformの通信モジュールで受けたデータをArukasで動かす場合、

  • 1) Arukas上にWebSocketまたはIncomingWebhookなどの連携サービス用コンテナを起動しておく
  • 2) Arukasが割り当てたエンドポイントの情報を元にさくらのIoT Platformで連携サービス(Outgoing-Webhookなど)を登録

といった、複数サービスを行き来しながらの面倒な設定が必要になるのですが、この辺りが一発というのがポイントです。
もちろん、環境をコード化することによって、バージョン管理ができるようになったり、コードレビューが行いやすくなったり、環境の複製/再利用が行いやすくなる、などの様々なメリットを受けることもできます。

試しに複数サービス環境を構築

さくらのIoT PlatformとArukasを連携する環境を構築してみます。

  • さくらのIoT Platformにプロジェクトを作成
  • さくらのIoT Platformに通信モジュールを1台登録
  • さくらのIoT Platformに連携サービスとしてOutgoing-Webhookを登録、通信モジュールからのデータをWebhookでArukas上のコンテナへ送信
  • Arukasでは通信内容を表示するだけのエコーサーバーを起動しておく
  • Webhookは外部からの不正アクセスを防ぐためにHMAC-SHA1署名用のシークレット文字列を設定する

準備

はじめに以下のページを参考に、Terraform for さくらのIoT PlatformとTerraform for Arukasのインストールを行っておきます。

定義ファイル

Terraform定義ファイルは以下のようになります。

# ------------------------------------------------------------
# HMAC-SHA1署名用のシークレット文字列を定義
# ------------------------------------------------------------
variable secret { default = "secret" }

# ------------------------------------------------------------
# Arukas上にコンテナ起動
# ------------------------------------------------------------
resource "arukas_container" "echo_server" {
    name = "sakura_iot_echo"
    image = "yamamotofebc/sakura-iot-echo"
    ports = {
        protocol = "tcp"
        number = "8080"
    }
    environments {
        key = "SAKURA_IOT_ECHO_SECRET"
        value = "${var.secret}"
    }
}

# ------------------------------------------------------------
# さくらのIoT Platformへプロジェクトの登録
# ------------------------------------------------------------
resource "sakuraiot_project" "project01" {
    name = "example project"
}

# ------------------------------------------------------------
# さくらのIoT Platformへモジュールの登録
# ------------------------------------------------------------
resource "sakuraiot_module" "module01" {
    project_id = "${sakuraiot_project.project01.id}"
    name = "example module"
    register_id = "put-your-register-id"      # (要編集)通信モジュール本体に記載されているモジュール登録用ID
    register_pass = "pur-your-register-pass"  # (要編集)通信モジュール本体に記載されているモジュール登録用パスワード
}

# ------------------------------------------------------------
# さくらのIoT Platformへ連携サービスとしてOutgoing Webhook登録
# ------------------------------------------------------------
# Outgoing Webhook
resource "sakuraiot_service_outgoing_webhook" "webhook01" {
    project_id = "${sakuraiot_project.project01.id}"
    name = "example outgoing webhook"
    secret = "${var.secret}"                                                            # HMAC-SHA1署名用のシークレット
    url = "${arukas_container.echo_server.endpoint_full_url}"    # Arukasが発行するエンドポイントのURLを参照指定
}

あとはterraform applyするだけで環境構築できちゃいます。便利でしょ?

今後の展望

Terraformの現在のバージョン(2016年12月現在はv0.8.2)はAWS IoTをサポートしていません。
しかしすでにAWS IoTをサポートするためのPullRequestが来ているようですので、近日中に対応されるのではないかと思います。

この辺りも自動化できるようになるとさらに夢が広がりますね!

お願い:複数の通信モジュールをお持ちの方へ

私のお小遣いでは通信モジュールをひとつしか買えませんでした。。。
このため複数の通信モジュールを利用する場合のテストが不十分です。
もし複数のモジュールをお持ちの方がいらっしゃいましたらテストにご協力いただけると助かります!
できれば三つ以上の通信モジュールがあるといいですね!

終わりに

これでさくらのサービスでのTerraformサポートはクラウド、Arukas、IoT Platformと揃いました。 次は、、VPSですね!

|ω・`)チラ

さくらのVPSAPIで操作できるようにならないかなー

|ω・`)チラチラ

VPSは初期費用がかかったりするのでAPIでの操作は難しいかもしれないですが、
ちらほらAPI欲しいという声を聞きますので、、、

もしさくらのVPSAPIが公開されたらTerraform対応しますので、ぜひ公開をお待ちしております。


以上です。Terraform for さくらのIoT Platform、ぜひご利用くださいー!!

【永久保証付き】Arduino Uno

【永久保証付き】Arduino Uno

DevOpsを支えるHashiCorpツール大全 ThinkIT Books

DevOpsを支えるHashiCorpツール大全 ThinkIT Books

Terraform: Up and Running; Writing Infrastructure As Code

Terraform: Up and Running; Writing Infrastructure As Code