AWS IoT Device Shadowを試すためのpython mock

はじめに

AWS IoTを利用する1つの理由として、Thing shadowによるThing/Deviceコントロールが出来ることがあるかと思います。
一方で概要は理解できたものの、”Thing”がないから動作確認ができないとお思いの方も多いかと、、
こちらについては実はDeviceSDKを使えばLinux上で確認が可能です。
ここでは、EC2を仮想デバイスとして、Thing shadowの動作確認をしてみようと思います。

準備

AWS IoT

Thingの作成

registryを選択し、thingsを選択。Thingペインが表示されたら、画面上部のcreateを押す。
スクリーンショット 2017-02-07 23.08.11.png

Thingの作成ですが、任意の名前を設定し、create thingを押す。
ここではthinnameを、shadow-testとしてます。

Thing作成後の画面で、Certificateを選択。表示された画面のcreate certificateを押す。
スクリーンショット 2017-02-07 23.11.03.png

作成された証明書3つをダウンロードしておいてください。(cert.pem/public.key/private.key)
また画面下部に表示された Activeを押し、証明書を有効化します。

Endpointの確認

AWS IoTコンソール、画面左下にあるSettingsを押し、表示された画面にエンドポイント確認、textなどにコピーしておいてください。
endpointはregionごとに一つとなります。
{random}.iot.{region}.amazon.com
の形で表示されます。

EC2

EC2の起動

EC2でamazon linuxを起動してください。t2.microで十分です。
EC2の起動方法がわからない方、こちらをご参考に。
HDDサイズもデフォルトで十分です。SSHでログインするためのGlobal IPの設定をお忘れなく。

EC2へIoT DeviceSDKのinstall

mockはpythonSDKで作っているのでPythonSDKをインストールします。
EC2のコンソールから以下のコマンドを発行

pip install AWSIoTPythonSDK

dummyプログラム(mock)の設置

必要なものとして

  • プログラム本体
  • setup.json
  • 証明書 3つ (rootCA/private/cert)

を配置します
本投稿では、/tmpの下で作業することを想定して記述します。

mkdir /tmp/dummy-shadow
cd /tmp/dummy-shadow
mkdir certs
cd certs

証明書の設定

rootCAの取得 (certsの下に配置します)
ベリサインのこちらから取得

curl https://www.symantec.com/content/en/us/enterprise/veisign/roots/VeriSign-Class%203-Public-Primary-Certification-Authority-G5.pem -o /tmp/root.pem

またこのcertsディレクトリに先程AWS IoTで作成したprivate/certの証明書を配置します。
scp/viでのコピペでも構いません。ファイル名は
cert => cert.pem
private => private.pem
としてください。以下の結果になるようにしてください。

ls -1 /tmp/certs
cert.pem
private.pem
root.pem

dummy(mock)の設置

/tmp/dummy-shadowで以下のファイルを配置します。
YOUR_AWSIOT_DOMAINは各自の環境に併せて、設定して下さい。
ドメインの確認は、AWS IoTのコンソール Settings => Custom endpointを参照して下さい。

setup.json
{
   "AWSIoT": {
        "ENDPOINT":"YOUR_AWSIOT_DOMAIN",
        "CERT_PATH":"./certs/",
        "KEYS":["cert.pem", "public.pem", "root.pem"]
   },
   "DEVICE":{
        "NAME":"shadow-test",
   }
}

以下にdummyプログラム

dummy-shadow.py
import os
import sys
import json
import time
from AWSIoTPythonSDK.MQTTLib import AWSIoTMQTTShadowClient


CONFIG_FILE = './setup.json'

#アプリ起動時の状態を固定で定義(shadowと同期する変数)
SIGNAL    = "green"
WAIT_TIME = 10

#コールバック関数からshadowを読み出すのでglobalで定義
shadow         = None
shadow_hundler = None

##########################################################
# setup.jsonから設定を読み出す
##########################################################
def readConfig():
    print 'start readConfig func'

    try:
        # read config file
        f = open(CONFIG_FILE, "r")
        jsonData = json.load(f)
        f.close()

        list = {}
        list["ENDPOINT"]    = jsonData["AWSIoT"]["ENDPOINT"]
        list["CERT_PATH"]   = jsonData["AWSIoT"]["CERT_PATH"]
        list["DEVICE_NAME"] = jsonData["DEVICE"]["NAME"]

        return list

    except Exception as e:
        print 'Config load error'
        print e.message
        sys.exit()

##########################################################
# Shadow update命令の発行
##########################################################
def updateThing(report):
    try: 
        report_json = '{"state":{"reported":'+ report + '}}'
        print "send currnet status to cloud-shadow"
        print report_json
        shadow_hundler.shadowUpdate(report_json, None, 5)

        return

    except Exception as e:
        print e.message
        sys.exit()

##########################################################
# shadowRegisterDeltaCallbackからコールバック型で呼び出される
#
##########################################################
def getDelta(payload, responseStatus, token):
    try:
        print '======get Delta======'
        dict_delta = json.loads(payload)
        print dict_delta
        state = dict_delta["state"]

        if state.has_key("wait_time"):
            delta = int(state["wait_time"])
            global WAIT_TIME
            WAIT_TIME = delta
            print "wait time change :%s" % WAIT_TIME
        if state.has_key('signal'):
            global SIGNAL
            SIGNAL = state['signal']
            print "SIGNAL change :%s" % SIGNAL

        report = json.dumps(dict_delta["state"])
        updateThing(report)

        return

    except Exception as e:
        print "Error on Delta function"
        print e.message
        raise

################################################
# Shadow接続の手続き関数
################################################
def initShadow(Config):
    ##--need device cert / private / rootCA--
    # rootCA: get from symantec
    ROOT_KEY    = Config['CERT_PATH'] + 'root.pem'
    CERT_KEY    = Config['CERT_PATH'] + 'cert.pem'
    PRIVATE_KEY = Config['CERT_PATH'] + 'private.pem'

    try:
        # init shadow connect procedure
        global shadow
        shadow = AWSIoTMQTTShadowClient(Config["DEVICE_NAME"])
        shadow.configureEndpoint(Config["ENDPOINT"], 8883)    # Setting URL-ENDPOINT & Port
        shadow.configureCredentials(ROOT_KEY, PRIVATE_KEY, CERT_KEY ) # Cert file setting
        shadow.configureConnectDisconnectTimeout(10)# CONNACK wait time (sec)
        shadow.configureMQTTOperationTimeout(5)     # QoS1 publish (sec)
        print 'start connct shadow'
        shadow.connect()
        print 'shadow connect'

        return

    except Exception as e:
        print 'Error on Init Shadow'
        raise

####
if __name__ == '__main__':
    Config = readConfig()

    try:
        initShadow(Config)
        print 'satrt subscribe shadow'
        shadow_hundler = shadow.createShadowHandlerWithName(Config['DEVICE_NAME'], True)
        shadow_hundler.shadowRegisterDeltaCallback(getDelta)
        default_state = '{"wait_time":' + str(WAIT_TIME) + ', "signal":"green"}'
        updateThing(default_state)

        while True:
            time.sleep(WAIT_TIME)
            print 'Currnet WAIT_TIME=%s' % str(WAIT_TIME)
            pass

    except KeyboardInterrupt:
         print 'Keyboard Interrupt'
         sys.exit()

    except Exception as e:
        print e.message
        sys.exit()

実行方法

python PROGRAM.py &

でバックグラウンド起動します。

shadow update

コンソールもしくは、CLIでshadow updateをします。
Resistor => Thing => [Thing名] => Shadowを選択します。

以下のようにdesiredセクションを追加し、wait_time:30 , signal:”green”で登録してみます。
するとdeltaとして、 wait_time:30 つまり差分のみがdeltaとしてthingにレポートされます。

スクリーンショット 2017-02-19 22.20.44.png

プログラム側のコンソールを見ると、deltaを受けソレが表示さているはずです。
で、コードの方をみてもらうとわかりますが、変数のwait_timeを変更し、[state]を送りかえしています。
deltaのstateには、結果整合としてあるべき状態が書いてあるので、正しく状態遷移が出来たらこれをreportするだけでいちいちJSONを作成する必要はありません。
上記の通り、正しく状態遷移出来ない状態で report するとズレますので要注意。

このレポートが送られるとdeltaがなくなり、desired/reportedが同じ値になっているはずです。

大まかなシーケンス

大まかなシーケンスを以下に示します。

スクリーンショット 2017-02-19 22.38.16.png

プログラム起動時に report statusとして ハードコーディングされている
SIGNAL = “green”
WAIT_TIME = 10
を通知します。何度か、shadowの状態を変えた場合はプログラム起動直後に上記初期パラメータを通知し、即deltaを受ける事になります。

免責

本投稿は、個人の意見で、所属する企業や団体は関係ありません。
また掲載しているsampleプログラムの動作に関しても保障いたしませんので、参考程度にしてください。

続きを読む

「フロントエンドエンジニアに伝えたいインフラの話」参加メモ 関西フロントエンドUG 2017/02/18

関西フロントエンドUG勉強会
「フロントエンドエンジニアに伝えたいインフラの話」
https://kfug.connpass.com/event/49305/
の参加メモです。

全般的にAWSいいね!という話ばかりでした。
サービスの内容については、書き取った内容を記載していますが、
最新の正確な情報は各サービス公式サイトの確認をお願いいたします。


フロントエンドで捗るAWS ー WordPress の事例と共に

岡本 秀高 さん

AMIMOTOでは、AWSクラウド上で動くWordPressホスティングサービスを提供しています。なぜクラウド上でWordPressを利用するようになったのか。ケーススタディと共にご紹介します。(CMSユーザー・管理者向け)

  • クラウドは環境の規模を柔軟に変えられる
  • 料金は使った分だけ
  • マネージドサービスならインフラレイヤのメンテを丸投げできる

AWSの豊富なサービス群を活用できる

  • Amason Elasticsearch
  • Amazon lightsail
  • Amazon Cognito User Pools (ユーザ認証)
  • Amazon API Gateway
  • AWS Certificate Manager (SSL)

Frontend Meets a Service

後藤 知宏 さん

Serverless を使用すれば Javascript を使用して簡単に 公開API を実装することが出来ます。
バックエンドのJSにつきものな面倒なExpress の学習も抜きにさっと始められる Serverless のAPI 実装を、 Serverless と Webpack の活用を通じて紹介していきます。

便利なサービスを使うことで、バックエンドを組まなくても、作れるものがある。

  • PaaS
  • Baas
  • FaaS

PaaS – Platform as a Service –

サービスの構築をしなくても自動でサーバーを立ち上げてくれる。
構築まではやってくれるが、保守・スケール・監視は自分で。
バックエンドアプリケーションの構築必要。
簡単なAPIサーバの構築や、APIモックなどをサッと上げてしまうには楽。

BaaS – Backend as a Service –

データの管理、検索、Push通知、メール配信、認証など、機能ごとに様々なモノがある。
サービスから提供されれるAPIなどを通じて機能を利用できる。
一方で認証周り等でフロントエンドでの活用は難しく、
バックエンド内での実装負担削減に用いられる。

FaaS – Function as a Service –

Javascriptのfunctionが書ければ、バックエンドを構築することができる。
サーバーサイドに関する知識は殆ど不要。

AWS Lambda

関数をデプロイしたら、API Gateway やスケジューラなどと連動させて様々な処理を行わせることが可能。
構成管理は Serverless framework を通じて簡単に行うことができる。
Serverless は Lambda の面倒なデプロイなどのタスクを自動で処理してくれるツール。
機能単位では無く関数単位でデプロイできる。


常時SSLとCDNの話

岩本貴久さん

常時SSL対応していますか?

  • 通常(非SSL)のインターネット通信は傍受可能
  • 個人情報、クレジットカード情報等をそのまま通信することは危険
  • 通信の暗号化の仕組み
  • HTTP/2は常時SSLが必須

  • メリット 暗号化される

  • デメリット サーバー負荷 SSL証明書の手配・更新

SSL証明書

  • 通信を暗号化するための、鍵と鍵穴
  • 証明書の取得が面倒くさい
  • WEBサーバーへの割り当て作業
  • 証明書の更新

CDN

検索やログイン画面などがキャッシュされないよう注意
キャッシュ時間を考慮

AWSなら快適

AWS Certificate Manager – 無料でSSL
Amazon CloudFront のみで利用可能、自動更新

Elastic Load Balancing – ロードバランサ
複数台のマシンで負荷分散

CloudFront ー CDN
都度の利用 従量課金 最低利用期間無し、安い

ーーー

VPSからクラウドサーバーに移ったらこんなに快適に!

榊原昌彦 さん

某VPSからAWSに移ったメリットを中心にご紹介します。EC2, RDS, S3, SNSあたりの話をします。初心者向け。

1. 自宅サーバー

  • 構築が大変
  • 電源抜いたら死ぬ
  • 自由度は高い

2. レンタルサーバー

  • とにかく安い
  • 自由はない
  • 最近はgitやssh等使えて便利

3. VPS

  • 融通が利くけれど、融通が利かない
  • 構築の煩雑さ
  • セキュリティの心配
  • 他の同居VPSにパフォーマンスを阻害される
  • プラン変更時の移転が大変

4. AWS

  • メモリの増強も簡単数クリック
  • スナップショットがとれる
  • 便利だがお高い

サービス群

RDS データベースサービス
VPS上にDBを入れるのでは無く、データベース専用サービスがある。
DBだけだから、バックアップも高速。かつバックアップの復元も楽。
DB単位でアクセス制限できるから、データ管理を寄り強固にできる。

S3 静的ファイルの保管サービス

Elastic Transcoder メディア変換サービス

Cloud Front 高速コンテンツ配信

プッシュ通知、ユーザー制御サービスなど…


LT

5分でブログ公開する話

しまきょうすけ さん

Netlify

スタティックサイトジェネレーター選んで、cloneして、ドメイン設定するだけ。

開発環境を構築する話

小渕周 さん

AppleMusicを使って100GBあいた話

技術書は Amazon Unlimited を使うと捗る

環境 VartualBox Vagrant bento

フロントエンドとインフラ層をつなぐ知識

pastelInc さん

インフラ層の学習すべきか?

学ぶ機会はある

  • トラブルに遭遇
  • パフォーマンスの話
  • 層の違いを跨ぐ技術 Vagrant Docker 文字エンコード
  • 所属する組織が提供するサービスであれば構成の知識を吸収
  • フロントエンドも層の違う知識を、隠蔽化されているだけで使っている

知らないはずは無い

  • 層の違うエンジニアとコミュニケーションする
  • 層の違いを埋める知識には人や組織によって差がある
  • 完全な分業は無理なので繋ぎの知識を知っている

どう学ぼう

  • 全部を学ぶ方法は無いとき付いている
  • 学ぶ題材は今までの歴史の積み重ね
  • テーマを決めて時間をかけてゆっくり学ぶ
  • そしきが押さえておくべき最低限の繋ぎの知識は最優先で学ぶ

所感

  • CPU、メモリのブレイクスルーが起こるかもしれない
  • ここまで変化に富んだ業界は珍しい
  • 変化を柔軟に楽しむ事が大切

運用していくことについて考えてみた

モリカワタカユキ さん

速さは大事

  • 速く実装
  • 速く動かせればテストに工数を割ける
  • 想定外を減らせる

速さはやっつけ仕事では無い

  • デプロイまでが作業期間ではない。

何を意識していくのか

  • そのループ本当に必要か
  • そのデータ必要か
  • 他の人がコードの意味が分かるか

現実甘くないよね

  • 納期が最優先
  • 本当にこのやり方で大丈夫なのかと 考える余地を持つ,,

続きを読む

[JAWS-UG CLI] IoT #16 ダミーデバイスでShadowを操作

前提条件

MacOS X El Capitanでは動作しません。

  • iot-dataコマンドは、OpenSSL 1.0.1以上が必要となるため、この手順はEC2インスタンス上などで実施してください。
変数の設定(EC2)
export AWS_ACCESS_KEY_ID='アクセスキーID'
export AWS_SECRET_ACCESS_KEY='シークレットアクセスキーID'

IoTへの権限

AWS IoTに対してフル権限があること。

AWS CLIのバージョン

以下のバージョンで動作確認済

  • AWS CLI 1.11.47
コマンド
aws --version
結果(例)
aws-cli/1.11.49 Python/2.7.10 Darwin/15.6.0 botocore/1.5.12

バージョンが古い場合は最新版に更新しましょう。

コマンド
sudo -H pip install -U awscli

ダミーデバイス(EC2)の構築済み

http://qiita.com/tcsh/items/8ec8419b9170f2cc36f0

0. 準備

0.1. リージョンの決定

構築するリージョンを決めます。 (カレントユーザが利用するカレントリージ
ョンも切り変わります。)

コマンド(東京リージョンの場合)
export AWS_DEFAULT_REGION='ap-northeast-1'

0.2. プロファイルの確認

プロファイルが想定のものになっていることを確認します。

コマンド
aws configure list
結果(例)
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         administrator-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         ap-northeast-1  env    AWS_DEFAULT_REGION

AssumeRoleを利用している場合はprofileが ”と表示されます。 そ
れ以外のときにprofileが ” と表示される場合は、以下を実行して
ください。

変数の設定:

     export AWS_DEFAULT_PROFILE=<IAMユーザ名>

0.3. モノ名の指定

変数の設定
IOT_THING_NAME='handson-thing-20170220'

1. 事前作業

2. Shadowの中でdummy内の変数を制御

2.1. Shadowの確認

変数の設定
FILE_OUTPUT='result-dummy-before.json'
コマンド
aws iot-data get-thing-shadow \
  --thing-name ${IOT_THING_NAME} \
  ${FILE_OUTPUT} \
  && cat ${FILE_OUTPUT}
結果(例)
An error occurred (ResourceNotFoundException) when calling the GetThingShadow operation: No shadow exists with name: 'handson-thing-20170220'

2.2. Shadow作成

変数の設定
FILE_OUTPUT='result-dummy-01.json'
IOT_DATA_PAYLOAD='{"state":{"reported":{"wait_time":20, "signal":"green"}}}'
コマンド
echo ${IOT_DATA_PAYLOAD} | jsonlint
結果
{
  "state": {
    "reported": {
      "wait_time": 20,
      "signal": "green"
    }
  }
}
変数の確認
cat << ETX

  IOT_THING_NAME:   ${IOT_THING_NAME}
  IOT_DATA_PAYLOAD: ${IOT_DATA_PAYLOAD}
  FILE_OUTPUT:      ${FILE_OUTPUT}

ETX
コマンド
aws iot-data update-thing-shadow \
  --thing-name ${IOT_THING_NAME} \
  --payload "${IOT_DATA_PAYLOAD}" \
  ${FILE_OUTPUT} \
  && cat ${FILE_OUTPUT}
結果(例)
{"state":{"reported":{"wait_time":20,"signal":"green"}},"metadata":{"reported":{"wait_time":{"timestamp":1487505988},"signal":{"timestamp":1487505988}}},"version":1,"timestamp":1487505988}

2.3. shadow update

変数の設定
FILE_OUTPUT='result-shadow-01.json'
IOT_DATA_PAYLOAD='{"state":{"desired":{"wait_time":20, "signal":"green"}}}'
コマンド
echo ${IOT_DATA_PAYLOAD} | jsonlint
結果
{
  "state": {
    "desired": {
      "wait_time": 20,
      "signal": "green"
    }
  }
}
変数の確認
cat << ETX

  IOT_THING_NAME:   ${IOT_THING_NAME}
  IOT_DATA_PAYLOAD: ${IOT_DATA_PAYLOAD}
  FILE_OUTPUT:      ${FILE_OUTPUT}

ETX
コマンド
aws iot-data update-thing-shadow \
  --thing-name ${IOT_THING_NAME} \
  --payload "${IOT_DATA_PAYLOAD}" \
  ${FILE_OUTPUT} \
  && cat ${FILE_OUTPUT}
結果(例)
{"state":{"desired":{"wait_time":20,"signal":"green"}},"metadata":{"desired":{"wait_time":{"timestamp":1487506160},"signal":{"timestamp":1487506160}}},"version":2,"timestamp":1487506160}

2.4. shadowの確認

変数の設定
FILE_OUTPUT='result-shadow-after.json'
コマンド
aws iot-data get-thing-shadow \
  --thing-name ${IOT_THING_NAME} \
  ${FILE_OUTPUT} \
  && cat ${FILE_OUTPUT}
結果(例)
{"state":{"desired":{"wait_time":20,"signal":"green"},"reported":{"wait_time":20,"signal":"green"}},"metadata":{"desired":{"wait_time":{"timestamp":1487506160},"signal":{"timestamp":1487506160}},"reported":{"wait_time":{"timestamp":1487505988},"signal":{"timestamp":1487505988}}},"version":2,"timestamp":1487506296}

2.5. ダミーデバイス (EC2)

コマンド(EC2)
cd ~/shadow/ \
  && python dummy_shadow.py
結果
start readConfig func
start connct shadow
shadow connect
satrt subscribe shadow
send currnet status to cloud-shadow
{"state":{"reported":{"wait_time":10, "signal":"green"}}}

ダミーデバイスのプログラム停止 (EC2)

Ctrl+Cでプログラムを停止します。

3. Shadowの変数でプログラムを終了させる(電源管理イメージ)

3.1. Thing名の変更

ここでは、Thing名を現時点で存在しない「handson-thing-20170220_power」に変更します。

変数の設定
IOT_THING_NAME="${IOT_THING_NAME}_power"

3.2. Shadow更新

変数の設定
FILE_OUTPUT='result-multi-01.json'
IOT_DATA_PAYLOAD='{"state":{"desired":{"power":"on"}}}'
コマンド
echo ${IOT_DATA_PAYLOAD} | jsonlint
結果
{
  "state": {
    "desired": {
      "power": "on"
    }
  }
}
変数の確認
cat << ETX

  IOT_THING_NAME:   ${IOT_THING_NAME}
  IOT_DATA_PAYLOAD: ${IOT_DATA_PAYLOAD}
  FILE_OUTPUT:      ${FILE_OUTPUT}

ETX
コマンド
aws iot-data update-thing-shadow \
  --thing-name ${IOT_THING_NAME} \
  --payload "${IOT_DATA_PAYLOAD}" \
  ${FILE_OUTPUT} \
  && cat ${FILE_OUTPUT}
結果(例)
{"state":{"desired":{"power":"on"}},"metadata":{"desired":{"power":{"timestamp":1487506888}}},"version":3,"timestamp":1487506888}

3.3. shadowの確認

変数の設定
FILE_OUTPUT='result-shadow-after.json'
コマンド
aws iot-data get-thing-shadow \
  --thing-name ${IOT_THING_NAME} \
  ${FILE_OUTPUT} \
  && cat ${FILE_OUTPUT}
結果(例)
{"state":{"desired":{"wait_time":20,"signal":"green","power":"on"},"reported":{"wait_time":20,"signal":"green"},"delta":{"power":"on"}},"metadata":{"desired":{"wait_time":{"timestamp":1487506160},"signal":{"timestamp":1487506160},"power":{"timestamp":1487506888}},"reported":{"wait_time":{"timestamp":1487505988},"signal":{"timestamp":1487505988}}},"version":3,"timestamp":1487506913}

3.4. ダミーデバイス (EC2)

コマンド(EC2)
cd ~/shadow/ \
  && python multi_shadow.py
結果
start readConfig func
satrt subscribe power-shadow
start connct shadow tmp01_power
Send power on to shadow name
satrt subscribe config-shadow
start connct shadow tmp01
send currnet status to cloud-shadow
{"state":{"reported":{"wait_time":10, "signal":"green"}}}

ダミーデバイスのプログラム停止 (EC2)

Ctrl+Cでプログラムを停止します。

4. 事後作業

完了

続きを読む

[JAWS-UG CLI] IoT #15 IoTダミーデバイスの構築 (EC2 + Shadow)

ダミーデバイスとして動作するEC2上で作業します。

前提条件

IoTへの権限

AWS IoTに対してフル権限があること。

AWS CLIのバージョン

以下のバージョンで動作確認済

  • AWS CLI 1.11.47
コマンド
aws --version
結果(例)
      aws-cli/1.11.14 Python/2.7.10 Darwin/15.6.0 botocore/1.4.71

バージョンが古い場合は最新版に更新しましょう。

コマンド
sudo -H pip install -U awscli

0. 準備

0.1. リージョンの決定

構築するリージョンを決めます。 (カレントユーザが利用するカレントリージ
ョンも切り変わります。)

コマンド(東京リージョンの場合)
export AWS_DEFAULT_REGION='ap-northeast-1'

0.2. 変数の確認

プロファイルが想定のものになっていることを確認します。

コマンド
aws configure list
結果(例)
            Name                    Value             Type    Location
            ----                    -----             ----    --------
         profile         administrator-prjz-mbp13        env    AWS_DEFAULT_PROFILE
      access_key     ****************XXXX shared-credentials-file
      secret_key     ****************XXXX shared-credentials-file
          region                         ap-northeast-1  env    AWS_DEFAULT_REGION

AssumeRoleを利用している場合はprofileが ”と表示されます。 そ
れ以外のときにprofileが ” と表示される場合は、以下を実行して
ください。

変数の設定:

     export AWS_DEFAULT_PROFILE=<IAMユーザ名>

1. 事前作業

2. EC2での構築作業

ダミーデバイス用のEC2インスタンスにログインして構築作業をします。

2.1. SDKのインストール (EC2)

コマンド(EC2)
sudo pip install AWSIoTPythonSDK
結果(例)
      (略)
      Successfully installed AWSIoTPythonSDK-1.1.1

2.2. dummy デバイスのインストール (EC2)

作業はログインしたディレクトリ /home/ec2-user で実行して下さい。 (
変更する場合はsetup.jsonでのCERT_PATHの設定が必要)

コマンド(EC2)
pwd
結果
      /home/ec2-user
コマンド(EC2)
wget https://s3-ap-northeast-1.amazonaws.com/document-for-customer/AWSIoT_Basic/JAWS-shadow/shadow.zip
結果
      (略)
      2016-11-17 03:24:57 (125 MB/s) - `shadow.zip' へ保存完了 [4208/4208]
コマンド(EC2)
unzip shadow.zip
結果
   creating: shadow/
   creating: shadow/certs/
  inflating: shadow/certs/rootca.pem  
  inflating: shadow/dummy_shadow.py  
  inflating: shadow/multi_shadow.py  
コマンド(EC2)
cd ~/shadow \
        && ls
結果
certs  dummy_shadow.py  multi_shadow.py

2.3. setup.jsonの作成 (EC2)

変数の宣言
FILE_INPUT='/home/ec2-user/shadow/setup.json'

/home/ec2-user/shadow/setup.json
{
      "AWSIoT": {
          "ENDPOINT":"YOUR_DOMAIN.amazonaws.com",
          "CERT_PATH":"/home/ec2-user/shadow/certs/",
          "KEYS":["cert.pem", "private.pem", "root.pem"]
      },
      "DEVICE":{
          "NAME":"handson20170220",
          "TOPIC":"/device/room01/tmp01"
      }
}
  • YOUR_DOMAINをAWS IoTのエンドポイントURLに書き替えます。

    • ‘https://’の部分は不要です。
コマンド
mv /home/ec2-user/shadow/certs/rootca.pem /home/ec2-user/shadow/certs/root.pem

2.4. 証明書の転送 (Local)

IoT環境構築時に取得した証明書と秘密鍵を
/home/ec2-user/shadow/certs/下に下記のファイル名で置きます。

  • 証明書(作成時の名称:handson-20170220.cert): cert.pem

  • 秘密鍵(作成時の名称:handson-20170220.pem): private.pem

コマンド(Local)
scp -i ${FILE_SSH_KEY} \
  handson-20170220.cert ec2-user@${EC2_PUBLIC_IP}:/home/ec2-user/shadow/certs/cert.pem
コマンド(Local)
scp -i ${FILE_SSH_KEY} \
  handson-20170220.pem ec2-user@${EC2_PUBLIC_IP}:/home/ec2-user/shadow/certs/private.pem

3. 事後作業

3.1. 証明書の確認

コマンド
ls /home/ec2-user/shadow/certs/
結果
cert.pem, private.pem, root.pem

3.2. プログラムの動作確認

コマンド
cd ~/shadow/ \
  && python dummy_shadow.py
結果
start readConfig func
start connct shadow
shadow connect
satrt subscribe shadow
send currnet status to cloud-shadow
{"state":{"reported":{"wait_time":10, "signal":"green"}}}

Ctrl+Cでプログラムを停止します。

完了

続きを読む

Elastic Volumes (Amazon EBS)

ついにEC2インスタンスを起動したままEBSのボリュームタイプと容量・IOPSの変更ができるようになりました!

Elastic Volumes(エラスティックボリューム)という機能だそうです。
新しいボリュームタイプではないのですね。

http://docs.aws.amazon.com/AWSEC2/latest/UserGuide/considerations.html
を見ると
– Magneticは対象外
– サイズ縮小は当然NG
– 変更後は6時間変更不可
– 2016/11/1以前にアタッチされたボリュームはインスタンスの停止・起動、またはボリュームのデタッチ・アタッチが必要
らしい。他にも制約や前提ありますね。読み込まないと。

紹介記事

続きを読む