Carpe Diem

備忘録

gRPCのkeepaliveで気をつけること

概要

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

gRPCではデフォルトの設定では無効になっている&地味に設定が細かいので1つ1つ説明します。

gRPCのkeepaliveの役割

大きく2つあります。

1つ目は先に述べたようにidleコネクションを維持するためです。

2つ目は死んだコネクション(TCPハーフオープン)があったら切断し、再接続するためです。

例えばNLBでは350秒以上idleなコネクションが切断される仕組みがあり、これによって普段あんまりトラフィックの無いサービスでいつの間にか切断されており、次回のリクエストでもその死んだコネクションをそのまま使おうとしてエラーになるケースをちらほら見かけます。

1つ目の対応でコネクションを維持するのも解決策の1つですが、切断された古いコネクションを使い続けないよう、再接続するというのも1つです。

環境

  • Go v1.15.0
  • grpc-go v1.29.1
続きを読む

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

概要

Bigtableで時系列データを保存する手段として

  1. 縦長のテーブルを使用する
  2. 横長のテーブルを使用する
  3. 列バージョンを利用する

の3種類あるのでそれぞれの特徴、使い方を紹介します。

環境

続きを読む

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

概要

sshポートフォワーディングの仕組みを説明します。

簡単に言うと、直接アクセスできないサーバ(Target)に対し、何かしら踏み台サーバ(Remote)を経由させることでまるで直接アクセスできるようにする仕組みです。

f:id:quoll00:20200822112146p:plain

その際に踏み台サーバに対しては上図のようにsshプロトコルを使います。

続きを読む

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

背景

TerraformはInfrastructure as Codeを実現してくれるとても素晴らしいツールである一方、運用時に以下のような問題が発生します。

  • 個々人がローカルで実行する場合のオペミス
  • パブリッククラウドリソースを扱うクレデンシャルの管理

そのため実行環境を統一(CIと連携など)したり、GitHubでplan結果を貼ってレビュー→問題なければマージ→(自動)applyといった運用をしているチームも多いことでしょう。
しかしTerraformはplanで成功してもapplyでコケることはちょくちょくあるため、そのPRが正しい状態かどうかは実行するまで分かりません。

またCIと連携することで神権限を持ったクレデンシャルを外部サービスに預けることとなり、漏洩リスクが増大しサービスに致命的な被害をもたらす可能性もあります。

このような諸々の課題を解決していい感じに自動化してくれるのがAtlantisです。

環境

  • Atlantis v0.14.0
  • Terraform v0.12.28
続きを読む

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

概要

GKEのPodといったWorkloadからGCPのリソース(GCS、PubSubなど)にアクセスする場合

  • GKE NodeのService Accountの権限でアクセスする
  • 権限を持ったService AccountのJSONキーを使う

の2通りあります。

それぞれの問題点の理解と、その解決策としてのWorkload Identityの説明・導入方法を紹介します。

環境

続きを読む

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

概要

Goでprotobufのコードを生成する際には公式のgolang/protbuf以外にgogo/protobufが候補に挙がると思います。

メリット

大きなメリットはパフォーマンスとカスタマイズ性です。

marshalling と unmarshalling が高速

去年のベンチマークですが、公式より2.5~3倍近くパフォーマンスが良いことがわかります。

benchmark iter time/iter bytes/op allocs/op
BenchmarkGoprotobufMarshal-8 5000000 337 ns/op 96 2
BenchmarkGoprotobufUnmarshal-8 3000000 533 ns/op 200 10
BenchmarkGogoprotobufMarshal-8 10000000 132 ns/op 64 1
BenchmarkGogoprotobufUnmarshal-8 10000000 187 ns/op 96 3

2019-08-28 Results with Go 1.12.6 darwin/amd64 on a 2.8 GHz Intel Core i7 16GB

ref: GitHub - alecthomas/go_serialization_benchmarks: Benchmarks of Go serialization methods

続きを読む

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

概要

開発中にサーバレスポンスの内容を表示したい時があると思いますが

  • クライアントが受け取ったレスポンス
  • サーバが送ったレスポンス

のそれぞれをログなどで表示する方法を紹介します。

環境

  • go 1.14.3

クライアントが受け取ったレスポンスを表示

クライアントでは受け取ったレスポンスはio.ReadCloserです。
なので一度読み込むと以降は読み込めなくなるのでそこだけ注意が必要です。

io.Reader系で実処理ではreadする処理がほぼ必ず入るので、io.TeeReader を使うと良いです。

f:id:quoll00:20200603013559p:plain

ref: Goのioパッケージのメソッドを図示 - Carpe Diem

続きを読む