ITアイランドセミナー in 姫島2019 で AWS IoT を利用したアプリケーションの構築について登壇してきました  #姫島ITアイランド

ITアイランドセミナー in 姫島2019 で AWS IoT を利用したアプリケーションの構築について登壇してきました #姫島ITアイランド

Clock Icon2019.03.18

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

こんにちは、モバイルアプリサービス部の田中孝明です。

3/15(金)に 大分県の姫島で ITアイランドセミナー in 姫島2019 が開催され、 AWS IoT を利用したアプリケーションの構築について登壇してきました。

資料

サーバーレスアプリケーションとは

各種部品について

AWS Lambda

  • サーバーのプロビジョニング、スケーリングや管理が不要
  • 開発者はサーバーやランタイムの管理、操作に煩わされず、コードに集中することができる
  • 利用できる言語が豊富
    • Ruby / Node.js / Python / Java / Go / C# / PowerShell
  • Custom Runtimesを利用すれば、任意の言語を動作させることが可能

Amazon API Gateway

  • 独自の REST および WebSocket API を作成、公開、保守、モニタリング、保護できる
  • 独自のクライアントアプリケーション (アプリ) で使用するための API を作成できる

Amazon Kinesis

  • あらゆる規模のストリーミングデータをコスト効率良く処理するための主要機能を提供
  • ストリーミングデータをリアルタイムで取得、バッファ、処理するため、通常は数時間から数日かかるインサイトの生成を数秒から数分で完了
  • インフラストラクチャを管理する必要なく、ストリーミングアプリケーションを実行できる

Amazon CloudWatch

  • 主要なメトリクスとログのモニタリング、アプリケーションおよびインフラストラクチャスタックの可視化、アラームの作成、およびメトリクスとログの関連付けによって、パフォーマンスの問題の根本的原因を把握
  • アラームの設定や自動化されたアクションを起こす
  • ログをすばやく発見、分析、視覚化することで運用上の問題に対処しやすくする

AWS IoTとサーバーレスアプリケーション

とある案件

  • デバイスに対して、外部APIから状態を変化させる
  • 多数のデバイスの状態から、状態が変化したものに対して特定のアクションを起こす
  • デバイスの状態を変化を取得し続ける
  • その日の終了後のデバイスの状態を表したデータを加工し、可視化する

AWS IoT

  • インターネットに接続したデバイスとAWSのサービスをセキュアに通信させる仕組みを提供
  • デバイスへの指令、デバイスからのデータを受け取り、AWSのサービスへ橋渡しを行う

モノ(Thing)

  • 特定のデバイスまたは論理エンティティを表す
  • 物理的なデバイスやセンサー (電球や壁のスイッチなど) は、モノとして扱う
  • AWS IoT から発効された証明書を内包し、 AWS IoT とセキュアに通信する

Device Shadow

  • AWS IoT 上のデバイスの状態を表す
  • デバイスへの指令の送信、デバイスからの結果の受信などを仮想的に行う仕組みを提供

トピック

  • AWS IoT のメッセージの送受信を可能にするパブリッシュ/サブスクライブブローカーサービス
  • AWS IoT と通信するとき、クライアントは Sensor/temp/room1 のようなトピック宛てにメッセージを送信

AWS IoT ルール

  • AWS IoT に接続されているモノからのデータをルーティングするための仕組み
  • SQL 構文でMQTT トピックで受け取ったメッセージをフィルタ処理し、別の場所にデータを送る
  • データを DynamoDB テーブルに挿入する、 AWS Lambda を呼び出すなどのアクションを指定できる

開発と運用の設計

AWS サーバーレスアプリケーションモデル (AWS SAM) の使用

  • サーバーレスアプリケーションに適した書式でAWS CloudFromationのStackを出力してくれる
  • Swaggerの定義を元にAmazon API Gatewayの設定が行える
  • API仕様と現実の乖離を防ぐ
  • CloudFormationテンプレートと同様で、組み込み関数などを使って、別のリージョンや別のAWSアカウントにアプリケーションのデプロイを行えるようにする

CloudWatch Events + AWS Lambda の組み合わせの例

  TimerEventFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: timer-event-function
      CodeUri: src/handlers/timer_event
      Handler: index.handler
      Runtime: python3.7
      Policies:
        - arn:aws:iam::aws:policy/AmazonS3FullAccess
      Events:
        Schedule:
          Type: Schedule
          Properties:
            Schedule: cron(0 17 * * ? *)

AWS IoT Core + Rule + Topic の組み合わせの例

  PowerOnFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: power-on
      CodeUri: src/handlers/power
      Handler: index.handler
      Runtime: python3.7
      Policies:
        - arn:aws:iam::aws:policy/AmazonDynamoDBFullAccess
      Events:
        PowerOnRule:
          Type: IoTRule
          Properties:
            AwsIotSqlVersion: 2016-03-23
            Sql: |
              SELECT *
              FROM '$aws/things/+/shadow/update'
              WHERE state.reported.power = true

CIとの組み合わせ

  • AWS SAM でのCIツールを組み合わせて、ユニットテスト → デプロイ → e2eテスト までを一貫して行う
  • CIツールの Approval などの機能を利用し、本番環境適用などを一連のワークフローで行えるようにする

ログ・監視について

  • マイクロサービス毎にログが出力されるため、ログの量は増える
  • デバイス数などが多いアプリケーションなどはもっと増える
  • ログは Amazon CloudWatch Logs に保存
    • Amazon CloudWatch Logs Insights
    • Amazon Athena

Subscription Filter と AWS Lambda の組みわせの例

  PowerOnSubscriptionFilter:
    Type: AWS::Logs::SubscriptionFilter
    Properties:
      RoleArn: !GetAtt LogSubscriptionFilterRole.Arn
      LogGroupName: !Sub /aws/lambda/power-on
      FilterPattern: ?ERROR ?REPORT
      DestinationArn: !GetAtt AlertMessageStream.Arn
  AlertMessageFunction:
    Type: AWS::Serverless::Function
    Properties:
      FunctionName: alert-message
      CodeUri: src/handlers/alert_message
      Handler: index.handler
      Runtime: python3.7
      Policies:
        - arn:aws:iam::aws:policy/AmazonSSMReadOnlyAccess
        - arn:aws:iam::aws:policy/AmazonSNSFullAccess
      Events:
        ErrorIngesterStream:
          Type: Kinesis
          Properties:
            Stream: !GetAtt AlertMessageStream.Arn
            StartingPosition: TRIM_HORIZON
            BatchSize: 5

まとめ

  • サービスが日々アップデートされるので、情報は常に追う必要がある
  • ツールを組み合わせて、開発・運用周りを整備することで、サービスの速度に対応させる
  • サービスの組み合わせや利用シーンによっては課金額が上がっていくため、適切なサイクルでアーキテクチャを見直す

参考文献

宣伝

【3/26(火) 福岡】AWS新発表「Well-Architected Tool」の使い方セミナー<コスト最適化編>を開催します

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.