TechFeed Experts Night#17 〜 事例で学ぶSRE 〜 ツール、プラクティスから組織づくりまで https://techfeed.io/events/techfeed-experts-night-17
SRE不在のチームに入って2ヶ月でやったこと負荷試験ツールからはじめるSREプラクティスの導入2023.04.26 TechFeed Experts Night#17@fujiwara
View Slide
@fujiwara面白法人カヤック SREチームgithub.com/kayac/ecspressoAmazon ECS デプロイツールgithub.com/fujiwara/lambrollAWS Lambda デプロイツール
(専任)SRE不在のチームとサービス - SMOUT2018年リリース
SREとしてチームに加わった背景きっかけはEoLElastiCache Redis 3 - 2023年7月31日RDS for PostgreSQL 10 - 2023年7月18日強制アップデートを伴うEoLがあるが手が回らない…他にもサーバーコストを削減したいCIに強すぎる権限がついているので絞りたいサービスの安定性を高めたい、監視を整備したい1億行のテーブルから9000万行消してALTERしたい(とりあえず期間限定で) SREの手助けが欲しい
(専任)SRE不在だが、よくメンテされているRails 5.1 → 6.1Dependabotによる定期的なアップデートElasticBeanstalk → ECS手作業でのインフラ管理 → Terraformデプロイ → CircleCIやる気も能力もある。DevOpsできている(自分は期間限定なので) 今後も使える考え方や手法を導入するのがよさそう単に「作業を代わりにやりました」で終わらないように
最初にやったこと - Grafana k6 による負荷テストシナリオGrafana k6 is an open-source load testing tool that makes performance testing easyand productive for engineering teams. k6 is free, developer-centric, and extensible.OSSの負荷試験ツールJavaScriptでシナリオを記述できるimport http from 'k6/http'import { check, sleep } from 'k6'export default function () {const data = { username: 'username', password: 'password' }let res = http.post('https://myapi.com/login/', data)check(res, { 'success login': (r) => r.status === 200 })sleep(0.3)}
なぜ負荷試験ツールを最初に用意したかPRコメント引用ElastiCacheのバージョンアップ時のRailsアプリケーション挙動チェックのため、継続的にアクセスがある状態でFailoverを発生させたい。ついでなので、簡単な負荷テストに使える仕組みを整備しました。以下のような用途にも使えるので便利です。ミドルウェアのバージョンアップ(Failover)時の挙動を確認するアプリケーションのパフォーマンス改善時の性能向上を確認するモニタリング整備時に必要な値が取れているかを確認するいろいろ使えて便利だが、知見がないと取っつきづらい簡単なサンプルを最初に書いて、誰でもいじれるようにしておく
用意したシナリオ1. トップページにアクセス2. トップページから呼ばれるAPI(認証なし)を複数並列で叩く3. ログインフォームにアクセス4. ユーザー名とパスワードをPOSTしてログインする5. ログインセッションが必要なAPI(要認証)を叩くコンポーネント(CDN, LB, WebApp, MySQL, Redis)を一通り通過するストレージからの読み込み、書き込み処理が両方あるこれを回しながら作業すると、各コンポーネントのエラーの発生と回復が検知できる
「不安だからメンテ入れましょう」からの脱却どれぐらいエラーが起きるか分からないどれぐらい復旧に時間が掛かるか分からない「怖いので」サービス停止メンテナンスを入れてやりたい知らない = 怖い だけなので、試せばよい(検証環境で)負荷を掛けた状態でバージョンアップ(Failover)する実際にどれぐらいのエラーが発生して、回復するか観察する普段発生しているエラー数、頻度と比較してメンテナンスの必要性を考える→ 「エラーバジェット」「SLO」の考え方に繋がる
結果的にはk6で負荷を掛けながらノーメンテでいろいろできたElastiCache Redis のバージョンアップRDS Blue/Green Deployments の昇格切り替え時の接続エラーを踏む役目をk6が肩代わりしてくれる(再接続される)ため、実際の利用者が目にしたエラーは数件程度今後も使える手法を導入できた
他にもやったことはいろいろ(略)Cache専用Memcached廃止 → Redisに統合1億行のテーブルから9000万行削除してALTER出たばかりの RDS Blue/Gren Deployments を使ってノーメンテでMySQL DBのインデックス最適化インデックスショットガン状態で書き込み負荷が高かったsys.schema_unused_indexesを見て不要なインデックス削除最適な複合インデックス作成インスタンスサイズ半分のRI購入でコスト大幅削減Redash 5(EC2) → 10(ECS)CircleCI OIDC化Mackerel導入
まとめチームに「エラーバジェット」「SLO」の考え方を導入するため負荷試験ツールをまず入れてみたSREは「エンジニアリング」の手法専任のSREエンジニアだけがやるものではないソフトウェアで扱える手法から導入していくとよいのでは