Carpe Diem

備忘録

Bitwardenでsshキーを管理する

背景 仕事だと定期的にPCを交換しますが、そのたびにsshキーを全て最初から登録し直すのは非常に大変です。 かといって.sshをdotfilesとしてGitHubに管理したり、手動でコピーするのも転送経路をどうするかとか前PCから消し忘れたりとセキュリティ的に心配に…

MongoDB AtlasでContinuous Cloud Backupを有効化してRPOを小さくする

概要 MongoDB AtlasではContinuous Cloud Backupという機能を用いることでRPO(Recovery Point Objective)を1分にすることが可能です。 Dedicated Cluster Backups — MongoDB Atlas その他のストレージやデータベースではPoint in Time Recover/Restoreとい…

IstioのDestination RuleでCircuit Breakerを適用する

概要 christina04.hatenablog.com ではEnvoyでのCircuit Breakerの設定や挙動について説明しました。 IstioではDataPlaneにEnvoyを使っているので同じ様にCircuit Breakerを使えますが、設定するコンポーネントとしてはDestination Ruleになります。 Istio /…

KubernetesのPodを安全に終了する(istio-proxy編)

概要 前回KubernetesのPodの安全な終了方法について図を交えて解説しました。 christina04.hatenablog.com 今回はistio-proxy(envoy sidecar)がある場合の安全な終了方法について説明します。 環境 Kubernetes v1.21.14 Istio 1.16.0 Envoy 1.24.1

Prometheusのrateを理解する

背景 Prometheusでメトリクスを可視化する際にPromQLを使います。その中で最もよく使うのがrate()関数ですが、 window, interval, resolutionの違い irate()関数との違い など疑問に思ったので一度きちんと整理してみます。 環境 Prometheus v2.40.5 range v…

Kubernetesの初学者がlabelについて気になること

概要 ラベルという名前ゆえか若干軽視されがちですが、Kubernetesにおいてlabelはリソースを識別する上で非常に重要な要素です。 そのlabelについてKubernetesの初学者が気になる(自身も気になった)ことを挙げて行きます。 気になること Deploymentにあるl…

KubernetesのPodを安全に終了する

概要 KubernetesのPodを安全に終了する際に気をつけるべき事前知識と設定方法について説明します。 あらかじめまとめると 新規リクエストのルーティングがなくなるまでpreStopでPodのアプリケーションコンテナの終了開始を待たせる 既存リクエストが全て処理…

Envoyで重み付き負荷分散を試してみる

概要 christina04.hatenablog.com の中でconfig.route.v3.RouteActionに重み付き負荷分散(weighted load balancing)の設定がありました。 これを利用することで カナリアリリース リクエストのサンプリング 一部だけ詳細なログやstatsを出す Mountebankのよ…

EnvoyのVirtual hostを読み解く

概要 EnvoyのルーティングはListener > Network filter chain > HCM(HTTP connection manager)のVirtual Hostで適用されます。 設定の一部は配列で複数設定することができますが、ものによっては 一致率が高いものから順に適用する(完全一致→部分一致→ワイ…

RedisのLua Scriptを使う

概要 前回PipelineやMultiでは読み出したデータを意思決定に使えないという課題があり、代わりにWatchで楽観ロックを用いるという旨を説明しました。 christina04.hatenablog.com Lua Scriptを使えば楽観ロックを用いずとも上記の課題を解決することができま…

RedisのPipeline, Multi, Watchの区別

概要 RedisのPipeline, Multi, Watchの区別をする上であまりシーケンス図を用いた説明がなかったので図示してみました。 解説 Pipeline 課題 通常複数の処理を実行しようとすると以下のような流れになります。 シンプルではありますが都度サーバ通信が入ると…

スクリーンショットをYoinkに直接送る

背景 以前以下の対応を行いましたが、 christina04.hatenablog.com 最後に書いてあるようにある程度ファイルは小さくなったもののクリップボード経由だとまだまだ大きく、結局スクリーンショットを保存したディレクトリから貼り付ける習慣になってしまいまし…

CloudFrontのキャッシュのTTLをフローチャートにした

背景 CloudFrontにはキャッシュのTTLの設定値が3つあり、 Minimum TTL Default TTL Maximum TTL かつオリジンのヘッダーによって挙動が変わります。 docs.aws.amazon.com 久々に触ると忘れてしまうのでフローチャートにしてすぐ理解できるようにします。

ファイルディスクリプタ数の上限を変更

概要 Too many open files のエラーが出た際の対策として、ファイルディスクリプタの上限を変更することがあります。 方法として以下の4つがあります。 ulimitで変更する /etc/security/limits.confで設定する systemdのサービスの設定でLimitNOFILEを設定…

kubectl run --generator run-pod/v1 が使えなくなっていた

背景 Kubernetes上でサクッと動作検証でPodを立てたい時に kubectl run \ --generator run-pod/v1 \ --namespace $NAMESPACE \ --image google/cloud-sdk:alpine \ --rm -it gcloud-test とやりますが、今実行すると以下のようにエラーになります。 error: u…

重み付き乱択を行う

概要 重み付き乱択アルゴリズムは結果に偏りのある抽選で ソシャゲのガチャのようにレアリティによって出現確率を変えたい リクエストを重み付けして分散したり、A/Bテストで99:1のように振り分けたい といった用途で使えます。 今回はその説明と実装方法の…

FastAPIのメトリクスをマルチプロセスモードで収集する

背景 PythonはGILがあるためマルチコアの恩恵を受けづらいです。そのためGunicornのようなプロセスマネージャを利用してマルチプロセスで稼働させ、パフォーマンスを上げるといった手法があります。 しかしマルチプロセスにした場合、Prometheusのメトリクス…

DataflowのAvro to BigtableテンプレートでQuotaエラーが発生した場合の対応

概要 Bigtableのデータを他プロジェクトに移したい場合、公式のDataflowテンプレートを用いて以下の図のようにExport & Importできます。 しかしBigtableのデータが多すぎるとImportする際に、 Error message from worker: java.lang.IllegalArgumentExcepti…

SCRAM (Salted Challenge Response Authentication Mechanism) 認証

概要 MongoDBやPostgreSQLでは認証時にSCRAM (Salted Challenge Response Authentication Mechanism) と呼ばれる認証方式を採用しています。 これは従来のチャレンジレスポンス型の認証を改善したものであり、パスワード(ハッシュ値含む)といった機密情報…

マイグレーションデータの完全性をチェックする方法

概要 オンプレからクラウドに移行(マイグレーション)した場合や、クラウド上でセルフホスティングしていたDBをマネージドDBに移行した場合に問題となるのが「データは欠損なく移行されたか」です。 データの数が少なければプログラミングで差分チェックな…

Cloud ArmorのAdaptive Protectionを使ってみる

概要 Cloud ArmorのようなWAFは通常ルールベースで不正なアクセスを制御するため、悪意あるユーザがIPアドレスやパラメータをコロコロ変えたりすると都度ルールを設定する必要が出てきてイタチごっこになりがちです。 そんなケースに対応できるよう、機械学…

GoでネストしたMongoDBドキュメントの部分更新をする

概要 MongoDBが使っているbsonはomitemptyというstructタグが利用可能で、これを使うことでそのフィールドがzero値の際は insert時にフィールドを追加しない(容量の削減) update時にフィールドを更新しない(部分アップデートの簡易化) といったメリット…

gRPCでFieldMaskを使う(更新編)

概要 christina04.hatenablog.com 前回はFieldMaskを使ってオーバーフェッチを避ける方法を説明しました。 今回はMutation(更新)におけるFieldMaskの活用方法を説明します。 環境 Go v1.18.3 protoc-gen-go v1.25.0 protoc v3.19.4 grpc-go v1.47.0 MongoDB…

gRPCでFieldMaskを使う(取得編)

概要 クライアントデバイスが多様化する中、UIに必要なデータもそれぞれ異なるためAPIのオーバーフェッチ(不要なデータの取りすぎ)が課題になってきます。 またマイクロサービス間の通信でも、例えばマスタ系データのうち必要なデータだけ取得して利用した…

Envoyで自動リトライ

概要 ネットワーク越しの通信は基本的に不安定であるため、外部APIとの通信で発生したエラーを都度クライアントに返すとエラー率が上がってしまいユーザ体験が悪くなってしまします。 そこでクライアントに返す前に何度かリトライすることで、エラー率を下げ…

Bazel で multiple copies of package passed to linker の対応方法

概要 Bazelでビルド時に multiple copies of package passed to linker: @io_bazel_rules_go//proto/wkt:field_mask_go_proto @org_golang_google_genproto//protobuf/field_mask:field_mask のようなエラーが出た時の対応です。 環境 Bazel 5.0.0 gazelle 0…

Envoy の Adaptive Concurrency で動的に流量制限をする

概要 christina04.hatenablog.com で説明したように、Circuit Breakerのパラメータ調整は大変です。 実際のキャパシティよりパラメータを小さくしてしまうと、リソースはまだ余裕があるのにOpenしていまいます。 逆にパラメータが大きすぎると、Openが遅れサ…

EnvoyのYAMLの読み方

概要 Envoyのyamlは非常に長大で初めて読む人からするととても分かりにくいです。 しかし実際は各要素の役割を理解するととてもシンプルに構成されていることが分かります。 そのための手助けとしてこちらで図を交えながら説明します。 環境 Envoy 1.22.0 要…

外部サービスへのリクエストにEnvoyのCircuit Breakerを設定する

概要 サービスの信頼性を高めるため、依存するマイクロサービスが落ちても障害範囲をそこだけに留め、それ以外のマイクロサービスは稼働し続けるのが理想です。 自分たちのサービスであれば各マイクロサービスにCircuit Breakerを設定することで、スローダウ…

Envoy Circuit Breakerの挙動を確認する

背景 EnvoyにはCircuit Breakerがあり、依存するサービスがスローダウンした際にそれ以上リクエスト送らず即座に503を返すことでサービスが死なないようにする仕組みがあります。 しかしパラメータの調節が難しく、期待した挙動にならないことが多いため1つ…