Carpe Diem

備忘録

pipeエラーのハンドリング

概要 write: broken pipeといったクライアント側の強制的なコネクション切断でのエラーハンドリングをする際の知見まとめ。 環境 go 1.13.3 事前知識 知っておくと良い知識を先に説明します。 そもそもpipeとは pipeはプロセス間通信をするための単方向のデ…

様々なrate limitアルゴリズム

概要 インターネットに晒されているWebサービスでは TV等で紹介されたことによる大量流入 悪意ある人物からの攻撃 クライアントのバグに依る大量リクエスト など、本来想定していた以上のトラフィックが来ることはよくあります。 単純にシステムを構築すると…

Goのnet/httpのkeep-aliveで気をつけること

概要 Idle connectionをプールするkeep-aliveの仕組みですが、golangで適切に使用するためにはいくつか注意があります。 環境 golang 1.13.1 TCP Keep-Aliveの挙動をパケットキャプチャで確認する 例えば以下のようにDefaultTransportの一部の設定(①、②)を…

Goのnet/httpのtimeoutについて

Go

概要 タイムアウトと一口に言ってもサーバ・クライアント、そして各フェーズによって細かく設定があります。 今回はGoのnet/httpのtimeoutについて1つ1つ説明していきます。 環境 golang 1.13 Server 全体図 サーバ系timeoutと各フェーズは以下の関係にな…

MongoDB 4.2でシャーディング・レプリカセットのクラスタ構築

概要 気づいたらMongoDBも4.2になっていました。 以前に DockerでMongoDBのレプリカセットを構築 - Carpe Diem でレプリケーションを、 MongoDBでシャーディング - Carpe Diem でシャーディングを構築しましたが、設定項目が代わっていたりしたので復習がて…

技術書典7でAbemaTVの合同誌にHashiCorp Vaultについて寄稿しました

概要 AbemaTVの合同誌にHashiCorp Vaultについて執筆しました。 techbookfest.org どんな内容 基本的にはこの技術ブログで紹介した内容を体系的にして、最新バージョンで改めて動作確認した感じにしています。 初めてHashiCorp Vaultを使う人にとって読みや…

gRPCでエラー詳細を渡す方法

概要 以前 christina04.hatenablog.com こちらの記事で、アプリケーション内でのレイヤ間のエラーハンドリングについてまとめました。 ではマイクロサービス間でそのエラーコードを伝播していくのはどうすれば良いのか、というのが今回の主題です。 課題 gRP…

protocの使い方

概要 christina04.hatenablog.com で紹介したprotoeasyがリンクごと消えて使えなくなったので、protocの使い方を整理するために書きます。 環境 libprotoc 3.9.1 使い方 golangを例に基本的な使い方を説明します。 SRC_DIRディレクトリに.protoファイルがあ…

機密情報の管理で大切なこと

概要 機密情報の管理はいつも悩みのタネです。 その管理に僕はHashiCorp Vaultを推してますが、その理由を含めて説明します。 管理方法の課題 機密情報の管理で考えなければいけないことはたくさんあります。 データの暗号化 どこに保存するか 認証 アクセス…

VaultのCubbyhole Response Wrapping

概要 HashiCorp VaultにはCubbyhole Response Wrappingという仕組みが用意されています。 これによってトークンや秘密情報の受け渡し時の漏洩リスクを最小限にします。 課題・背景 人やマシンにトークンを渡す場合、 発行した人から漏洩する可能性 渡す際に…

HashiCorp VaultのDynamic Secrets

概要 HashiCorp VaultにはDynamic Secretsという期限の付いた認証情報を動的に生成してパブリッククラウドやDBへのアクセスをセキュアに保つ仕組みが用意されています。 課題・背景 秘密情報とその周辺の認証を一元化し、適切な暗号化・Auditなどをしっかり…

VaultのTokenとLease

概要 HashiCorp VaultのTokenにはLeaseという概念があります。 この概念によってよりローテーションを強制し、秘密情報のセキュアな管理をすることが可能です。 環境 Vault 1.2.1 default_lease_ttlとmax_lease_ttl root tokenを除く全てのtokenにはdefault_…

Kubernetes の Ingress を理解する

概要 KubernetesにはL4ロードバランサのServiceとL7のIngressがあります。 IngressはControllerによって挙動が大きく変わるので実際に手を動かして学んでみます。 環境 minikube 1.3.0 Kubernetes 1.15.2 nginx-ingress 0.24.1 nginx-ingress chart 1.6.19 I…

Helm の基本的な使い方

概要 Kubernetesの問題の1つに、マニフェストファイルがたくさんできるYAMLの壁と呼ばれるものがあります。 image mountするファイル label リソース割当 といった一部の要素だけ変えたい時、ほとんど構成は同じで似たようなマニフェストファイルが大量に出…

Kubernetes のRBACを理解する

概要 KubernetesではRBACという、各種リソースへのアクセス権限を管理する仕組みが用意されてます。 たとえばPrometheusのようにKubernetesのAPIを叩く場合、各リソースへアクセスするための権限が必要になります。 今回はそれの基本的な仕組みや設定方法を…

Prometheus でNodeのモニタリング

概要 christina04.hatenablog.com でNode exporterを使った基本的な監視方法を説明しましたが、今回は具体的にどんな項目をどう監視すべきかを説明します。 USEメソッド サーバの監視すべき項目の指標としてUSEメソッドというものがあります。 項目 説明 Uti…

GitHubを使った開発であると便利なツール

概要 GitHubを使った開発で使ってるツールを紹介していきます。 どれもあると無いとでは開発スピードが大きく変わります。 Fork GUIのGitクライアントです。 git-fork.com 以前はSourcetreeを使っていましたが管理するファイルが増えると非常に重くなったの…

Prometheus の監視対象を ServiceDiscovery で動的に設定する

概要 PrometheusはPull型の監視ツールであるため、監視対象がどれかを教えてあげなければいけません。 これまでの記事は全てstatic_configsを用いた静的な値で、スケールした時やサービスが増減した時に柔軟性がありません。 PrometheusはServiceDiscoveryを…

Prometheus でAPIサーバの監視【gRPC】

概要 前回はHTTPのAPIサーバの監視の仕方を説明しました。 christina04.hatenablog.com 今回はgRPCでのメトリクスの作り方を説明します。 環境 Prometheus 2.11.1 Golang 1.12.7 Grafana 6.2.5 prometheus/client_golang 1.0.0 go-grpc-prometheus 1.2.0 メ…

Prometheus でAPIサーバの監視【HTTP】

概要 前回は既存のexporterを利用せず、自分でメトリクスを生成する方法を説明しました。 christina04.hatenablog.com その方法を使って実際にAPIサーバ(HTTP)のメトリクスを生成し、可視化してみます。 環境 Ubuntu 18.04 Prometheus 2.11.1 Golang 1.12.7 …

Prometheus で独自メトリクスを用意する

概要 Metric types | Prometheus で定義されているようにPrometheusでは大きく4つのメトリクスタイプがあります。 Counter Gauge Summary Histogram 今回はGoのPrometheusクライアントライブラリを用いて各メトリクスを独自で用意する方法を説明します。 環…

Grafanaのパネルの作り方

概要 Prometheus + GrafanaではPromQLを使って柔軟なパネルが作成できる一方、作り方が複雑になりがちです。 今回は基本的なパネルの作り方を説明します。 環境 Grafana 6.2.5 Prometheus 2.11.1 パネル Grafanaのダッシュボードのパネルは大きく10あります…

Prometheus の基本的な使い方【Grafana】

概要 christina04.hatenablog.com の続きです。 今回はGrafanaを使ってメトリクスの可視化をします。 環境 Ubuntu 18.04 Prometheus 2.11.1 Grafana 6.2.5 構成 引き続きVMで行います。 VM名 IP Prometheus 192.168.33.10 Node 192.168.33.11 Grafana 192.16…

Prometheus の基本的な使い方【Node exporter】

概要 Pull型の監視サービスであるPrometheusの使い方を説明します。 環境 Prometheus 2.11.1 Node exporter 0.18.1 アーキテクチャ Prometheusのアーキテクチャはこの様になっています。 ref: Overview | Prometheus 大まかな特徴としては以下です。 Pull型(…

GPGでgitのcommitに署名する

概要 GitHubではMergeコミットなどで といったマークを見ます。これは署名されたcommitを示すものなのですが、 なぜ必要なのか どうやったら署名できるのか を今回説明します。 環境 macOS 10.14.5 Mojave gpg 2.2.10 なぜ署名が必要か? gitのコミットは co…

gRPC Unary Interceptorを複数設定した時の実行順序

概要 以前 christina04.hatenablog.com にてgRPCのUnary Interceptorの基本的な使い方を説明しました。 このInterceptorを複数設定したい時に使われるのがgo-grpc-middlewareの出している ChainUnaryServer ChainUnaryClient です。READMEにありますが、以下…

Go言語でプラグイン機構【RPC編】

概要 オブジェクト指向についてClean Architectureでは OOとは「ポリモーフィズムを使用することで、システムにあるすべてのソースコードの依存関係を絶対的に制御する能力」である。 これにより、アーキテクトは「プラグインアーキテクチャ」を作成できる。…

rand.Readerはいつエラーを返すのか

概要 golangのuuid生成で有名な satori/go.uuid はこちらのコミットでUUIDv4を生成する際にエラーを返すように変わりました。 理由は github.com このissueに対応するためなのですが、内部で使っているrand.Read()はそもそもどんな時にエラーが起きるのだろ…

Kubernetesを扱う上で便利なツール

概要 Kubernetesを利用する上であったら便利なツールの紹介です。 stern kubectx kubens kube-tmux stern podのログを簡単に取れるツールです。 github.com インストール $ brew install stern

Kubernetesのresource requests, limits

概要 Kubernetesには以下のフィールドでCPUやメモリを制限することが可能です。 spec.containers[].resources.limits.cpu spec.containers[].resources.limits.memory spec.containers[].resources.requests.cpu spec.containers[].resources.requests.memor…