2013/10/30

ElasticSearch + fluentdでログ分散管理

前々回前回と、ElasticSearchについて勉強をしました。繰り返しになりますが、ElasticSearchの特徴は「RESTfulで全てがJSON」です。そうするとJSONデータであれば何でも食わせて全文検索が出来るわけですね。またCluster機能によって保持データを分散させることで可用性も確保出来ます。

高い可用性が必要で、全文検索したいもの...ログだ!

そこでfluentdです
fluentdはイベントログ収集のためのオープンソースソフトウェアで、インプットされたイベントログをJSONに変換してアウトプットします。「Log everything in JSON」です。開発元であるTreasure Data, Inc.の古橋氏のBlogに詳細があります。

2013/10/29

ElasticSearchのCluster機能を試す

ElasticSearchとは、の修正
昨日僕はElasticSearchを「検索エンジン」と書きましたが、正確に言うと「全文検索エンジンであるLuceneを使用した、全文検索システム」です。

Luceneとは
Apache Software Foundationで開発されている全文検索エンジンで、Javaのクロスライブラリとして提供されています。

Solrとは
Apache Software Foundationで、Luceneのサブプロジェクトとして開発されている、全文検索システムです。Luceneを検索エンジンとして使用しており、もちろんJavaで書かれています。

ElasticSearchとSolrの比較
ものすごくざっくり言っちゃうと、ElasticSearchはRESTfulで全てがJSONです、ということ...なのかな
ElasticSearchにあるclustering機能はSolr4で採用されたSolrCloud機能でカバーされたようだし、細かいことは色々あるんだろうけど、簡易的な使い方に絞って言えばRESTfulなのはとても便利だと思います。

本題
今回はElasticSearchのCluster機能を試してみたいと思います。

2013/10/28

ElasticSearchとKuromojiで日本語全文検索してみる

北海道開発オフなどでご一緒させて頂いた方はご存知だと思いますが、元々インフラエンジニアとしてネットワーク機器の設定やサーバの構築ばかりしていた僕がプログラムを書くようになったのは、「形態素解析してマルコフ連鎖するTwitter botを作りたい!」というのがきっかけであり、日本語の分かち書きや全文検索というのは僕にとって興味深くそして好きな技術の一つです。

そこで今回はElasticSearchとそのプラグインであるelasticsearch-analysis-kuromojiについて調べてみました。

ElasticSearchとは
Apache v2ライセンスで公開されているオープンソースソフトウェアの検索エンジンです。特徴として
  • RESTfulなAPIが使える
  • InputもOutputもJSON
  • スキーマフリーなので面倒臭い定義無しにデータを突っ込める
等があります。

AlternativesでRubyのバージョンを切り替える

現在最新のAmazon Linux AMI(Amazon Linux AMI 2013.09)に初期導入されているRubyは1.8.7だ。
$ ruby -v
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
しかしRuby 1.8.7は引退しました。互換性の問題で1.8.7なのかな?まぁとにかく新しいRubyを使いたいなぁと思って調べていたら、AMIのRelease Notes
You can switch between Ruby 1.8 and 1.9 with one command
って書いてあった。なのでやってみよう。

まずはyum全体を最新化する。
$ sudo yum check-update
$ sudo yum update
次にruby1.9をインストールする。
$ sudo yum install ruby19 
そしてalternativesでrubyというコマンドの向き先を1.9に変更する。
$ sudo alternatives --set ruby /usr/bin/ruby1.9
$ ruby -v
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-linux]
1.8に戻す場合。
$ sudo alternatives --set ruby /usr/bin/ruby1.8
$ ruby -v
ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]
対話的にも切替が出来る。
$ sudo update-alternatives --config ruby
There are 2 programs which provide 'ruby'.
  Selection    Command
-----------------------------------------------
*+ 1           /usr/bin/ruby1.8
   2           /usr/bin/ruby1.9
Enter to keep the current selection[+], or type selection number: 2 
$ ruby -v
ruby 1.9.3p448 (2013-06-27 revision 41675) [x86_64-linux]
これは便利。なお先述のAMIのRelease Notesに
We expect Ruby 2.0 to land in our Amazon Linux AMI "preview" repository in advance of our 2014.03 release.
と書いてあったので、Ruby 2.0は2014年3月までお待ちくださいってことらしい。

2013/10/24

パピーウォーカーとして過ごした日々について

2012年8月25日から2013年9月16日までの一年間、北海道盲導犬協会よりパピーウォーカーとして委託を受け、盲導犬候補犬の飼育を行った。

ここに記録を残そうと思う。

パピーウォーカーについて
盲導犬候補犬の委託を受け飼育を行うボランティアである。盲導犬協会は全国各地に公益財団法人や社会福祉法人といった形であり、北海道の場合は「公益財団法人北海道盲導犬協会」になる。ちなみに場所は札幌市中央区、豊平川沿い。
パピーウォーカーになる条件は多くなく、室内で犬が飼えること、自家用車があること、長時間留守にしないこと、等。基本的に赤ちゃん犬なので長時間目を離すことは出来ないし屋外で飼うことも出来ない、自家用車はパピーを連れて盲導犬協会に来て研修を受ける必要があるため。
金銭的な負担もほぼ無く、餌代とおもちゃなどのみ。病気や怪我の場合は領収書を取得して盲導犬協会に提出することになる。なお、わんこの食費は一ヶ月で大体5000円くらい。家族での外食を1回控えると充分賄える。

2013/10/23

AWSを低いレイヤーから調べてみよう

AWSを低いレイヤーから調べてみようのコーナー!
今日はSNSとSQSの通信についてパケットキャプチャしてみました!

SNS
IAM roles for EC2でPowerUsersに設定したEC2から、AWS command line toolsでaws sns publishしたものをtcpdumpでキャプチャしてWiresharkに食わせました。

2013/10/22

AWS::ELBのHealth Checkについてのメモ

ELBのHealth Checkについて調べたのでメモ。


Ping Protocol
サーバの生存監視(ヘルスチェック)に使うプロトコルを指定します。HTTP、TCP、HTTPS、SSLから選択します。
HTTP、HTTPSの場合はPing Pathを設定することが出来ます。

■Ping Port
ヘルスチェックに使うポートを指定します。例えばHTTPなら80、HTTPSなら443などです(もちろん任意で指定可能です)

■Ping Path
Ping ProtocolをHTTP又はHTTPSとした場合に指定可能です。ヘルスチェックで該当PathがGET出来無いと異常と判断します。

■Response Timeout
ヘルスチェックのタイムアウト時間を秒で指定します。指定した秒だけ応答が無ければ異常と判断します。デフォルトだと5秒です。

■Health Check Interval
ヘルスチェックの間隔を分単位で指定します。デフォルトの0.5minutesは30秒です。

■Unhealty Threshold
ここで設定した回数だけヘルスチェックが失敗した場合、振り分け対象から除外します。デフォルトだと2回です。
Unhealty Thresholdが2回、Response Timeoutが5秒、Health Check Intervalが0.5minutesの場合、障害発生から切り離しまで最長30+5+30+5=70秒かかります。
[Check直後にFault]→30sec→[1st Check]→5sec→[1st Timeout]→30sec→[2nd Check]→5sec→[2nd Timeout]→[Cut Off!]
■Healthy Threshold
振り分け対象外となったインスタンスが、ここで指定した回数だけヘルスチェックに成功したら、振り分け対象に戻します。デフォルトだと10回です。
Healthy Thresholdが10回、Health Check Intervalが0.5minutesの場合、障害復旧から切り戻しまで最長300秒掛かります。
[Check直後にRestore]→30sec→[1st Check]→30sec→[2nd Check]→30sec→[3rd Check]→30sec→[4th Check]→30sec→[5th Check]→30sec→[6th Check]→30sec→[7th Check]→30sec→[8th Check]→30sec→[9th Check]→30sec→[10th Check]→[Cut On!]


2013/10/21

AWSでOSSECを導入する

前回の調査に引き続き、クラウドにおける侵入検知の一つの方式として、AWSにOSSECを導入してみました。

2013/10/18

AWSのSource/Dest. Checkについてのメモ

昨日「[AWS]VyattaでNATインスタンスを立ててみた」を試している中で、EC2のSource/Dest. Checkについて
「送受信するパケットの送信元あるいは送信先が自分であるかのチェック」
と書いたんだけど、これって結局Promiscuous modeの設定なんじゃないか?と思い、

  1. 同一Subnet内に二つのEC2を建てる
  2. 片方のEC2でtcpdumpする
  3. もう片方のEC2に通信する
という実験をしてみたが、全く通信が引っかからなかった。

何でだろうと思って調べていたところ、Amazon Web Services: Overview of Security Processesという文章を見つけた。以下抜粋。
It is not possible for a virtual instance running in promiscuous mode to receive or "sniff" traffic that is intended for a different virtual instance. While customers can place their interfaces into promiscuous mode, the hypervisor will not deliver any traffic to them that is not addressed to them. This includes two virtual instances that are owned by the same customer, even if they are located on the same physical host. 
つまり
  • EC2インスタンスでPromiscuous modeを有効にしても自分以外の通信を盗聴することは出来ない
  • 自分自身が所有する2つのEC2インスタンスを同一の物理ホスト上で動かしていても同様
ということですね。

AWSはXenをベースにカスタマイズしたハイパーバイザを採用しているそうで、XenはPromiscuous modeで動作可能(How to Configure a Promiscuous Virtual Machine in XenServer)なんだけど、クラウドプラットフォームサービスに特化したAWSでは全面禁止になっているようだ。

クラウドが主流となっていくとネットワークベースのIDS/IDPからホストベースのIDS/IDPに変わって行くのかなぁ。この辺のクラウド構成でのセキュリティ対策については今後も勉強していこう。






2013/10/17

[AWS]VyattaでNATインスタンスを立ててみた

きっかけはこの記事。

[Developers.IO]VYATTA USERS MEETING Autumn 2013(の前半)に参加しました

Vyattaは2年半前に触ったっきり情報を追ってなかったんだけど、AWSのような環境こそVyattaが活きるなぁと思い、AWSの中でNATインスタンスとして立ててみた。
なおAmazonのWebサイトにも記載してあるとおり、NATと言うよりPAT/NAPT/IP masqueradeの動作になる。

(1)準備
VPCの中にSubnetを2つ作り、1つをPublic、1つをPrivateとする。
VPCにInternet Gatewayを作成する。
PublicのRoute TableにVPC内の経路と、デフォルトゲートウェイとしてInternet Gatewayを設定する。
PrivateのRoute TableはVPC内の経路のみ持つ。

こんな感じ。

(2)Create Security Group for NAT Instance
今回はローカルネットワークからのHTTP/HTTPS通信を受け取り、外部に送信する。
なおInbound SSHをAnyにしてあるけど、本来はメンテナンスネットワークのIPアドレス帯をSourceに設定すべき。
Inbound - Local IP Network - 80(HTTP)
           - Local IP Network  - 443(HTTPS)
           - Any                    - 22(SSH)
Outbound - Any                 - 80(HTTP)
              - Any                 - 443(HTTPS)

(3)Launch NAT Instance
[Community AMIs]で「vyatta」で検索すると出てくる「Vyatta Core 6.6 R1 x86_64 rev1」を使う。なお本AMIは@j3tm0t0氏が作成しデプロイされたもので、ありがたく使わせて頂きます。なお当然ですがCommunity AMIは場合によっては悪意あるユーザーによってどんなバックドアが仕込まれてるかわかったもんじゃないので自己責任の利用となります。
VyattaはオフィシャルにVyatta Network OS AMI(有償)もリリースしています。

(4)Change Source/Dest. Check
NAT Instance設定のキモ。EC2ではデフォルトで実行されている「送受信するパケットの送信元あるいは送信先が自分であるかのチェック」を無効にすることで、他ノードからのあるいは他ノードへのIPパケットが自分を経由して通信することを可能にする。
設定場所はここ。

(5)最低限のアクセス認証設定
デフォルトだとUser:vyatta、Password:vyattaで、かつパスワード認証でログイン出来てしまうため、このまま外部から接続出来るようにするのは危険。まずは同一ネットワーク内の別のEC2からSCPで公開鍵を送りつけた後にSSHで接続し、最低限のアクセス認証設定だけ行う。
$ configure
# loadkey /home/vyatta/.ssh/"公開鍵"    ← 公開鍵をLoadする
# set service ssh disable-password-authentication   ← パスワード認証をDisableにする
# commit
# save

(6)Associate Elastic IP for NAT Instance
作成したNAT InstanceにElastic IPを割り当る。これが外部のアクセス先から見えるグローバルIPアドレスになる。

(7)Configure NAT Instance
まずは基本的なホスト名、ドメイン名、タイムゾーン、NTPサーバの設定。
$ configure
# set system host-name "ホスト名" 
# set system domain-name "ドメイン名" 
# set system time-zone Asia/Tokyo
# set system ntp server "NTPサーバ"
# commit

次にキモとなるNATの設定。同一VPCからの通信をmasqueradeでOutboundする。
# set nat source rule 10 outbound-interface eth0
# set nat source rule 10 source address 172.31.0.0/16
# set nat source rule 10 translation address masquerade
# commit  
# save

(8)Operation verification
PrivateのSubnetのRoute Tableに、デフォルトゲートウェイとしてNAT Boxを設定する。
Privateに属したEC2から、NAT Instanceを経由して外部通信してみる。

$ w3m http://www.google.com/


はいOK。

(9)感想
今回はNATインスタンスとして構築したけれど、AWSでだとVPN BOXとして使われることが多いようだ。次回はその辺にチャレンジしたい。



オープンソース・ソフトウェアルータVyatta入門 ――実践ルーティングから仮想化まで (Software Design plus)オープンソース・ソフトウェアルータVyatta入門 ――実践ルーティングから仮想化まで (Software Design plus)
近藤邦昭,松本直人,浅間正和,大久保修一,日本Vyattaユーザー会

技術評論社
売り上げランキング : 19102

Amazonで詳しく見る by AZlink

「妻は俺の嫁」を電子書籍にして出版してみた

Kindle paperwhite 3Gを買ったのと、Kindleダイレクト・パブリッシング(通称KDP)での出版が非常にお手軽になったという話を聞いたのをきっかけに、「僕もちょっと電子書籍作ってみたい」と思い、

「妻は俺の嫁」を電子書籍にして出版してみた。

妻は俺の嫁妻は俺の嫁


smokeymonkey

Amazonで詳しく見る by AZlink

以下、これの作り方。

(1)原稿を作る
原稿はまずePubファイルで作成し、その後KDPで出版可能なMobi形式に変換することになる。
ePubエディタは抜群に知名度が高いSigilを使用した。なおSigilはGPLv3ライセンスで公開されておりgithubでソースが公開されている。このアプリケーションはマルチプラットフォーム対応になっており、Windows、Mac、Linuxで実行可能。素晴らしい。
ePubの実体はXHTML+XMLで構成されているため、ePubエディタ上もワープロソフトのように文章を入力しつつ、HTMLやCSSをガシガシ使って体裁を整えるイメージ。なお表紙だけは画像取り込みで行った。
メニューなども日本語化されているし、CSSで縦書き構成にも出来るし、とても簡単に作れるなぁという感想。デザイナーの人でいれば綺麗な製版が出来るのだと思う。

(2)原稿を確認する
ePubエディタで作成した原稿が実際にKindle上でどう見えるのかを確認するには、Amazon謹製のKindle Previewerが使用できる。このソフトウェアはビューワだけでなくKindleGenというMobi formatジェネレータが同梱されており、ePub形式のファイルを読み込むと自動的にMobi形式に変換して表示してくれる。
力入ってるなぁ。こういうツール類がオフィシャルに用意されてるのは強み。

(3)原稿を入稿する
前述のKindle Previewerで作成したMobi形式のファイルがそのまま入稿できる。なおePub形式でアップロードすると自動的にMobi形式に変換してくれるそうだが、今回はエラーになったため、ローカル環境でMobi形式に変換してからアップロードするほうが確実のようだ。

(4)ロイヤリティについて
今回は別に利益を得たいわけではないので適当に一番安いのを選んだんだけど、本当に利益を考えて出版するとなると、色々と面倒臭いことがあるようだ。
まず書籍の価格に対するロイヤリティは35%と70%から選択できる。70%の場合ファイルサイズによって「配信コスト」が引かれる。Amazon.co.jpの場合\1/MB。ファイルサイズが大きくなればなるほどコストが高くなるので、書籍のファイルサイズを可能な限り小さくする、といったテクニックが必要になるようだ。
次に支払いの問題。KDPのロイヤリティはAmazonUSから支払われるため、小切手か銀行振込になる。小切手の場合$100を越えると支払われる。ただし小切手は外貨建てで、日本円に換金するには銀行で手数料を払う必要がある。では銀行振込はどうかというと、1000円単位で自動的に振込してくれるが、1回の振込で2500円の手数料が掛かる。なんだそれ。
今回の場合は一番面倒くさく無さそうな30%のロイヤリティオプションで小切手支払いを設定した。

(5)入稿から出版まで
入稿後は手動チェックが入るので出版まで最大48時間程度掛かるそうなんだけど、コレみたいな小さいのは6時間で完了した。早い。

(6)全体的な感想
まず、出版への敷居が非常に低くなったと思う。電子書籍なんて無かった時代は自分でDTPして製本会社を探して販売してくれるところの伝手を辿って結構大きな自費出費があったり、あるいは同人誌即売会のようなイベントで手渡し販売するような状況だったんだろうけど、今は手間だけ掛ければほぼノーコストで出版まで出来る。もちろんちゃんとデザインや広告、商流まで考えると費用はかかるんだろうけど、個人が趣味で細々とやってる分にはすごくお手軽。

この電子書籍の潮流の中で、小説でも詩でも何でも、新しい才能、新しい文化が生まれてくると面白いなぁ。



Kindle Paperwhite 3G (2012年モデル)Kindle Paperwhite 3G (2012年モデル)

2013/10/14

Windows 7でVagrant + Sahara

今更感はあるけれど、Windows 7のノートPCにVagrantをセットアップしてみた。

(1)VirtualBoxをインストールする。
https://www.virtualbox.org/wiki/DownloadsからVirtualBox 4.2.18 for Windows hostsをダウンロードしインストール。


(2)Vagrantをインストールする。
http://downloads.vagrantup.com/からVagrant_1.3.4.msiをダウンロードしインストール。


(3)CentOSをインストールしたVagrantBoxを作成する。
> vagrant box add centos https://dl.dropbox.com/u/7225008/Vagrant/CentOS-6.3-x86_64-minimal.box
> vagrant init centos
> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for machine to boot. This may take a few minutes...
Timed out while waiting for the machine to boot. This means that
Vagrant was unable to communicate with the guest machine within
the configured ("config.vm.boot_timeout" value) time period. This can
mean a number of things.

If you're using a custom box, make sure that networking is properly
working and you're able to connect to the machine. It is a common
problem that networking isn't setup properly in these boxes.
Verify that authentication configurations are also setup properly,
as well.

If the box appears to be booting properly, you may want to increase
the timeout ("config.vm.boot_timeout") value.

怒られました。

Windows7にVirtualBoxとVagrantをインストールしたメモ
仮想化支援機能(VT-x/AMD-V)を有効化できません
を参考にしたところ、64bitのイメージを入れようとしているのに、仮想化支援機能(VT-x/AMD-V)が有効になっていなくてエラーで止まっているようだ。

BIOSで「Intel(R) Virtualization Technology」と「Intel(R) VT-d Feature」をEnabledにしてもう一度。
> vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
[default] Clearing any previously set forwarded ports...
[default] Creating shared folders metadata...
[default] Clearing any previously set network interfaces...
[default] Preparing network interfaces based on configuration...
[default] Forwarding ports...
[default] -- 22 => 2222 (adapter 1)
[default] Booting VM...
[default] Waiting for machine to boot. This may take a few minutes...
[default] Machine booted and ready!
[default] The guest additions on this VM do not match the installed version of
VirtualBox! In most cases this is fine, but in rare cases it can
cause things such as shared folders to not work properly. If you see
shared folder errors, please update the guest additions within the
virtual machine and reload your VM.

Guest Additions Version: 4.1.18
VirtualBox Version: 4.2
[default] Mounting shared folders...
[default] -- /vagrant

OK。


(4)起動したVagrantBoxに接続してみる。
> vagrant ssh
`ssh` executable not found in any directories in the %PATH% variable. Is an
SSH client installed? Try installing Cygwin, MinGW or Git, all of which
contain an SSH client. Or use the PuTTY SSH client with the following
authentication information shown below:

Host: 127.0.0.1
Port: 2222
Username: vagrant
Private key: C:/Users/ユーザー/.vagrant.d/insecure_private_key

怒られました。なので上記の通りの情報でTeraTermから接続→OK。


(5)Saharaプラグインをインストールする。
> vagrant plugin install sahara
Installing the 'sahara' plugin. This can take a few minutes...
Installed the plugin 'sahara (0.0.15)'!


(6)Saharaプラグインを使ってみる。
# sandboxモードをON。
> vagrant sandbox on

# sandboxモードONにしたタイミングまでRollback。
> vagrant sandbox rollback

# sandboxモードONにしたタイミングからここまでの変更をcommit。
> vagrant sandbox commit



(7)感想
Saharaとかchef-soloとかと組み合わせることで開発環境をサクサク作れるようにしておく、というのはとても便利ですね。チーム開発で環境を横並びに揃えておくにも便利だし、イメージ展開と違って常に新しいバージョンを使えるのもメリットだと思いました。

Kindle Paperwhite 3G (2012年モデル)を買った

題記の通り。東京出張で丸一日空いたので朝から赤羽で飲んだくれて秋葉原のソフマップで触ったら良さそうでちょうどAmazonで旧モデル3000円オフ投売りだったのでポチった。

Kindle Paperwhite 3G (2012年モデル)Kindle Paperwhite 3G (2012年モデル)


Amazon.co.jp
売り上げランキング : 43

Amazonで詳しく見る by AZlink
重量は思ったより軽く片手で持つのにちょうど良い。本を1冊2冊持ち歩くことを考えると確実にこっちのほうが軽い。
前面を覆うカバーもあるけど、カバーを付けちゃうと「手軽に取り出して電源を入れたら使える」という優位性が失われると思うので付けていない。またこのスクリーンはちょっとザラザラしてるんだけど、その触感がとても良いので、保護フィルムも付けていない。
手軽さこそが命の製品だと思うので、付属品一切無しのほうが使いやすいと思う。

e-linksディスプレイは「紙に印刷された活字に慣れてると気になるかなぁ」と思っていたんだけど、ほとんど気にならない。スリープから復帰してパスワード入力するあたりがちょっとモタつくけど、画面を開いちゃったあとはサクサクページもめくれるし快適。

難点があるとすれば、電子書籍自体のラインナップが(僕にとっては)満足できるほどじゃない、というのと、Kindle自体から購入するときの検索UIの使いづらさかなぁ。購入自体は「PCのWebブラウザから買ってMy Kindleに保存→Kindle端末に同期」という手が使えるから良いとして、主にSFばかり読む僕が読みたい本がそれほど多くないというのがちょっと寂しい。今後の充実に期待したいところ。

とりあえず恩田陸さんの「ドミノ」を買ってみた。しばらく読み倒してみようと思う。

ドミノ (角川文庫)ドミノ (角川文庫)
恩田 陸

KADOKAWA / 角川書店
売り上げランキング : 480

Amazonで詳しく見る by AZlink

2013/10/12

AWS::ELBについてのメモ

先日、とある識者の方とお話しているときに、マルチAZ構成に組み込まれたELBが、複数のグローバルIPアドレスを所持していることを知りました。

以下、digの結果。

myelb-15XXXXXXXX.us-west-2.elb.amazonaws.com. 60 IN SOA ns-944.amazon.com. root.amazon.com. 1381560172 3600 900 7776000 60
myelb-15XXXXXXXX.us-west-2.elb.amazonaws.com. 600 IN NS ns-944.amazon.com.
myelb-15XXXXXXXX.us-west-2.elb.amazonaws.com. 60 IN A 50.112.133.1XX
myelb-15XXXXXXXX.us-west-2.elb.amazonaws.com. 60 IN A 54.200.96.1XX


ELB & CloudWatch & AutoScaling - AWSマイスターシリーズにも書いてありました。

・マルチAZを用いていると、2つ以上のIPアドレスを持つ(最大8個まで)

つまりELB自体はAZ上にあるイメージで、AZが丸ごと落ちたときのために、それぞれのAZの範囲内のグローバルIPアドレスを持っている、ということなんですね。なおELBは「トラフィックに併せて自動的にキャパシティを増減」し、同時に数も増減するため、このIPアドレス数は=構成するAZの数では無く、最低IPアドレス数が構成するAZの数になるようです。

このAレコードの返却についてはAWSのDNSサーバが自動的にラウンドロビンしてくれているとのこと。この辺がELBのFQDNのTTLとminimumが60秒になっている理由のようです。今時のブロードバンド(死語か...)だと大した負荷じゃないのでしょうが、「TTLを60秒にして良いのはサーバ移設かISP移設のときだけ」のような教育をされてきた僕みたいなおっさんはちょっとドキドキします。

という、メモ。



Amazon Web Services クラウドデザインパターン実装ガイドAmazon Web Services クラウドデザインパターン実装ガイド
大澤 文孝,玉川 憲,片山 暁雄,鈴木 宏康

日経BP社
売り上げランキング : 17216

Amazonで詳しく見る by AZlink

2013/10/06

「妻は俺の嫁 4」をトゥギャってみた

妻は俺の嫁 4


■過去の経緯


Twitterという「媒体」に言葉を放つようになって7年が経ちました。その間に日々発生した妻との出来事ややり取りをちまちまとまとめていたのがコレです。
見出しに「愛妻家ってのは妻を愛してる人であって妻に愛されている人とは限らない」って書いたけど、僕は「愛妻家」という表現が好きじゃないです。夫が妻を愛しているのなんて当たり前じゃない。妻に愛されているなら素晴らしいことだと思う。僕?ま、まぁ...


さて、妻と出会って15年になるわけですが、恋人から夫婦に代わり、父母の立場になり、そして10年以上一緒に暮らしていると、良い意味で空気のようになります。あっても気にならないけど無いと死ぬ。だからやり取りも直接的な愛情表現が減っていく分、相手のツボを心得た返事が出来るようになり、毎日の会話がどんどん楽しくなるんですよね。それでも僕はめげずに愛してる愛してる言い続けてるんですけど!
こうやって毎日の妻との生活が楽しいと思えるのはほぼ100%妻のおかげです。ありがとう妻様。

これはただのログでしか無いし、誰かにとって役立つようなものでは無いけれど、こんな夫婦もいるんだなぁくらいの気持ちで見守って頂けると幸甚です。




中国嫁日記 一中国嫁日記 一
井上 純一

エンターブレイン

Amazonで詳しく見る by AZlink

2013/10/05

CloudInitを使ってみた

Amazon Linuxで何気なくchkconfig --listしたら、見たこと無いやつがあった。

$ chkconfig --list
cloud-init      0:off   1:off   2:on    3:on    4:on    5:on    6:off
cloud-init-user-scripts 0:off   1:off   2:on    3:on    4:on    5:on    6:off

cloud-init?なんだそれ?

CloudInit[cloud-init is the Ubuntu package that handles early initialization of a cloud instance.]とのことで、元々Ubuntuのパッケージだったそうなんだけど、要はEC2インスタンスの初期起動時のお決まりのセットアップをスクリプト化しちゃうものらしい。なるほど便利そう。

CloudInitのスクリプトは、EC2インスタンスをLaunchするときの以下の画面、User Data枠に記載する。


例えばこんな感じ。
パッケージ全部をyum upgradeして、指定したパッケージを追加で入れて、かつコマンド実行する。今回はAWS-SDKがセットアップされた状態にしたかった。

#cloud-config
repo_upgrade: all
packages:
- ruby-devel
- rubygems
- gcc
- make
- libxml2-devel
- libxslt-devel
runcmd:
- [gem, install, nokogiri]
- [gem, install, aws-sdk]
- [sed, -i, 's/en_US/ja_JP/', /etc/sysconfig/i18n]
- [cp, /usr/share/zoneinfo/Asia/Tokyo, /etc/localtime]


EC2インスタンス起動後、ログを確認し、エラーが無いことを確認する。
# cat /var/log/cloud-init.log

どれどれ...

$ gem list --local

*** LOCAL GEMS ***
aws-sdk (1.20.0)
json (1.8.0)
mini_portile (0.5.1)
nokogiri (1.5.10)
uuidtools (2.1.4)

おおーちゃんと最初からAWS-ASKがセットアップ済みだー!これは便利!
大量に同じノードを展開したいときはオリジナルAMI作ってばら撒くほうが良いんだろうけど、いつも必ず最初にやるようなことはCloudInitにお任せしちゃうと楽だね!

2013/10/04

AWS Command Line Interfaceを使ってみた

関連:初めてのAWSメモ(2):CloudWatchからSNS→SQS、AWS SDK for RubyでQueue取り出し
関連:AWS SDKを使ってSNSにCPU使用率を送りつける

前回はAWS SDK for rubyを使ってSNSとSQSを操作(SNSにメッセージを送り、SQSから取り出す)を行っていたけれど、2013年9月3日に正式リリースされたAWS Command Line Interfaceを使えばもっと簡単に出来るんじゃないか?と思い、やってみた。


(1)AWS Command Line InterfaceはPythonのeasy_installでインストールする。
$ sudo yum -y install python-setuptools
 →Amazon Linuxには最初から入ってました
$ sudo easy_install awscli

(2)configファイルを作成する。
$ mkdir ~/.aws/
$ chmod 700 =~/.aws/
$ vi ~/.aws/config
---
[default]
aws_access_key_id = アクセスキー
aws_secret_access_key = シークレットキー
region = リージョン
---
$ chmod 600 ~/.aws/config

(3)SNS TopicへPublishする。
$ aws sns publish --topic-arn arn:aws:sns:リージョン:1234567890:cpu-alert --message "`mpstat -P ALL`" --subject "alert"

(4)SQSからgetする。
$ aws sqs receive-message --queue-url https://sqs.リージョン.amazonaws.com/1234567890/alert

60秒おきにgetしたかったら while true; do コマンド; sleep 60; done とかしとけばいい。


簡単じゃないか...AWS SDKを使ってScriptに組み込むのとコマンドラインから操作するのは適材適所だろうけどけど、どっちも便利だなぁ。

Amazon Web Services クラウドデザインパターン実装ガイドAmazon Web Services クラウドデザインパターン実装ガイド
大澤 文孝,玉川 憲,片山 暁雄,鈴木 宏康

日経BP社
売り上げランキング : 17216

Amazonで詳しく見る by AZlink

2013/10/03

AWS SDKを使ってSNSにCPU使用率を送りつける

初めてのAWSメモ(2):CloudWatchからSNS→SQS、AWS SDK for RubyでQueue取り出し」ではEC2のDetailed Monitringを使って「対象EC2のCPU使用率を1分に1回SNSに通知→SQSに分配→監視サーバからAWS SDKを使って取り出し」していたんだけど、普通にAWS-SDKを使って通知もしちゃえば良いことに気づき、Script書いてみた。

 (1)CPU使用率はmpstatを使って取得したいので、sysstatをinstallする。
 $ sudo yum -y install sysstat

 (2)通知スクリプト。mpstatで取得したCPU使用率をAWS-SDKを使ってSNSに送りつける。
  (※追記:IAM Roke for EC2を設定してればアクセスキーとシークレットキーはいらない)

#!/usr/bin/ruby

require 'rubygems'
require 'aws-sdk'

access_key = 'アクセスキー'
secret_key = 'シークレットキー'
sns_endpoint = 'sns.xxxxx.amazonaws.com'
topic_arn = 'arn:aws:sns:xxxxx:1234567890:cpu-alert'

AWS.config(:access_key_id => access_key,
           :secret_access_key => secret_key,
           :sns_endpoint => sns_endpoint)

topic = AWS::SNS::Topic.new(topic_arn)
message = `mpstat -P ALL`

while true
  topic.publish(message,'cpu usage.')
  sleep 60
end

(3)実行すると1分に1回mpstatの結果をSNSに送りつけるので、監視サーバ側でSQSから取り出せばOK。




Amazon Web Services クラウドデザインパターン実装ガイドAmazon Web Services クラウドデザインパターン実装ガイド
大澤 文孝,玉川 憲,片山 暁雄,鈴木 宏康

日経BP社
売り上げランキング : 17216

Amazonで詳しく見る by AZlink

Amazon CloudWatch Monitoring Scripts for Linuxを使う

(0)ACMS for Linuxを使いたいEC2をIAM role for EC2 PowerUsersにしておく。
(1)インストールする。
$ wget http://ec2-downloads.s3.amazonaws.com/cloudwatch-samples/CloudWatchMonitoringScripts-v1.1.0.zip
$ unzip CloudWatchMonitoringScripts-v1.1.0.zip
$ rm CloudWatchMonitoringScripts-v1.1.0.zip
$ cd aws-scripts-mon
(2)getの動作確認。
$ ./mon-get-instance-stats.pl
---
Instance i-ABCDEFG statistics for the last 1 hour.

CPU Utilization
    Average: 0.27%, Minimum: 0.00%, Maximum: 3.39%

Memory Utilization
    Average: N/A, Minimum: N/A, Maximum: N/A

Swap Utilization
    Average: N/A, Minimum: N/A, Maximum: N/A
---
(3)putの動作確認。
$ ./mon-put-instance-data.pl --mem-util --verify --verbose
---
MemoryUtilization: 8.40000262952031 (Percent)
No credential methods are specified. Trying default IAM role.
Using IAM role
---
EC2 PowerUsersのRoleを使ってることが確認できた。
(4)実際にSendしてみる。
$ ./mon-put-instance-data.pl --mem-util --mem-used --mem-avail
(5)AWS consoleのCloudWatchから確認する。
 cronで回してCloudWatchのグラフで確認して...って感じかな。
 MRTG的な感じ。

2013/10/02

初めてのAWSメモ(2):CloudWatchからSNS→SQS、AWS SDK for RubyでQueue取り出し

■やりたいこと

■参考にしたURL
AWS CloudWatch と Alarm を試してみる
SQSってなんじゃ?(AWSコンソールにSQS登場)
Rubyを使ってAmazon SNSとSQSを操作する:fanoutパターン
AWS SDK for RubyでSQSを操作する

■やったこと
1.SQSの設定
  SNSから通知するためのSQSを、先に作っておく。
  -- SQS NavigationからCreate new Queueをクリック
   -- 適当に名前付けてQueueを作っておく
   -- Detail画面からARNをメモしておく
   -- PermissionからAdd a Permissionで追加
    -- Allow Everybody Sendmessage(送信元をSNSに縛れるか?確認)

2.SNSの設定
(1)SNS NavigationからSNSのTopicを作る
  -- Create New Topic
   -- Nameを付与して作る
(2)作成したTopicに対してSubscriptionを設定する
  -- Create Subscription
   -- ProtocolはEmail、Endpointはメールアドレス
   -- 登録したメール宛に認証メールが来るので対応する
  -- もいっちょCreate Subscription
   -- ProtocolはAmazon SQS、Endpointは1.で作ったSQSのARN。
      (後で気づいたんだけど、Queue側からSubscribe Queue to SNS Topicで紐つけが出来た)
  -- TopicからPublish to this Topicでテストメッセージが送信可能。

3.CPU監視される側のEC2立ち上げ
(1)EC2からSNSにアクセスするために、IAM roleの設定を行う。
  なお、Launch済のEC2のIAM Roleを変更することは出来ないみたい。
  -- IAM Dashboard
   -- Roles -> Create New Role
    -- Amazon EC2に対しPower Usersを付与。
(2)IAM roleを設定したEC2を立ち上げる。
  -- EC2 Dashboard
   -- Instances -> Launch New Instance
    -- ほぼDefault、IAM Roleだけ(1)で作ったRoleを設定する。
  -- Elastic IPsでGlobal IPも振っておく。
(3)CloudWatchの設定。今回は「1分に1回CPU使用率を通知」したいんだけど、
  基本モニタリングでは5分に1回しか出来ないため、Deailed Monitoringを使う。
  追加料金かかります。
  -- EC2 Dashboardで対象のEC2を選択、Monitorningタブを表示
   -- Enable Detailed Monitoringをクリック
   -- Create AlermからAverage of CPU Utilizationを1分単位で通知にする。
    -- 負荷はテストなので10%以上に。
    -- send a notification toは1.で作成したSNSを指定。
(4)試しに負荷を上げてみる。yum installとか。


4.CPU監視する側のEC2立ち上げ
(1)EC2 DashboardからLaunch EC2でもう1台立ち上げる。
 IAM Roleの設定だけ忘れずに。
(2)このEC2からSQSをPollingして、Queueがあったらコンソールに表示したい。
(3)AWS SDK for Rubyのセットアップ
  $ sudo yum install ruby-devel rubygems gcc make libxml2-devel libxslt-devel
  $ sudo gem install aws-sdk
(4)AWS SDK for Ruby経由でSQSからMessageを拾って表示。一度表示したらQueueから削除。
 Access_keyとSecret_keyはアカウントオプションのSecurityから取得できる。
  (※追記:IAM Roke for EC2を設定してればアクセスキーとシークレットキーはいらない)

  $ vi get_sqs.rb

#!/usr/bin/ruby

require 'rubygems'
require 'aws-sdk'

access_key = 'アクセスキー'
secret_key = 'シークレットキー'
sss_endpoint = 'SQSのURI'
queue_url = 'queueのURL'
queue_name = 'queueの名前'

sqs = AWS::SQS.new(:access_key_id => access_key,
                   :secret_access_key => secret_key,
                   :sss_endpoint => sss_endpoint,
                   :queue_url => queue_url  ).client

while true
  message = sqs.receive_message(:queue_url => queue_url)[:messages][0]
  if message
    puts message[:body]
    sqs.delete_message(:queue_url => queue_url, :receipt_handle => message[:receipt_handle])
    puts "Waiting"
  end
  sleep 5
end

(5)$ ruby ./get_sqs.rb で実行。
(6)SNSからPublish to this Topicsでテストメッセージを送って、コンソールにMessageが表示されることを確認。
(7)監視される側のサーバでyumとか使って負荷を上げて、SNS→SQS→コンソールにメッセージが表示されることを確認する。

■感想
・CloudWatchを使った監視はとてもお手軽。5分より短い間隔で監視したいほどシビアな案件なんてそんなに無いので、基本モニタリング充分使えると思う。
・SQSとAWS SDKを使ってイベント駆動のアプリ作るのもなかなか面白そう。
・AWS SDKはもっといろんなことできそうなのでもっと調べたい。


Amazon Web Services クラウドデザインパターン実装ガイドAmazon Web Services クラウドデザインパターン実装ガイド
大澤 文孝,玉川 憲,片山 暁雄,鈴木 宏康

日経BP社
売り上げランキング : 17216

Amazonで詳しく見る by AZlink

2013/10/01

初めてのAWSメモ:VPCでELBでMultiAZのRDS

■やりたいこと

■参考にしたURL。
Amazon VPCを使ったミニマム構成のサーバ環境を構築する
Amazon RDSで仮想DBインスタンスを作成する
RDSインスタンスにMulti-AZの設定をする

■やったこと
1.Network周りの設定
(1)Amazon無料枠で申し込みする。
(2)AWS Management Consoleを起動。
(3)VPC DashboardからVPCを作る。
  -- Your VPCs
   -- Create VPC
    -- CIDR Block = 10.0.0.0/16
    -- Tenancy = Default
(4)SubnetからAZ1にPublic(10.0.1.0/25)とPrivate(10.0.1.128/25)を作る。
 またAZ2にPublic(10.0.2.0/25)とPrivate(10.0.2.128/25)を作る。
(5)Internet GatewaysからInternet Gatewayを作成する。
  -- Internet Gateways
   -- Create Internet Gateway
    -- Attach to VPC
     -- VPCをアタッチ
(6)Route Tablesを設定する。AZ1-PrivateとAZ2-PrivateはLocalのみのTableを使う。
 AZ1-PublicとAZ2-PublicはLocalとDefault Gateway(=Internet Gateway)を設定する。
  -- Route Tables
   -- Create Route Table
    -- 新しいRouteを作成し、Localと0.0.0.0/0を設定する。
  -- Subnets
   -- Public
    -- 新規に作成した0.0.0.0/0のRouteを持つRoute TableにReplaceする。
   -- Private
    -- 0.0.0.0/0のRouteを持たないRoute TableにReplaceする。

2.RDS(DBサーバ)の設定
(1)RDS Dashboardの
  -- Subnet Groups
   -- Create DB Subnet Group
    -- AZ1-PrivateとAZ2-PrivateをGroupingする。
(2)RDSを構築する。
  -- Instances
   -- Launch DB Instance
    -- MySQLを選択
     -- Do you production...でNoを選択する
     -- Multi-AZ Deployment=Yesで作成する
     -- Additional ConfigでVPCとDB Subnet Groupを選択する
     -- Management OptionsはDefaultで。
(3)Security Groupを設定する。
  -- 対象RDSのSecurity Group設定箇所をクリックする。
   -- Security Groups画面が開くのでCreate Security Group
    -- [db-servers]という名前で、Port=MySQL、Source=10.0.0.0/16のルールを作成
  -- RDS画面に戻り、対象RDSを選択してModifyをクリックする。
   -- Security Groupをdb-serversに変更する。
(4)MultiAZの動作確認
  Instances画面から対象Instanceをクリックして、Availability Zoneを確認する。
  Instance ActionからRebootする。「Reboot With Failover?」をチェックする。
  Statusがrebootingからavailableになったことを確認して、Availabillity Zoneが切り替わったことを確認する。

3.EC2(Webサーバ)
(1)EC2を構築する。Web1とWeb2の2台構築する。
  -- EC2 Dashboard
   -- Instances
    -- Classic Wizzard
     -- Amazon Linux AMIを指定
      -- AZ1-Public or AZ2-Publicを指定
      -- あとはDefaultで
      -- Security Gruop では22と80をFrom anyであける(後で80はSLBからのみに絞れると思う)
(2)EC2にElastic IPを付与する
  -- Elastic IPs
   -- Associate Address
    -- Web1、Web2両方ともに設定する。
     →たぶんGIP1つでもNATすることで外部通信可能だと思うんだけど調査していない。
(3)EC2にSSHアクセス。ユーザーはec2-user。
(4)Web1からDBSにmysqlコマンドでアクセスしてみる。
   sudo yum -y install mysql
   mysql -h dbs.xxxxxxx.xxxxxxx.rds.amazonaws.com -u user -p
(5)httpdをインストールする。Web1、Web2両方で。
  $ sudo yum -y install httpd
  $ sudo chkconfig httpd on
  $ sudo service httpd start
(6)Elastic IPに外部からWebで接続して、接続できることを確認。
(7)後で作るELBのために、簡単なindex.htmlを作っておく
  $ vi /var/www/html/index.html
   -- Web1とWeb2でどちらにアクセスしているかわかりやすい内容にしておく。

4.ELBの構築
(1)EC2 DashboardのLoad BalancersからELBを作る
  -- VPCを指定、Portは80のみ、Internalではないのでチェック無し
  -- Health checkはデフォルトのまま。
  -- Add EC2 InstancesではAZ1-PublicとAZ2-Publicを選択
   -- Create a new Security GruopでELB用のSecurity Groupを作成する。Port 80 from anyのみ。
    -- Manually Add Instances... でWeb1とWeb2をSelectする。
  -- Createしたら、2つのECがIn Servicesになっていることを確認する。
(2)ブラウザからELBのHostnameにアクセスして、Web1とWeb2のHTTPDをそれぞれ落として、
 振り分けされることを確認する。

■感想
・立ち上げるだけならとにかく楽。難しい設定を考えなくても動く。
・MultiAZのあたりは同期のタイミングとかcommitとかLockのタイミングとかその辺調べるともっと面白そう。
・ELBも振り分けまでしかしてないけど、セッションの振り分けとか管理のあたりをもっと知りたい。
・Security Groupの設定は、物理みたいに経路とフィルタのセットで考えるんじゃなくて、1つの大きなFirewallで制御しているような感じ?この辺の感覚に慣れるのが難しそう。もっと細かく制御できそうな気がするんだけどな。
・とにかく最近新しいことにチャレンジする機会が全く無くて悶々と死んだように生きていたけど、こういうことやるのめちゃくちゃ楽しい。幸せ。
・まだ届いてないけどこの本買いました。

Amazon Web Services クラウドデザインパターン実装ガイドAmazon Web Services クラウドデザインパターン実装ガイド
大澤 文孝,玉川 憲,片山 暁雄,鈴木 宏康

日経BP社
売り上げランキング : 17216

Amazonで詳しく見る by AZlink