Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
AWS IoTを活用したサーバーレスアプリケーションの構築
Search
Takaaki Tanaka
March 15, 2019
Technology
0
1.1k
AWS IoTを活用したサーバーレスアプリケーションの構築
ITアイランドセミナー in 姫島2019 で話してきました
https://connpass.com/event/115052/
Takaaki Tanaka
March 15, 2019
Tweet
Share
More Decks by Takaaki Tanaka
See All by Takaaki Tanaka
Zenn のウラガワ ~エンジニアのアウトプットを支える環境で Google Cloud が採用されているワケ~ #burikaigi #burikaigi_h
kongmingstrap
22
8.1k
AWS re:Invent 2024 ふりかえり
kongmingstrap
0
250
製造の課題に立ち向かう Manufacturing Data Engine と Manufacturing Connect の ご紹介
kongmingstrap
0
920
Tellus の衛星データを見てみよう #mf_fukuoka
kongmingstrap
0
730
JAWS-UG 福岡 #16 re:Invent 現地に行った人のお話 #jawsugfuk #jawsug
kongmingstrap
0
610
AppMod の開発のイマを知るために現地に潜入した私が見たものは・・・? #GoogleCloudNext
kongmingstrap
0
650
Kong Gateway から読みとく、 API統合・API連携サービスの最新情報 #devio2023
kongmingstrap
0
1.9k
Cloud Run に憧れて Google Cloud を推進している話 / CX事業本部で使われている技術
kongmingstrap
0
290
AWS / Google Cloud / Azure それぞれの推しサービス.pdf
kongmingstrap
1
1.5k
Other Decks in Technology
See All in Technology
VS CodeとGitHub Copilotで爆速開発!アップデートの波に乗るおさらい会 / Rapid Development with VS Code and GitHub Copilot: Catch the Latest Wave
yamachu
2
190
AWS CDKの仕組み / how-aws-cdk-works
gotok365
8
300
アクセスピークを制するオートスケール再設計: 障害を乗り越えKEDAで実現したリソース管理の最適化
myamashii
1
140
FOSS4G 2025 KANSAI QGISで点群データをいろいろしてみた
kou_kita
0
410
〜『世界中の家族のこころのインフラ』を目指して”次の10年”へ〜 SREが導いたグローバルサービスの信頼性向上戦略とその舞台裏 / Towards the Next Decade: Enhancing Global Service Reliability
kohbis
2
370
Getting to Know Your Legacy (System) with AI-Driven Software Archeology (WeAreDevelopers World Congress 2025)
feststelltaste
1
160
Lakebaseを使ったAIエージェントを実装してみる
kameitomohiro
0
160
What’s new in Android development tools
yanzm
0
460
マネジメントって難しい、けどおもしろい / Management is tough, but fun! #em_findy
ar_tama
7
1.2k
敢えて生成AIを使わないマネジメント業務
kzkmaeda
2
470
Coinbase™®️ USA Contact Numbers: Complete 2025 Support Guide
officialcoinbasehelpcenter
0
460
Delta airlines®️ USA Contact Numbers: Complete 2025 Support Guide
airtravelguide
0
340
Featured
See All Featured
[RailsConf 2023] Rails as a piece of cake
palkan
55
5.7k
Building a Modern Day E-commerce SEO Strategy
aleyda
42
7.4k
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
How STYLIGHT went responsive
nonsquared
100
5.6k
Principles of Awesome APIs and How to Build Them.
keavy
126
17k
What's in a price? How to price your products and services
michaelherold
246
12k
Statistics for Hackers
jakevdp
799
220k
A Modern Web Designer's Workflow
chriscoyier
695
190k
The Illustrated Children's Guide to Kubernetes
chrisshort
48
50k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Navigating Team Friction
lara
187
15k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
281
13k
Transcript
ۚ ITアイランドセミナー in 姫島2019 "84*P5Λ׆༻ͨ͠ αʔόʔϨεΞϓϦέʔγϣϯͷߏங
⾃自⼰己紹介 wΫϥεϝιουגࣜձࣾ wԬΦϑΟεॴଐ wϞόΠϧΞϓϦαʔϏε෦ wϞόΠϧΞϓϦΤϯδχΞ wαʔόʔαΠυΞϓϦΤϯδχΞ wαʔόʔϨε։ൃ෦ wΞϓϦέʔγϣϯΤϯδχΞ
ాத໌ @kongmingtrap
クラスメソッド = ブログの会社 https://dev.classmethod.jp/remote-work/it-island-himeshima-day1/
今回の議題 • サーバーレスアプリケーションとは • AWS IoTとサーバーレスアプリケーション • 開発と運⽤用の設計
サーバーレスアプリケーションとは
広義でのサーバーレスアプリケーション https://aws.amazon.com/jp/lambda/serverless-architectures-learn-more/ 開発者・運⽤用者にとって、 インフラストラクチャの管理理が不不要な サービス群(マネージドサービス)で 構成したアプリケーション
サーバーレスのメリット • サーバーの管理理が不不要 • 柔軟性のあるスケーリング • 価値に対する⽀支払い •
⾼高可⽤用性の⾃自動化 https://aws.amazon.com/jp/serverless/
サーバーレスアプリケーションを構成するためのサービス(⼀一部) • 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
AWS Lambda • サーバーのプロビジョニング、スケーリングや 管理理が不不要 • 開発者はサーバーやランタイムの管理理、操作に 煩わされず、コードに集中することができる
• 利利⽤用できる⾔言語が豊富 • Ruby / Node.js / Python / Java / Go / C# / PowerShell • Custom Runtimesを利利⽤用すれば、任意の⾔言語を 動作させることが可能 https://aws.amazon.com/jp/lambda/
Amazon API Gateway • 独⾃自の REST および WebSocket
API を作成、 公開、保守、モニタリング、保護できる • 独⾃自のクライアントアプリケーション (アプリ) で使⽤用するための API を作成できる https://aws.amazon.com/jp/api-gateway/
Amazon Kinesis • あらゆる規模のストリーミングデータをコスト 効率良く処理理するための主要機能を提供 • ストリーミングデータをリアルタイムで取得、 バッファ、処理理するため、通常は数時間から数
⽇日かかるインサイトの⽣生成を数秒から数分で完 了了 • インフラストラクチャを管理理する必要なく、ス トリーミングアプリケーションを実⾏行行できる https://aws.amazon.com/jp/kinesis/
Amazon CloudWatch • 主要なメトリクスとログのモニタリング、アプ リケーションおよびインフラストラクチャスタッ クの可視化、アラームの作成、およびメトリク スとログの関連付けによって、パフォーマンス の問題の根本的原因を把握
• アラームの設定や⾃自動化されたアクションを起 こす • ログをすばやく発⾒見見、分析、視覚化することで 運⽤用上の問題に対処しやすくする https://aws.amazon.com/jp/cloudwatch/
サービスを組み合わせてアプリケーションを構築 https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ WhatIsCloudWatchEvents.html • 前述したサービスを組みわせて、機能を実装していく AM 2:00 に実⾏行行
AWS IoTとサーバーレスアプリケーション
とある案件 • デバイスに対して、外部APIから状態を変化させる • 多数のデバイスの状態から、状態が変化したものに対して特 定のアクションを起こす • デバイスの状態を変化を取得し続ける
• その⽇日の終了了後のデバイスの状態を表したデータを加⼯工し、 可視化する
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
モノ(Thing) • 特定のデバイスまたは論理理エンティティを表す • 物理理的なデバイスやセンサー (電球や壁のスイッ チなど) は、モノとして扱う
• AWS IoT から発効された証明書を内包し、 AWS IoT とセキュアに通信する https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-thing-management.html
Device Shadow • AWS IoT 上のデバイスの状態を表す • デバイスへの指令の送信、デバイスからの結果
の受信などを仮想的に⾏行行う仕組みを提供 • desired -> デバイスに対する指令 • reported -> デバイスの状態 • delta -> デバイスの状態と指令の差分 https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-device-shadows.html
Device Shadow
Device Shadow \ TUBUF\ SFQPSUFE\ QPXFS0'' ^ ^
^
Device Shadow \ TUBUF\ SFQPSUFE\ QPXFS0'' ^ ^
^ Powerを ONにして
Device Shadow \ TUBUF\ SFQPSUFE\ QPXFS0'' ^ ^
^ Powerを ONにして \ TUBUF\ lEFTJSFE\ QPXFS0/ ^ ^ ^
Device Shadow \ TUBUF\ lEFTJSFE\ QPXFS0/ ^
SFQPSUFE\ QPXFS0'' ^ ^ ^ Powerを ONにして \ TUBUF\ lEFTJSFE\ QPXFS0/ ^ ^ ^ desired を受け付け
Device Shadow \ TUBUF\ lEFTJSFE\ QPXFS0/ ^
SFQPSUFE\ QPXFS0'' ^ lEFMUBz\ QPXFS0/ ^ ^ ^ Powerを ONにして \ TUBUF\ lEFTJSFE\ QPXFS0/ ^ ^ ^ desired と reported の差分 delta が発⽣生
Device Shadow \ TUBUF\ lEFTJSFE\ QPXFS0/ ^
SFQPSUFE\ QPXFS0'' ^ lEFMUBz\ QPXFS0/ ^ ^ ^ Powerを ONにして \ TUBUF\ lEFTJSFE\ QPXFS0/ ^ ^ ^ deltaがあるな… 受け付けて結果を 返そう desired と reported の差分 delta が発⽣生
Device Shadow \ TUBUF\ lEFTJSFE\ QPXFS0/ ^
SFQPSUFE\ QPXFS0'' ^ lEFMUBz\ QPXFS0/ ^ ^ ^ Powerを ONにして \ TUBUF\ lEFTJSFE\ QPXFS0/ ^ ^ ^ \ TUBUF\ lSFQPSUFE\ QPXFS0/ ^ ^ ^
Device Shadow \ TUBUF\ SFQPSUFE\ QPXFS0/ ^ ^
^ Powerを ONにして \ TUBUF\ lEFTJSFE\ QPXFS0/ ^ ^ ^ \ TUBUF\ lSFQPSUFE\ QPXFS0/ ^ ^ ^
Device Shadow \ TUBUF\ SFQPSUFE\ QPXFS0/ ^ ^
^ Powerを ONにして \ TUBUF\ lEFTJSFE\ QPXFS0/ ^ ^ ^ \ TUBUF\ lSFQPSUFE\ QPXFS0/ ^ ^ ^ デバイスへの指令の送信、 デバイスからの結果の受信などを 仮想的に⾏行行う
トピック • AWS IoT のメッセージの送受信を可能にする パブリッシュ/サブスクライブブローカーサー ビス •
AWS IoT と通信するとき、クライアントは Sensor/temp/room1 のようなトピック宛て にメッセージを送信 https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/topics.html
AWS IoT ルール • AWS IoT に接続されているモノからのデータ をルーティングするための仕組み
• SQL 構⽂文で MQTT トピックで受け取ったメッ セージをフィルタ処理理し、別の場所にデータを 送る • データを DynamoDB テーブルに挿⼊入する、 AWS Lambda を呼び出すなどのアクションを 指定できる https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-create-rule.html
AWS IoT ルール
AWS IoT ルール SELECT * FROM '$aws/things/+/shadow/update' WHERE
state.reported.power = True
AWS IoT ルール \ TUBUF\ SFQPSUFE\ QPXFSl0/ ^
^ ^ SELECT * FROM '$aws/things/+/shadow/update' WHERE state.reported.power = True 指定したトピックへ データを送信
AWS IoT ルール \ TUBUF\ SFQPSUFE\ QPXFSl0/ ^
^ ^ SELECT * FROM '$aws/things/+/shadow/update' WHERE state.reported.power = True ルールにマッチ
AWS IoT ルール \ TUBUF\ SFQPSUFE\ QPXFSl0/ ^
^ ^ SELECT * FROM '$aws/things/+/shadow/update' WHERE state.reported.power = True ルールに設定された アクションを実⾏行行する
AWS IoT ルール SELECT * FROM '$aws/things/+/shadow/update/documents'
AWS IoT ルール SELECT * FROM '$aws/things/+/shadow/update/documents'
AWS IoT ルール SELECT * FROM '$aws/things/+/shadow/update/documents' データを格納するアクショ
ンを紐づけた別のルール
AWS IoT ルール SELECT * FROM '$aws/things/+/shadow/update/documents' データを格納するアクショ
ンを紐づけた別のルール 複数のトピックとルールを組み合わ せて、アクションを設定していく
参考 (AWS Black Belt) https://www.slideshare.net/AmazonWebServicesJapan/20180327-aws-black-belt-online- seminar-aws-iot 20180327 AWS
Black Belt Online Seminar AWS IoT におけるデバイス管理理
開発と運⽤用の設計
開発と運⽤用の並⾏行行 • 機能開発と運⽤用は開発者が並⾏行行して⾏行行う場合が多い • 開発チーム・運⽤用チームなどの役割分担をしない • スパイクアクセスの対応など、マネージドサービスに寄せて いる部分の対応は不不要だが、その結果を踏まえて機能を考慮
する場合はある • マイクロサービスを組み合わせる上での開発・運⽤用の設計が 肝要
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
AWS SAM sam.yml AWSアカウントB AWSアカウントA AWSアカウントC
AWS SAM sam.yml AWSアカウントB AWSアカウントA AWSアカウントC AWSアカウントBへ コマンド実⾏行行
AWS SAM sam.yml AWSアカウントB AWSアカウントA AWSアカウントC CloudFormationの Stackに変換
AWS SAM sam.yml AWSアカウントB AWSアカウントA AWSアカウントC AWSのリソースを展開
AWS SAM sam.yml AWSアカウントB AWSアカウントA AWSアカウントC AWSアカウントA へコマンド実⾏行行
AWS SAM sam.yml AWSアカウントB AWSアカウントA AWSアカウントC CloudFormationの Stackに変換
AWS SAM sam.yml AWSアカウントB AWSアカウントA AWSアカウントC
AWS SAM sam.yml AWSアカウントB AWSアカウントA AWSアカウントC
AWS SAM の記法の例例 • Amazon CloudWatch Events +
AWS Lambdaの例例 AM 2:00 に実⾏行行
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 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を紐づける イベントの設定
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 SAM の記法の例例 SELECT * FROM '$aws/things/+/shadow/update' WHERE
state.reported.power = True • トピック+ルールの例例
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
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
CIとの組み合わせ • AWS SAM でのCIツールを組み合わせて、ユニットテスト → デプロイ →
e2eテスト までを⼀一貫して⾏行行う • CIツールの Approval などの機能を利利⽤用し、本番環境適⽤用など を⼀一連のワークフローで⾏行行えるようにする sam.yml
CIとの組み合わせ https://circleci.com/docs/2.0/workflows/ • ワークフローの例例
CIとの組み合わせ https://circleci.com/docs/2.0/workflows/ ユニットテスト を⾏行行う • ワークフローの例例
CIとの組み合わせ https://circleci.com/docs/2.0/workflows/ ユニットテスト を⾏行行う 開発環境へのデプ ロイとe2eテスト を⾏行行う •
ワークフローの例例
CIとの組み合わせ https://circleci.com/docs/2.0/workflows/ ユニットテスト を⾏行行う 開発環境へのデプ ロイとe2eテスト を⾏行行う 本番環境への適⽤用
を⾏行行う • ワークフローの例例
CIとの組み合わせ https://circleci.com/docs/2.0/workflows/ 本番適⽤用の実⾏行行は Approvalで待たせる • ワークフローの例例
CIとの組み合わせ https://circleci.com/docs/2.0/workflows/ • ワークフローの例例
ログ・監視について • マイクロサービス毎にログが出⼒力力されるため、ログの量量は増 える • デバイス数などが多いアプリケーションなどはもっと増える • ログは
Amazon CloudWatch Logs に保存 • Amazon CloudWatch Logs Insights • Amazon Athena
アラートの通知 • アラートメッセージをSlackに流すことで、メッセージ通知を 起点に調査できるようにする
ログ出⼒力力 • 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
ログ出⼒力力 • CloudWatch Logs サブスクリプションフィルターで、特定の ⽂文字列列(ERROR等)を検出した時に、ログ出⼒力力させる https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/logs/SubscriptionFilters.html
ログ出⼒力力 PowerOnSubscriptionFilter: Type: AWS::Logs::SubscriptionFilter Properties: RoleArn: !GetAtt LogSubscriptionFilterRole.Arn
LogGroupName: !Sub /aws/lambda/power-on FilterPattern: ?ERROR ?REPORT DestinationArn: !GetAtt AlertMessageStream.Arn
ログ出⼒力力 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
ログ出⼒力力 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
ログ出⼒力力
監視 • Datadog で利利⽤用しているサービスのメトリクスを監視し、異異 常値を検知したら Slack に通知させるようにする https://docs.datadoghq.com/integrations/amazon_web_services/?tab=allpermissions
監視 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 …
監視
まとめ
まとめ • サービスが⽇日々アップデートされるので、情報は常に追う必 要がある • ツールを組み合わせて、開発・運⽤用周りを整備することで、 サービスの速度に対応させる •
サービスの組み合わせや利利⽤用シーンによっては課⾦金金額が上がっ ていくため、適切なサイクルでアーキテクチャを⾒見見直す
参考⽂文献 https://d1.awsstatic.com/whitepapers/architecture/AWS-Serverless-Applications-Lens.pdf • Well-Architected レンズ サーバーレスアプリケーション • Well-Architected
レンズ IoT (モノのインターネット) • 20180327 AWS Black Belt Online Seminar AWS IoT における デバイス管理理