Carpe Diem

備忘録

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つ…

MongoDBでindexを整理する際に使ったコマンド

概要 MongoDBで使っていないindexを整理する際に使ったコマンドのチートシートです。 バックアップ用途の吐き出しコマンドとスプレッドシートで確認しやすくするためのコマンドを主に書きます。 環境 MongoDB v3.6.23 コマンド 以下にそれぞれのケースでのス…

YAMLのような設定ファイルで環境変数を扱う

背景 christina04.hatenablog.com ではconfig.yamlを読み込ませてサーバを起動するのですが、その中にSlackのAPIトークンを入れる箇所がありました。 config.yaml自体はConfigMapで渡しているのですが、中に記述されているAPIトークンは環境変数でSecretで管…

macOSのスクリーンショットをJPEGでクリップボードに保持させる

Mac

背景 macOSではcmd+shift+ctrl+4でスクリーンショットをクリップボードに直接保持させることができます。 これを使ってSlackやらNotionやらに直接貼り付ける事がよくあるのですが、データ量が非常に大きいというデメリットがあります。 というのもmacOSでは …

OpenAPI Specベースのモノリポのドキュメントを1つにまとめる

背景 実装とAPIドキュメントはしばしば乖離して負債になりがちです。なので 実装コードからAPIドキュメントを生成する OpenAPI SpecのようにAPIスキーマから実装コードを生成する(スキーマ駆動) といった方針をとることが多いです。 FastAPIは前者のパター…

Workload Identity Federationを図で理解する

概要 GCPのWorkload Identity連携はサービスアカウントで秘密鍵を作らずともGCPリソースへのアクセス権を他の環境(オンプレ、別パブリッククラウド)に付与することができます。 これにより AWSからGCPリソースにアクセスする GitHub ActionsからGCRにDocke…

BigQueryのIAM設定をアーキテクチャから理解する

概要 BigQueryはIAMロールを設定する際にハマる事が多いので、アーキテクチャを理解しておくときちんと権限付与することができます。 BigQueryのアーキテクチャ BigQueryのアーキテクチャは以下のように ストレージ コンピュート の大きく2つに分かれていま…

CircleCIのsshで困ったこと

概要 CircleCIにはビルドが失敗した際のデバッグ手段としてRerun Job with SSHが提供されてます。 これを押すとEnable SSHというステップが挟まれ、そこに書いてあるsshコマンドをターミナルで実行することでCircleCIで実行中のジョブ内に入ることができます…

CircleCIのDynamic Configで差分ビルド

概要 CircleCIのDynamic Configでconfig.ymlを分割管理する - Carpe Diem ↑ではファイルを分割管理する方法を説明しました。 今回はpath filteringを使って差分ビルド(変更のあるディレクトリのみビルド)する方法を説明します。 環境 CircleCI 2.1 circlec…

CircleCIのDynamic Configでconfig.ymlを分割管理する

背景 CircleCIを使っているのですが 多数のリポジトリを管理している config.ymlが肥大化している。けれど殆どは似たような記述 といった背景がある上で、新しいjobやworkflowを各リポジトリに適用していく際に コピペ漏れが起きやすい レビューがつらい と…

FastAPIでPath Operationに def と async def どちらを使うべきか

背景 FastAPIでは以下のようにデコレータ関数を使うことでHTTPサーバのpathを設定することができ、これをPath Operationと呼びます。 from fastapi import FastAPI app = FastAPI() @app.get("/") async def read_root(): return {"Hello": "World"} @app.ge…

技術ブログを書くための心構えやツール

概要 技術ブログを書くための心構えや使っているツールを紹介します。 心構え まずは意識していることから 人に説明できなきゃ理解してるとは言えない 教えることは二度学ぶこと 人に教えるにはn倍理解してないといけない など色々いい方はありますが、誰か…

Cloud PubSubのOrdering Keyで考慮すること

概要 以下のような購入時のドメインイベントをメッセージング基盤に非同期で渡してから順番通りに実行したい、となった時に便利なのが順序保証をしてくれるPubSubのordering keyです。 購入処理 各マイクロサービスへの状態変更リクエスト 行動ログ追記 購入…

MongoDB Causal Consistency Session

概要 MongoDB Write Concern - Carpe Diem MongoDB Read Concern - Carpe Diem でデータの耐久性・一貫性・分離性・最新性などを保証する方法について説明しました。 しかし、これらの設定だけでは Causal Consistency - Carpe Diem で紹介した因果関係の一…

Causal Consistency

概要 Eventual Consistency(結果整合性)はレプリケーションラグにより「自分が書き込んだデータが読めない」といったような因果関係がおかしくなるケースがあります。 そこでより一貫性の強いものとしてCausal Consistency(因果一貫性)があります。 ※Cas…

MongoDB Read Concern

概要 前回 MongoDB Write Concern - Carpe Diem にてWrite Concernについて説明しました。 今回はRead Concernについて説明します。Read Concernはデータの分離性・一貫性・最新性を考慮する際に気をつけるべき設定です。 環境 MongoDB 3.6+ 前提知識 Point-…

MongoDB Write Concern

概要 MongoDBはデータがどこまで書き込まれたらクライアントにackを返すかという設定ができます。 その設定をWrite Concernといい、メモリまで保存されたのかディスクまで保存されたのか・何台のデータノードにデータが書き込まれたらといった指定が可能です…