Upgrade to Pro — share decks privately, control downloads, hide ads and more …

AWS IoTを活用したサーバーレスアプリケーションの構築

AWS IoTを活用したサーバーレスアプリケーションの構築

ITアイランドセミナー in 姫島2019 で話してきました

https://connpass.com/event/115052/

Takaaki Tanaka

March 15, 2019
Tweet

More Decks by Takaaki Tanaka

Other Decks in Technology

Transcript

  1. サーバーレスアプリケーションを構成するためのサービス(⼀一部)   • AWS Lambda • Amazon API Gateway

    • Amazon Kinesis • Amazon CloudWatch • Amazon S3 • Amazon DynamoDB • AWS Step Functions • Amazon Simple Queue Service • Amazon Athena • AWS Glue …etc
  2. AWS Lambda   • サーバーのプロビジョニング、スケーリングや 管理理が不不要 • 開発者はサーバーやランタイムの管理理、操作に 煩わされず、コードに集中することができる

    • 利利⽤用できる⾔言語が豊富 • Ruby / Node.js / Python / Java / Go / C# / PowerShell • Custom Runtimesを利利⽤用すれば、任意の⾔言語を 動作させることが可能 https://aws.amazon.com/jp/lambda/
  3. Amazon API Gateway   • 独⾃自の REST および WebSocket

    API を作成、 公開、保守、モニタリング、保護できる • 独⾃自のクライアントアプリケーション (アプリ) で使⽤用するための API を作成できる https://aws.amazon.com/jp/api-gateway/
  4. Amazon Kinesis   • あらゆる規模のストリーミングデータをコスト 効率良く処理理するための主要機能を提供 • ストリーミングデータをリアルタイムで取得、 バッファ、処理理するため、通常は数時間から数

    ⽇日かかるインサイトの⽣生成を数秒から数分で完 了了 • インフラストラクチャを管理理する必要なく、ス トリーミングアプリケーションを実⾏行行できる https://aws.amazon.com/jp/kinesis/
  5. Amazon CloudWatch   • 主要なメトリクスとログのモニタリング、アプ リケーションおよびインフラストラクチャスタッ クの可視化、アラームの作成、およびメトリク スとログの関連付けによって、パフォーマンス の問題の根本的原因を把握

    • アラームの設定や⾃自動化されたアクションを起 こす • ログをすばやく発⾒見見、分析、視覚化することで 運⽤用上の問題に対処しやすくする https://aws.amazon.com/jp/cloudwatch/
  6. AWS IoT   • インターネットに接続したデバイスとAWSの サービスをセキュアに通信させる仕組みを提供 • デバイスへの指令、デバイスからのデータを受 け取り、AWSのサービスへ橋渡しを⾏行行う

    • 関連するサービス • AWS IoT Core • AWS IoT Device Defender • AWS IoT Analytics https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/what-is-aws-iot.html
  7. モノ(Thing)   • 特定のデバイスまたは論理理エンティティを表す • 物理理的なデバイスやセンサー (電球や壁のスイッ チなど) は、モノとして扱う

    • AWS IoT から発効された証明書を内包し、 AWS IoT とセキュアに通信する https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-thing-management.html
  8. Device Shadow   • AWS IoT 上のデバイスの状態を表す • デバイスへの指令の送信、デバイスからの結果

    の受信などを仮想的に⾏行行う仕組みを提供 • desired -> デバイスに対する指令 • reported -> デバイスの状態 • delta -> デバイスの状態と指令の差分 https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-device-shadows.html
  9. Device Shadow   \ TUBUF\ SFQPSUFE\ QPXFS0'' ^ ^

    ^ Powerを ONにして \ TUBUF\ lEFTJSFE\ QPXFS0/ ^ ^ ^
  10. Device Shadow   \ TUBUF\
 lEFTJSFE\ QPXFS0/ ^ 

    SFQPSUFE\ QPXFS0'' ^ ^ ^ Powerを ONにして \ TUBUF\ lEFTJSFE\ QPXFS0/ ^ ^ ^ desired を受け付け
  11. Device Shadow   \ TUBUF\
 lEFTJSFE\ QPXFS0/ ^ 

    SFQPSUFE\ QPXFS0'' ^  lEFMUBz\ QPXFS0/ ^ ^ ^ Powerを ONにして \ TUBUF\ lEFTJSFE\ QPXFS0/ ^ ^ ^ desired と reported の差分 delta が発⽣生
  12. Device Shadow   \ TUBUF\
 lEFTJSFE\ QPXFS0/ ^ 

    SFQPSUFE\ QPXFS0'' ^  lEFMUBz\ QPXFS0/ ^ ^ ^ Powerを ONにして \ TUBUF\ lEFTJSFE\ QPXFS0/ ^ ^ ^ deltaがあるな… 受け付けて結果を 返そう desired と reported の差分 delta が発⽣生
  13. Device Shadow   \ TUBUF\
 lEFTJSFE\ QPXFS0/ ^ 

    SFQPSUFE\ QPXFS0'' ^  lEFMUBz\ QPXFS0/ ^ ^ ^ Powerを ONにして \ TUBUF\ lEFTJSFE\ QPXFS0/ ^ ^ ^ \ TUBUF\ lSFQPSUFE\ QPXFS0/ ^ ^ ^
  14. Device Shadow   \ TUBUF\ SFQPSUFE\ QPXFS0/ ^ ^

    ^ Powerを ONにして \ TUBUF\ lEFTJSFE\ QPXFS0/ ^ ^ ^ \ TUBUF\ lSFQPSUFE\ QPXFS0/ ^ ^ ^
  15. Device Shadow   \ TUBUF\ SFQPSUFE\ QPXFS0/ ^ ^

    ^ Powerを ONにして \ TUBUF\ lEFTJSFE\ QPXFS0/ ^ ^ ^ \ TUBUF\ lSFQPSUFE\ QPXFS0/ ^ ^ ^ デバイスへの指令の送信、 デバイスからの結果の受信などを 仮想的に⾏行行う
  16. トピック   • AWS IoT のメッセージの送受信を可能にする パブリッシュ/サブスクライブブローカーサー ビス •

    AWS IoT と通信するとき、クライアントは Sensor/temp/room1 のようなトピック宛て にメッセージを送信 https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/topics.html
  17. AWS IoT ルール   • AWS IoT に接続されているモノからのデータ をルーティングするための仕組み

    • SQL 構⽂文で MQTT トピックで受け取ったメッ セージをフィルタ処理理し、別の場所にデータを 送る • データを DynamoDB テーブルに挿⼊入する、 AWS Lambda を呼び出すなどのアクションを 指定できる https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-create-rule.html
  18. AWS IoT ルール   \ TUBUF\ SFQPSUFE\ QPXFSl0/ ^

    ^ ^ SELECT * FROM '$aws/things/+/shadow/update' WHERE state.reported.power = True 指定したトピックへ データを送信
  19. AWS IoT ルール   \ TUBUF\ SFQPSUFE\ QPXFSl0/ ^

    ^ ^ SELECT * FROM '$aws/things/+/shadow/update' WHERE state.reported.power = True ルールにマッチ
  20. AWS IoT ルール   \ TUBUF\ SFQPSUFE\ QPXFSl0/ ^

    ^ ^ SELECT * FROM '$aws/things/+/shadow/update' WHERE state.reported.power = True ルールに設定された アクションを実⾏行行する
  21. AWS IoT ルール   SELECT * FROM '$aws/things/+/shadow/update/documents' データを格納するアクショ

    ンを紐づけた別のルール 複数のトピックとルールを組み合わ せて、アクションを設定していく
  22. AWS サーバーレスアプリケーションモデル (AWS SAM) の使⽤用   • サーバーレスアプリケーションに適した書式で AWS

    CloudFromation の Stack を出⼒力力してくれる • Swaggerの定義を元に Amazon API Gateway の設定が⾏行行える • API仕様と実装の乖離を防ぐ • AWS CloudFormation テンプレートと同様で、組み込み関数 などが使える • 別のリージョンや別のAWSアカウントにアプリケーションの デプロイを⾏行行えるようにする https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/serverless_app.html
  23. AWS SAM の記法の例例   • Amazon CloudWatch Events +

    AWS Lambdaの例例 AM 2:00 に実⾏行行
  24. AWS SAM の記法の例例   • Amazon CloudWatch Events +

    AWS Lambdaの例例 AM 2:00 に実⾏行行 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 * * ? *) sam.yml
  25. AWS SAM の記法の例例   • Amazon CloudWatch Events +

    AWS Lambdaの例例 AM 2:00 に実⾏行行 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 * * ? *) sam.yml AWS Lambdaを紐づける イベントの設定
  26. AWS SAM の記法の例例   • Amazon CloudWatch Events +

    AWS Lambdaの例例 AM 2:00 に実⾏行行 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 * * ? *) sam.yml
  27. AWS SAM の記法の例例   SELECT * FROM '$aws/things/+/shadow/update' WHERE

    state.reported.power = True • トピック+ルールの例例
  28. AWS SAM の記法の例例   • トピック+ルールの例例 AM 2:00 に実⾏行行

    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 sam.yml
  29. AWS SAM の記法の例例   • トピック+ルールの例例 AM 2:00 に実⾏行行

    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 sam.yml
  30. CIとの組み合わせ   • AWS SAM でのCIツールを組み合わせて、ユニットテスト  → デプロイ →

    e2eテスト までを⼀一貫して⾏行行う • CIツールの Approval などの機能を利利⽤用し、本番環境適⽤用など を⼀一連のワークフローで⾏行行えるようにする sam.yml
  31. ログ出⼒力力   • AWS Lambda の Context オブジェクトには 流れを追いやすくするデータが⼊入っているの

    で、ログ出⼒力力の際に付加しておく • aws_request_id • log_group_name • log_stream_name https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/python-context-object.html
  32. ログ出⼒力力   PowerOnSubscriptionFilter: Type: AWS::Logs::SubscriptionFilter Properties: RoleArn: !GetAtt LogSubscriptionFilterRole.Arn

    LogGroupName: !Sub /aws/lambda/power-on FilterPattern: ?ERROR ?REPORT DestinationArn: !GetAtt AlertMessageStream.Arn
  33. ログ出⼒力力   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/AmazonSNSFullAccess Events: ErrorIngesterStream: Type: Kinesis Properties: Stream: !GetAtt AlertMessageStream.Arn StartingPosition: TRIM_HORIZON BatchSize: 5
  34. ログ出⼒力力   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/AmazonSNSFullAccess Events: ErrorIngesterStream: Type: Kinesis Properties: Stream: !GetAtt AlertMessageStream.Arn StartingPosition: TRIM_HORIZON BatchSize: 5
  35. 監視   resource "datadog_monitor" "states_executions_failed" { name = "[Step

    Functions] ExecutionsFailed 監視" type = "metric alert" query = "sum(last_5m):sum:aws.states.executions_failed.as_count() >= 1" notify_no_data = false renotify_interval = 10 notify_audit = false timeout_h = 0 evaluation_delay = 900 include_tags = false locked = false new_host_delay = 300 no_data_timeframe = 10 require_full_window = false …
  36. まとめ   • サービスが⽇日々アップデートされるので、情報は常に追う必 要がある • ツールを組み合わせて、開発・運⽤用周りを整備することで、 サービスの速度に対応させる •

    サービスの組み合わせや利利⽤用シーンによっては課⾦金金額が上がっ ていくため、適切なサイクルでアーキテクチャを⾒見見直す
  37. 参考⽂文献   https://d1.awsstatic.com/whitepapers/architecture/AWS-Serverless-Applications-Lens.pdf • Well-Architected レンズ サーバーレスアプリケーション • Well-Architected

    レンズ IoT (モノのインターネット) • 20180327 AWS Black Belt Online Seminar AWS IoT における デバイス管理理