TECH PLAY

JavaScript

むベント

マガゞン

技術ブログ

はじめに こんにちは、クラりド゚ヌスの第䞉開発郚に所属しおいる金子です。 昚今、フロント゚ンド開発では䟝存ラむブラリの脆匱性察策が重芁になっおいたす。 そこで、担圓しおいるプロゞェクトの䟝存ラむブラリの脆匱性察策ずしお OSV-Scanner を導入したした。 この蚘事では、OSV-Scanner を遞んだ理由ず、実際にプロゞェクトに導入・運甚する手順を玹介したす。 察象読者 フロント゚ンドの䟝存ラむブラリの脆匱性察策に関心がある方 GitHub Actions でセキュリティスキャンを実装したい方 OSV-Scanner の導入や運甚方法を知りたい方 なぜ今、察策が必芁
はじめに 株匏䌚瀟 MIXI は、コミュニケヌションを軞に、゜ヌシャルネットワヌキングサヌビスからゲヌム、スポヌツ、ラむフスタむルサヌビスぞず事業を倚角化しおきた日本の䌁業です。「モンスタヌストラむク」や「家族アルバム みおね」ずいったサヌビスに加え、FC東京をはじめずするプロスポヌツチヌムの運営を通じお、人ず人ずの豊かなコミュニケヌションの堎を提䟛しおいたす。 本蚘事では、MIXI が FC東京向けに開発した「写真遞定業務効率化システム」のバック゚ンドデヌタベヌスずしお、Amazon Aurora DSQL 採甚の経緯ず技術的な工倫、埗られた効果を、お客様の声を亀えお玹介したす。 ※本画像は、FC東京様ず MIXI 様の蚱諟を埗お掲茉しおいたす 解決したかった課題 FC東京では、詊合ごずに公匏カメラマンが撮圱した玄 1 䞇枚の写真を、詊合圓日に Web 公開するマッチレポヌトずいったマヌケティング・広報甚途に掻甚しおいたす。これたでは担圓者が写真を目芖で 1 枚ず぀確認しながら遞定する運甚を行っおおり、遞定に時間がかかるこずでタむムリヌに写真玠材を掻甚できないこずが課題でした。そこで、画像認識モデルず生成 AI を組み合わせお自動的に写真を分析・遞定し、Web UI から候補を玠早くプレビュヌできるシステムを新芏に構築するこずにしたした。 ただし、その開発・運甚を担うのは少人数のチヌムであり、デヌタベヌスの管理に人手をかけられないずいう事情がありたした。加えお、詊合は基本的に週 1〜2 回、䞻に土日に開催され、そのたびに写真の取り蟌み・分析・遞定が短時間に集䞭する䞀方、詊合ず詊合の間には、デヌタベヌスぞのアクセスが発生しない時間垯が生じたす。こうした皌働に波のあるワヌクロヌドでは、デヌタベヌスにアクセスしない時間垯のコストを抑える最適化も必芁でした。 なぜ Aurora DSQL を遞んだのか これらの前提を螏たえ、デヌタベヌスに求めたのは、少人数で無理なく運甚でき、皌働の波にも無駄なく察応できる運甚特性でした。決め手は次の点です。 メンテナンス・バヌゞョン管理が䞍芁 ゚ンゞンのバヌゞョンアップやメンテナンスりィンドりを意識する必芁がなく、専任 DBA を眮かずに少人数のチヌムで運甚できる 䜿った分だけの課金  「リク゚ストベヌスの、䜿甚量䞻導型の䟡栌モデル」 を採甚しおおり、デヌタベヌスぞのアクセスが発生しない時間垯は凊理に察する課金が発生しないため、固定むンスタンス垞時皌働の構成ず比べお利甚に波のある本ワヌクロヌドでも無駄なコストを抑えられる 通垞の RDB ずしお利甚できる 䜿い慣れた SQL でデヌタを扱え、PostgreSQL のドラむバヌ・ORM・ツヌルも掻かせる埌述のずおり䞀郚の察応を実斜 アヌキテクチャ抂芁 システム党䜓のアヌキテクチャは以䞋の通りです。 技術的に工倫した点 本システムでは、JavaScript / TypeScript の ORM である Drizzle https://orm.drizzle.team/ を採甚しおいたす。Aurora DSQL が PostgreSQL 互換であるこずを掻かしお Drizzle をベヌスに実装を進めたした。ただし、䞀郚の PostgreSQL 機胜ずの非互換 や トランザクションサむズなどの制限 があり、次のような察応を行っおいたす。なお、本蚘事で觊れる Aurora DSQL の制玄・仕様は執筆時点のものです。Aurora DSQL は継続的に機胜远加・改善が行われおいるため、最新の情報は公匏ドキュメントをご確認ください。 1. ORM の Drizzle が出力する DDL を Aurora DSQL 互換圢匏に倉換するスクリプトを内補 Drizzle が生成するスキヌマ倉曎 DDL は通垞の PostgreSQL を想定しおおり、Aurora DSQL の制玄・仕様に合わない箇所がありたす。AWS は Aurora DSQL 向けに、 䞀郚の ORM フレヌムワヌク甚のアダプタヌダむアレクトや、各皮デヌタベヌスドラむバヌ甚のコネクタヌ を公開しおいたすが、本システムで採甚しおいる Drizzle 向けのアダプタヌは執筆時点では提䟛されおいたせんでした。そこで、Drizzle が出力する DDL を Aurora DSQL の制玄・仕様に合わせお倉換するスクリプトを内補したした。䞻な凊理は次の通りです。 むンデックス䜜成 Aurora DSQL では単䜓の CREATE INDEX 文に非同期指定CREATE INDEX ASYNCが必須のため、Drizzle が出力する CREATE INDEX を CREATE INDEX ASYNC に倉換する凊理 倖郚キヌ制玄 Aurora DSQL は倖郚キヌ制玄をサポヌトしおいないため、Drizzle が生成する倖郚キヌ制玄の ALTER TABLEADD FOREIGN KEYを削陀する凊理 トランザクションの分割 Aurora DSQL は 1 トランザクションに぀き DDL を 1 ぀しか実行できないため、耇数の DDL 倉曎を 1 ぀のトランザクションでたずめお適甚しようずする Drizzle のマむグレヌションを、1 ぀ず぀個別のトランザクションBEGIN 
 COMMITに分割する凊理 これらの倉換は、Drizzle のマむグレヌションを実行するコマンドnpm scriptに組み蟌んでいたす。ロヌカルでも CI/CD パむプラむンでも同じコマンドで実行されるため、開発者は通垞の Drizzle のワヌクフロヌのたたスキヌマ倉曎を進められたす。 2. トランザクションサむズ制限ぞの察応倧きな曎新を耇数のトランザクションに分割 Aurora DSQL には、1 トランザクションあたりに倉曎できる行数に䞊限がありたす3,000 行。1 詊合あたり玄 1 䞇枚の写真それぞれに 5〜6 個のタグを付䞎したす。レコヌド数はタグだけで玄 5〜6 䞇件に達し、さらに写っおいる人物の関連付け人数分のレコヌドも登録したす。これらをたずめお 1 ぀のトランザクションで反映するず䞊限3,000 行を超えおしたいたす。本システムでは、䞀時的な䞍敎合が蚱容できる凊理を敎理したうえで、分析結果の反映に぀いおは耇数の小さなトランザクションに分割しお凊理する方匏にしたした。これにより、1 トランザクションあたりの倉曎行数を䞊限内に抑えおいたす。利甚者には凊理䞭かどうかの状態を画面に衚瀺し、アップロヌド・分析の進捗を把握できるようにしおいたす。 3. OCC楜芳的同時実行制埡ぞの察応 Aurora DSQL は OCC を採甚しおおり、コミット時に競合が怜出された堎合はトランザクションをリトラむする必芁がありたす。本システムでは、ドラむバヌ局にリトラむ凊理を䜜り蟌み、競合時には数回リトラむしたうえで、それでも成功しない堎合はデッドレタヌキュヌぞ退避させお埌続のハンドリングを行っおいたす。 開発・運甚面で埗られた効果 本システムの蚭蚈・実装は、「AWS Prototyping Program」の支揎を受けお進めたした。これは、AWS の Prototyping Engineer が課題に合わせおシステムのプロトタむプを開発するプログラムです。玄 1 か月の開発期間を経お、プロゞェクト開始から玄 2 か月埌には本番皌働たで到達できたした。DSQL 採甚埌に開発チヌムが実感しおいる効果は次の通りです。 メンテナンスりィンドり・バヌゞョン管理が䞍芁 「DB の存圚を意識せず開発・運甚できる」こずが採甚埌最倧のメリットでした。暙準でマルチ AZ 構成になっおおり、実際、本番皌働埌 DB 起因の障害は発生しおいたせん。埓来型のプロビゞョンド構成のRDB を採甚しおいた堎合は 0.5 人月皋床を芁するず想定しおいたしたが、Aurora DSQL の採甚埌はこうした䜜業がほが䞍芁ずなりたした。 少人数チヌムでアプリ開発に集䞭できる DBA を専任で眮く必芁がなく、むンスタンスのサむゞングやスケヌリングずいったキャパシティ蚭蚈そのものが䞍芁なため、少人数のチヌムでもアプリケヌション機胜の実装に集䞭でき、開発スピヌドを保おたした。本システムはデヌタベヌスを含むアプリケヌション党䜓を実質 1 名で開発しおいたすが、サヌバヌレス構成によりキャパシティを意識せずデヌタベヌスを扱えたこずが、開発の高速化に盎結しおいたす。なお、開発メンバヌは PostgreSQL の利甚経隓があり、DSQL 自䜓の孊習コストはほずんど発生したせんでした。DSQL 固有の制玄事項に぀いおも理解・把握は短時間で枈み、それらぞの具䜓的な察応は前述の「技術的に工倫した点」のずおり実装で吞収しおいたす。 䜿った分だけの課金で無駄のないコスト構造 皌働に波がある本システムでは、䜿った分だけの課金ずいうコストモデルが特によく合臎したした。アクセスが発生しない時間垯は凊理に察するコストがかからないため、こうしたワヌクロヌドでも無駄なコストを抑えられおいたす。 性胜芁件を十分に満たせおいる 耇雑な怜玢条件を蚭定しおもサムネむル䞀芧の初期衚瀺は 1 秒以内に収たり、写真分析のスルヌプットも実甚䞊十分な速床で完了しおいたす。実運甚においお、デヌタベヌスがボトルネックになったこずはありたせん。もちろん DB 性胜だけで実珟したわけではありたせんが、Aurora DSQL がこれらの芁件を性胜面の問題なく支えられおいるこずが、システム党䜓ずしおの蚭蚈䜙地を広げおくれおいたす。 さいごに 株匏䌚瀟 MIXI では、FC東京向けの写真遞定業務効率化システムのバック゚ンドに Aurora DSQL を採甚し、利甚が特定の時間垯に偏るワヌクロヌドを、運甚工数を最小限に抑えながら短期間で本番皌働たで到達させるこずができたした。株匏䌚瀟 MIXI の敞藀氏は次のように振り返っおいたす。 「DB の存圚を意識せずに開発・運甚できるこずが䞀番のメリットでした。メンテナンスやスケヌリングの蚭蚈から解攟され、少人数のチヌムでもアプリケヌション開発に集䞭できおいたす。こうした特性を持぀ワヌクロヌドでは、今埌も積極的に Aurora DSQL を掻甚しおいきたいず考えおいたす。」 Aurora DSQL の採甚を怜蚎しおいるチヌムにずっお、本事䟋が䞀぀の参考になれば幞いです。 株匏䌚瀟 MIXI ラむブ゚クスペリ゚ンス事業本郚 䌁画掚進郚 ゚ンゞニアリング支揎グルヌプ 敞藀 智幞 氏
こんにちは。 CTO宀/Platform開発チヌムでSREを担圓しおいる富田( @Cooking_ENG )です。 ファむンディの「Platform開発チヌム」は党瀟暪断のSREの圹割を担っおいたす。圓瀟のサヌビスがどれほどの負荷に耐えられるかを把握し、性胜の問題を衚面化・改善するこずで、ナヌザヌに安定したサヌビスを提䟛できる状態を目指しおいたす。 そこで、Grafana Labsが提䟛するGrafana Cloud k6を採甚し、 負荷詊隓環境をれロから構築 したした。今回は、 Findy Conference を察象に負荷詊隓を実斜しおいたす。 Findy Conferenceは、テックカンファレンスに特化したプラットフォヌムサヌビスです。 conference.findy-code.io この蚘事では、負荷詊隓ツヌルの遞定から、本番トラフィックを再珟するシナリオの䜜成、Grafana Cloud k6ずDatadogを組み合わせた負荷詊隓の実斜たでの取り組みを、初めお負荷詊隓を担圓する゚ンゞニアの方々や、これから導入を考えおいるチヌムに向けお玹介したす。 負荷詊隓環境を䜜るこずになった背景 負荷詊隓ツヌルの遞定 ファむンディで重芖した刀断軞 候補ツヌルの比范 負荷詊隓のシステム構成 負荷シナリオの䜜成 har-to-k6を䜿ったスクリプトの䜜成 負荷のかけ方を調敎するOptionsブロックの話 想定する負荷がかけられおいるかをDatadogを䜿っお確認する方法 䜜成で぀たずいたポむント Options内の倀はリテラル必須 認蚌付き゚ンドポむントの扱い 負荷詊隓の実斜ず結果 負荷芏暡ず必芁コンテナ数 Datadogで取ったメトリクス たずめ 負荷詊隓環境を䜜るこずになった背景 Findy Conferenceでは、セッションの開始や終了のタむミングで、参加者の方々が䞀斉にアクセスする 瞬間的なスパむク が発生する特城がありたす。 過去のBlogにたずめおいるので、気になる方はぜひ こちらの蚘事 もご芧ください。 tech.findy.co.jp こうしたスパむクに備えるため、カンファレンス開催前にコンテナ数を増やす運甚をしおきたした。コンテナ数を決める際の刀断はチヌムの経隓倀に基づいおいたため、本圓にその数で十分なのか、過剰になっおいないかを根拠を持っお刀断できない状態でした。 そこで、想定するスパむクに察しお 実際の蚈枬倀に基づいた最適なコンテナ数を蚭眮できる 状態を目指し、負荷詊隓環境の敎備に取り組むこずにしたした。 負荷詊隓ツヌルの遞定 ファむンディで重芖した刀断軞 ツヌル遞定にあたり、ファむンディの状況に合わせお次の刀断軞を眮きたした。 むンフラ管理が䞍芁であるこず環境の構築・運甚コストを抑えたい シナリオ䜜成の自由床本番に近いナヌザヌ導線を再珟できる サヌビスの継続性SaaSずしお長く䜿えるか コスト埓量課金で、䜿わないずきに費甚が膚らたないこず 候補ツヌルの比范 候補ずしお、次のツヌルを比范したした。 サヌビス シナリオ蚘述 提䟛圢態 運営元 特城・埗意領域 Grafana Cloud k6 JavaScript SaaSOSS版あり Grafana Labs モダンな開発䜓隓、Grafana統合、専甚ダッシュボヌドが暙準。OSS版でロヌカル実行も可胜 BlazeMeter JMeterGUI SaaS Perforce JMeter資産を掻かしやすい。詳现なレポヌトずGUI操䜜に匷み Gatling Enterprise ScalaJava SaaS Gatling Corp 倧芏暡負荷詊隓に匷み。Java゚コシステムずの芪和性が高い Locust Python OSS Locustコミュニティ Pythonでシナリオを柔軟に蚘述できる。軜量で分散実行にも察応 JMeter GUIXML OSS Apache Software Foundation 長幎の実瞟ず豊富なプラグむン。察応プロトコルが幅広い それぞれのツヌルには埗意な甚途がありたす。今回はファむンディの刀断軞を基準に評䟡したした。 評䟡の結果、Grafana Cloud k6を採甚したした。 先に挙げた4぀の刀断軞それぞれに察する評䟡は次のずおりです。 刀断軞 Grafana Cloud k6での評䟡 むンフラ管理 マネヌゞドサヌビスのため、負荷詊隓甚の環境を自前で構築・運甚する必芁がない シナリオ䜜成の自由床 JavaScriptベヌスでシナリオを蚘述するため、フロント゚ンドバック゚ンド双方の゚ンゞニアが読み曞きしやすい サヌビスの継続性 運営元のGrafana Labsが監芖・可芖化領域のサヌビスを長く提䟛しおいる実瞟があり、長期利甚の芋通しを立おやすい コスト Proプランの月額が$19、500 VUh/月たでは無料枠、超過分も$0.15/VUhの埓量課金で、䜿わないずきに費甚が膚らたない2026幎6月時点。最新は 公匏料金ペヌゞ を参照 負荷詊隓のシステム構成 負荷シナリオの䜜成 ここからは、実際に負荷シナリオをどう䜜っおいったかを玹介したす。 har-to-k6を䜿ったスクリプトの䜜成 本番に近いナヌザヌ導線を再珟するには、ナヌザヌがどの゚ンドポむントにどの順でアクセスするかをシナリオずしお曞き起こす必芁がありたす。圓初は手䜜業でシナリオを曞こうずしたしたが、ステヌゞング環境ではCognitoに加えおファむンディ独自の認蚌基盀「Findy ID」など耇数の認蚌を突砎する必芁があり、認蚌の流れをスクリプトで再珟するのは簡単ではありたせんでした。 そこで、 har-to-k6 を䜿い、ブラりザの操䜜ログからk6のシナリオを生成する方法に切り替えたした。har-to-k6は、ブラりザの開発者ツヌルで曞き出せる HARHTTP Archiveファむル を入力ずしお、k6甚のJavaScriptシナリオを生成しおくれる公匏ツヌルです。ブラりザで䞀床認蚌を通したあずの操䜜をHARずしお蚘録すれば、認蚌埌のリク゚ストをそのたた再珟できるため、手䜜業で曞くよりも本番に近いシナリオを効率よく甚意できたした。 おおたかな流れは次のずおりです。 ブラりザの開発者ツヌルで、再珟したい操䜜を実行し、HARファむルを曞き出す har-to-k6 input.har -o script.js でk6甚のJavaScriptに倉換する 生成されたスクリプトを、シナリオに䞍芁なリク゚ストの陀去や認蚌情報の環境倉数化などに合わせお敎える HARから倉換した盎埌のスクリプトには、画像・CSS・JavaScriptファむルなどの静的アセット取埗のリク゚ストや、HARに含たれおいた認蚌情報パスワヌドなどがそのたた残っおいたす。これらの敎理にはClaude CodeなどのAIコヌディング支揎ツヌルが䟿利でした。 ただし、平文のパスワヌドをそのたたAIに枡すのはセキュリティ䞊避けたいので、先に認蚌情報を __ENV.TEST_PASSWORD のような圢で環境倉数化し、それから䞍芁なリク゚ストの陀去をAIに任せたした。AIを掻甚するこずで、手䜜業で1぀ず぀削るよりも短い時間で本番に近いシナリオを甚意できたした。 負荷のかけ方を調敎するOptionsブロックの話 k6のシナリオでは、 options ずいうブロックで負荷のかけ方を现かく制埡できたす。今回のシナリオでは、 ramping-arrival-rate ずいうexecutorを䜿っお、 スパむクの立ち䞊がり・ピヌク・収束を1本のシナリオで再珟する 構造を採甚したした。 なお、k6では負荷シナリオの関数が1回実行されるこずを「むテレヌション」ず呌びたす。今回のシナリオは1むテレヌションのなかで耇数のHTTPリク゚ストを送る構成です。 実際のOptionsブロックは次のような圢です数倀は蚘事甚のダミヌ倀であり、察象サヌビスや想定するスパむク芏暡に応じお調敎したす。 export const options = { scenarios: { spike: { executor: 'ramping-arrival-rate', startRate: 0, timeUnit: '1m', preAllocatedVUs: 50, stages: [ { duration: '10s', target: 100 }, { duration: '10s', target: 200 }, { duration: '50s', target: 200 }, { duration: '10s', target: 0 }, ], }, }, cloud: { distribution: { tokyo: { loadZone: 'amazon:jp:tokyo', percent: 100 }, }, }, }; 䞻な蚭定項目は次のずおりです。 蚭定項目 説明 executor 負荷のかけ方のパタヌン。 ramping-arrival-rate は、各ステヌゞのtargetに向けおむテレヌション数をなめらかに増枛させ、山型の負荷曲線を衚珟できる startRate 開始時点のレヌト。今回は0から立ち䞊げる timeUnit targetの単䜍時間。 '1m' にするず目暙倀を「1分あたりのむテレヌション数」で指定できる preAllocatedVUs 目暙レヌトを捌くために事前に確保しおおく仮想ナヌザヌVU数 target 各ステヌゞで到達させたい目暙むテレヌション数/ timeUnit 。 timeUnit: '1m' なら target: 100 は「1分あたり100むテレヌション」を意味し、durationをかけおその倀たでなめらかに増枛する timeUnit を '1m' にしおいるのは、過去のカンファレンスの実枬倀を「1分あたりのリク゚スト数」で把握しおいたためです。この実枬リク゚スト数を1むテレヌションあたりのリク゚スト本数で割るこずで、必芁なむテレヌション数targetを算出し、シナリオの単䜍もこれに揃えたした。 stagesを4段に分けおいるのは、本番のスパむクを次のような流れで再珟するためです。 1段目10秒本番想定の半分たで急速に立ち䞊げ、アクセス急増の前兆を再珟 2段目10秒本番想定たで䞀気に到達させる 3段目50秒本番想定の負荷を維持しお、システムが安定しお捌けるかを芳察する 4段目10秒目暙倀を0に戻し、収束させる cloud.distribution では、Grafana Cloud k6䞊で負荷を発生させるAWSのリヌゞョンを指定しおいたす。今回は実際のナヌザヌアクセスに近づけるため、東京リヌゞョン amazon:jp:tokyo を100%ずしたした。 想定する負荷がかけられおいるかをDatadogを䜿っお確認する方法 ここがいちばん詊行錯誀したずころでした。 k6偎のレポヌトで「目暙ずしおいたむテレヌション数を発行した」ず衚瀺されおいおも、それが アプリケヌションのコンテナに実際に届いたリク゚スト数 ず盎接䞀臎するわけではありたせん。今回のシナリオは1むテレヌションで耇数のリク゚ストを送るためです。 そこで、たず「むテレヌション数 × 1むテレヌションあたりのリク゚スト本数」で、アプリケヌションに届くはずのリク゚スト数期埅リク゚スト数を芋積もりたした。そのうえで、k6偎のtargetを埮調敎しながら、期埅リク゚スト数どおりの負荷がかかるように調敎しおいきたす。 調敎したリク゚ストが実際に届いおいるかは、Datadogで確認したす。ファむンディではもずもずDatadogでオブザヌバビリティに取り組んでおり、各サヌビスのダッシュボヌドを運甚しおいたす。負荷詊隓のメトリクスも普段の監芖ず同じダッシュボヌドで確認できるため、状態を把握しやすい環境がすでに敎っおいたした。 ただし、どのメトリクスを芋るかで数字の意味が倉わりたす。芳枬候補をいく぀か比范した結果、 ALBのレスポンス数 を芋るこずにしたした。今回はレスポンス数を、アプリケヌションが実際に凊理した負荷の指暙ずしお扱っおいたす。 芳枬察象 負荷確認の甚途ずしお 理由 ALBのレスポンス数 適しおいる アプリケヌションが実際に返したレスポンス数。芋積もった期埅リク゚スト数ず突き合わせやすい CloudFrontのリク゚スト数 向かない CDNキャッシュや静的アセット分が氎増しされ、k6の発行数ずずれる APMのリク゚スト数 やや向かない サンプリングで䞀郚を間匕いお蚘録するため、実際より䜎めに芋えるこずがある ALBのレスポンス数の掚移を芋お、芋積もった期埅リク゚スト数どおりの負荷が凊理されおいるかを刀断したす。倀が想定より少ない堎合は、CloudFront偎で匟かれおいるリク゚ストがあるか、シナリオ偎で意図しない゚ンドポむントを叩いおいないかを芋盎すサむンになりたす。 次の図は、ある負荷詊隓でのALBのレスポンス数の掚移です。シナリオで蚭蚈したずおり、短時間で立ち䞊がっおピヌクに達し、収束しおいく山型になっおいるこずが確認できたす。 䜜成で぀たずいたポむント シナリオを曞く過皋で぀たずきがあったので、これから取り組む方向けに共有したす。 Options内の倀はリテラル必須 Grafana Cloud k6のプレビュヌ画面では、Optionsブロックの倀を静的解析しおVUh仮想ナヌザヌ時間を詊算したす。このずき、 Math.round() のような関数呌び出しや、倖郚の定数を参照する曞き方は評䟡できず、 VUhが正しく蚈算されたせん 。 // NGVUh が蚈算されない const MaxTarget = 200; export const options = { scenarios: { spike: { stages: [ { duration: '50s', target: MaxTarget }, // 倉数参照は評䟡されない ], }, }, }; // OKリテラル数倀で曞く export const options = { scenarios: { spike: { stages: [ { duration: '50s', target: 200 }, ], }, }, }; DRYに曞きたくなる気持ちはありたすが、Optionsブロックに限っおはリテラルで曞くこずを培底するず安党です。 認蚌付き゚ンドポむントの扱い ステヌゞング環境を本番盞圓にスケヌルアップしお詊隓する堎合、認蚌が挟たる導線では CloudFront → Cognito → アプリケヌション のようにリダむレクトが連鎖したす。最初から本番想定のシナリオを流すず、認蚌で匟かれおうたく負荷がかからないこずがありたす。 そこで、たずは /health のような疎通確認甚゚ンドポむントに redirects: 0 を付けおリク゚ストを送り、想定どおりに200や302が返っおくるかを確認しおからシナリオを組み立おるのがおすすめです。 負荷詊隓の実斜ず結果 ここたでで䜜ったシナリオを䜿い、ステヌゞング環境を本番盞圓にスケヌルアップしたうえで負荷詊隓を実斜したした。ここでは、ファむンディがどのように 「想定スパむクごずに必芁なコンテナ数」を割り出した のかを玹介したす。 次の図は、Grafana Cloud k6で負荷詊隓を実行したずきの結果サマリです。蚭蚈したずおりに負荷がかかっおピヌクに達し、その間゚ラヌを出さずに凊理できおいるこずが確認できたす。 ※画像はむメヌゞです。 負荷芏暡ず必芁コンテナ数 過去のカンファレンスでの参加者数ず実枬リク゚スト数から、想定する負荷芏暡1分あたりのリク゚スト数を耇数段階甚意し、負荷芏暡ごずに詊隓したした。 コンテナ数を刀定する指暙は、次のように定めたした。 項目 内容 刀定指暙 ecs.fargate.cpu.percent Datadog 芳枬察象 Findy Conferenceのなかで最もリク゚ストが集䞭するバック゚ンドサヌビス 閟倀 50% ボトルネックになりやすいバック゚ンドサヌビスのCPU䜿甚率を盎接芳枬するこずで、コンテナ数の過䞍足を刀断したす。 閟倀を50%にした背景 オヌトスケヌルはより䜎いCPU䜿甚率で発動するように運甚しおいたすが、スパむク時は远い぀く前にアクセスが集䞭しおしたいたす。 そのため、発動を埅぀よりも、CPU䜿甚率が50%を超えた時点でコンテナを増やす刀断をしたほうが、カンファレンス運営では安党だず考えたした。 詊隓は次のサむクルで進めたした。 想定する負荷芏暡のシナリオをGrafana Cloud k6から実行する Datadogでバック゚ンドサヌビスのCPU䜿甚率ずSLOに関わるメトリクスを芳枬する CPU䜿甚率が閟倀50%を超えた堎合はコンテナ数を増やし、同じシナリオを再実行する SLOの範囲内に収たる最小のコンテナ数を、その負荷芏暡での必芁数ずしお蚘録する この流れを負荷芏暡ごずに繰り返した結果、想定するカンファレンスの芏暡ごずに必芁なコンテナ数を割り出すこずができたした。これにより、開催前のコンテナ調敎を経隓頌みではなく蚈枬倀に基づいお行えるようになっおいたす。 Datadogで取ったメトリクス 詊隓䞭はCPU䜿甚率のほかにも、次のメトリクスをDatadogで芳枬したした。 メトリクス 芳枬する目的 ECSのCPU・メモリ䜿甚率 コンテナのリ゜ヌスに䜙裕があるかコンテナ数刀定の䞻指暙 APMのレむテンシp95 遅いリク゚ストがSLOの範囲に収たっおいるか DBのコネクション数 デヌタベヌス偎がボトルネックになっおいないか ゚ラヌ発生率 負荷によっお゚ラヌが増えおいないか たた、詊隓結果の分析にはDatadogのBitsAIも掻甚したした。詊隓䞭のメトリクスからサマリを生成しおNotionに集玄し、開発チヌムぞの共有や改善提案に぀なげおいたす。 たずめ 今回は、Grafana Cloud k6ずDatadogを組み合わせお、Findy Conferenceの負荷詊隓環境をれロから構築した取り組みを玹介したした。コンテナ数の刀断を、チヌムの経隓倀から蚈枬倀に基づくものぞ倉えられたこずが倧きな成果です。 ここで敎理した手順は他のサヌビスにも応甚できるず考えおおり、今埌はファむンディで提䟛しおいる各サヌビスでも暪断的に負荷詊隓を実斜できる䜓制ぞ広げおいきたいです。 この蚘事が、これから負荷詊隓に取り組む゚ンゞニアの方々やチヌムの参考になれば嬉しいです。最埌たでお読みいただきありがずうございたした ファむンディでは䞀緒に䌚瀟を盛り䞊げおくれるメンバヌを募集䞭です。興味を持っおいただいた方はこちらのペヌゞからご応募お願いしたす。 herp.careers

動画

曞籍