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
19
7.4k
AWS re:Invent 2024 ふりかえり
kongmingstrap
0
190
製造の課題に立ち向かう Manufacturing Data Engine と Manufacturing Connect の ご紹介
kongmingstrap
0
750
Tellus の衛星データを見てみよう #mf_fukuoka
kongmingstrap
0
650
JAWS-UG 福岡 #16 re:Invent 現地に行った人のお話 #jawsugfuk #jawsug
kongmingstrap
0
540
AppMod の開発のイマを知るために現地に潜入した私が見たものは・・・? #GoogleCloudNext
kongmingstrap
0
580
Kong Gateway から読みとく、 API統合・API連携サービスの最新情報 #devio2023
kongmingstrap
0
1.7k
Cloud Run に憧れて Google Cloud を推進している話 / CX事業本部で使われている技術
kongmingstrap
0
250
AWS / Google Cloud / Azure それぞれの推しサービス.pdf
kongmingstrap
1
1.4k
Other Decks in Technology
See All in Technology
Developers Summit 2025 浅野卓也(13-B-7 LegalOn Technologies)
legalontechnologies
PRO
0
150
High Performance PHP
cmuench
0
140
第13回 Data-Centric AI勉強会, 画像認識におけるData-centric AI
ksaito_osx
0
360
SCSAから学ぶセキュリティ管理
masakamayama
0
140
Oracle Base Database Service 技術詳細
oracle4engineer
PRO
6
57k
組織貢献をするフリーランスエンジニアという生き方
n_takehata
1
1k
技術負債の「予兆検知」と「状況異変」のススメ / Technology Dept
i35_267
1
1k
Fintech SREの挑戦 PCI DSS対応をスマートにこなすインフラ戦略/Fintech SRE’s Challenge: Smart Infrastructure Strategies for PCI DSS Compliance
maaaato
0
450
Nekko Cloud、 これまでとこれから ~学生サークルが作る、 小さなクラウド
logica0419
2
730
室長と気ままに学ぶマイクロソフトのビジネスアプリケーションとビジネスプロセス
ryoheig0405
0
320
Datadog APM におけるトレース収集の流れ及び Retention Filters のはなし / datadog-apm-trace-retention-filters
k6s4i53rx
0
320
APIファーストで実現する運用性の高い IoT プラットフォーム: SORACOMのアプローチ
soracom
PRO
0
240
Featured
See All Featured
Chrome DevTools: State of the Union 2024 - Debugging React & Beyond
addyosmani
3
310
The Language of Interfaces
destraynor
156
24k
4 Signs Your Business is Dying
shpigford
182
22k
Understanding Cognitive Biases in Performance Measurement
bluesmoon
27
1.5k
Producing Creativity
orderedlist
PRO
343
39k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Building Applications with DynamoDB
mza
93
6.2k
Building Better People: How to give real-time feedback that sticks.
wjessup
366
19k
Bootstrapping a Software Product
garrettdimon
PRO
305
110k
The Invisible Side of Design
smashingmag
299
50k
Rebuilding a faster, lazier Slack
samanthasiow
79
8.8k
Unsuck your backbone
ammeep
669
57k
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 における デバイス管理理