Carpe Diem

備忘録

特定のGCSバケットにのみアクセスできるサービスアカウントの作り方

概要 christina04.hatenablog.com の実践編です。 特定のGCSバケットにのみアクセスできるサービスアカウントを作ってみます。

関連と集約と合成集約の違い

概要 UML図における 関連 (Association) 集約 (Aggregation) 合成集約 (Composition) の違いをまとめます。 関係図 まずそれぞれを集合で表現すると以下のようになります。

GCPのIAMを使う上で理解しておくこと

背景 IAMはアクセス制御をする上で非常に重要な仕組みですが、一方で複雑になりがちです。 間違った理解のままだと必要以上の権限を与えてしまい、事故の原因となるので押さえておくべき点をいくつかまとめてみます。 リソース階層 GCPのIAMにはリソース階層…

Go modulesで依存モジュールのメジャーバージョンがv2以上の時の対応

Go

背景 依存するモジュールのメジャーバージョンがv2以上の場合に、以下のようにバージョン指定すると $ go get github.com/xxx/yyy@v2.0.1 次のように怒られます。 require github.com/xxx/yyy: version "v2.0.1" invalid: should be v0 or v1, not v2 今回は…

CodecovのBash Uploader問題の再発防止策

概要 コードカバレッジサービスのCodecovでは、カバレッジファイルをアップロードする際に以下のようにbash scriptを実行します。 bash <(curl -s https://codecov.io/bash) ref: Codecov Bash uploader しかし先日、このbash scriptが何者かに勝手に改竄さ…

ユースケースに応じたユニークなIDの生成

Go

概要 ユニークなID生成をしたい場面は多々ありますが、ユニークIDにはユースケースによって以下のような要件が出てきます。 ユニーク 短い(=データ量が少ない) 推測困難 分散性(ランダム性) 順序性(Lexicographical) 生成速度 それぞれの観点について…

トランザクションの分離レベルで出てくる用語

背景 トランザクションの分離レベルで出てくる用語がぱっと頭に浮かぶようまとめます。 起きうる問題 基本的にどのDBも単一オブジェクトの原子性と分離性は保証します。 つまりデータ送信の途中でネットワーク接続が切れたら断片のみ保存するのではなく、全…

JWTの署名検証で使う公開鍵をX.509証明書で管理する

概要 JWTをアクセストークンとして利用する場合、署名(秘密鍵)は認証サーバで、署名検証(公開鍵)はリソースサーバで行うのが良いです。 そのため認証サーバは公開鍵をリソースサーバに公開する必要があります。 Googleなどの大規模サービスを見ると、生…

OpenSSLコマンド備忘録

概要 よく忘れるので備忘録として。 環境 macOS v11.2.3 OpenSSL v1.1.1 秘密鍵、公開鍵 基本的にgenpkeyで作れるが、RSA、EC系は他のコマンドの方が短い記述で生成できる。 RSA /docs/man1.1.1/man1/openssl-genrsa.html /docs/man1.1.1/man1/openssl-rsa.h…

etcdを使った分散ロック

概要 前回のRedisを使った分散ロックでは、正確なロックを取るためにはZookeeperやetcdを使うと良い、とまとめていました。 なので今回はetcdを用いて分散ロックを実現します。 環境 etcd v3.4.15 pkg.go.dev/go.etcd.io/etcd v3.5.0 go 1.16.0 事前知識 分…

Redisを使った分散ロック (SETNX, Redlock)

概要 分散システムにおいて同じリソースにアクセスする際にロック(排他制御)する仕組みを分散ロックといいます。 ロックを用いる背景としては主に2つあり、 目的 説明 具体例 効率 同じ作業を不必要に複数回行わないため キャッシュのOriginへのリクエス…

NEG(Network Endpoint Group)を使った負荷分散

概要 従来のGKEのロードバランサーはNodeに到達後iptablesで再度負荷分散するという2段階ロードバランシングでした。 これによりレイテンシの増加、分散のばらつきといった問題が生じていました。 ref: Google Cloud Blog - News, Features and Announcemen…

セキュアなトークン管理方法

概要 クライアント↔サーバ間の認証・認可情報としてのトークン管理はWebサービスとしては必ずつきまとうものですが、一方できちんと実装しないとセキュアに管理はできません。 今回はそのトークン管理方法の一例を紹介します。 要件 今回の主な要件は以下で…

デッドロックとその対策

概要 複数のトランザクションが共通のリソースにアクセスする際に気をつけるものとしてデッドロックがあります。 例えばこのように一方はResource1, Resource2とロックしてアクセスし、もう一方はResource2, Resource1とロックしてアクセスする場合、うまく…

OAuth 2.0 Device Authorization Grant

概要 サービスのマルチデバイス対応をした際に、各デバイスで同じアカウントにログインするのはユーザにとっては非常に手間です。 例えばテレビデバイスに対応した場合にID&パスワードをリモコンで入力させるのはユーザにとって苦痛でしかありません。 なの…

SquidをForward Proxyサーバとして使う

概要 Forward Proxyを導入することで以下のメリットを得ることができます。 DNS lookupをキャッシュして名前解決を高速化 Targetからのレスポンスをキャッシュして高速化 TargetがIP制限している場合に、送信元IPを固定するサーバにする ↑と逆にTargetの制限…

http clientでHTTP/2を使う方法

背景 外部APIを叩く時に利用するhttp clientですが、サーバ側がHTTP/2対応しているのであればコネクションの有効活用ができるようHTTP/2を使いたいものです。 その際にhttp client側で設定する点、気をつける点を説明していきます。 環境 Go 1.15.6 curl 7.6…

WARNING: Missing 'go_package' option が出る時の対処法

背景 いつの間にかprotocでprotoc-gen-goプラグインを使うと以下のようなエラーが出るようになりました。 2021/01/05 06:19:01 WARNING: Missing 'go_package' option in "xxx/xxx.proto", please specify it with the full Go package path as a future rel…

ポインタを図で理解する

Go

概要 Goのポインタを図で理解することで ダブルポインタとは Goは全て値渡し ポインタレシーバと値レシーバの違い がどういうことかを理解でき、参照渡しの時に x = y だと更新されず *x = *y だと更新される理由が分かります。

structのメモリ割り当て

Go

概要 Goにおけるstructのメモリ構造を知ることでフィールド順序に対する意識が変わったり、なぜunsafe.Sizeof(string)が16bytesでunsafe.Sizeof(slice)が24bytesになるかが理解できます。 環境 golang 1.15.6 darwin 20.1.0 x86_64 各型のメモリ割り当て uns…

GoでShutdown Hook

Go

背景 以前Graceful shutdown機能の使い方を紹介しました。 christina04.hatenablog.com これによって処理途中のリクエストが残っていても、きちんと完了するまで待ってからプロセスを終了してくれます。 しかしPubSubのPublish()のような非同期処理であれば…

継続的プロファイリング

背景 過去にいくつかpprofの使い方を紹介しましたが、実際に運用する上では以下の課題があります。 何かしら問題が発生して初めてプロファイリング開始するという後手になりがち 問題の再現が難しく、再び発生するまで様子見という流れになりがち プロファイ…

GCPのCloud PubSubで考慮すること

概要 GCPのCloud PubSubはメッセージング基盤として非常に有用です。 ただし利用する上で考慮すべきことも多々あるのでまとめておきます。 パラメータに関しては主にgolangのクライアントライブラリをベースに説明します。 環境 go 1.15.2 google-cloud-go v…

データ暗号化で考慮すること(鍵編)

概要 前回の続きです。 christina04.hatenablog.com 今回は暗号化における鍵(共通鍵)について説明します。 前提知識 鍵とは 鍵とはとても大きな数です。 鍵のビット長が大きい=鍵空間が大きいことを意味します。つまり可能な鍵の総数が大きいため総当り攻…

データ暗号化で考慮すること(暗号アルゴリズム編)

概要 ユーザのメールアドレスといった機密情報を暗号化・復号したいユースケースがあるとします。 メール送信などに利用するためパスワードのようにハッシュ化するのでなく、復号して利用したいケースです。 機密情報の管理全般については以前↓で話しました…

パスワードを保存するときに考慮すること

概要 パスワードを保存する際は平文で保存せずハッシュ化するのは当然です。しかし単にハッシュ化するだけでなく 暗号学的に優れたハッシュ関数を使う saltを付ける 計算コストのかかるアルゴリズムを採用する ストレッチングで計算コストを上げる といった…

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アドレス…