Contenu connexe
Similaire à フルサーバレスで構築した電子書籍ストアを1年運用してみた (20)
フルサーバレスで構築した電子書籍ストアを1年運用してみた
- 1. Serverless Days Fukuoka 2019
フルサーバレスで構築した電子書籍ストアを
1年運用してみた
Keiichi Nakayama
Vice General Manager
Cloud Partner Group
CHARA-WEB Co., Ltd.
- 2. Serverless Days Fukuoka 2019
自己紹介
• 中山 桂一 ( @k1nakayama )
• 株式会社キャラウェブ
クラウドパートナーグループ 副部長
• クラウドパートナー事業をリード
• サーバレスが大好きなのに,
DevOps関連の登壇が多め
- 3. Serverless Days Fukuoka 2019
会社概要
会社名:株式会社キャラウェブ
所在地:東京都台東区東上野4−12−1
資本金:7,161万円
主な事業内容:
コンテンツ事業
電子書籍のライセンスおよび管理,電子書籍販売
クラウドパートナー事業
AWS活用支援サービスの提供及びSI事業
- 4. Serverless Days Fukuoka 2019
コンテンツ事業
電子書籍ライセンス管理
• 白泉社の電子書籍事業の共同事業展開
• 電子書店各社へ電子書籍のコンテンツ提供やライセンスの管理を行う
電子書店の構築・運用
• 白泉社e-net!の構築・運用
各種デジタルコンテンツ関連サービスの運営
• フィーチャーフォン向けにキャリア公式コンテンツとして,
ゲームコンテンツや着メロコンテンツ等を提供
- 5. Serverless Days Fukuoka 2019
白泉社e-net!
白泉社公式電子書籍サイト
Web / iOS / Android向けに提供
2013年3月から提供開始
主な特徴
• 電子コミック雑誌の先行配信
• 電子限定コミックの配信
• 電子限定特典
• 白泉社作品の熱狂的ファンが集まる電子書籍ストア
- 6. Serverless Days Fukuoka 2019
サーバレス化
2018年10月に全面リニューアル
同時にiOS / Androidアプリでもストア展開
全てマネージド・サービスのみで構成したサーバレスアーキテクチャ
23個のマイクロサービスで構成
ステージあたり約270個のLambda Functionで構成
- 7. Serverless Days Fukuoka 2019
従来の課題
初期構築時のPHP5.6,Symfony 1など脆弱性たっぷり
モノリシックな構造なうえ,次々とハリボテ的な追加開発により,
機能の拡張より,むしろバグを産む感じ
全ページサーバサイドレンダリングで,APIがゼロ。
スマホ向けアプリ化などをしたいけどAPIないしムリ!
クラウドを活かせていない構成などにより,障害対応に追われる毎日
社内のエンジニアは,2名(当時)
- 10. Serverless Days Fukuoka 2019
マイクロサービスアーキテクチャ
機能などの区分け毎にマイクロサービス化する
マイクロサービス単位でリソースを管理
他のサービスが正常でない場合があることを考慮する
マイクロサービス単位のCI/CDパイプラインを構築
マイクロサービス間はAPIやPub/Subで連携
μS μS
μS μS
- 11. Serverless Days Fukuoka 2019
ステージ
開発用,検証用,本番用それぞれのステージを用意する
AWSアカウントをステージごとに分ける
管理用アカウントを用意
•各マイクロサービスのCI/CDパイプラインやGitリポジトリ
•アセット(画像や各種設定ファイル類,EPUB等)のデプロイ先
•スタッフ用IAMユーザを作成し,各ステージ用アカウントへはAssume Roleで
Manage Account
Dev Stg Prod
- 13. Serverless Days Fukuoka 2019
Web/MobileバックエンドAPI ①
典型的なWeb/MobileのバックエンドAPIとして使われている
マイクロサービス毎に1つのAPIを立てる
Swaggerを適切に定義しておくことが重要
Amazon DynamoDBAmazon API Gateway AWS Lambda
- 14. Serverless Days Fukuoka 2019
Web/MobileバックエンドAPI ②
Pub/Subを容易に実装することができる
複数のAPIコールを1回にまとめて行える
直接DynamoDBに読み書きが行えるため,
Lambdaの実装削減できる
AWS AppSync
Amazon DynamoDB
Amazon Elasticsearch
Service
AWS Lambda
- 15. Serverless Days Fukuoka 2019
DynamoDBトリガー
DynamoDB内のレコードの書き込みをトリガーにアクション
Kinesis Streams同様に時系列に従ってイベントが受け取れる
非同期処理を容易に実装できる
AWS Lambda
Amazon DynamoDB
- 16. Serverless Days Fukuoka 2019
SQSトリガー
キューに入ったメッセージをトリガーにLambdaを発火
リソース間を疎結合に保ちやすくできる
Lambdaの同時実行数の予約をしておかないとエライことに
Amazon Simple Queue
Service
AWS Lambda
AWS Lambda
AWS Lambda
- 17. Serverless Days Fukuoka 2019
データ解析・可視化
DynamoDBトリガーを利用しデータをS3に吐き出す
QuickSight + Athena + Guleでデータ解析し可視化する
パーティション設計などに気をつけてデータ吐き出し
Amazon Simple Storage
Service
AWS Glue Amazon Athena
Amazon QuickSight
AWS LambdaAmazon DynamoDB
- 18. Serverless Days Fukuoka 2019
通知処理
Eメールやプッシュ通知を時系列に沿って配信
シャード量の調整で配信速度を調整可能
PinpointにユーザIDを紐付けて管理することで,
ユーザID指定でPUSH通知
Amazon Simple Email Service
Amazon Pinpoint
Amazon Kinesis
Data Streams
AWS Lambda
- 19. Serverless Days Fukuoka 2019
エッジHTML生成 ・ エッジ画像リサイズ
Lambda@Edgeを活用
リクエスト毎に認証や動的なHTML生成が可能
UserAgent等に合わせた画像のリサイズ等をリアルタイムに実行
Amazon CloudFront Amazon Simple Storage
Service
AWS Lambda
- 21. Serverless Days Fukuoka 2019
サーバレス化の成果
1年ちょっとの間,サービスダウンを伴う障害は1件もなし!
•8.23の東京リージョン障害も無傷だった
セキュリティパッチ対応やスケーリング対応等必要なし!
マイクロサービス単位に手を入れられるので,機能改修がしやすい
iOS / Androidアプリでもストア展開ができた
アプリ展開も行ってトラフィックも急増し,3ステージに分けて運用し
ているが,コストは従来の80%程度
ページ表示等のUXが大きく改善された
エンジニアのモチベーションが向上した
- 23. Serverless Days Fukuoka 2019
オリジンバケットをus-east-1に配置した
DRM処理関連はコストを考慮しus-east-1で行っている
処理後のファイルもus-east-1のバケットに入れていた
Lambda@Edgeにより処理されるブラウザビューアの
ページ送りが,キャッシュヒットしないと,
各ページ2秒ほど掛かりストレス
処理後の画像データをap-northeast-1のバケットに転送で改善
- 24. Serverless Days Fukuoka 2019
S3 Storage Classを変えた
リニューアル直後の11月後半,re:InventにてS3の新しいStorage
Class「Intelligent-Tiering」が発表された
Epubなど大容量のファイルをこれに変えよう!
全ファイルのS3トリガーが発生してDRM処理が再度行われ
関連処理のサービス利用料が爆発!
約100万円ほどの無駄な費用が発生した
- 25. Serverless Days Fukuoka 2019
Node.jsで全Lambda Functionを作成
フロントエンドはAngular(TypeScript)で開発していくことにした
Lambdaの開発も,同様にTypeScriptで行うことに
2018年初旬のLambdaのNode.jsの最新バージョンは6.10だった
2018年10月,ようやくリニューアルオープン!
2019年4月1日にNode.js 6.10のサポート終了がアナウンス
サポート終了に向けてNode.js 8.10にアップデート
アップデート作業中に,Node.js 10.xのサポートが発表
- 26. Serverless Days Fukuoka 2019
DynamoDBトリガーのLambdaで問題
Node.jsのアップデート対応に伴いLambdaを修正していた
全てユニットテストも通ったと思っていたら,一時的にテストをして
いない関数がちらほら。。
適切にランタイムのアップデートがされていないDynamoDBトリ
ガーのLambda Functionがあった
24時間の間イベントがリトライされ続ける
適切なモニタリングが出来ていないうえ,
気づきにくい処理部分で発生していた
修正するまで無限実行され続けLambda等のコストが
150万ほど無駄に発生!
- 28. Serverless Days Fukuoka 2019
課題
DynamoDBの設計がダメダメなことに気づいたので直したい
サービスのモニタリングが最低限しか出来ていない
Nodeはライフサイクル短いなぁ
今更だけどAuth0とか使ったほうが,拡張性高かった
まだまだ,UX向上できるはず
SSR対応出来ていない
- 30. Serverless Days Fukuoka 2019
まとめ
適切にマイクロサービス化すると,開発効率は向上する
Swagger等をしっかり作り,マイクロサービス単位で外注すると
比較的スムーズにプロジェクトを進めやすい
急いでいるときこそ,細かなユニットテストを行うべし
モニタリングをどう行うかをプロジェクトの序盤で考えるべし
リトライに対する対処など,Lambdaの基本的なことをしっかりやる
AWSサービスに固執せず,様々なSaaSなどを積極的に取り入れ
ることで,開発効率を向上させる