ようへいの日々精進XP

よかろうもん

2016 年 10 月 12 日(水)

ジョギングは無し

  • (腕立て 30 + 腹筋 30) x 3
  • 太ももが完治するまでは走るのは我慢することにした

昼飯

  • 今季最後のセブンイレブンのとろろそば
  • 納豆、もみのりをオリジナルでトッピング

夕飯

  • ワシたっての希望で湯豆腐
  • お鍋大好き(奥さんの次に大好き)

Kickflip

  • 私物の X1 Carbon(2013) をデスクの上で使う場合、角度がイマイチ足りないのか若干打ちづらさを感じていたので Kickflip を購入
  • MacBook Pro 13 インチ用だけど X1 Carbon でもイケた
  • これでしばらく X1 Carbon を使い続ける理由が出来た(メモリ容量さえなんとかなれば、この先 5 年はいけそう)

Heroku に Sinatra アプリケーションをデプロイ

heroku コマンドを導入

以下を参考に heroku コマンドを導入。

今回試した環境は以下の通り。

$ cat /etc/lsb-release 
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"

$ heroku --version
heroku-toolbelt/3.43.12 (x86_64-linux) ruby/2.3.1
heroku-cli/5.4.3-a5b1cb1 (linux-amd64) go1.7.1
You have no installed plugins.

Sinatra アプリケーションを実装

簡単なログインフォームをサクッと作ってみた。

github.com

Heroku にデプロイ

  • Heroku にアプリケーションを作成
$ heroku create oreno-app
  • Heroku に push
$ git push heroku master
  • Heroku にデプロイしたアプリケーションにアクセス
$ heroku open

ブラウザが起動する。

Heroku アプリケーションを削除

$ heroku apps:destroy --app oreno-app

Sinatra での Session について

ログインフォーム作った勢いでちょっと調べて以下が参考になったのでメモ。

2016 年 10 月 11 日(火)

ジョギングは無し

  • (腕立て 30 + 腹筋 30) x 3
  • 左太もも痛い、もはや慢性化している

父から電話

  • 自宅のインクジェットプリンタのインクが切れたとのことで、交換にあたりカートリッジの型番等を電話口で読み合わせる等

お義母さんの携帯着メロ

  • せっかくなので自分のボイスメモを着メロにして差し上げている

Amazon Elasticserch Service で es_rejected_execution_exception エラー

  • インスタンスサイズを上げてもエラーは無くならなかった
  • 結局はノード数を追加することでエラーは出なくなった

夕飯

  • ビーフシチューをライスにかけたらハヤシライスだよな、今更思った
  • 美味しかった

2016 年 10 月 10 日(月)

一気に秋がきた

  • 涼しいをちょっと超えて寒い

ジョギング

  • 香椎浜 x 2 周
  • (腕立て 30 + 腹筋 30) x 3
  • 左太ももはまだ違和感ある
  • 早くちゃんと走れるようになりたい

Amazon Elasticserch Service で es_rejected_execution_exception エラー

  • t2.micro.elasticsearch で暫く動かしていたアプリケーションで以下のようなエラーを確認
{u'error': {u'failed_shards': [], u'root_cause': [], u'caused_by': {u'reason': u'rejected execution of org.elasticsearch.action.search.SearchQueryThenFetchAsyncAction$2@xxxxxxxxx on EsThreadPoolExecutor[search, queue capacity = 1000, org.elasticsearch.common.util.concurrent.EsThreadPoolExecutor@xxcxxxxx[Running, pool size = 2, active threads = 2, queued tasks = 1000, completed tasks = 338758]]', u'type': u'es_rejected_execution_exception'}, u'grouped': True, u'reason': u'[reduce] ', u'phase': u'fetch', u'type': u'reduce_search_phase_exception'}}

search queue が溢れてしまって検索クエリが破棄されてしまっているようだ。ノードを横に増やす(スケールアウト)か、Amazon ES の場合にはインスタンスサイズを上げる対策を取る必要がある。但し、インスタンスサイズ毎に HTTP リクエストサイズに制限がある為、このあたりに注意してインスタンスサイズを調整する必要がありそうだが、引続き調査を行いたい。

背中を痛める

  • 奥さんのピアノに合わせて踊っていたら背中を痛めた
  • 加齢を感じる...

70-533 勉強

  • Azure AD の用語が個人的に特殊過ぎて辛い

Sinatra アプリケーションで Could not find backports-3.6.8 in any of the sources

Azure AD で SSO を試してみたくて Sinatra でアプリケーションを作ろうと思って bundle install して bundle exec ruby app.rb したら以下のようなエラー。

Could not find backports-3.6.8 in any of the sources
Run `bundle install` to install missing gems.

なんだこりゃー。

rbenv rehash
bundle install --path vendor/bundle

したら直った。うーむ。

夕飯は

奥さん特製のビーフシチューやらナスの揚げびたしやら。ご飯がすすむくん。美味しかったー。

collectd と facette の Vagrantfile を作った(collectd でサバクラ環境を作る)

tl;dr

  • マイブームの collectd でサーバー、クライアント環境って作れるのか調べてみたら意外に簡単だった
  • facette もセットアップは簡単なのでついでに触ってみる

メモ

Vagrantfile

github.com

collectd のクラサバ構成

クラサバ構成のキモは network プラグイン。以下のように server(メトリクスデータを収集する側)、client(サーバーにメトリクスデータを飛ばす側)で設定するだけ。

#
# server
#
$ cat /etc/collectd/collectd.conf.d/network.conf
LoadPlugin network

<Plugin network>
  <Listen "0.0.0.0" "25826">
    # SecurityLevel Sign
    # AuthFile "/etc/collectd/passwd"
    # Interface "eth0"
  </Listen>
</Plugin>

#
# client
#
$ cat /etc/collectd/collectd.conf.d/network.conf
LoadPlugin network

<Plugin network>
  <Listen "0.0.0.0" "25826">
    # SecurityLevel Sign
    # AuthFile "/etc/collectd/passwd"
    # Interface "eth0"
  </Listen>
</Plugin>

認証も設けることが出来るので、実運用の際には認証は設定しておきたい。(上記の Vagrantfile では認証は設定されていない)

facette とは

facette は Go 言語で書かれた rrd や Graphite 等の時系列データベースをバックエンドデータベースとして利用可能な時系列データの可視化ツール。

facette.io

現在は開発途上な為、プロダクション環境での利用は推奨されていないので注意。

導入については、各種 OS 環境のパッケージを取得してインストールする。

vagrant up

vagrant up --provision

実行すると仮想マシンが 2 台構築されて以下のような構成となる。

[ vm02 ](collectd) => [ vm01 ](facette / collectd) <= [ ワシ ] 

facette UI

ざっくりと紹介。

f:id:inokara:20161010182833p:plain

Graphite とか influxdb とかも利用可能。機会があれば試してみよう。

f:id:inokara:20161010182913p:plain

Origin がバックエンドのデータベースのことだと思われる。今回は collectd(rrd)のみ。

f:id:inokara:20161010182954p:plain

Sources が各 collectd が動いているホスト。Source Groups で各 Source をグルーピング出来る。

f:id:inokara:20161010183001p:plain

collectd で収集しているメトリクス各種。

f:id:inokara:20161010183011p:plain

まだまだお触りが足りていないけど、グラフをこさえるところまではイケた。

以上

メモでした。

2016 年 10 月 09 日(日)

体調イマイチ

休日の朝は元気よく起きれるはずなのに起きれず二度寝で死んでた。

ガラケー

お義母さんの携帯電話を機種変更する為に博多へ。犬キャリアのショップ店員さんがとても親身に対応して頂いてお義母さんも安心されていた。売るだけの時代はもう終わっているんだなって思った。

お義母さんはスマフォに興味を示されていたけど結局はガラケー。ワシもガラケーにしたい。

筑紫口二階のプロント

電源もあるし、17 時半からはバータイムなのでお酒も飲めるので飲みながらもくもく。

寒い

自宅に戻って洗濯物を取り込む際に外に出たら寒くてビックリした。

collectd の exec プラグインで俺のデータを CloudWatch に飛ばす

全国 5000 万人の収集癖、メトリクス厨の皆さん、こんばんわ。かっぱです。

tl;dr

の続き。

collectd はプラグイン機構が備わっており、自作することも出来る。

ただ、コマンドの標準出力の結果をメトリクスとして記録してくれる exec プラグインを利用することで、より簡単にオリジナルデータを collectd に飛ばすことが出来るようだ。

参考

memo

引続き、試している環境は...

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.4 LTS"

exec プラグインスクリプト実装時の注意点

以下のようなフォーマットで標準出力させることで由なに collectd が集めてくれる。

"PUTVAL #{hostname}/#{PLUGIN_NAME}/#{metric_name} #{unix_time}:#{data}"

また、以下のようにオプションとして interval=#{INTERVAL} も指定可能。

"PUTVAL #{hostname}/#{PLUGIN_NAME}/#{metric_name} interval=#{INTERVAL} #{unix_time}:#{data}"

例えば、ランダムな数値を収集したい場合に Ruby では以下のように書ける。

#!/usr/bin/env ruby

PLUGIN_NAME = 'oreno-collectd-plugin'
hostname    = ENV['COLLECTD_HOSTNAME'] || "localhost"
interval    = ENV['COLLECTD_INTERVAL'] || 20

def usage
  puts("#{$0} -h <host_id> [-i <sampling_interval>]")
  exit
end

# Main
begin
  $stdout.sync = true

  while true do
    start_run = Time.now.to_i

    random = Random.new
    data = random.rand(1000..10000)
    puts("PUTVAL #{hostname}/#{PLUGIN_NAME}/gauge-random-number #{start_run}:#{data}")

    sleep(interval.to_i)
  end
end

このプログラムを実行すると、以下のように出力される。

$ ./oreno-collectd-plugin.rb
PUTVAL localhost/oreno-collectd-plugin/gauge-random-number 1475923480:4336
PUTVAL localhost/oreno-collectd-plugin/gauge-random-number 1475923500:4618
PUTVAL localhost/oreno-collectd-plugin/gauge-random-number 1475923520:8226
PUTVAL localhost/oreno-collectd-plugin/gauge-random-number 1475923540:5802
PUTVAL localhost/oreno-collectd-plugin/gauge-random-number 1475923560:9781

exec プラグインの設定

上記のスクリプトを /usr/lib/collectd/ 以下に置いて、実行権限を付与する。

sudo cp oreno-collectd-plugin.rb /usr/lib/collectd
sudo chmod +x oreno-collectd-plugin.rb

そして、/etc/collectd/collectd.conf.d/ に以下のような設定ファイルを置く。設定ファイル名は任意。ただ、拡張子に .conf が必要かもしれないので注意する。(ちゃんと確認出来ていない)

LoadPlugin exec

<Plugin exec>
  Exec vagrant "/usr/lib/collectd/oreno-collectd-plugin.rb"
</Plugin>

上記の設定が終わったら collectd を再起動する。

sudo service collectd restart

暫くすると以下のように rrd 形式でデータが保存される。

/var/lib/collectd/rrd/vagrant-ubuntu-trusty-64/oreno-collectd-plugin/gauge-random-number.rrd

CloudWatch プラグインの設定

前回同様に CloudWatch に飛ばしたいメトリクス名を以下のように whitelist.conf に追記する。

oreno-collectd-plugin-gauge-random-number

記述フォーマットは多分、以下のようなルールで正規表現も利用出来る。

#{プラグイン名}-#{メトリクス名}

暫くすると...

f:id:inokara:20161008200541p:plain

おお。

ちなみに...

collectd のフロントエンドとして Go で書かれた Facette でもメトリクスを表示させてみた。

f:id:inokara:20161008200752p:plain

Facette については、改めて書くことにする。

ということで

collectd 面白い。

CloudWatch collectd plugin メモ(EC2 以外の環境からメトリクスを飛ばす)

全国 5000 万人の収集癖の皆さん、こんばんわ。かっぱです。

tl;dr

collectd というサーバー上の各種メトリクスを収集するオープンソースツールのプラグインとして CloudWatch Plugin が awslab よりリリースされたようなので触ってみたいと思う。せっかくなので EC2 ではなく、手元の Vagrant 環境で動いている Ubuntu で動かしてみたい。

memo

試した環境

$ cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=14.04
DISTRIB_CODENAME=trusty
DISTRIB_DESCRIPTION="Ubuntu 14.04.4 LTS"

IAM ユーザーの作成

マネジメントコンソールより IAM ユーザーを作成。以下のようなポリシーを付与。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "cloudwatch:PutMetricData"
      ],
      "Effect": "Allow",
      "Resource": [
        "*"
      ]
    }
  ]
}

アクセスキーとシークレットアクセスキーを控えておく。

collectd をインストール

sudo apt-get update
sudo apt-get install collectd

CloudWatch Plugin のセットアップ

wget https://raw.githubusercontent.com/awslabs/collectd-cloudwatch/master/src/setup.py
chmod +x setup.py
sudo ./setup.py

セットアップウィザードを以下のように進めた。

vagrant@vagrant-ubuntu-trusty-64:~$ sudo ./setup.py

Installing dependencies ... OK
Installing python dependencies ... OK
Downloading plugin ... OK
Extracting plugin ... OK
Moving to collectd plugins directory ... OK
Copying CloudWatch plugin include file ... OK

AWS region could not be automatically detected. Cause:Cannot access metadata service. Cause: HTTPConnectionPool(host='169.254.169.254', port=80): Max retries exceeded with url: /latest/meta-data/placement/availability-zone/ (Caused by ReadTimeoutError("HTTPConnectionPool(host='169.254.169.254', port=80): Read timed out. (read timeout=0.5)",))
Enter one of the available regions from: http://docs.aws.amazon.com/general/latest/gr/rande.html#cw_region
Enter region: ap-northeast-1

EC2 instance id could not be automatically detected.
Enter hostname [vagrant-ubuntu-trusty-64]:

IAM Role could not be automatically detected.
Enter absolute path to AWS credentials file [/home/vagrant/.aws/credentials]:
Enter access key: AKxxxxxxxxxxxxxxxx
Enter secret key: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Choose how to install CloudWatch plugin in collectd:
  1. Do not modify existing collectd configuration
  2. Add plugin to the existing configuration
Enter choice [2]:
Plugin configuration written successfully.
Credentials configuration written successfully.
Stopping collectd process ... OK
Starting collectd process ... OK

CloudWatch に飛ばしたいメトリクスを whitelist.conf に設定

$ cat /opt/collectd-plugins/cloudwatch/config/whitelist.conf
memory--memory-.*

ちなみに、blocked_metrics というファイルに自動的に収集されるメトリクスのリストが記載されていて、その中から CloudWatch に飛ばしたいメトリクスのみを whitelist.conf に転記するようだ。(全部飛ばしたらコスト的にも大変だと思う)

collectd を再起動

sudo service collectd restart

暫くすると...

f:id:inokara:20161008150024p:plain

カスタムメトリクスに登録された。おお。

最後に

カスタムメトリクスのコスト

CloudWatch にカスタムメトリックを飛ばしたい

  • と思った時に収集部分だけを実装すればいいことになる
  • collectd が収集するメトリクスは collectd-web のような Web インタフェースで見つつ、アラームを飛ばしたいメトリクスだけ CloudWatch に飛ばすというのもありかなーと思った

一応

  • EC2 以外でも使えるので、マルチクラウド環境の監視を一時的にでも CloudWatch に寄せたいようなニーズがあれば検討出来るかもしれない

2016 年 10 月 08 日(土)

頭痛

寝不足気味で頭痛。でも、「旅サラダ」を見る。

よっちゃんと朝ごはん

金町のよっちゃんマスターと「善甚」で朝ごはん。マスターは相変わらず元気そう。キョウジさんも元気そうで何より。

羽田空港

ドヤ顔でラウンジに入ったら「こちらはプレミアム会員様限定です」と門前払いを食らった。プレミアムな体験は出来た気がする。

15:45 ANA 261 便で福岡に帰る。

帰ってきた

30 分遅れで雨の博多空港に着いた。

博多駅でもくもく

奥さんがマリンメッセで行われている絢香のライブに行っていたので、博多駅筑紫口二階のプロントでもくもくしながら合流を待つことにした。プロントの良いところはお酒が飲めるところ。あと、おつまみも充実しているのも嬉しい。

ところで、絢香のライブは「最前列やー」と喜んでいた奥さんだったが、実は「スタンドの最前列」だったらしい。ワハハ。

2016 年 10 月 07 日(金)

東京に来た

リオオリンピック、パラリンピック出場選手のパレードのタイミングと被るという、何とも美味しいタイミングだったが人の多さに目眩がした。

久しぶりの LAMP 構成

久しぶりに LAMP 構成を構築させて頂く機会を頂いたが、色々と忘れていたことがあったのでテンパった。また、情報を追えていない部分があったりして本当に反省しかなかった。

例えば、以下のような Apache 2.2 系までと Apache 2.4 で VirtualHost のディレクトリアクセス制御の書き方が全く違っていて「おおっ」って思った。

# Apache 2.2 系まで
<Directory "/path/to/document_root">
  Order allow,deny
  Allow from all
</Directory>

# Apache 2.4 系から
<Directory "/path/to/document_root">
    Require all granted
</Directory>

ほええ。

AWS WAF を初めて触った

CloudFront の IP 制限に AWS WAF を初めて触った。

焼肉

夜は杉原さんに声掛けてもらって焼肉ベアーズで焼肉を食べた。雑な表現で恐縮だが、肉もキムチ盛り合わせもめっちゃ美味しかった。

2016 年 10 月 06 日(木)

JAWS-UG 福岡「AWS Cloud Roadshow 2016 ナイトイベント LT 大会」で LT した

暖機が間に合わず不完全燃焼だったけど、久しぶりにメンバーの皆さんにお会いしてお話出来たのが良かった。

明日から東京

一泊二日の出張です。