ITアイランドセミナー in 姫島2019 で AWS IoT を利用したアプリケーションの構築について登壇してきました #姫島ITアイランド
はじめに
こんにちは、モバイルアプリサービス部の田中孝明です。
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
まとめ
- サービスが日々アップデートされるので、情報は常に追う必要がある
- ツールを組み合わせて、開発・運用周りを整備することで、サービスの速度に対応させる
- サービスの組み合わせや利用シーンによっては課金額が上がっていくため、適切なサイクルでアーキテクチャを見直す
参考文献
- 20180327 AWS Black Belt Online Seminar AWS IoT におけるデバイス管理
- Well-Architected レンズ サーバーレスアプリケーション
- Well-Architected レンズ IoT (モノのインターネット)
宣伝
【3/26(火) 福岡】AWS新発表「Well-Architected Tool」の使い方セミナー<コスト最適化編>を開催します