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

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

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

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

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

808ce3d41280c085f8bdc27dce7ea8fb?s=128

Takaaki Tanaka

March 15, 2019
Tweet

Transcript

  1.  ۚ  ITアイランドセミナー in 姫島2019 "84*P5Λ׆༻ͨ͠ αʔόʔϨεΞϓϦέʔγϣϯͷߏங

  2. ⾃自⼰己紹介   wΫϥεϝιουגࣜձࣾ w෱ԬΦϑΟεॴଐ wϞόΠϧΞϓϦαʔϏε෦ wϞόΠϧΞϓϦΤϯδχΞ wαʔόʔαΠυΞϓϦΤϯδχΞ wαʔόʔϨε։ൃ෦ wΞϓϦέʔγϣϯΤϯδχΞ

    ాத޹໌ @kongmingtrap
  3. クラスメソッド = ブログの会社   https://dev.classmethod.jp/remote-work/it-island-himeshima-day1/

  4. 今回の議題   • サーバーレスアプリケーションとは • AWS IoTとサーバーレスアプリケーション • 開発と運⽤用の設計

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

  6. 広義でのサーバーレスアプリケーション   https://aws.amazon.com/jp/lambda/serverless-architectures-learn-more/ 開発者・運⽤用者にとって、 インフラストラクチャの管理理が不不要な サービス群(マネージドサービス)で 構成したアプリケーション

  7. サーバーレスのメリット   • サーバーの管理理が不不要 • 柔軟性のあるスケーリング • 価値に対する⽀支払い •

    ⾼高可⽤用性の⾃自動化 https://aws.amazon.com/jp/serverless/
  8. サーバーレスアプリケーションを構成するためのサービス(⼀一部)   • 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
  9. AWS Lambda   • サーバーのプロビジョニング、スケーリングや 管理理が不不要 • 開発者はサーバーやランタイムの管理理、操作に 煩わされず、コードに集中することができる

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

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

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

    • アラームの設定や⾃自動化されたアクションを起 こす • ログをすばやく発⾒見見、分析、視覚化することで 運⽤用上の問題に対処しやすくする https://aws.amazon.com/jp/cloudwatch/
  13. サービスを組み合わせてアプリケーションを構築   https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ WhatIsCloudWatchEvents.html • 前述したサービスを組みわせて、機能を実装していく AM 2:00 に実⾏行行

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

  15. とある案件   • デバイスに対して、外部APIから状態を変化させる • 多数のデバイスの状態から、状態が変化したものに対して特 定のアクションを起こす • デバイスの状態を変化を取得し続ける

    • その⽇日の終了了後のデバイスの状態を表したデータを加⼯工し、 可視化する
  16. 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
  17. モノ(Thing)   • 特定のデバイスまたは論理理エンティティを表す • 物理理的なデバイスやセンサー (電球や壁のスイッ チなど) は、モノとして扱う

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

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

  20. Device Shadow   \ TUBUF\ SFQPSUFE\ QPXFS0'' ^ ^

    ^
  21. Device Shadow   \ TUBUF\ SFQPSUFE\ QPXFS0'' ^ ^

    ^ Powerを ONにして
  22. Device Shadow   \ TUBUF\ SFQPSUFE\ QPXFS0'' ^ ^

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

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

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

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

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

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

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

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

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

  32. AWS IoT ルール   SELECT * FROM '$aws/things/+/shadow/update' WHERE

    state.reported.power = True
  33. AWS IoT ルール   \ TUBUF\ SFQPSUFE\ QPXFSl0/ ^

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

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

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

  37. AWS IoT ルール   SELECT * FROM '$aws/things/+/shadow/update/documents'

  38. AWS IoT ルール   SELECT * FROM '$aws/things/+/shadow/update/documents' データを格納するアクショ

    ンを紐づけた別のルール
  39. AWS IoT ルール   SELECT * FROM '$aws/things/+/shadow/update/documents' データを格納するアクショ

    ンを紐づけた別のルール 複数のトピックとルールを組み合わ せて、アクションを設定していく
  40. 参考 (AWS Black Belt)   https://www.slideshare.net/AmazonWebServicesJapan/20180327-aws-black-belt-online- seminar-aws-iot 20180327 AWS

    Black Belt Online Seminar AWS IoT におけるデバイス管理理
  41. 開発と運⽤用の設計

  42. 開発と運⽤用の並⾏行行   • 機能開発と運⽤用は開発者が並⾏行行して⾏行行う場合が多い • 開発チーム・運⽤用チームなどの役割分担をしない • スパイクアクセスの対応など、マネージドサービスに寄せて いる部分の対応は不不要だが、その結果を踏まえて機能を考慮

    する場合はある • マイクロサービスを組み合わせる上での開発・運⽤用の設計が 肝要
  43. 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
  44. AWS SAM   sam.yml AWSアカウントB AWSアカウントA AWSアカウントC

  45. AWS SAM   sam.yml AWSアカウントB AWSアカウントA AWSアカウントC AWSアカウントBへ コマンド実⾏行行

  46. AWS SAM   sam.yml AWSアカウントB AWSアカウントA AWSアカウントC CloudFormationの Stackに変換

  47. AWS SAM   sam.yml AWSアカウントB AWSアカウントA AWSアカウントC AWSのリソースを展開

  48. AWS SAM   sam.yml AWSアカウントB AWSアカウントA AWSアカウントC AWSアカウントA へコマンド実⾏行行

  49. AWS SAM   sam.yml AWSアカウントB AWSアカウントA AWSアカウントC CloudFormationの Stackに変換

  50. AWS SAM   sam.yml AWSアカウントB AWSアカウントA AWSアカウントC

  51. AWS SAM   sam.yml AWSアカウントB AWSアカウントA AWSアカウントC

  52. AWS SAM の記法の例例   • Amazon CloudWatch Events +

    AWS Lambdaの例例 AM 2:00 に実⾏行行
  53. 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
  54. 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を紐づける イベントの設定
  55. 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
  56. AWS SAM の記法の例例   SELECT * FROM '$aws/things/+/shadow/update' WHERE

    state.reported.power = True • トピック+ルールの例例
  57. 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
  58. 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
  59. CIとの組み合わせ   • AWS SAM でのCIツールを組み合わせて、ユニットテスト  → デプロイ →

    e2eテスト までを⼀一貫して⾏行行う • CIツールの Approval などの機能を利利⽤用し、本番環境適⽤用など を⼀一連のワークフローで⾏行行えるようにする sam.yml
  60. CIとの組み合わせ   https://circleci.com/docs/2.0/workflows/ • ワークフローの例例

  61. CIとの組み合わせ   https://circleci.com/docs/2.0/workflows/ ユニットテスト を⾏行行う • ワークフローの例例

  62. CIとの組み合わせ   https://circleci.com/docs/2.0/workflows/ ユニットテスト を⾏行行う 開発環境へのデプ ロイとe2eテスト を⾏行行う •

    ワークフローの例例
  63. CIとの組み合わせ   https://circleci.com/docs/2.0/workflows/ ユニットテスト を⾏行行う 開発環境へのデプ ロイとe2eテスト を⾏行行う 本番環境への適⽤用

    を⾏行行う • ワークフローの例例
  64. CIとの組み合わせ   https://circleci.com/docs/2.0/workflows/ 本番適⽤用の実⾏行行は Approvalで待たせる • ワークフローの例例

  65. CIとの組み合わせ   https://circleci.com/docs/2.0/workflows/ • ワークフローの例例

  66. ログ・監視について   • マイクロサービス毎にログが出⼒力力されるため、ログの量量は増 える • デバイス数などが多いアプリケーションなどはもっと増える • ログは

    Amazon CloudWatch Logs に保存 • Amazon CloudWatch Logs Insights • Amazon Athena
  67. アラートの通知   • アラートメッセージをSlackに流すことで、メッセージ通知を 起点に調査できるようにする

  68. ログ出⼒力力   • 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
  69. ログ出⼒力力   • CloudWatch Logs サブスクリプションフィルターで、特定の ⽂文字列列(ERROR等)を検出した時に、ログ出⼒力力させる https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/SubscriptionFilters.html

  70. ログ出⼒力力   PowerOnSubscriptionFilter: Type: AWS::Logs::SubscriptionFilter Properties: RoleArn: !GetAtt LogSubscriptionFilterRole.Arn

    LogGroupName: !Sub /aws/lambda/power-on FilterPattern: ?ERROR ?REPORT DestinationArn: !GetAtt AlertMessageStream.Arn
  71. ログ出⼒力力   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
  72. ログ出⼒力力   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
  73. ログ出⼒力力  

  74. 監視   • Datadog で利利⽤用しているサービスのメトリクスを監視し、異異 常値を検知したら Slack に通知させるようにする https://docs.datadoghq.com/integrations/amazon_web_services/?tab=allpermissions

  75. 監視   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 …
  76. 監視  

  77. まとめ

  78. まとめ   • サービスが⽇日々アップデートされるので、情報は常に追う必 要がある • ツールを組み合わせて、開発・運⽤用周りを整備することで、 サービスの速度に対応させる •

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

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