2015年09月

http traffic replay ツール gor は便利

gor という http traffic を replay するツールが便利だった。

http traffic を記録しておいてあとで再生できれば、ウェブアプリの動作確認に役に立つのでは?と思って探してた。なければ作ろうかと思ったけど、golang 製の gor というツールがあった。 => https://github.com/buger/gor

使い方はこんなかんじ。簡単。

install

https://github.com/buger/gor/releases からバイナリをダウンロード

wget https://github.com/buger/gor/releases/download/v0.10.1/gor_0.10.1_x86.tar.gz
tar zxvf gor_0.10.1_x86.tar.gz

record

sudo ./gor --input-raw :80 --output-file requests.gor

replay

sudo ./gor --input-file requests.gor --output-http "http://localhost:80"

他にも varnish 付属の varnishreplay というツールも使えそうだったけど、varnish で一度リクエストを全て受けてログを吐くように設定しないといけないので、めんどくさげだった。

gor は他にも、http トラフィックをコピーして別のサーバに流す、いわゆる shadow proxy と呼ばれる使い方もできるようで便利っぽかった(というか主用途はそちらのようだ)

家族で積読消化合宿をやった

積読消化合宿というのをやりました - miyohide's blog にインスパイアされた。

積読消化合宿だったら開発合宿と違って、エンジニアじゃなくてもいいので家族でできるじゃん、と思って提案してみたらいいよ、ということになったので、シルバーウィークだし家族で積読消化合宿をしてみた。温泉行ってひたすら本を読んだ。

自分は、峰郎先生のこちらの本が積読になっていたので、そちらを読んだ。読みきれた。




 

分析にかかわる人ならエンジニアに限らず、アナリストからマーケティングの人まで皆に読んで欲しい本だなという感想。とくに弊社の場合、自分が作ってる内製BIツールというかダッシュボードツールはSQLでクエリを書いてもらうことを前提にしているので、読んでもらえると非常にありがたい🙏エンジニアの自分でもとても勉強になったし、確かに技術の流行り廃りが速いウェブ界隈でもSQLなら10年は継続して使えるだろうし、読んでおいて損はないと思う。

あとは BigQuery の本も読み始めたのだが、1泊だし読み終わらなかった。

奥さんがなに読んでたのかは知らない。 

定期的に開催したい。

cron でのコマンド実行が失敗したときにアラートを飛ばすための alerty というツール

ひと月ほど前に、必要にかられて cron でのコマンド実行が失敗した時に通知を飛ばすために使う alerty というツールを ruby でさくっと書いた。

社内には同様の perl で書かれたツールがすでにあったが(自分が知ってるだけで2つあった)、Amazon SNS を使うという新しい要件もあったので、ruby でさくっと書き直した。プラグイン機構に対応していて、プラグインとして実装することで通知方式を増やすことができるようになっている。 いまのところデバッグ用の stdout,file、任意のコマンドに結果を渡す exec、そして Amazon SNS、Ikachan 通知プラグインが実装されている。

設定方法

インストールは gem install alerty のようにする。必要なプラグインも gem install する。

設定は /etc/alert/alerty.yml のようなファイルを作って、

log_path: STDOUT
log_level: 'warn'
timeout: 10
lock_path: /tmp/lock
plugins:
  - type: stdout
- type: ikachan
host: ikachan.test.local
channel: notify
subject: FAILURE: [
${hostname}] ${command}

あとは /etc/cron.d/xxxxx に

0 * * * * alerty -c /etc/alerty/alerty.yml -- /path/to/script --foo FOO --bar

のように cron の設定を書けばよい。/path/to/script の終了コードが 0 (正常終了) じゃない場合に、標準出力、標準エラー出力を alerty に渡して通知が飛ぶ.

おわりに

プラグイン追加 welcome。自分は daioikachan を使っているので作ってないけど、slack 通知プラグインはあってもよさそう。

EC2 インスタンスを Roles タグで絞り込んでホスト一覧を出す ec2-host というツール

ひと月ほど前に、必要に迫られて ec2-host というツールをさくっと書いた。 AWS の EC2 ホストにタグを付けて、それでホストの絞り込み検索をするためのツール。 コマンドラインツールとしてもライブラリとしても動く。

https://github.com/sonots/ec2-host

設定方法

gem install ec2-host でインストールできる。設定は /etc/sysconfig/ec2-host に書く。

aws cli を動かすために必要な設定である $HOME/.aws/credentials の [default] セクション(プロファイル)に aws_access_key_id および aws_secret_access_key がすでに書いてあるなら、AWS_REGION を指定するだけで良い。

AWS_REGION=ap-northeast-1

credentials は次のように ec2-host の設定ファイルに直接書いても良い.

AWS_REGION=ap-northeast-1
AWS_ACCESS_KEY_ID=xxxxxxxxx
AWS_SECRET_ACCESS_KEY=xxxxxxxxx

使い方

ec2-host コマンドを打つと、参照可能なホストの一覧が表示される。

$ ec2-host
test
ip-172-31-6-194

※ 細かいことを言うと、Name タグにホスト名が設定されている場合はそれを表示するし、Name タグが空の場合は、EC2 が割り当てている private_dns_name のホスト名部分を表示する。

-j オプションを指定すると、ホストの情報を Line Delimited JSON 形式で取得する。

$ ec2-host -j
{"hostname":"test","roles":["admin:ami","test"],"region":"ap-northeast-1","instance_id":"i-85900780","private_ip_address":"172.31.23.50","public_ip_address":null,"launch_time":"2013-09-16 06:14:20 UTC","state":"stopped","monitoring":"disabled"}
{"hostname":"ip-172-31-6-194","roles":["isucon4:qual"],"region":"ap-northeast-1","instance_id":"i-f88cc8e1","private_ip_address":"172.31.6.194","public_ip_address":null,"launch_time":"2014-10-20 15:57:23 UTC","state":"stopped","monitoring":"disabled"}

さて、タグでの絞り込みであるが、例えば、

  • Name: test Roles: admin:ami,test
  • Name: isucon Roles: isucon4:qual

のようにタグを付けているとした場合、以下のように --role admin:ami と指定すると、admin:ami タグの付いている test ホストだけが表示される。

$ ec2-host --role admin:ami
test

Roles タグには , (カンマ) 区切りで複数のロールを指定できる仕様にしていて、先ほどの例だと test ホストの Roles タグには admin:ami,test という文字列を指定しているので、test ホストは admin:amitest 両方の役割(ロール)を担っているホストであるということになる。

さらに、ちょっと特殊な仕様な気もするが、: (コロン) 区切りでロールの階層レベルを指定できることにしていて、レベルでの絞り込みには --role1--role2--role3 オプションを使う。具体例を上げると、admin:ami:test のようなロールの場合、role1 は adminrole2 は amirole3 は test となる。ロールに階層構造を持たせてホストを管理できるようにしている。

$ ec2-host --role1 admin
test

ライブラリとしての利用

次のようにしてライブラリとしても利用できる。より詳細な使い方は git レポのほうに yardoc を貼っているのでそちらを参照してもらえると良い。

require 'ec2-host'

hosts = EC2::Host.new(role: 'admin:ami')
hosts.each do |host|
  puts host
end

拡張

デフォルトでは Name と Roles タグに対応しているが、対象にするタグを追加することもできる。/etc/sysconfig/ec2-host に以下のような設定を足す。

OPTIONAL_STRING_TAGS=Status,Service
OPTIONAL_ARRAY_TAGS=Array

これで Status, Service, Array タグを使えるようになる。OPTIONAL_ARRAY_TAGS に指定すると Roles タグのように , (カンマ) 区切りで複数の値を指定できるようになる。: での階層レベルサポートは Roles タグでしかサポートしてない。

例えば Service タグを用意して、サービス(プロダクト、またはプロジェクト)ごとに名前空間を分けてホストを管理するのに使っている。

ec2-ssh

他のツールと組み合わせて実現しているので、gem に含めてはいないが、手元では jqpeco と組み合わせた ec2-ssh というコマンドを作って、ロール指定で EC2 ホスト間の ssh ができるようにしていたりする。

ec2-ssh

#!/bin/bash
hosts="$(ec2-host -j $*)"
head=$(echo $hosts | head -1)

if [ "$hosts" = "$head" ]; then
  ssh $(echo "$head" | jq -r .private_ip_address)
else
  host=$(echo "$hosts" | peco)
  ssh $(echo $host | jq -r .private_ip_address)
fi

$ ec2-ssh --role admin

のように絞り込んで複数候補があるようであれば、peco のインターフェースで手動で選択し、対象ホストに ssh できる。これで EC2 ホスト間の ssh が楽になった。

簡易的に tcp リバースプロキシする

たとえば rack アプリを 9292 ポートで動かしたのは良いとして、80 番ポートしかあけちゃダメと言われているようなサーバに対して、次の作業で nginx を立ててリバプロの設定をするのだけど、そのまえにまずその rack アプリがちゃんと動いているのかを動作確認したいので、簡易的にリバプロしたい。

socat というコマンドを使うと簡単に tcp ポートフォワーディングできるのでお使いいただける。

RedHat 系の OS なら

$ sudo yum install socat 

で入るので、あとは次のようにコマンドを打てばよい。簡単。

$ sudo socat TCP-LISTEN:80,fork TCP:127.0.0.1:9292
A Ruby and Fluentd committer working at DeNA. 記事本文および記事中のコード片は引用および特記あるものを除いてすべて修正BSDライセンスとします。 #ruby #fluentd #growthforecast #haikanko #yohoushi #specinfra #serverspec #focuslight
はてぶ人気エントリー