Carpe Diem

備忘録

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

背景

CloudFrontにはキャッシュのTTLの設定値が3つあり、

かつオリジンのヘッダーによって挙動が変わります。

docs.aws.amazon.com

久々に触ると忘れてしまうのでフローチャートにしてすぐ理解できるようにします。

続きを読む

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

概要

Too many open files

のエラーが出た際の対策として、ファイルディスクリプタの上限を変更することがあります。
方法として以下の4つがあります。

  1. ulimitで変更する
  2. /etc/security/limits.confで設定する
  3. systemdのサービスの設定でLimitNOFILEを設定する
  4. systemdの全体設定でDefaultLimitNOFILEを設定する

環境

  • Ubuntu v22.04.1
  • Nginx v1.18.0
続きを読む

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: unknown flag: --generator

これの対応方法です。

続きを読む

重み付き乱択を行う

概要

重み付き乱択アルゴリズムは結果に偏りのある抽選で

  • ソシャゲのガチャのようにレアリティによって出現確率を変えたい
  • リクエストを重み付けして分散したり、A/Bテストで99:1のように振り分けたい

といった用途で使えます。

今回はその説明と実装方法の紹介を行います。

環境

Weighted Random Selection

重み付き乱択のイメージとしては以下のようにいくつかの重みがある中で、0〜重みの合計値の範囲でランダム値を生成してどの重みにヒットしたかを返します。

図ではランダム値34が出たため、item Cが結果として返ります。

続きを読む

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

背景

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

しかしマルチプロセスにした場合、Prometheusのメトリクス値が収集するプロセス毎に異なってしまい、本来単調増加するはずの値が増減してしまいおかしなメトリクスになってしまいます。

単調増加せず途中途中で減少する

ref: Strange drops in total requests · Issue #50 · trallnag/prometheus-fastapi-instrumentator · GitHub

そこでPythonのPrometheus clientにはマルチプロセスモードが用意されており、外部共有ファイルにstatsを書き出すことで整合性を保証します。

今回はFastAPIでマルチプロセスモードを用いたメトリクスの収集方法を説明します。

続きを読む

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

概要

Bigtableのデータを他プロジェクトに移したい場合、公式のDataflowテンプレートを用いて以下の図のようにExport & Importできます。

しかしBigtableのデータが多すぎるとImportする際に、

Error message from worker: java.lang.IllegalArgumentException: Key xxxxxx has 141530 mutations, which is over the 100000 maximum.

といったBigtableのquotaエラーが発生することがあります。今回はその対応方法です。

環境

  • maven 3.8.6
  • OpenJDK 11
  • DataflowTemplates 2022-09-05-00_RC00
続きを読む

SCRAM (Salted Challenge Response Authentication Mechanism) 認証

概要

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

今回はそのSCRAMについて図を交えて説明します。

シーケンス

SCRAMのシーケンスは以下です。

続きを読む