Carpe Diem

備忘録

etcdを使った分散ロック

概要

前回のRedisを使った分散ロックでは、正確なロックを取るためにはZookeeperやetcdを使うと良い、とまとめていました。

なので今回はetcdを用いて分散ロックを実現します。

環境

  • etcd v3.4.15
  • pkg.go.dev/go.etcd.io/etcd v3.5.0
  • go 1.16.0

事前知識

分散ロックに必要なもの

分散ロックマネージャには以下の機能が必要です。

  • 自動リース機能
  • CAS
  • フェンシングトークンを発行する機能

1つ1つ説明していきます。

続きを読む

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

概要

分散システムにおいて同じリソースにアクセスする際にロック(排他制御)する仕組みを分散ロックといいます。

ロックを用いる背景としては主に2つあり、

目的 説明 具体例
効率 同じ作業を不必要に複数回行わないため キャッシュのOriginへのリクエストを抑制したい(Cache stampede対策)
正確性 データの不整合が起きないようにするため トランザクション

Redisを分散ロックに使う場合は主に前者のケースにおいて推奨されます。

環境

  • Redis 6.2.0
続きを読む

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

概要

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

f:id:quoll00:20210222013932g:plain

ref: Google Cloud Blog - News, Features and Announcements

しかしNEG(Network Endpoint Group)という機能を使うことで直接Pod宛てに負荷分散を行うことができ、上記の問題を低減することが可能となっています。

f:id:quoll00:20210222014123g:plain

ref: Google Cloud Blog - News, Features and Announcements

続きを読む

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

概要

クライアント↔サーバ間の認証・認可情報としてのトークン管理はWebサービスとしては必ずつきまとうものですが、一方できちんと実装しないとセキュアに管理はできません。

今回はそのトークン管理方法の一例を紹介します。

要件

今回の主な要件は以下です。

  • AuthサーバとResourceサーバは別で管理する(負荷特性が異なるので)
  • 認証するとAuthサーバはrefresh tokenとaccess tokenを返す
  • access tokenはJWT形式
  • access tokenはクライアントのオンメモリで管理する
  • access tokenの期限は短く(1時間以内)
  • refresh tokenを使ってaccess tokenを発行できる
  • refresh tokenはrevoke可能である
    • 認証情報に変更があれば(パスワード変更など)refresh tokenをrevokeできる
  • Resourceサーバは起動時などにAuthサーバから公開鍵を取得し、access tokenの署名検証に使用する

ネイティブクライアントの場合

ネイティブクライアントの場合、keychainなどセキュアな管理ストレージがあるためrefresh tokenを保存することができます。

続きを読む

デッドロックとその対策

概要

複数のトランザクションが共通のリソースにアクセスする際に気をつけるものとしてデッドロックがあります。

例えばこのように一方はResource1, Resource2とロックしてアクセスし、もう一方はResource2, Resource1とロックしてアクセスする場合、うまく行けば両方とも成功しますが、

f:id:quoll00:20210207152617p:plain

ロックのタイミングによっては一方がロックできず、またアンロックもできない状態(=デッドロック)に陥ります。

続きを読む

OAuth 2.0 Device Authorization Grant

概要

サービスのマルチデバイス対応をした際に、各デバイスで同じアカウントにログインするのはユーザにとっては非常に手間です。

例えばテレビデバイスに対応した場合にID&パスワードをリモコンで入力させるのはユーザにとって苦痛でしかありません。

なのでサービス側はユーザが苦労なくスムーズにログインできる方法を提供しなくてはいけませんが、一方でセキュリティについても気にする必要があります。

そんなケースの対応方法としてOAuth 2.0 Device Authorization Grantがあるので紹介します。

ユーザの体験

例としてテレビデバイスでログインします。
huluが体験として分かりやすいので実際にやってみます。

ログインしようとする

f:id:quoll00:20210201045708j:plain

続きを読む

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

概要

Forward Proxyを導入することで以下のメリットを得ることができます。

  • DNS lookupをキャッシュして名前解決を高速化
  • Targetからのレスポンスをキャッシュして高速化
  • TargetがIP制限している場合に、送信元IPを固定するサーバにする
  • ↑と逆にTargetの制限をかけられる(社内→インターネットのパターン)

今回Forward Proxyとして有名なSquidを使って簡単な検証を行ってみます。

環境

続きを読む