826 Views
April 07, 17
スライド概要
・2017/4/6
・ヒカラボ
・LIFULL Home's androidアプリの開発の裏側について
LIFULL HOME'Sを運営する株式会社LIFULLのアカウントです。 LIFULLが主催するエンジニア向けイベント「Ltech」等で公開されたスライド等をこちらで共有しております。
アプリAPIの マイクロサービス化 Amazon API Gateway + AWS Lambda 株式会社LIFULL 衛藤剛史
自己紹介 • • • • • 2 衛藤 剛史(ETO TAKESHI) 大分県大分市出身 ~2014 SIerで開発経験 株式会社ネクスト(現 株式会社LIFULL)中途入社 Androidアプリ・API(バックエンド)開発を担当 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
本日お話すること • • • • • • • 3 アプリAPIマイクロサービス化概要 Amazon API Gateway / AWS Lambda 実装環境詳細 Testing Deploy(APIリリース) 運用・監視 まとめ © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
アプリAPI マイクロサービス化概要 より柔軟に・より高速に 4 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
マイクロサービスとは 「個別に開発された小さなサービスを組み合わせ て、一つのサービスを提供する」 Salesforce Customer Success Blog https://www.salesforce.com/jp/blog/2016/03/microservices.html Service 5 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
LIFULLとしてのマイクロサービス 「サービスごとに独立した環境を構築し、必要に 応じて連携してプロダクトを作る」 LIFULL HOME’S API 6 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
マイクロサービス化の目的 • • • • • 7 ネイティブアプリ専用のAPI 高速な開発・リリース 古いシステムからの脱却 新しい技術への挑戦 利用状況の可視化 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
以前までの構成 Orchestration Layer DB / DAO common modules PC API Smart phone API Apps API 8 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
マイクロサービス化 Orchestration Layer DB / DAO PC API common modules Smart phone API Apps API 9 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
マイクロサービス構成 S3 Cloud Front Route53 App DB / DAO Lambda API Gateway Cognito AWS cloud 10 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
Amazon API Gateway AWS Lambda サーバレスアーキテクチャにより運用いらず 11 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
Amazon API Gateway アプリケーションの玄関 • • • • • • 12 最大で数十万の同時API呼び出し 従量課金 キャッシュ Cloud Watchでロギング クライアント側SDKが出力可能 Lambda関数を指定 Touch © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
AWS Lambda サーバー構築しなくてもコードを実行 • Lambda対応言語 • Node.js • Java • C# • Python • S3のイベントをフックしてコード実行 • API Gatewayと組み合わせてRESTful通信 Touch POINT 1関数1git repositoryで独立 13 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
API GatewayとLambdaの制限 POINT 運用コストが減る代わりに、様々なデフォルト制限がある サービスの規模に応じてAWS Supportに上限緩和申請をする ※項目によっては緩和出来ないため、AWSのドキュメントを参照 • • • • • 14 スロットル制限1,000rps アカウント当たりのAPI数 60 Timeout 30秒 Payloadサイズ 10MB Etc… • • • • ディスク容量 512MB リクエスト本文のPayloadサイズ 6MB 関数の同時実行数 Etc… © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
実装環境詳細 APIドキュメントの記載・使用しているツール・実装などについて 15 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
Node.js サーバーサイドJavaScript環境 • • • • • 非同期型のイベント駆動 各接続ごとにコールバックが発火 スレッドベースのモデルと対象的 Non-blocking I/O パッケージ管理はnpm(今回は使っていない※後述) function handler(event, context, callback) { // event => API Gatewayのパラメータ // context => Lambdaの状態 // callback => コールバック関数 } 16 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
SWAGGER API I/Oドキュメントを作成・管理 http://swagger.io/ • • • • • • 17 THE WORLD’S MOST POPULAR API FRAMEWORK Open Source Initiativeが採用 RESTful APIドキュメントの管理 Swagger SpecでI/Oを定義する(yaml/json) Client用のSDKとサーバーコードの生成 Electron化で社内用ツールとして使用 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
SWAGGER 18 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
SWAGGER POINT • 記述方式が統一されている • Editorが使いやすい • 一人三役 1. APIリファレンス 2. パラメータのValidation 3. API Gatewayデプロイ時の設定 19 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
Yarn npmに変わるパッケージマネージャ • • • • • • • • 20 Facebookが2016/10にローンチ Ultra Fast. Mega Secure. Super Reliable. Offline Mode Flat Mode yarn.lockファイルでversion統一 Qiita書きました $ npm install $ yarn (install) Ultra Fast! © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
API実装方針 アプリ専用のAPIとして、自由自在にカスタマイズ Apart001 { "title": "Apart001", "overview": { "title": "概要", "label": "価格", "value": "3,000万円" }, "image": { "label": "外観" "url": "https://xxx" } 概要 ■ 価格 3,000万円 外観 } • • • • • 21 1画面1~2APIコール 解析に必要な情報は必須で送付 • OS / OS Version / App Version / Device Type API Versioning 画面に沿ったレスポンス構造 必要最低限なレスポンス © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
Testing ユニットテスト、結合テスト、Lint 22 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
Mocha テスティングフレームワーク • • • • • ユニットテスト 結合テスト(APIテスト) npm ライブラリrewireでprivate functionテスト coverage計測 CIサーバーでpush毎にnpm run test $ npm test Hoge #moge() ✔ should poge poge 1 passing (5ms) =========== Coverage summary =========== Statements : 100% ( 37/37 ) Branches : 100% ( 14/14 ) Functions : 100% ( 6/6 ) Lines : 100% ( 37/37 ) ======================================== 23 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
ESlint
JavaScriptの静的検証ツール
コーディング規約をすべて集約
•
•
•
•
•
インデント幅
スペーシング
var禁止(ES6)
スペルチェック
Etc…
{
"extends": "eslint:recommended”,
"rules": {
"indent": [2, 2, {"SwitchCase": 1, "VariableDeclarator": 2}],
"quotes": [2, "single"],
"space-before-blocks": [2, "always"],
"comma-spacing": [1, {"before": false, "after": true}],
"complexity": [2, 20],
"no-var": 2,
// etc
"spellcheck/spell-checker": [1,
{…}
]
}
}
24
© LIFULL Co.,Ltd.
本書の無断転載、複製を固く禁じます。
CircleCI 継続的インテグレーション(CI)サービス • • • • • • ビルド毎にコンテナ起動 → 破棄 1コンテナは無料 Github連携 Slackにテスト結果通知 yarnでも使える Test前にlintも流す コードをpush CircleCIでテスト Github連携 Slackに結果通知 25 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
CircleCIをyarnに対応させる ビルドからテストまでを高速化 POINT cache_directoriesの指定 circle.yml machine: node: version: 4.2.2 post: - curl -o- -L https://yarnpkg.com/install.sh | bash dependencies: cache_directories: - "~/.cache/yarn" pre: - yarn --version override: - yarn install test: post: - yarn run lint deployment: master: … 26 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
Deploy(APIリリース) 27 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
Gulp Node.jsベースのビルド自動化用ツールキット リリーススクリプトタスクの実行順序 1.Clean 2.lint実行 • Fail時はabort 3.UT実行 • Fail時はabort 4.zipに固める 5.AWS Lambdaへアップロード 6.Amazon API Gatewayにデプロイ 28 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
リリース 毎日リリース • • • • 29 Web側のスケジュールを気にすることなくリリース Web側への影響はほぼゼロレベル Lambdaは切り戻しがすぐに行える エンジニア全員がリリース作業を行える © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
運用・監視 輪番体制で毎日監視 修正が必要であれば即修正・即リリース 30 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
AWS CloudWatch AWSクラウドリソースとAWSで実行するアプリケー ションのモニタリングサービス デフォルトで使用可能なアラームの他、手動で様々なアラームを定義 • 5xxエラー • Lambdaの関数ごと • 任意の文字列(ログ内容から抽出) • Invocation Count • Count over limit • Throttles 31 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
運用と監視 輪番体制でアプリエンジニアが監視 • アラームメールで検知 • Chatworkで報告 • Chatworkへの投稿自動化も可能なので試してみたい 修正が必要ならすぐに対応してリリース • アプリをリリースを最小限に • リポジトリが独立しているため、他APIへの影響はほぼゼロ 32 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
まとめ 33 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
マイクロサービス化を行ってみて 高速・柔軟な開発サイクルの確立 • • • • • • 34 アプリ専用APIとして独立 開発がアプリチームで完結 影響範囲の把握が容易 リリースがアプリチームで完結 エンジニアのスキル向上 数値関連の把握 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
告知など 35 © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。
Google I/O 2017 参加してきます! May 17-19, 2017 @Shoreline Amphitheatre Mountain View, California • Qiitaかエンジニアブログに参加レポート書きます! • 社外向け勉強会(報告会)を開催します! Qiita(@etet-etet) 36 LIFULL Creators Blog © LIFULL Co.,Ltd. 本書の無断転載、複製を固く禁じます。