Carpe Diem

備忘録

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…

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といい、メモリまで保存されたのかディスクまで保存されたのか・何台のデータノードにデータが書き込まれたらといった指定が可能です…

ターミナルエミュレータをAlacrittyに

概要 これまでデフォルトのTerminal.appを使っていましたが たまに重い 設定をファイルで管理したい True Color対応してない などの不満が出てきたので、上記課題を解決できるRust製のAlacrittyに移行してみました。 環境 Alacritty + tmux + vimの環境です…

SSHにYubikeyを使う

背景 OpenSSH 8.2からU2F/FIDO2デバイスを用いたハードウェア認証に対応しており、仮に秘密鍵が漏洩しても鍵の生成時に利用したデバイス(Yubikeyなど)がないとsshできなくなるというセキュアな対応が実現できます。 以前はOpenPGPに委譲させたり、PIVで対…

YubikeyにGPGの副鍵を転送する

概要 前回作ったGPGの副鍵をYubikeyに移してセキュアに管理できるようにします。 環境 Yubikey 5C NFC(Firmware: 5.4.3) GPG 2.2.32 前提知識 Yubikey 5が持つ機能 Yubikey 5には以下の機能があります。 ref: ワンタイムパスワードトークンYubiKey |(株)ソ…

GPGで主鍵と副鍵を作成する

背景 Yubikeyを新しくしたのでGPGの運用もYubikeyに寄せようと思ったのがきっかけです。 環境 GPG 2.2.32 前提知識 主鍵と副鍵 GPGには主鍵と副鍵の関係があります。またそれぞれ秘密鍵と公開鍵のペアになっています。 これは鍵が漏洩した際にローテーション…

Bigtableで複数クラスタ構成におけるデータ整合性の保証

背景 Bigtableはレプリケーションを有効にしたマルチクラスタ構成にすることで負荷分散、高可用性を保証することが可能です。 一方でマルチクラスタにすることで 単一行のトランザクションが効かなくなる 書き込み後読み取り操作でレプリケーション遅延によ…

Bazel を使う上での Tips

概要 Bazelを導入する過程で学んだTipsをまとめます。 環境 Bazel v4.2.2 Tips bazeliskを使う Bazelのバージョンを環境別に管理したい場合、bazelbuild/bazeliskを使うのが良いです。 .bazelversionに以下のようなバージョンを書いておけばそのバージョンで…

Bazelを使ってみる その6(テスト)

概要 Bazel解説第6弾です。 Bazelを使ってみる その1(Goのビルド) - Carpe Diem Bazelを使ってみる その2(protobufのビルド) - Carpe Diem Bazelを使ってみる その3(docker imageのビルド) - Carpe Diem Bazelを使ってみる その4(gRPCのビルド)…

fatal: could not read Username for 'https://github.com': terminal prompts disabledが出たら

概要 CIツールでプライベートリポジトリをgo getしようとするとたまに遭遇する fatal: could not read Username for 'https://github.com': terminal prompts disabled の対応方法をまとめます。 原因 go getはデフォルトだとHTTPSで通信しようとしますが、…