higehikiのブログ

iPhoneアプリ「ログ雀」の中の人です。

UNICORNフレームワークその後

@saimushiOSSで開発している UNICORN フレームワークです。
また、DevOpsの取り組みの一貫として、skyarch社が提供されている OSS SkyHopperをカスタマイズした PHOENIX プロジェクトも進行中です。

 

UNICORN フレームワーク は一緒に開発してくれる仲間を募集しています。
コミッター / Pull Request 大歓迎!!

UNICORN Framework


UNICORN-Project/UNICORN · GitHub

現在携わっている案件で使用するPHPフレームワークUNICORNに決定しました!

UNICORNフレームワークとは...

可能性を追求した(する)フレームワーク
主にスマホアプリケーション開発において「Fast Start」である事に重点を置いています。

ぜんぜんわからないw

っとリファレンスがあるじゃないか!
http://UNICORN-Project.github.io/

f:id:higehiki:20140917102604p:plain

うーむ…w

とりあえず使ってみよう。うん。

Amazon RDSのレプリケーションがLOAD DATAするとエラーで止まる

AmazonRDSのreplica setを作って運用していたんですが、とある開発事案で、大量のレコードを短時間で生成する必要に迫られました。

要件としては、
① 特定ファイル(複数)のファイル名から属性情報を抜き出す
② 既存テーブルAの属性情報にHitしないレコードをSELECTしてtmpテーブルを生成
③ tmpテーブルに特定ファイル(複数)を1個ずつ展開してINSERT
というようなものです。

ただ、特定ファイル内のレコード数が大きく、1ファイル、10万件〜100万件を想定しておく必要がありました。

ここで、単純にサーバー(php)から1行ずつINSERTするのは選択肢から消えます。
バルクインサートも検証しましたが、速度として満足いくものではなく、代替方法を検討しました。

結果、LOAD DATAを使おう!ってことになりました。

LOAD DATA INFILE "ファイル名" INTO TABLE テーブル名 
FIELDS TERMINATED BY ',区切り文字' ENCLOSED BY '"';

クッソ速いんですねコレ。知らなかった…。

ひゃっほーひゃっほー言っていたら、商用環境でRDSのレプリケーションがエラー…。
どうも、MySQLでは推奨されない方法 + 対応していない?!という状況のようで八方塞がりに。

「バージョン上げたら直るかも?」ってアドバイスを頂き、確認したところ、「MySQL 5.6.17」が選択できるようになっている!
動けばいいなーぐらいの期待感で、replica setの方を Modify で 5.6.17 に変更したところ…。


動いた!エラーでない!ひゃっほーひゃっほー!

めでたしめでたし。

ログをS3に保存する際にサーバーのIP毎に管理する方法

こういうことがしたい!
S3 Bucket / logs / 20140707 / [サーバーA] / access.log
S3 Bucket / logs / 20140707 / [サーバーB] / access.log
S3 Bucket / logs / 20140707 / [サーバーC] / access.log

fluentdでログをS3に流していますが、frontサーバーにオートスケールを設定していると、サーバー毎の設定を動的に行う必要があります。

そこで、td-agentが起動されるタイミングで、設定ファイルを動的に生成する方式を採ってみました。

まずは動的に生成する基となる設定ファイルを用意します。

$ vim /etc/td-agent/td-agent.conf.tpl

# ad access log
<source>
  type tail
  format json
  path XXXXXXXXXXXXX
  pos_file /var/log/td-agent/access.pos
  tag xxx.access
</source>

# S3 Output
<match xxx.access>
  type copy
  <store>
    type s3
    aws_key_id YYYYYYYYYY
    aws_sec_key ZZZZZZZZZZZZ
    s3_bucket AAAAAAAAAAA
    s3_endpoint s3-ap-northeast-1.amazonaws.com
    path logs                      # S3に格納するディレクトリ先
    buffer_path /var/log/fluent/s3/deliver           # S3にflushするまでのbufferファイル格納先
    buffer_chunk_limit 1g                    #リミット値を変更
    time_slice_format  %Y%m%d/${hostname}/%H/%M          #分単位でファイル作成
    time_slice_wait 1m                      # flushまでの待ち時間
    flush_interval 30s                      #これを書くと、timesliceを無視して指定したインターバルごとにs3にflushされる。
  </store>
</match>

こんな感じに。
${hostname} に動的にサーバーのローカルIPが入ればOKです。


続いて、td-agentの起動スクリプトに以下を追加します。

$ vim /etc/init.d/td-agent

sed -e "s/\${hostname}/`hostname`/g" /etc/td-agent/td-agent.conf.tpl > /etc/td-agent/td-agent.conf

これで起動するタイミングで、設定ファイルに動的にIPを取得、置換して生成することができます。

capistrano3 + AWS(オートスケール) でdeployしてやる

オートスケール下でのdeployというと、self-deploy (起動時にスクリプトを実行して、ローカルのソースを最新版にする!) がイケてる気がします!

AWS EC2 capistranoでオートスケーリングインスタンスにデプロイ - cap version2
http://qiita.com/mychaelstyle/items/a550d4a0658c87c1ff30

こちらで紹介されている方法がまさにそれ!

にも関わらず、今回はオートスケールの通常フローで実装してみました。
AWS SDK使ってラクしてみよう!とか思ったわけではないんですが、別案件のスクリプトががっつり使いまわせたからって理由です。<今回のゴール>
capistrano3の動的IP取得 ⇒ ソース反映 + AMI作成 + オートスケール設定更新

先人の方々がcapistrano2でやられているのを参考にちょいちょいとやってみました。

やりたいことの流れ

① ローカルからgit development branchにソースをpush
② TOOLサーバにログインして capistrano3 (production) 実行
③ ELBにぶら下がっている全インスタンスに ソース反映 処理
④ オートスケール用のAMIを作成
⑤ Launch Configuration を新規作成 ( ④のAMIを指定 )
⑥ Auto Scaling group の設定を変更 ( ⑤のConfigurationに向け先を変更 )

続きを読む

iPhoneアプリ ログ雀 が Appliv様に掲載されました!

ログ雀をリリースして早2ヶ月。
大型連休の助けもあり、ダウンロードのペースは落ちることなく推移しています。

「Facbeookアカウントがないと使えないアプリ」へのネガティブな反応が多かったため、
ログインなしでも使えるように独自ユーザー管理の仕組みを追加したことで、アクティブ
ユーザーも順調に増加してきています。

そんな中、ログ雀 をAppliv様に紹介して頂きました!!
実際に使って頂いたようで、丁寧なレビューに頭が下がるばかりです。
ぜひぜひご一読ください!

このままもっとたくさんの人に使ってもらえますように!

AutoScaleでCloudWatchがずっとALARMなんだけど...

f:id:higehiki:20140421182829p:plain
オートスケールを一通り用意して、CloudWatchで CPU %に応じて スケールインさせる設定をしたところ、ステータス:ALARM になったまま変わらない。

おかしいのかどうかよくわからずおろおろしていたら、
AWS オートスケーリング設定方法 – 2013年版実践編 | Hiro Fukami's Blog

通常の状態であれば STATE 項目でスケールアウトが OK、スケールイン が ALARM になっていれば良い。ALARM は今現在閾値に引っかかって ALARM を出しているという状態。INSUFFICIENT_DATA になっていなければ何か設定がおかしいということ。

問題ないようです。わかりづらい!