Carpe Diem

備忘録

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

続きを読む

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

概要

Goのioパッケージにはio.Readerio.Writerのインタフェースを有効活用するため以下のような便利なメソッドが用意されています。

しかし普段から使っていないと、これらメソッドの方が簡単にかけるのに忘れて遠回りな書き方をしがちです。
なのでイメージ化して覚えやすいようにします。

続きを読む

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

概要

christina04.hatenablog.com

以前上の記事でGOMAXPROCSはCPU数程度が適切に動くという話をしました。

これはこれで正しいのですが、一方でdockerのようにcgroupsでCPU Quotaを制限するケースではこれに当てはまらなくなります。

Kubernetesでいうと

Kubernetesのresource requests, limits - Carpe Diem

のようにlimitsを設定した場合ですね。

今回はその検証と対応方法についてまとめます。

環境

  • go 1.14.2
  • docker 19.03.8
続きを読む