Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

サーバーレスのメリット • サーバーの管理理が不不要 • 柔軟性のあるスケーリング • 価値に対する⽀支払い • ⾼高可⽤用性の⾃自動化 https://aws.amazon.com/jp/serverless/

Slide 8

Slide 8 text

サーバーレスアプリケーションを構成するためのサービス(⼀一部) • 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

Slide 9

Slide 9 text

AWS Lambda • サーバーのプロビジョニング、スケーリングや 管理理が不不要 • 開発者はサーバーやランタイムの管理理、操作に 煩わされず、コードに集中することができる • 利利⽤用できる⾔言語が豊富 • Ruby / Node.js / Python / Java / Go / C# / PowerShell • Custom Runtimesを利利⽤用すれば、任意の⾔言語を 動作させることが可能 https://aws.amazon.com/jp/lambda/

Slide 10

Slide 10 text

Amazon API Gateway • 独⾃自の REST および WebSocket API を作成、 公開、保守、モニタリング、保護できる • 独⾃自のクライアントアプリケーション (アプリ) で使⽤用するための API を作成できる https://aws.amazon.com/jp/api-gateway/

Slide 11

Slide 11 text

Amazon Kinesis • あらゆる規模のストリーミングデータをコスト 効率良く処理理するための主要機能を提供 • ストリーミングデータをリアルタイムで取得、 バッファ、処理理するため、通常は数時間から数 ⽇日かかるインサイトの⽣生成を数秒から数分で完 了了 • インフラストラクチャを管理理する必要なく、ス トリーミングアプリケーションを実⾏行行できる https://aws.amazon.com/jp/kinesis/

Slide 12

Slide 12 text

Amazon CloudWatch • 主要なメトリクスとログのモニタリング、アプ リケーションおよびインフラストラクチャスタッ クの可視化、アラームの作成、およびメトリク スとログの関連付けによって、パフォーマンス の問題の根本的原因を把握 • アラームの設定や⾃自動化されたアクションを起 こす • ログをすばやく発⾒見見、分析、視覚化することで 運⽤用上の問題に対処しやすくする https://aws.amazon.com/jp/cloudwatch/

Slide 13

Slide 13 text

サービスを組み合わせてアプリケーションを構築 https://docs.aws.amazon.com/ja_jp/AmazonCloudWatch/latest/events/ WhatIsCloudWatchEvents.html • 前述したサービスを組みわせて、機能を実装していく AM 2:00 に実⾏行行

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

とある案件 • デバイスに対して、外部APIから状態を変化させる • 多数のデバイスの状態から、状態が変化したものに対して特 定のアクションを起こす • デバイスの状態を変化を取得し続ける • その⽇日の終了了後のデバイスの状態を表したデータを加⼯工し、 可視化する

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

モノ(Thing) • 特定のデバイスまたは論理理エンティティを表す • 物理理的なデバイスやセンサー (電球や壁のスイッ チなど) は、モノとして扱う • AWS IoT から発効された証明書を内包し、 AWS IoT とセキュアに通信する https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/iot-thing-management.html

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

Device Shadow

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

Device Shadow \ TUBUF\ SFQPSUFE\ QPXFS0/ ^ ^ ^ Powerを ONにして \ TUBUF\ lEFTJSFE\ QPXFS0/ ^ ^ ^ \ TUBUF\ lSFQPSUFE\ QPXFS0/ ^ ^ ^ デバイスへの指令の送信、 デバイスからの結果の受信などを 仮想的に⾏行行う

Slide 29

Slide 29 text

トピック • AWS IoT のメッセージの送受信を可能にする パブリッシュ/サブスクライブブローカーサー ビス • AWS IoT と通信するとき、クライアントは Sensor/temp/room1 のようなトピック宛て にメッセージを送信 https://docs.aws.amazon.com/ja_jp/iot/latest/developerguide/topics.html

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

AWS IoT ルール

Slide 32

Slide 32 text

AWS IoT ルール SELECT * FROM '$aws/things/+/shadow/update' WHERE state.reported.power = True

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

AWS IoT ルール SELECT * FROM '$aws/things/+/shadow/update/documents' データを格納するアクショ ンを紐づけた別のルール 複数のトピックとルールを組み合わ せて、アクションを設定していく

Slide 40

Slide 40 text

参考 (AWS Black Belt) https://www.slideshare.net/AmazonWebServicesJapan/20180327-aws-black-belt-online- seminar-aws-iot 20180327 AWS Black Belt Online Seminar AWS IoT におけるデバイス管理理

Slide 41

Slide 41 text

開発と運⽤用の設計

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

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

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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を紐づける イベントの設定

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

AWS SAM の記法の例例 SELECT * FROM '$aws/things/+/shadow/update' WHERE state.reported.power = True • トピック+ルールの例例

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

CIとの組み合わせ • AWS SAM でのCIツールを組み合わせて、ユニットテスト  → デプロイ → e2eテスト までを⼀一貫して⾏行行う • CIツールの Approval などの機能を利利⽤用し、本番環境適⽤用など を⼀一連のワークフローで⾏行行えるようにする sam.yml

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

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

Slide 67

Slide 67 text

アラートの通知 • アラートメッセージをSlackに流すことで、メッセージ通知を 起点に調査できるようにする

Slide 68

Slide 68 text

ログ出⼒力力 • 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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

ログ出⼒力力 PowerOnSubscriptionFilter: Type: AWS::Logs::SubscriptionFilter Properties: RoleArn: !GetAtt LogSubscriptionFilterRole.Arn LogGroupName: !Sub /aws/lambda/power-on FilterPattern: ?ERROR ?REPORT DestinationArn: !GetAtt AlertMessageStream.Arn

Slide 71

Slide 71 text

ログ出⼒力力 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

Slide 72

Slide 72 text

ログ出⼒力力 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

Slide 73

Slide 73 text

ログ出⼒力力

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

監視 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 …

Slide 76

Slide 76 text

監視

Slide 77

Slide 77 text

まとめ

Slide 78

Slide 78 text

まとめ • サービスが⽇日々アップデートされるので、情報は常に追う必 要がある • ツールを組み合わせて、開発・運⽤用周りを整備することで、 サービスの速度に対応させる • サービスの組み合わせや利利⽤用シーンによっては課⾦金金額が上がっ ていくため、適切なサイクルでアーキテクチャを⾒見見直す

Slide 79

Slide 79 text

参考⽂文献 https://d1.awsstatic.com/whitepapers/architecture/AWS-Serverless-Applications-Lens.pdf • Well-Architected レンズ サーバーレスアプリケーション • Well-Architected レンズ IoT (モノのインターネット) • 20180327 AWS Black Belt Online Seminar AWS IoT における デバイス管理理