ふくしま

ソフトウェアエンジニア

Prometheusとアラートが何かを掴みつつある話

背景

Prometheusというものが、メトリクスを保存したり、保存したメトリクスを返してくれるものだと理解していたが、アラートについてはさっぱりよく分かっていなかった。 AlertManagerと関連して理解つつあるので、まとめておく。

アラート機能とは

以下の記事の記載がわかりやすい。

Prometheusのクエリ機能とアラート機能

アラート機能は、監視対象のデータがあらかじめ設定しておいた条件に合致した場合、メールやインスタントメッセージ、チャットなどを使って管理者にその旨を通知したり、指定しておいた外部サービスのAPIを呼び出すというものだ。

ここで大事なのが、「Prometheusでアラート生成を行えるが、それをどこかに通知するにはAlertManagerが必要」ということである。

設定方法

つまり、PrometheusとAlertManagerの両方を設定・デプロイしないといけないということだ(Prometheus Operatorを使用する想定)。 ということで実際の設定を記す。

AlertManagerの設定

  • AlertManagerリソースを作成
  • アラート設定を作成してAlertManagerリソースと紐付け
    • 以下3つがある
      • 設定ファイルをSecretに埋め込む
      • AlertManagerリソースと同じnamespaceにAlertmanagerConfigリソースを作成する。spec.alertmanagerConfiguration を使って指定する
      • spec.alertmanagerConfigSelectorspec.alertmanagerConfigNamespaceSelector を定義して、AlertmanagerConfigs オブジェクトを選択

Prometheusの設定

  • Prometheus と AlertManagerの紐付け
    • Prometheusリソースで spec.alerting.alertmanagers で設定。AlertManagerのServiceを指定する。
  • Prometheus でアラートを生成する条件を設定
    • いわゆるアラートルール
      • ルールというからには結果が bool になる条件式を設定する。
      • それが true になるとメトリクスとして Promehteus に保存される。
      • その条件式は Prometheus Query で記述され、Queryを発行する間隔値も設定できる。
    • PrometheusRuleリソースを作成
    • Prometheusリソースで spec.ruleSelector でPrometheusRuleリソースを指定
    • recording rulesという便利機能を使える: https://prometheus.io/docs/prometheus/latest/configuration/recording_rules/
  • ルールが発火したら、Prometheus Serverから AlertManagerインスタンスに自動で送られるっぽい

参考

KubernetesのOperatorとCRDが何かを掴みつつあるという話

背景

様々な Kubernetest Operator がある。 それが何か理解しつつあるのでまとめておく。

Kubernetest Operatorに対する僕の理解

僕の理解では、「CRD(Custom Resource Difinition)とControllerリソースを用いてあれこれするモジュール」である。 まず、CRDというのは、独自のk8sリソースである。PodとかServiceとかSecretとか公式のリソースのように独自に定義できる。 Controllerというのは、PodというかインスタンスというかCRDを操作する実態である。主に kubernetes API を使ってクラスタ内のリソースを操作したり、外部のAPIを実行したりする。

だから、Kubernetest Operatorの主な仕事は、CRDを定義してContollerを作成すること、だと思う。

例えばPrometheus Operatorでは

CRDとして PrometheusAlertmanager , PrometheusRule などを定義する。 Contorollerとして Deployment を定義している。

だから、Prometheus Operatorをクラスタにリリースすると、それらのCRDの定義そのもの(リソースではない)やPodが作成される。 このリリースにより、PrometheusAlertmanagerといったCRDを使えるようになる(リソースとしてデプロイできる)

Contoroller は、デプロイされたCRDのリソースを使用して、メトリクスを保存したりアラートを送ったりできる。 このContorollerをServiceやらIngressやらを用いて外部に公開していると、PrometheusのUIをWebアプリとして見れたりAPIとしてクエリを実行したりできる。

そういう世界観。

OAuthとかOpenIDConnectがなぜ安全とされるのかBasic認証との対比で考えてみた

疑問に思った背景

Basic認証が危険な理由として「クレデンシャルを直接クライアントからサーバに送るから」という話がある。 確かに、Basic認証はAuthorizationヘッダーにクレデンシャルをエンコードして送りつける。 なんらかの方法でクレデンシャルが盗まれたら(例えばTLS化していない通信で盗聴されたり、サーバに保存されているクレデンシャルがクラックされたり)、即座にサーバにある大事な情報が暴露される。

では、なぜOAuthとかの認証認可フレームワークを使えば、Basic認証よりも安全になるんだろうか?

自分が調べた感じ

一言で言えば「認可サーバがアクセストークンを発行し、アクセストークンの検証を行うから」だと思う。 具体的には、クライアントと認可サーバがクレデンシャルのやり取りをし、認可サーバがアクセストークンを発行する。サーバはクライアントから送られたアクセストークンを認可サーバに確認する。

つまり、発行と検証のステップを認可サーバに移譲することで、クライアントとサーバの通信でクレデンシャルを直接扱わないようにしている。 サーバはクレデンシャルを保存しなくて良くなるし、もしアクセストークンが盗まれてもそのトークンは期限付きのものであるため被害を多少は抑えられる。 だから、Basic認証よりも安全なのだろう。

AndroidStruidoをUpgradeした後にjavaがないと言われたのを直した話

概要

表題の通り。

起きた問題

flutter doctor したら以下のように怒られた。

[!] Android toolchain - develop for Android devices (Android SDK version 32.0.0)
    ✗ Could not determine java version
[!] Android Studio (version 2022.1)
    ✗ Unable to find bundled Java version.

解決策

このstackoverflow が解決策になる。

自分の場合は

  • FinderからAndroidStudioアプリのリンクを見つける
  • 右クリックして「パッケージの内容を表示」
  • Contents の中に移動
  • jre フォルダを作成
  • jbr フォルダにある Contents フォルダをコピーして、jre 以下に配置
    • jre/Contents ができる

CloudFunctionsにFirestoreトリガーのPythonコードをデプロイできなくて四苦八苦した話

概要

表題の通り、FirestoreトリガーのPythonコードをCloud Functionsでデプロイした。

エラー

公式ドキュメントのやり方でやっていたのだが、以下のエラーが出てデプロイができなかった。

ImportError: cannot import name 'firestore' from 'google.cloud' (unknown location)

どうやらCloud Functions の python311 に該当のライブラリ google-cloud-firestore がないようである。

解決策

ないなら requirements.txt に書けば良いじゃないということで、pythonコードがあるディレクトリに以下を指定した requirements.txt をおく。

google-cloud-firestore==2.5.3

感想というか愚痴

公式ドキュメントに書いていなくて、ちょっと困った。 ドキュメントが指定するコードrequirements.txt があったので、それを真似したらできた。

iOSリリース用のアプリだけでpush通知がされなかった話

概要

表題の通り。 ローカルでの開発時は、問題なくpush通知できていたのに、リリース用にビルドしてテストしていたら iOS だけpush通知が来なくて困った。

困ったこと

ググってみると大抵、「Apple Developerで作成したp8ファイルをfirebase上に設定したか」という項目が出てくる。 しかし、これはすでに設定している。

解決策

なんてことはなかった。ローカルの開発時に追加した「Push Notifications」をリリース用の設定でもするだけだった。

Xcode上で、TARGETS -> Signing & Capabilities の+ボタンから「Push Notifications」を追加

参考

お手軽firebaseプッシュ通知証明書作成メモ

PDICで抽出した単語データにSpreadSheetで発音記号をつける

概要

概要の通り、PDICで抽出した単語データにSpreadSheetで発音記号をつける。

背景

エクセルがなかったので、スプレッドシートを使った。

related with: M1 MacBook ProでAnkiに12000語の英語を入れた

手順

  • 空白のSpreadSheetを作成する
  • 「ファイル」→「インポート」で単語データのファイルを指定
  • オプションを選択(今回はタブ区切りだった)
  • あとは、任意の英単語一覧に発音記号と英辞郎の和訳を付けるには?の通りに行う
    • 空白行の削除は「フィルタ」を作って空白行のみを選択し、選択した行を削除
    • 偶数行のみを抽出するのは: =FILTER(A1:A12000,ISEVEN(SEQUENCE(ROWS(A1:A12000))))