Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所

8,133 views

Published on

2017.6.24 ハッカーズチャンプルー2017で話した資料です

Published in: Technology
  • Be the first to comment

サーバーレスのアーキテクチャパターンとそれぞれの実装・テストの勘所

  1. 1. サーバーレスの アーキテクチャパターンと それぞれの実装・テストの勘所 株式会社セクションナイン 吉田真吾 2017.6.24
  2. 2. 吉田真吾 n バックグラウンド 証券システム基盤開発 p 基盤システム開発、Oracleチューニングなど エバンジェリスト p 講演113回(2013年実績) p AWS設計・構築・移行(2014-2015) n 現在のしごと (株) セクションナイン 代表取締役社長 p APN コンサルティングパートナー p DevOps Dockerize Serverless 支援など (株) 実績等 p AWSウルトラクイズ 初代チャンピオン (2012年) p AWS Samurai 2014 / 2016 ←New!!
  3. 3. 本日お伝えしたいこと • サーバーレスってなに? • サーバーレスのエコシステム • 5種類のサーバーレスアーキテクチャと事例 • 「サーバーレスアーキテクチャのパターン別ユース ケース」からいくつか紹介 • http://yoshidashingo.hatenablog.com/entry/serv erlss-usecases-2017
  4. 4. パラダイムシフト • Why The Future Of Software And Apps Is Serverless by Ken Fromm, VP of Business Development at Iron.io • コンピューティングリソースの調達リードタイムの短縮 • スタンダローンアプリからの変化(現在のMicroservices) • クラウドで柔軟にコンピューティングリソースをサービスとして 利用することができる • サーバーが要らないということではなく、開発者はサーバーにつ いて「考えなくてもよくなる」 E L. M ARMF I ) RET E CP PM C N C R M A LLN FN N M M NN
  5. 5. AWS Lambda • 2014年末 re:Invent にて発表 • サポート言語 • Node.js – v4.3.2, v6.10 • Java – Java 8 • Python – Python 2.7, 3.6 • C# - .NET Core 1.0.1 • ホスト • Amazon Linux (時々バージョンアップ) • 実行環境は再利用される • 初回起動が遅いが再利用時は高速 • 一時ストレージとして /tmp 利用可能(スケールしたり破棄されたりするので 頼らないこと) • 課金は使った分だけ • 確保(指定)したメモリ(128MB〜1.5GB) x 実行時間(100ms単位) x 実行回数 • メモリに比例してCPUの割当ても多くなる http://docs.aws.amazon.com/ja_jp/lambda/latest/dg/welcome.html
  6. 6. Functions as a Service の台頭 • 特徴 • 実行環境は隠蔽&プラットフォーム 管理で、必要なのはコードのみ • コンテナベースで調達リードタイム を短縮 • 分散実行環境による可用性の確保 • 実行時間のみ課金によるコスト低減 • アーキテクチャにおける責務 • Stateful >> Statelessへ • 永続データ >> 揮発性 • モノリシック >> Microservices • バッチ処理 >> イベントドリブン https://aws.amazon.com/jp/about-aws/events/reinvent-report-2014-pt2/
  7. 7. Lambda goes everywhere!! FGM DD @ I F@I 9 G7 I F@I GI G7 K M @ DG KBGF @ DG KBGF 3IB@BF 1 E @ K LF KBGF FDBF IG BF@ GI BF B BI AG
  8. 8. サーバーレス エコシステム プラットフォーム 開発・運用フレームワーク 開発者
  9. 9. プラットフォーム事業者 フレームワークやツール アプリケーション開発者 サーバーレスエコシステム • サーバー構築不要 • スケーラブル • 従量課金 etc… • API定義と関数コード の一体管理 • チーム開発(テスト、 デプロイ) etc… • 企画→開発→デリバリーに 集中 • サービスマネジメント • etc…
  10. 10. Serverlessでの開発にどんなツールを使ってますか? P w : M M NN 3M I R M nyc VflV dk 7 A # /L S u5 I A puW dk 7 A 5 I MT u5 I A puW dk 8T E ( :R DD M /84w vs ) / : : M M NN /LL F F 6 A :/6 nyc VflV dk 0 PA3 MI F 8 N I 92: Wh V a Vi 6F M N C FNP : PAF xtnyor 412 # / : 054 embg m Vi # - 2 FLN xtnyor 412 8T E : M M NN 6F M CM I R M C M / : E F nyc VflV dk 8T E Serverless Community(JP) https://www.facebook.com/groups/813718382095265/
  11. 11. サーバーレス だからこそできることをやる 開発の高速化 運用の省力化
  12. 12. 10X Product Development • 製品がマーケットにフィットす るかどうかが最も重要である • ビジネスに関連するコードの開 発時間に極力時間を使うべきで ある • 顧客とまわすイテレーションを 最大化すべきである • 依存性を最小化すべきである: 仕様確定待ちで開発者を待たせ たり、運用やDBAやその他の開 発者の影響で待たせることを極 力避けるべきである http://www.slideshare.net/ServerlessConf/joe-emison-10x-product-development
  13. 13. 10X Product Development Commercial Search • 開発者2人x4ヶ月 • TypeScript 13,307行 • 開発者の稼働 95%以上(待ち時間なし) 構成 • Auth: Firebase • Static Site Hosting: Netlify • 画像管理: Cloudinary • 検索: Algolia ペインポイント • Firebaseのダッシュボードでは大きなデータセッ トが扱えない • RDBMSからFirebaseに移行する開発者のラーニン グカーブ http://www.slideshare.net/ServerlessConf/joe-emison-10x-product-development
  14. 14. まかせっきりでよい? プロダクトの最終責任について
  15. 15. Serverlessness, NoOps and the Tooth Fairy ベストプラクティス • 自分のプロダクトの問題はちゃん と直せる人は自分しかいない • クリティカルパスを理解する • できるかぎり小さく維持する • プロバイダの技術情報や、内部技 術が何に依存しているか理解する • アウトソース先に問題が起きても、 自身のサービスにおけるそれによる 結果については依然としてあなたが 責任を持たなければいけない http://www.slideshare.net/ServerlessConf/charity-hound-serverless-noops-the-tooth-fairy
  16. 16. Serverlessness, NoOps and the Tooth Fairy トレードオフ • 可視性が下がる • 自分自身で問題をfixできない し、新機能を実装することも できない • サービスはあなたの支払うお 金で維持されている • 制限や制約は公開されること もあるし、公開されないこと もある http://www.slideshare.net/ServerlessConf/charity-hound-serverless-noops-the-tooth-fairy
  17. 17. 5つの分類パターン 1. Webアプリケーション 2. 運用業務 3. ストリームデータ処理 4. モバイル・IoTのバックエンド 5. アプリケーション連携のバックエンド
  18. 18. Webアプリケーション 1) Serverless Single Page Apps
  19. 19. RRR S IL I Amazon Route 53 Amazon S3 (Static Website) Google+ profile Cognito Identity Pools Lambda DynamoDB SPA
  20. 20. 流れ • ビュー/アプリ開発 • ビューの作成 • テスト駆動でアプリコードを追加 • Cognitoを使った認証+フェデレーション • DynamoDBを使ったデータの管理 • Lambdaでシステム強化
  21. 21. 2 4 32 1 2 1 1 4 32 2 1 3 4 1 4 2 1 1 3 4 32 1 1 3 4 1 3 4 1 1 3 4 - 4 4. 1 1 4 1 • ライブラリ:jQuery (他のものでもよい) • テストフレームワーク:Jasmine ビュー/アプリ開発
  22. 22. ビュー/アプリ開発 • アプリ(js)開発 • ローカルで開発可能 • チーム開発がはじまっ たらS3で • 気をつけること • テスト時のブラウザ キャッシュ [index.html] イベント ループ Javascript [app.js] [app_spec.js] イベントを トリガする リクエスト コールバック 関数の起動 入力の取得 マークアップの変更 マークアップのテスト
  23. 23. ビュー/アプリ開発 • テスト駆動 'use strict'; var learnjs = {}; learnjs.showView = function(hash) { var problemView = $('<div class="problem-view">').text('Coming soon!'); $('.view-container').empty().append(problemView); } [app.js] 実装 describe('LearnJS', function() { it('can show a problem view', function() { learnjs.showView('#problem-1'); expect($('.view-container .problem-view').length).toEqual(1); }); }); [tests/app_spec.js] テスト ビューコンテナの存在チェックをする→テスト:エラー →ビューコンテナを実装する→テスト:正常
  24. 24. 'use strict'; var learnjs = {}; learnjs.problemView = function() { return $('<div class="problem-view">').text('Coming soon!'); } learnjs.showView = function(hash) { var routes = { '#problem-1': learnjs.problemView }; var viewFn = routes[hash]; if (viewFn) { $('.view-container').empty().append(viewFn()); } } ビュー/アプリ開発 • テスト駆動 [tests/app_spec.js] describe('LearnJS', function() { it('can show a problem view', function() { learnjs.showView('#problem-1'); expect($('.view-container .problem-view').length).toEqual(1); }); it('shows the landing page view when there is no hash', function() { learnjs.showView(''); expect($('.view-container .landing-view').length).toEqual(1); }); }); テスト ルートの存在チェック→テスト:エラー →ルートの実装→テスト:正常 [app.js] 実装
  25. 25. CognitoをつかったIDフェデレーション ログイン ID取得 検証 認証情報取得 検証 APIコール ログインOK ID発行
  26. 26. CognitoをつかったIDフェデレーション localhost入れておくと ローカルでテスト便利
  27. 27. CognitoをつかったIDフェデレーション
  28. 28. CognitoをつかったIDフェデレーション
  29. 29. DynamoDB • NoSQLデータベース サービス learnjs.saveAnswer = function(problemId, answer) { return learnjs.identity.then(function(identity) { var db = new AWS.DynamoDB.DocumentClient(); var item = { TableName: 'learnjs', Item: { userId: identity.id, problemId: problemId, answer: answer } }; return learnjs.sendDbRequest(db.put(item), function() { return learnjs.saveAnswer(problemId, answer); }) }); }; ユーザーID, 問題番号, 解答をDynamoDBに保存
  30. 30. Lambda • 今回のアプリでの利用目的 • DynamoDB直接読み書きでは「不正なクエリからの保護」 • DynamoDB直接読み書きできない「ユーザー全員分の集計」 などの情報提供のため RRR S IL I Amazon Route 53 Amazon S3 (Static Website) Google+ profile Cognito Identity Pools Lambda DynamoDB SPA
  31. 31. サーバーレスシングルページアプリケーション 読み進めながら手を動かすだ けでServerless SPAが作成で きる Step by Step ガイド
  32. 32. Webアプリケーション 2) CSVアップロード/ダウンロード HR系事業会社
  33. 33. 課題 • Webアプリ内のワークロードギャップ • 一覧画面や詳細画面とCSVアップロード/ダウン ロードが同一アプリに載っている • php-fpmやunicornのワーカーの設定チューニング が大変(重たい処理に合わせないといけない) →ジャマだな…
  34. 34. PL A S IL I Amazon Route 53 Amazon S3 (Static Website) Cognito User Pools Lambda RDS R dkP n Amazon S3 Sel m
  35. 35. Webアプリケーション 3) REST API
  36. 36. 作成する構成 7 F EG 851 F GBFK 3 7 1 7 <テーブルデータの 取得・追加・削除 をするAPIだよ
  37. 37. AWS Serverless Application Model (SAM) • サーバーレスアプリケーションの 管理フレームワーク • CloudFormation テンプレートで 管理 • Lambda API Gateway DynamoDB のリソースおよび複 数のイベントソースをサポート • Apache 2.0 ライセンス E LN. DF EP I RN N N M M NN LL F F I A
  38. 38. 作成する構成 functions app-spec (template) dkSb WP (zip) 1 E L C K F EG K C DGL GIE KBGF K M 2
  39. 39. 手順 準備 1. AWS CLIのインストール 2. IAMユーザー作成とクレデンシャル取得 3. リリースステージ用S3バケットの作成 開発 4. Lambdaのコードを書く 5. AWS SAMファイルを書く デプロイ 6. Lambda関数のzip化 7. パッケージする 8. アーティファクトをステージしてデプロイする
  40. 40. AWS SAMファイル < それぞれのFunctionに対応する APIの定義や環境変数(テーブル名) や簡易的なテーブル作成ができる
  41. 41. Lambda関数コード < get/put/delete 用のハンドラ
  42. 42. アーティファクトのパッケージ $ zip app.zip index.js $ aws cloudformation package --template-file app-spec.yml --output-template-file app-spec.deploy --s3-bucket bucket-name $ tree . app-spec.yml app-spec.deploy index.js └── app.zip
  43. 43. デプロイ $ aws cloudformation deploy ¥ --template-file app-spec.deploy ¥ --stack-name stack-name ¥ --capabilities CAPABILITY_IAM < 最後のcapabilities指定はFunctionのサービスロールを 作成するためのIAMリソースの承認だよ、忘れずにね ※ ¥はバックスラッシュに読み替えてね
  44. 44. POST < 大成功! ※ヘッダにSigv4の署名が要るのでPostmanが便利
  45. 45. GET < 大成功!
  46. 46. DELETE < 大成功!
  47. 47. AWS Serverless Application Model (SAM) • サーバーレスアプリケーションの 管理フレームワーク • CloudFormation テンプレートで 管理 • Lambda API Gateway DynamoDB のリソースおよび複 数のイベントソースをサポート • Apache 2.0 ライセンス E LN. DF EP I RN N N M M NN LL F F I A
  48. 48. Webアプリケーション 4) Serverless CMS Shifter, Serverless Wordpress
  49. 49. https://speakerdeck.com/digitalcube/serverlessconf-tokyo-2016-shifter
  50. 50. 運用 5) バッチ処理 日経新聞さんの事例
  51. 51. https://speakerdeck.com/ikait/serverless-architecture-supports-nikkeis-paper-viewer
  52. 52. https://speakerdeck.com/ikait/serverless-architecture-supports-nikkeis-paper-viewer
  53. 53. https://speakerdeck.com/ikait/serverless-architecture-supports-nikkeis-paper-viewer
  54. 54. 運用 6) オンコールシステム 大手人材系メディア
  55. 55. 課題 • SRE部で運用する共通Zabbix基盤 • 各システムはテンプレ作ってfluentdでアプリログ やsyslogをかっぱいで送ればOK • 実際のオンコール部分どうしよう→PagerDutyなど のSaaSは都度セキュリティ部門による評価・承認 が必要(だがすごく時間がかかる) →自分で作るわ(担当者はAWS, Twilio未経験) →2週間でリリース
  56. 56. Lambda oDB RPTSc RhP RdiWP glk pszu E OGF K M i fl rt fl y Lambda P a U
  57. 57. アプリケーション連携 7) Alexa Skills Set
  58. 58. Serverless Community • ServerlessConf Tokyo ’16 http://tokyo.serverlessconf.io • Serverless Meetup (Tokyo|Osaka|Sapporo) https://serverless.connpass.com • Serverless Community (JP) https://www.facebook.com/groups/813718382095265/

×