Hateburo: kazeburo hatenablog

SRE / 運用系小姑 / Goを書くPerl Monger

買ってよかった2022

年末恒例

kazeburo.hatenablog.com

テレビ前に置くスピーカーを買った

www.sonos.com

Apple AirPlay 2対応でBluetoothのような煩雑なことがなく、すぐに音楽を鳴らせるし、音にも満足。

Dolby Atmos対応になったので、2本(?)ほど4K ULTRA HD Blu-rayを買った。

ロード・オブ・ザ・リングの方は劇場版とスペシャル・エクステンデッド・エディションのHDと4Kあわせて18枚セット。当然まだ全部みきれてない。

次はサブウーファーが欲しいな。Sonos Sub Miniかわいい。いつかのMac Proみたい。

ランニンググッズ

走るのは無料だと言ったな。あれは嘘だ。

前半は On の CloudMonster を履いていた。

www.on-running.com

何種類も履き比べてないのですが、地面に足を着いた時の安定性があった。今は普段履きとして使ってる。

後半はasicsのGlideRide 3。みなとみらいのスポーツゼビオで足の形を測ってお勧めされた中から選んだ。

www.asics.com

足の運びはこちらの方がスムーズで走り方に合ってる気がする。

去年買った走る時のポーチもだいぶボロボロになってきたので新しくした。YURENIKUIのベルトタイプ。

yurenikui.jp

体を挟むような形状になっていて安定しやすい。いつもは前に鍵、後ろにスマホをいれてます。

あと膝が痛くなることがあり、サポーターを買ってみた

タイツタイプと

膝サポーター

どちらも走るのが楽になってとてもよかった。

ただ、無理はよくない。1-2月、10月あたりは膝が痛く走るのをやめてウォーキングなどに切り替えていた。

12月はここまで133km程度。

体重も減ってる。

1月にハーフマラソン挑戦なのでがんばるぞー

hitech-half-marathon.net

今年つくったSRE室でチーム開発の体制もよくしていくための取り組みを開始している。そのひとつとして、「LeanとDevOpsの科学」は、さくらのクラウドのバックエンドチームのリーダーと一緒に読書会を始めた。

チームトポロジーは読みやすく、図もあるので社内で話するときにイメージが合わせやすいという利点ある。

社内で書籍購入制度が整備されたのでしっかり有効につかっていく所存。

来年は何買うかな~

sleepy コマンド

さくらのアドベントカレンダー2022 13日目の記事です。

qiita.com

サーバ運用を行なっていると、非同期で行われるサーバの設定反映や起動を待ったり、メンテナンス後に監視を再開する前にすこし待つなんてこともあるかと思います。

そんな時に、人力で3分待ったらコマンドを打つ、Webコンソールを操作するなんてやっていると人間「必ず」忘れます。監視のメンテナンスモードの解除などを忘れてしまうとそれこそ事故につながります。チェックリストを利用した対策もありますが、技術的に解決するのが望ましい姿です。

そこで、よくやってきたのがsleepコマンドと組み合わせて

sleep 180 && mkr update --st working 

とする方法。(サンプルとしてMackerelでサーバのステータスを変更しています)

このように実行しておけば、自動で3分後にmkrコマンドが実行され、サーバの監視をもとに戻してくれます。この方法をしばしば使っていたのですが、ひとつだけ不満がありました。

それは、今どれくらいsleepしたのか分からない、あとどれくらいでmkrコマンドが動くのかを知りたいというものです。

date && sleep 180 && mkr update --st working 

このようにdateコマンドを最初に実行すれば、あとどれくらいだろーと気になった時にターミナルに表示された時間と今の時間と見比べれば、あとどれくらいで完了するのかわかるかもしれません。が、もう少し怠惰にしたいです。

ということで、なんか作るかなと思いつつ、twitterでぼやいてみました。

すると、わずか19分後に完成していました。チャットAIさんもびっくりな速さです

mattnさん速すぎです。

せっかくなので、自分の利用に合うように、小数点を含む秒数infinityのサポートと経過時間の表示を追加してもらい、お仕事でも使ってます。

以下は監視を一時的に止めつつ、さくらのクラウドでサーバのスペックを変更する例。

mkr update --st maintenance <hostId>
usacloud server shutdown <hostID> —zone <zone> -y
usacloud server update <hostID> --zone <zone> --cpu 3 --memory 4 -y
usacloud server boot <hostID>--zone <zone> -y
sleepy 360
mkr update --st working <hostId>

複数台のサーバのスペックを変更していくような場合には状況が可視化されていると、心理的安全性高く作業にあたれますね。

電子書籍版5/30、紙版6/4「達人が教えるWebパフォーマンスチューニング 〜ISUCONから学ぶ高速化の実践」が発売されます!

共著で執筆しました「達人が教えるWebパフォーマンスチューニング 〜ISUCONから学ぶ高速化の実践」が発売されます。紙版は6/4日発売、電子書籍版は本日5/30から発売されております。通称 #ISUCON本 です。

ISUCONを例にするWebアプリケーションの主にサーバサイドのチューニングを広く扱うユニークな書籍となっております。ISUCONに参加する方はもちろん、業務でWebアプリケーションの開発運用にあたるエンジニアまで役に立ちそうな内容が盛りだくさんになります。

見本誌が届きましたが、分厚い、そして盛りだくさんな内容となっています。

技術評論社のページ

gihyo.jp

Amazon

ISUCON本 出版記念のイベントも本日やります。お時間あるかた是非どうぞ

isucon.connpass.com

執筆者

著者は、ISUCONの初期から参加者として、あるいは出題者として深く関わってきた豪華メンバーです。

藤原俊一郎さん @fujiwara
2011年より面白法人カヤック。SREチーム所属。ISUCON優勝4回、出題3回

馬場俊彰さん @netmarkjp
株式会社X-Tech 5取締役CTO、株式会社iCARE技術顧問。ISUCON第一回にプロジェクターを持ち込んで参加しSELinux=Enforcingで入賞

中西建登さん @whywaita
株式会社サイバーエージェント所属。ISUCON8にて史上初の学⽣総合優勝

長野雅広 @kazeburo
さくらインターネット株式会社所属。ISUCON1、ISUCON2、ISUCON9予選で問題作成。参加者として優勝も予選落ちも経験

金子達哉さん @catatsuy
株式会社PR TIMES開発本部長CTO。ピクシブ・メルカリを経て現職。ISUCON9予選・ISUCON6本選出題

草野 翔さん @rosylilly
宇宙海賊合同会社代表、株式会社ハンマーキットCTO、株式会社 Tech Consiglie CTO、プロモータル株式会社相談役、IPTech特許業務法人技術顧問。ISUCON9優勝、ISUCON4とISUCON10出題

目次

内容は次のようになっています。チューニングの基礎とモニタリングを最初に扱ったあと、負荷試験を紹介し、データベースやアプリケーションの高速化を扱い、最後にOSなど低いレイヤのチューニングについて書かれています。

また、付録として実際に9章までの知識を使っての private-isu のチューニングの事例、またISUCONのベンチマーカを実装するというなかなか対象読者が限られてしまいそうですが、知ると世界が広がる面白い内容もあります。

1章 チューニングの基礎知識 (@netmarkjp)
2章 モニタリング (@whywaita)
3章 基礎的な負荷試験 (@fujiwara)
4章 シナリオを持った負荷試験 (@fujiwara)
5章 データベースのチューニング (@kazeburo)
6章 リバースプロキシの利用 (@catatsuy)
7章 キャッシュの活用 (@catatsuy)
8章 押さえておきたい高速化手法 (@catatsuy)
9章 OSの基礎知識とチューニング (@whywaita)
付録A private-isuの攻略実践 (@fujiwara)
付録B ベンチマーカーの実装 (@rosylilly)

私の担当は、5章データベースです。データベースで扱う範囲は広く、本書の中で最もページ数の多い章となっています。NoSQL、NewSQLなどデータベースの種類を紹介し、データベースの負荷を知る方法として private-isuを題材にPROCESSLISTやスロークエリログ、pt-query-digestをあげ、そこで見つけた課題をインデックスやN+1を紹介することで解いていける内容となっています。

5-1 データベースの種類と選択
5-2 データベースの負荷を測る
5-3 インデックスでデータベースを速くする
5-4 N+1とは
5-5 データベースとリソースを効率的に利用する
5-6 まとめ

データベースは、ISUCONではありませんが、実際の業務ではクラウドのマネージドサービスを使うことがかなり多くなっているかと思います。執筆時にも悩みポイントではあったのですが、5章では具体的なクラウドの使い方は扱ってなく、ISUCONをベースに書かせていただいています。ISUCONの問題は今でも有用なものが多く、実際のクラウドでのパフォーマンスの問題も解決できるはずです。

本書のねらい

2019年のISUCON9の予選の問題を bokko, catatsuy, sota1235 とやらせていただいたのですが、そこで意識していたのは、着実にスコアがあがる設計をして、参加者の方にISUCONやパフォーマンスチューニングが楽しいと思っていただくということがありました。

この本もやはり、ISUCONやパフォーマンスチューニングの最初の一歩を踏み出せるよう書かせていただきました。プロファイリングを行い、そこから問題点を見つけ、修正する。そしてプロファイリングをしてみると、チューニングの作業は地味にみえるかもしれません。ただ、やれることが増え、目に見える形で結果が改善するとその分楽しくなるはずです。

内容が多く、一度に読むことは難しいかもしれません。1章から付録まで気になるところから行ったり来たり、繰り返し読んだりすることをお勧めします。

謝辞

技術評論社の皆様、共著者の皆様、レビューに協力していただいた皆様、ISUCONを運営しているLINE株式会社の皆様(特に@941さん)、大変ありがとうございました。

今日のワンライナー:meminfoを調べる

某サーバのメモリ使用量に納得がいかないので、わかりやすく表示するワンライナーを書いた。

# cat /proc/meminfo |perl -E 'while(<>){m!^(.+):\s*(\d+)! and $h{$1}=$2} END { @active=qw/MemFree Active(file) Inactive(file) Unevictable Active(anon) Inactive(anon) SReclaimable SUnreclaim KernelStack PageTables VmallocUsed/; map { say "$_\t$h{$_}"; $total+=$h{$_} } @active; say "--"; say "MemTotal\t$h{MemTotal}";say "*Unknown\t".($h{MemTotal}-$total) }'
MemFree 237356
Active(file)    355420
Inactive(file)  171960
Unevictable     15692
Active(anon)    43040
Inactive(anon)  62300
SReclaimable    48644
SUnreclaim      25252
KernelStack     1624
PageTables      7384
VmallocUsed     0
--
MemTotal        993172
*Unknown        24500

Unknownが700MBぐらいになるサーバあって悩んでいます。

以下の記事を参考にさせていただきました。

qiita.com

買ってよかった2021

今週のお題「買ってよかった2021」

去年、Apple Watchを買って

kazeburo.hatenablog.com

如何に動いてなかったかが可視化されてしまったのを契機に、今年の年明けから朝の時間に運動(ウォーキングのちにランニング)するようにしました。子供たちを学校に送りだして、仕事する前にやってます。

そうだ運動をしよう

坂道・階段があるコースを30分ぐらいで3km弱歩いていたのですが、歩いている途中に音楽聴いたりしたいなということで、骨伝導イヤホンを買書いました。骨伝導なら周りの音も聞こえるので安心です。

f:id:kazeburo:20211231165216p:plain

買ったのは、AfterShokz Aeropex。

たまにオンラインの会議でも使っていて、今年買ってよかったものではかなり上位。

このAfterShokz Aeropexは充電コネクタがマグネット式となっていて、ケーブルを近づけるだけでカチッとくっついて充電ができるのも便利なのですが、そのケーブルがちょいと短いので、USBの延長ケーブルがあると便利です。

ウォーキングをするようになって体重も減り始めたのでスマホ連携できる体重計を買った。メトリクス大事。

置いている場所のせいかスマホへの自動転送の成功率があまり高くはない(手動で読み込みかけると転送できる)けど、体重その他の数値が取れ、グラフになるのはよい。グラフ大事。

f:id:kazeburo:20211231171054p:plain

夏に一旦減りがとまったけど、そのあたりからウォーキングからランニングに切り替えて運動強度をあげました。以前から@fujiwaraさんや@mattn_jpさんが走った結果をtwitterにあげているのをみて、勝手に目標とさせてもらっています。

歩くのにはとくに道具は必要ないですが、走るとなるといくつかあった方がいいものがあって、まずはランニングシューズを、また、マウスカバー(!マスク)、上着、手袋、小物を入れて置けるポーチなどを買いました。

ランニング用のジャケットや手袋は軽くていいですね

この成果もあり、12月には月の走行距離が100kmを超えました。

走り初めは、1km走るのに6分以上かかっていたけど、最近は5分切れるようになってきたので調子にのって来年も怪我に気をつけて頑張りたい。

娘の骨折

11月に、娘が左の肘を骨折して、3週間ほどのギブス生活になった。本人大変だっただろうにがんばった。怪我してすぐは病院でもらった白い布の三角巾で腕を吊っていましたが、結んだり外したりが不便で、結び目が首の後ろということもあり、痛がって外してしまうので、病院で使っていいか確認してメッシュでできたアームホルダーを買いました。

(大サイズ(S)) という表記が気になりますが、脱着も楽なのでギブスがとれるまで、多少ほつれて縫ったりもしましたが毎日使えました。

2ヶ月たって骨折は大分よくなっているので安心です。

リフォームしたのでライトを新調

家を少しリフォームして、仕事の机を置く場所ができたので、その上のライトを新調した。レールはそのまま。

f:id:kazeburo:20211231173826p:plain

INTERFORMという照明・家具のメーカーのもので、おしゃれで気に入っている。

interform-inc.com

リビングの時計もここで買ったものを使っています。

来年は何買うかな~

クラウドサービスにおける ReDoS 対策

正規表現のマッチングにかかる処理時間が指数的に増えることでDoS脆弱性が発生し、それを利用した攻撃を ReDoS 攻撃と呼びます。

詳しくは、

owasp.org

最近書かれた、立命館コンピュータクラブの記事もよくまとまっております。

www.rcc.ritsumei.ac.jp

クラウドサービスにおける ReDoS 対策

f:id:kazeburo:20211224094719p:plain

クラウドのサービスでは、お客様にサーバやミドルウェアの設定として正規表現ワイルドカードを入力していただくことがあります。そうした場合に正規表現がReDoSの対象とならないよう、チェックしなければなりません。

さくらのクラウドのエンハンスドロードバランサではコントロールパネルにてワイルドカードを入力する箇所がいくつかあります。ワイルドカードはL7ロードバランサとして利用しているHAProxyの設定では正規表現に変換されて使用されます。

以前は、マッチングの負荷を抑えるため、ワイルドカード文字 *? を利用する数を数個に制限しておりましたが、現在ではその制限を緩和し、 ReDoS につながる正規表現をチェックする以下のライブラリを使って負荷になる正規表現にならないか確認しています。

github.com

safe-regexのREADMEにも書かれてますが、より正確なチェックをするには別のライブラリがおすすめされています。

github.com

また、立命館コンピュータクラブの記事でも紹介されている recheck もあります。

makenowjust-labo.github.io

今回はワイルドカードからの変換であり、自由に正規表現が指定できないので safe-regex を利用しています。

ワイルドカード文字の個数制限をやめてReDoSチェックの導入する提案はフロントエンドのエンジニアから頂き、開発も一緒にやりました。さくらのクラウドの開発チームはフロントエンド、バックエンド、基盤などの役割を問わず改善のアイディアを出し合って開発を進めています。

正規表現チェックサーバ

さくらのクラウドのコントロールパネルは JavaScript/TypeScript で作られていますので、上記のライブラリはフロントエンドそのまま使えますが、APIや基盤の制御、ミドルウェアの設定の生成をするサーバ側はPHPPerlまたはGoといった言語で書かれているので、そのまま使うことはできません。

そこで、davisjam/safe-regex を呼び出すだけのAPIサーバを Node.js で作り hacobune で動作させ、PHP/Perlから利用するようにしました。小さいAPIを作るのは Mackerel の Plugin をインストールするための release Tag キャッシュサーバ と同じアイディアです。

APIサーバのコードは例によってGitHubにあります。

github.com

使い方

$ docker run -p 3000:300 ghcr.io/kazeburo/safe-regex-api:latest

APIはシンプルに、正規表現をPOSTする形となります。

$ curl -sSf -XPOST --data-urlencode 'regexp=[a-z]+' localhost:3000/is_safe_regexp
{"error":false,"is_safe":true}

expressのmiddlewareの機能により、form-urlencodedまたはJSONでPOSTできます。

curl -sSf -XPOST -H 'Content-type: application/json' -d '{"regexp":"[a-z]+"}' localhost:3000/is_safe_regexp 
{"error":false,"is_safe":true}

安全でない正規表現を送るとis_safefalse となることがわかります

$ curl -sSf -XPOST --data-urlencode 'regexp=(a+)+' localhost:3000/is_safe_regexp
{"error":false,"is_safe":false}

まとめ

  • クラウドサービスでもReDoS チェックやってます
  • Node.jsで極小API書いてhacobuneにデプロイし、サーバ側のチェックを実現しています
  • さくらのクラウドの開発チームでは役割を問わず改善のアイディアを出し合って開発を進めています

hirose31/s3surfer でさくらのクラウド オブジェクトストレージにアクセスする

hirose31さん作のAmazon S3にあるファイルリストの閲覧とファイルのダウンロードにとても便利なツール s3surfer にAPIのエンドポイントURLを切り替えるオプションをつけていただきさくらのクラウドのオブジェクトストレージにもアクセスできるようになりました。

github.com

さくらのクラウドのオブジェクトストレージについてははこちら

cloud.sakura.ad.jp

こちらのサービスではS3互換のAPIを提供させていただいています。

使い方

Mac/Linuxの場合はGitHubのリリースページからバイナリをダウンロードしてインストールできます。v1.0.3 以降で --endpoint-url オプションが使えます。

さくらのクラウドのオブジェクトストレージのAPI Endpointを指定して起動します。その他のS3互換ストレージでも利用できるかと思います。

% s3surfer --endpoint-url=https://s3.isk01.sakurastorage.jp/ 

~/aws 以下に credential があるか、AWS_ACCESS_KEY_ID の設定は必要です。

動作イメージ

bucketのファイル一覧を表示するイメージ

f:id:kazeburo:20211217153313p:plain

ファイルのダウンロードもできました。簡単便利