Carpe Diem

備忘録

Go 1.11 で導入された ListenConfig を使って SO_REUSEPORT を利用する

概要

先日リリースされた1.11でソケットオプションを設定できるようになりました
これによってLinux 3.9から導入されたSO_REUSEPORTという、同じポートでbindすることが可能になる機能が利用可能になります。

環境

何が嬉しい?

一言で言うとGraceful Restartが可能になるという点です。

通常サーバプロセスを再起動するとその瞬間はリクエストを捌けなくなります。
Rolling updateのような事ができる環境であればいいですが、そうではない場合

  • a) Listenしているsocketのfile descriptorの複製
  • b) SO_REUSEPORTを使う

といった手段でデプロイ時に一時的に古いプロセスを残したまま新しいプロセスを起動し、起動完了後に古いプロセスを落とすといった形で実現する必要があります。
ただし a, b のような手段でないと bind error で新しいプロセスの方は起動できません。通常使用中のポートは別プロセスで利用できないからです。

今回リリースされたgolang 1.11では b を自前でサクッと対応できるようになります。

続きを読む

fluentdをローカルで簡単に検証する

概要

ローカルでサクッとfluentdの検証をしたい時に毎回調べ直していたのでメモ。

設定ファイル

fluentd.confという名前で設定を用意します。
forwardされたログをstdoutに出力します。

<source>
  @type forward
  port 24224
  bind 0.0.0.0
</source>

<match *.*>
  @type stdout
</match>
続きを読む

bindアドレスとadvertiseアドレス

概要

ConsulやVaultのクラスタ構成をしていると

  • bind address
  • advertise address

という2つのアドレスを設定する必要が出てきます。
この2つをしっかり理解しておかないとクラスタ構成で思わぬ落とし穴にハマったりするので今回はこれを紹介します。

bindアドレスって?

サーバを立ち上げる時に指定するアドレスです。
これまではふわっとした知識で

  • 127.0.0.1だとローカルからのみアクセスできる
  • 0.0.0.0だとどこからでもアクセスできる
  • Elasticsearchとかはデフォルトは127.0.0.1になってる

くらいの理解でした。

続きを読む

HashiCorp VaultのKVの基本的な使い方

概要

HashiCorp VaultのKey/Valueの基本的な使い方を紹介します。
このKey/Valueは少し前にv2が出ているため、v1と混同しないよう注意してください。

今回はKey/Valueのバージョン管理が可能なv2を想定して説明します。

環境

  • Vault v0.10.4
  • KV Secrets Engine v2
続きを読む

Consulクラスタをアップグレードした時に起きた問題と対応

概要

先日Consulクラスタのアップグレードをしたところちょこちょこ問題にぶち当たって解決に時間がかかったので、同じ症状に遭ったりした人用にメモ。

環境

  • Consul 1.1.0 -> 1.2.2
  • Ubuntu 16.04

問題背景

Consulはクライアントエージェントが追加されたり死んだりしても自動でjoin・leaveを行ってくれるので、サーバエージェントも同様に1台ずつAMIを更新すれば自動でjoin・leaveしてくれる&Key/Valueデータもレプリケーションを自動でやってくれるから問題ないはずと勝手に期待してやってみたのが問題でした。

続きを読む

HashiCorp VaultのAppRoleを使ってトークン取得

概要

HashiCorp Vaultではトークンを取得するための様々な認証方法がありますが、その中でアプリケーションに向いたAppRoleという認証方法があります。

f:id:quoll00:20180803184031p:plain

ref: AppRole Pull Authentication | Vault - HashiCorp Learn

この図ではRole IDSecret IDというID & Password的な認証方法ですが、他にも特定のIP Rangeのアクセスの時のみトークンを発行するといった設定もでき、アプリケーションのPrivate IPの範囲を指定すれば外部からはトークンは発行できず、アプリケーションのみ発行できるということが実現できます。

続きを読む

SSHのCA認証で Certificate lacks principal list

背景

christina04.hatenablog.com

を元に本番環境を用意していたところ、ubuntuで作ったインスタンスsshできるもののAmazon Linuxで作られたec2-userインスタンスsshできない現象に遭遇しました。
sshのログを調べるために

# /etc/ssh/sshd_config
# ...
LogLevel VERBOSE

と設定して再起動し、

$ tail -f /var/log/auth.log | grep --line-buffered "sshd"

でtailしながら再度アクセスを試みると

error: key_cert_check_authority: invalid certificate
error: Certificate lacks principal list

というエラーが発生していました。

続きを読む