Ce diaporama a bien été signalé.
Nous utilisons votre profil LinkedIn et vos données d’activité pour vous proposer des publicités personnalisées et pertinentes. Vous pouvez changer vos préférences de publicités à tout moment.

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

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

  • Identifiez-vous pour voir les commentaires

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

  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/

×