NewsPicks 社内システムの低コスト・高可用性を実現したLambdaの利用例
レビュー投稿日の情報になります
株式会社ユーザベース / Kaito Hiwatashi
メンバー / インフラエンジニア
最終更新日投稿日
| ツールの利用規模 | ツールの利用開始時期 | 事業形態 |
|---|---|---|
| 51名〜100名 | 2024年9月 | B to C |
| ツールの利用規模 | 51名〜100名 |
|---|---|
| ツールの利用開始時期 | 2024年9月 |
| 事業形態 | B to C |
アーキテクチャ
.png?disposition=inline)
導入の背景・解決したかった問題
導入背景
ツール導入前の課題
弊社で使用している社内向けシステムの一つに「Watson」というシステムがあります。「Watson」とは簡単にいうと「NewsPicks」のユーザーIDをもとにユーザーごとの情報を検索・閲覧できるシステムで、お客様からの問い合わせ対応等に活用される重要なシステムです。「Watson」は構築されたのが8年前と歴史が古く、歴史が古い故に数々の問題を抱えていました。
改訂前の「Watson」のインフラ基盤は、「Classic Load Balancer」+「EC2」+「DB」で構成されるシンプルなものです。OSは「Amazon Linux 1」、フロントエンドが「React 15.4」、バックエンドとして「Node.js 7.10」を使用し、EC2内のアプリの永続化のためにforeverを利用していました。
- このインフラ構成では、以下の3つの観点で問題がありました。
- 「セキュリティ」
- 社内システムであることから、頻繁に開発がされておらず、バージョン更新等のメンテナンスがされていませんでした。
- 開発環境もメンテナンスされておらず、開発・運用の負荷が高いことから誰も進んで開発をしない悪循環がありました。
- 「可用性が低い」
- シングルインスタンス構成であることから、リリースのたびにダウンタイムが発生していました。
- 「コスト効率が悪い」
- 常時起動している状態であり、利用していない時間でもコストが発生していました。
- 「開発効率が悪い」
- 当時のインフラはCDKによるIaC化がされていない状態であり、そのため開発するにしても、開発やリリース方法が複雑で効率が悪かったです。
- 「セキュリティ」
どのような状態を目指していたか
抱えていた課題について、インフラ基盤を更新することで以下の状態を目指していきたいと考えていました。
- それぞれの課題について、セキュリティ、運用コスト、コスト、可用性のすべてを向上させたいと考えていました。
- 具体的には
- リリースを容易にしてセキュリティ対策を容易化
- マネージドサービスを駆使して運用コストを削減
- サーバーレスにしてアタックサーフェースを減少
- サーバーレスにして可用性の向上
- サーバーレスにし、時間課金から呼び出しでの課金に変更
比較検討したサービス
- ECS
「Watson」は、API + SPA(シングルページアプリケーション)で構成されるシンプルなものです。ECSでの置き換えを検討しましたが、以下の観点からLambdaを採用しました。- API + SPAなのでS3 + Lambda(Express)でも置き換えが可能なこと
- S3 + Lambda(Express)であれば、サーバーレス構成になり稼働時間の制御が不要なこと
- サーバーレス構成にすることで、サーバーダウンがなくなり、可用性の向上が見込めること
比較した軸
- 低コストで高い可用性を実現
- 社内システムであるという性質上、必要以上にリッチなインフラ構成はできないです。そのため、できるだけコスト低く、かつ可用性は高いインフラを実現しなければいけません。
- S3 + Lambda(Express)の構成は、コスト・可用性面ともに実現できると考えました。
選定理由
具体的に決め手になったポイントは以下です。
- マネージドなサービスであるため、インスタンス管理の必要がなく、運用コストが下がる点
- サーバーレス構成であるため、呼び出し回数による従量課金体系になる点
- サーバーレス構成であるため、簡単にダウンタイム発生を防ぐことができ、可用性が上がる点
- ダウンタイムが発生しなくなることから、開発者のリリース作業が容易になり、開発者体験も向上する点
導入の成果
改善したかった課題はどれくらい解決されたか
課題の4つの観点について、次のように解決されました。
- 「セキュリティ」
- 開発・リリースが容易になったことで、セキュリティ関連の開発が進みました。
- 「可用性が低い」
- Lambdaを利用したサーバーレス構成にしたことで、ダウンタイムの発生を防げる構成になりました。
- 「コスト効率が悪い」
- サーバーレス構成にすることで、呼び出す回数による従量課金体系に変わった結果、コスト効率が向上しました。
- マネージドサービスを利用することで、自前でインスタンスをメンテナンスする必要がなく運用コストも減少しました。
- EC2で運用していた時と比べて、請求されたコストは1/10ほどまで減少しました。
- 「開発効率」
- AWS CDKを使ってインフラの全てをIaC化した結果、開発効率が著しく向上しました。具体的には、Watsonの改訂後、DWHをRedshift -> Snowflakeへ移行する作業が発生しました。その際、IaC化していたことによりパッケージのバージョン更新やサーバー部分の処理変更などの動作確認・適用がスムーズに行え、迅速な対応に繋がりました。
- IaC化したことにより、開発環境を用意できたことも寄与しています。またLambdaのコスト特性から、開発環境にかかるコストもほとんどありません。
どのような成果が得られたか
- 開発者が簡単に開発・リリースできるようになった結果、セキュリティ開発や機能開発が活発化
- コスト効率が上がった結果、従来のインフラと比べて大幅なコスト減少を達成
- マネージドサービスを利用した結果、インフラ管理者の運用・メンテナンスコストが減少
導入に向けた社内への説明
上長・チームへの説明
以下の決め手になったポイントを根拠に、運用コスト・開発コストを下げることができる点、結果として今後のセキュリティ・ユーザー体験の向上につながっていく点を説明しました。
- マネージドなサービスであるため、インスタンス管理の必要がなく、運用コストが削減できる点
- サーバーレス構成であるため、呼び出し回数による従量課金体系になる点
- サーバーレス構成であるため、簡単にダウンタイム発生を防ぐことができ、可用性が上がる点
- ダウンタイムが発生しなくなることから、開発者のリリース作業が容易になり、開発者体験も向上する点
活用方法
- Node.js + ExpressによるAPIサーバーのホストしています。
- APIサーバーの実装には、Lambda上でServerless Expressを利用し、既存実装を活かすことで対応時の工数を削減しました。
- API GatewayとLambdaを組み合わせて外部公開しています。
- 既存の認証は、Basic認証とIP制限でした。この認証部分もLambdaを使用し実装。API GatewayのLambdaIntegrationで認証機能をつけています。
- SPAの配信は、CloudFront + S3を活用し、S3においたReactアプリを配信しています。
よく使う機能
- CloudWatchによるログ収集・調査
- CloudWatch Metricsによるメトリクス監視
- 弊社では、「Watson」以外にも、様々な社内マイクロシステムでLambdaを利用しています。
ツールの良い点
- マネージドサービスのため、運用コストが低い点
- サーバーレス構成のため、コストパフォーマンスが高い点
ツールの課題点
- API Gateway + Lambda課題点として、timeout制限の問題があります。
- 対応初期は、API Gateway REST API + Lambdaでサーバー側の実装を行い、Express側でBasic認証を行う構成で進めていました。この構成には、次のような課題がありました。
- API Gateway REST APIの使用により、"WWW-Authenticate"ヘッダーが書き換えられてしまうため、Express側でのBasic認証ができないです。
- その回避策として、API Gateway HTTP APIを利用して構築したが、API Gateway HTTP APIにはtimeout時間が30秒までしか設定できないです。
- 社内システムであるため、DWHに対して重めのクエリを実行することが多々あることから、timeout時間の制限は致命的でした。
- 上記のような課題を、API Gateway REST API + API Gateway Lambda Integration(認証) + Lambda Serverless Expressのようなインフラ構成にして、Basic認証の責務をLambda側に移すことで対応した経緯があります。
株式会社ユーザベース / Kaito Hiwatashi
メンバー / インフラエンジニア
よく見られているレビュー
株式会社ユーザベース / Kaito Hiwatashi
メンバー / インフラエンジニア
レビューしているツール
目次
- アーキテクチャ
- 導入の背景・解決したかった問題
- 活用方法


