Carpe Diem

備忘録

2019-01-01から1年間の記事一覧

check digitを使った誤り検出

概要 クレジットカード・シリアルナンバーなど、長くなるほど入力ミスはしやすくなります。 そんな時に毎回DBに問い合わせて正しい値かをチェックするのではなくアルゴリズムによって正しいものかどうかチェックする仕組みがcheck digit(チェックディジット…

inodeから見たmvやcpの動き

背景 実行中のファイルに対してcpで上書きする場合だとText file busyで置き換えられず、mvだと何も聞かれず置き換えられる理由を深掘ってみました。 データ構造 mvやcpの動きを確認する前に必要な前提知識を説明します。 プロセスとinodeとの関係 プロセス…

リダイレクトの仕組みを深掘りする

背景 $ コマンド > outfile 2>&1 と $ コマンド 2>&1 > outfile は結果が異なります。 前者は標準出力、標準エラーともにoutfileに出力されるのに対し、後者は標準出力はoutfileに、標準エラーはターミナルに出力されます。 この違いを理解するためにUnixの…

cgoを使わないGoのクロスコンパイル時に -installsuffix cgo が不要になってた

背景 以前Docker multi stage buildなどビルド環境と実行環境が異なる(クロスコンパイル)時に、単純にGOOSやGOARCHをセットするだけではなく $ CGO_ENABLED=0 GOOS=linux GOARCH=amd64 \ go build -a -installsuffix cgo -o main main.go のように CGO_ENA…

OpenAPI で REST API のスキーマ作成

背景 今やWebだけでなく、iOS、Android、TV、カーナビといった多数のクライアントでAPIを利用する時代です。 各クライアントでBFFを置く設計もありますが、開発コストや運用コストを考えて同一のAPIサーバを用意し利用することも多いと思われます。 加えてサ…

App Store の In-App Purchase の Grace Period対応

概要 AppStoreでGrace Period機能がリリースされたました。 これはその機能の検証を行った結果です。 ※Appleは気づいたら仕様変更することもちょこちょこあるので、こちらの結果が常に正しいとは信じず参考程度に捉えてください 前提知識 サブスクリプション…

Go の http.Server は各種 Timeout をセットした方が良い

Go

概要 以前↓の記事を紹介しましたが、 christina04.hatenablog.com http.Serverの各Timeoutを使わないと TCPハンドシェイクをしたあと全くリクエストを送ってこないクライアント Slowloris DDoS attack による大量接続攻撃を受けた時に困るので注意してくださ…

I/O Multiplexing(I/O多重化)

概要 christina04.hatenablog.com で一度まとめましたが、まだ理解があやふやなところがありました。 その後 Working With TCP Sockets を読んでようやくストンと理解できたのでまとめます。 経緯 たくさんのリクエストを受けるにはどうしたらいいか、で マ…

pipeエラーのハンドリング

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

様々なrate limitアルゴリズム

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

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

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

Goのnet/httpのtimeoutについて

Go

概要 タイムアウトと一口に言ってもサーバ・クライアント、そして各フェーズによって細かく設定があります。 今回はGoのnet/httpのtimeoutについて1つ1つ説明していきます。 環境 golang/go 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 使い方 Goを例に基本的な使い方を説明します。 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 H…

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あります…