ApexからAWS IoT叩いてみた話

18
ApexからAWS IoT叩いてみた話 株式会社ウフル 田実

Transcript of ApexからAWS IoT叩いてみた話

ApexからAWS IoT叩いてみた話

株式会社ウフル 田実 誠

Who Am I?

名前:田実 誠

会社&ロール:株式会社ウフルでデベロッパー的な。

最近のお仕事:Marketing Cloud(ExactTarget)とかHerokuとかSalesforceとか

Github:tzmfreedomTwitter:@tzm_freedomBlog:http://freedom-man.com/blog/

IoT Cloudまだー?

ということで今日は IoTCloud ApexからAWS IoTを叩いてみた、というお話

詳しくはブログで。サンプルはgithubにあるよー

Blog: http://freedom-man.com/blog/apex-awsiot/Code: https://github.com/tzmfreedom/apex_awsiot

AWS IoTとは?

https://aws.amazon.com/jp/iot/

・MQTT Broker(仲介役となるサーバー・サービス)・認証(SigV4、X.509証明書)、暗号化(TLSv1.2)・デバイスのメタデータ管理(Things)・デバイスの状態管理(Device Shadow)・ルールエンジンによるAWSの各種サービスとのつなぎ込み(AWS Lambdaも呼べる!)・Amazon得意のスケーラビリティ・100万メッセージあたり $5~$8

2015年末にベータが取れて一般公開に!!

AWS IoTとは?

基本的にはMQTTを使ってデバイスからデータを取得したり、リモートコントロールしたりそういったIoT向けのサービス

AWS IoT × Salesforce(妄想)

• HTTPのAPIではThingsやDevice Shadowを閲覧、更新、削除、作成できる→Things(メタデータ)やDevice Shadow(属性値)、つまりデバイスを管理できる。

※SORACOMのSIM(回線)管理とかもすると、IoTに関わる部分を一元管理できそう(http://appirio.co.jp/category/tech-blog/2015/10/soracom-salesforce/)

• MQTTのTopicに対してHTTPのAPIでPublishができる→Rules Engineを利用したAWSサービスとのつなぎ込み(本来のIoT的な使い方ではないかもしれないが…)

SNS→任意のユーザ、サービスに色んな方法で通知(メール、MobilePush、HTTP)S3やDynamoDB→構造化、非構造化データの格納SQS→外部に対して非同期にワークフローを投げるLambda→5分以内なら何でも(?)できるKinesis→ ApexからのHTTPなPublishではビッグデータな感じじゃないので利用用途無いかも

しかも、これらのRules EngineとActionの管理を、Salesforceのようにノンコーディングで実現出来る!

SalesforceからAWSのAPIを叩く方法

・Salesforce謹製?のAppExchangeのパッケージを使う→EC2とS3しか使えない

https://developer.salesforce.com/page/JP_Amazon_Toolkit

・JavaScriptのSDKを使う→画面限定https://aws.amazon.com/jp/sdk-for-browser/

・頑張ってApexで書く(ブログはコレ)→Apex適用できるところにはどこでもOKだが、書くの辛い

自前で叩く:Signature Version4• AWSのAPIの署名方式

https://docs.aws.amazon.com/ja_jp/general/latest/gr/signature-version-4.html

• 現在は署名方式としてVersion2, Version4があり、Version4が一番署名の強度が強く、ほぼ全てのサービスでVersion4が利用できるようになっている。新しく発表されるサービスのAPIはだいたいSignature Version4に対応している。

• 結構複雑で辛い(他の言語だったらSDKが提供されているのに…orz)

・HTTPプロキシ(HTTPSをMITMしてくれる良い感じなやつ)例)Fiddler, Charles, mitmproxy→これでAWS CLIなどのHTTPリクエストをキャプチャして各APIのリクエスト方法を何となく把握する。

・Apexで実装している例http://www.terrasky.co.jp/blog/2013/131031_001313.phphttps://doc.terrasky.com/pages/viewpage.action?pageId=9998331

叩くときに便利なツールとか参考になるサイト↓

Signature Version4の辛み

CanonicalRequest =HTTPRequestMethod + '¥n' +CanonicalURI + '¥n' +CanonicalQueryString + '¥n' +CanonicalHeaders + '¥n' +SignedHeaders + '¥n' +HexEncode(Hash(RequestPayload))

StringToSign =Algorithm + '¥n' +RequestDate + '¥n' +CredentialScope + '¥n' +HashedCanonicalRequest))

kSecret = Your AWS Secret Access KeykDate = HMAC("AWS4" + kSecret, Date)kRegion = HMAC(kDate, Region)kService = HMAC(kRegion, Service)kSigning = HMAC(kService, "aws4_request")

HexEncode(HMAC(derived-signing-key, string-to-sign))

Authorization: algorithm Credential=access key ID/credential scope, SignedHeaders=SignedHeaders, Signature=signature

嫌な予感しかしないDemo

AWS IoT AWS Lambda

レコード作成

ProcessBuilder

Chatter

※ProcessBuilderから直接Chatterを叩かない無駄に技術を使った構成

乃木坂

AKB

48

46

46

48

Process Builder

var fs = require("fs");var jsforce = require('jsforce');var username = “********";var password = “*******";var loginUrl = "https://login.salesforce.com";

exports.handler = function(event, context) {var conn = new jsforce.Connection({

loginUrl : loginUrl});var chatter_body = {

body: {messageSegments: [{

type: 'Text',text: event.name + " => " + event.number

}]}

};conn.login(username, password, function(err, res) {

conn.chatter.resource("/feeds/record/" + event.parent_id + "/feed-items").create(chatter_body, function(err, result) {

context.done(null, 'chatter de lambda');});

});};

SELECT name,parent_id,CASE name

WHEN '乃木坂' THEN '46' WHEN 'AKB' THEN '48'ELSE '48'

END AS numberFROM

'Idol'

Rules EngineとLambda

まとめ

・SalesforceからAWS IoTのAPI叩けると、端末管理とかも出来そうで素敵。SORACOMの回線管理と組み合わせるともっと素敵。

・AWS IoTのRules Engineを活用すると、IoTじゃなくても面白いこと出来そう(AWSサービスの前段のGatewayと考えることで柔軟なシステム構成?)

・自前でSignature Version 4叩くの辛い→でも一度作ると使いまわせて便利!

つまり…

IoT Cloudまだー?

ご清聴ありがとうございました!