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.2k
AWS re:Invent 2024 ふりかえり
kongmingstrap
0
280
製造の課題に立ち向かう Manufacturing Data Engine と Manufacturing Connect の ご紹介
kongmingstrap
0
990
Tellus の衛星データを見てみよう #mf_fukuoka
kongmingstrap
0
770
JAWS-UG 福岡 #16 re:Invent 現地に行った人のお話 #jawsugfuk #jawsug
kongmingstrap
0
620
AppMod の開発のイマを知るために現地に潜入した私が見たものは・・・? #GoogleCloudNext
kongmingstrap
0
670
Kong Gateway から読みとく、 API統合・API連携サービスの最新情報 #devio2023
kongmingstrap
0
1.9k
Cloud Run に憧れて Google Cloud を推進している話 / CX事業本部で使われている技術
kongmingstrap
0
300
AWS / Google Cloud / Azure それぞれの推しサービス.pdf
kongmingstrap
1
1.5k
Other Decks in Technology
See All in Technology
人と組織に偏重したEMへのアンチテーゼ──なぜ、EMに設計力が必要なのか/An antithesis to the overemphasis of people and organizations in EM
dskst
7
820
Grafana MCPサーバーによるAIエージェント経由でのGrafanaダッシュボード動的生成
hamadakoji
1
880
AWS環境のリソース調査を Claude Code で効率化 / aws investigate with cc devio2025
masahirokawahara
2
930
LLM翻訳ツールの開発と海外のお客様対応等への社内導入事例
gree_tech
PRO
0
400
「魔法少女まどか☆マギカ Magia Exedra」での負荷試験の実践と学び
gree_tech
PRO
0
410
退屈なことはDevinにやらせよう〜〜Devin APIを使ったVisual Regression Testの自動追加〜
kawamataryo
4
960
努力家なスクラムマスターが陥る「傍観者」という罠と乗り越えた先に信頼があった話 / 20250830 Takahiro Sasaki
shift_evolve
PRO
2
120
役割は変わっても、変わらないもの 〜スクラムマスターからEMへの転身で学んだ信頼構築の本質〜 / How to build trust
shinop
0
150
絶対に失敗できないキャンペーンページの高速かつ安全な開発、WINTICKET × microCMS の開発事例
microcms
0
350
生成AI時代のデータ基盤
shibuiwilliam
1
1.2k
つくって納得、つかって実感! 大規模言語モデルことはじめ
recruitengineers
PRO
31
11k
制約理論(ToC)入門
recruitengineers
PRO
8
3.6k
Featured
See All Featured
Unsuck your backbone
ammeep
671
58k
Practical Orchestrator
shlominoach
190
11k
Building a Scalable Design System with Sketch
lauravandoore
462
33k
Optimising Largest Contentful Paint
csswizardry
37
3.4k
Documentation Writing (for coders)
carmenintech
73
5k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
29
1.9k
Done Done
chrislema
185
16k
The Cult of Friendly URLs
andyhume
79
6.6k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
44
2.5k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
33
2.4k
RailsConf 2023
tenderlove
30
1.2k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.4k
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 における デバイス管理理