Carpe Diem

備忘録

Homebrewで過去のバージョンを使いたい【tap版】

概要 以前以下の記事でhomebrewの過去バージョンの使い方を紹介しました。 christina04.hatenablog.com あれからHomebrewも変わり、以前の方法ではうまくいかなくなったため新しい過去バージョンのインストール方法を紹介します。 環境 macOS Catalina 10.15…

CircleCIの新UIでのslack連携

概要 旧UIでは以下のような設定画面でslack連携を行っていましたが 新UIからはこの設定方法はサポートされなくなり、新しくSlack Orbを使った設定方法に変わりました。

メールにおけるDKIMの仕組み

概要 前回SPFについて説明しました。 christina04.hatenablog.com 今回は署名によってヘッダ・メール本文の改ざんを検知するDKIMについて説明します。 フロー図 DKIMの検証フロー DKIMの検証フローは以下です。

メールにおけるSPFのドメイン認証の仕組み

概要 SPF(Sender Policy Framework)はメールのなりすましを防ぐための送信ドメイン認証の手法です。 さらに細かく説明すると SMTPのTCPコネクションの送信元IPアドレスと送信元メールアドレス(エンベロープFrom)のドメインのTXTレコードに含まれるIPアドレス…

GoのCLIで標準入力とファイル読み込みの両方に対応する

Go

概要 Goでは簡単にコマンドラインツールが作れますが、人によって引数やオプションといったインタフェースがバラバラになりがちです。 POSIX Utility Syntax Guidelinesというガイドラインがあるので、これに則るとUnixライクな統一されたインタフェースのCL…

gRPCのkeepaliveで気をつけること

概要 gRPCでは1つのHTTP/2コネクション上でstreamを多重化します。 しかしidleなコネクションは、LBなど間に介在するネットワーク機器によって気づいたら切断されているケースがあります。 そうならないよう、定期的にパケット(PINGフレーム)を流して「id…

Bigtableに時系列データを保存する

概要 Bigtableで時系列データを保存する手段として 縦長のテーブルを使用する 横長のテーブルを使用する 列バージョンを利用する の3種類あるのでそれぞれの特徴、使い方を紹介します。 環境 go v1.15.0 Google Cloud SDK v293.0.0 cloud.google.com/go/big…

sshポートフォワーディング

SSH

概要 sshポートフォワーディングの仕組みを説明します。 簡単に言うと、直接アクセスできないサーバ(Target)に対し、何かしら踏み台サーバ(Remote)を経由させることでまるで直接アクセスできるようにする仕組みです。 その際に踏み台サーバに対しては上…

Atlantisを用いてPRを介したTerraformオペレーションの自動化

背景 TerraformはInfrastructure as Codeを実現してくれるとても素晴らしいツールである一方、運用時に以下のような問題が発生します。 個々人がローカルで実行する場合のオペミス パブリッククラウドリソースを扱うクレデンシャルの管理 そのため実行環境を…

Workload IdentityでPodからのGCPリソースアクセスをセキュアにする

概要 GKEのPodといったWorkloadからGCPのリソース(GCS、PubSubなど)にアクセスする場合 GKE NodeのService Accountの権限でアクセスする 権限を持ったService AccountのJSONキーを使う の2通りあります。 それぞれの問題点の理解と、その解決策としてのWo…

GoGo Protobufのメリット・デメリット

概要 Golangでprotobufのコードを生成する際には公式のgolang/protbuf以外にgogo/protobufが候補に挙がると思います。 メリット 大きなメリットはパフォーマンスとカスタマイズ性です。 marshalling と unmarshalling が高速 去年のベンチマークですが、公式…

Go でサーバレスポンスの内容を表示

Go

概要 開発中にサーバレスポンスの内容を表示したい時があると思いますが クライアントが受け取ったレスポンス サーバが送ったレスポンス のそれぞれをログなどで表示する方法を紹介します。 環境 go 1.14.3 クライアントが受け取ったレスポンスを表示 クライ…

Goのioパッケージのメソッドを図示

Go

概要 Golangのioパッケージにはio.Reader、io.Writerのインタフェースを有効活用するため以下のような便利なメソッドが用意されています。 io.Copy io.Pipe io.MultiReader io.MultiWriter io.TeeReader しかし普段から使っていないと、これらメソッドの方が…

CPU CFS Quotaを制限している場合の適切なGOMAXPROCS

概要 christina04.hatenablog.com 以前上の記事でGOMAXPROCSはCPU数程度が適切に動くという話をしました。 これはこれで正しいのですが、一方でdockerのようにcgroupsでCPU Quotaを制限するケースではこれに当てはまらなくなります。 Kubernetesでいうと Kub…

PrometheusがStatsDより優れているところ

概要 新しい技術というのは既存の技術にある課題を解決するために生まれてきます。 入門 監視 ―モダンなモニタリングのためのデザインパターン作者:Mike Julian発売日: 2019/01/17メディア: 単行本(ソフトカバー) はStatsD&Graphiteを中心に説明されてお…

Go Module MirrorとChecksum Database

Go

概要 Go 1.13から、goコマンドはデフォルトでGo Module MirrorとChecksum Databaseを使用してモジュールをダウンロード&認証するようになりました。 環境 go 1.14.1 Module Mirror (Module Proxy) Module Mirrorは公開モジュールをキャッシュし、go modでの…

Redis Clusterを冗長構成で構築

概要 前回はマスターのみでRedis Clusterを構築しました。 christina04.hatenablog.com 今回は冗長構成で構築し、可用性を確認します。 環境 Redis 5.0.7

Redis Clusterの構築と水平スケーリング

概要 christina04.hatenablog.com 前回の続きで今度はRedis Clusterを構築してスケール性などを検証してみます。 環境 Redis 5.0.7 Redis Clusterの特徴 Redis Clusterは以下の特徴を持ちます。 シャード毎にSlotを持ち、データ分散される(hash slot) 全部…

go generateでモックを生成する

Go

背景 Clean Architecture に則ってレイヤ間をプラガブルにするためにインタフェースを使っていくと、テストのために各インタフェースのモックが欲しくなります。 そのモックを生成する際にgolang/mockを使用するわけですが、毎回 $ mockgen -source user.go …

Cassandraのデータモデルを理解する

概要 Cassandraはワイドカラム型のKVSでデータモデル図もネット上には色々上がっていますが、実際にはTable Schemaもあって普通のRDBのような表に見えます。 またkeyも primary key row key partition key composite key clustering key とたくさん出てきて…

Keepalivedを用いた冗長化

概要 デフォルトゲートウェイのように1つしかIPを設定できない箇所を冗長化したい ロードバランサ、Proxyを冗長化したい active/standby型でフェイルオーバーした時にクライアント側でIPの変更を意識したくない といったケースでVIP(仮想IP)を用いること…

RedisのReplication

概要 Redisの冗長構成は Replication Cluster Sentinel の3種類がありますが、そのうちのReplicationについて説明します。 環境 Redis 5.0.7 Replication Replicationはmasterからデータをreplicaにコピーし、read系コマンドをreplicaから行うことでスケー…

Prometheus でカスタムコレクタを用意する

概要 以前↓の独自メトリクスを作る方法を紹介しました。 christina04.hatenablog.com これはdirect instrumentation(直接計装)というやり方で、アプリケーションサーバ自体がstatsを持ちprometheusにデータを渡すやり方です。 今回はそうではなく別プロセ…

AWKの基本的な使い方

awk

概要 AWKは文字列の検索、抽出、変換などができるプログラミング言語です。 Unix、Linuxは基本的にテキストをプロトコルとしています。AWKを扱えるとそのプロトコルをより柔軟に扱えることになります。 前提知識 あらかじめ知っておくべき知識を書いていきま…

cgroupsでリソース制限

概要 cgroups (control groups)は、プロセスグループのリソース(CPU、メモリ、ディスクI/O、ネットワークなど)を制限、考慮、分離するLinuxカーネル機能です。 これを使ってプロセスのリソース制限を行ってみます。 環境 Ubuntu 18.04.3 cgroupsの構成 cgr…

Macのsudoでパスワード入力でなくTouch IDを使う

概要 MacにはTouch IDがあり、インストールなど様々なところでこれまでパスワード入力が必要だった箇所がTouch IDによる指紋認証が使えるようになっています。 その中でターミナルでのsudoのパスワード入力もTouch IDに替えることができるので対応します。 …

PAM (Pluggable Authentication Modules)

概要 LinuxにはPAMという認証システムとアプリケーションを分離するための仕組みが用意されています。 ref: https://docs.oracle.com/cd/E19253-01/819-0396/ch3pam-01/index.html プラガブルという名前の通り、モジュールによって認証方法を簡単に切り替え…

gRPCのヘルスチェック

概要 gRPCサーバのヘルスチェック方法として HTTPサーバを別途立ち上げてHTTPでチェック tcpでポートがopenしたかチェック といった方法がありますが、前者はgRPCサーバなのにHTTPサーバを用意しないといけなかったり、後者はtcpのopenは実際にServe開始した…

iptablesの仕組みを図解

概要 ネットワーク周りでたまに触るiptablesですが、たまになせいで度々忘れてググり直すことが多いので理解しやすいよう図を作ってみました。 iptablesの仕組みを図解 iptablesの構成図 iptablesは以下のように iptables -> Tables -> Chains -> Rules とい…

Network Namespaceから外部ネットワークへアクセスする

概要 前回の christina04.hatenablog.com の続きで、今回はネットワーク名前空間から外部ネットワークへアクセスできるようにします。 環境 Ubuntu 18.04 以下の状態からスタートします。