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

フルサーバレスで構築した電子書籍ストアを1年運用してみた

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