ApexからAWS IoT叩いてみた話
-
Upload
tzmfreedom -
Category
Technology
-
view
587 -
download
1
Transcript of ApexからAWS IoT叩いてみた話
Who Am I?
名前:田実 誠
会社&ロール:株式会社ウフルでデベロッパー的な。
最近のお仕事:Marketing Cloud(ExactTarget)とかHerokuとかSalesforceとか
Github:tzmfreedomTwitter:@tzm_freedomBlog:http://freedom-man.com/blog/
詳しくはブログで。サンプルは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 × 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
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叩くの辛い→でも一度作ると使いまわせて便利!