2013-03-27
AWSでsshするならyogafireも便利
※便乗記事ですごめんなさい><
http://m.igrs.jp/blog/2013/03/14/ec2-ssh/
yogafireはec2を便利に使うためのコマンドラインツールです。
yogafireの機能はsshだけではありませんが、
sshするだけでも便利なのでチラッと紹介してみます。
インストール
# ※cpanmコマンド無い時
brew install cpanminus
# インストール (ncurses-devel / readline-devel / libxml2-devel パッケージが必要)
cpanm https://github.com/toritori0318/p5-Yogafire/tarball/master
初期設定する
yoga use --init
sshする
# 一覧から選択 yoga ssh # Nameタグが「www01」のサーバにsshログイン yoga ssh www01 # Nameタグが「www*」のサーバを一覧表示。ユーザはec2-userでログインする yoga ssh 'www*' --user=ec2-user # AWS APIの条件から絞り込んで一覧表示 yoga ssh --filter='availability-zone=ap-northeast-1,group-name=base'
ssh踏み台指定
# タグ名「fumidai」のインスタンスを踏み台にする yoga ssh --proxy=fumidai
または、.yogaファイルに「proxy」を設定してもOKです。
application1: access_key_id: xxxxxxxxxxxxxxxxx ... proxy: fumidai ...
インタラクティブに絞り込んでみる
1.普通にyoga sshしたあと、「app」を入力してEnter。
2.さらに「b」で絞込み。
3.さらに「web」で絞り込むと、最後の一つのインスタンスなので自動でsshが実行されます。
もちろん、途中でNoを指定してsshを実行することも可能です。
リモートコマンド実行
# Nameタグが「www01」のサーバでlsを実行 yoga cmd www01 ls # Nameタグが「www」で始まるサーバでuptimeを実行 yoga cmd 'www*' 'uptime' # Nameタグが「db」で始まるサーバでsudo+password実行 yoga cmd 'db*' -s -p '/etc/init.d/redis start'
リモートにファイルを get / put
# Nameタグが「www02」サーバの「/tmp/hoge.log」をローカルの「./」に転送 yoga get www02 /tmp/hoge.log ./ # Nameタグが「www」で始まるサーバ全部に「/tmp/hoge.log」をローカルの「./」に転送 yoga get 'www*' /tmp/hoge.log ./ # ホスト名でも可能 yoga get hogehoge.example.com /tmp/hoge.log ./ # dry-runモード yoga get www02 /tmp/hoge.log ./ --dry-run # rsyncオプションを追加(node_modulesディレクトリを除外してsync) yoga get www02 ./nodapp ./ -o '--exclude=node_modules' # ローカルの「README」ファイルを、Nameタグが「www03」サーバの「/home/tori243」に送信 yoga put www03 README /home/tori243
yogafireには他にも多数のコマンドが実装されているので
ご興味のある方は他の記事もご参照ください。
2013-03-19
App::RedisTopをcpanに上げて念願のCPAN Authorになったよ
Redis | |
上がったようです。わーい\(^o^)/
http://search.cpan.org/~toritsuyo/App-RedisTop-0.01/
cpanm App::RedisTop
でインストールできるようになりました。楽ちん!
パッチを送っていただいたfujiwaraさん、hirose31さん、
lingerで相談に乗っていただいたsongmuさん、tokuhiromさん
ありがとうございました!
2013-01-02
YogafireというAWSツールでヨガの奥義を極める
※注 タイトルに深い意味はありません
https://github.com/toritori0318/p5-Yogafire
だいぶ前からgithubには置いてたんですが
年始だしドキュメントっぽいのを書いてみることにしました。
超長い!でも便利かも!
前置き
自分で使っていて「こんなんあったら便利かなー」というのを寄せ集めたCLIです。
基本的な考え方としては「EC2をタグNameベースで」いろいろと操作できるようなツールですね。*1 *2
貧乏性な自分はスポットインスタンスを定常的に使うので
※Windows
たぶん動きません!
インストール
cpanm https://github.com/toritori0318/p5-Yogafire/tarball/master # cpanm無い時 curl -LOk http://xrl.us/cpanm # 環境によっては sudo 付ける # ncurses-devel / readline-devel パッケージが必要 perl cpanm https://github.com/toritori0318/p5-Yogafire/tarball/master
依存が多くていらいらするかもしれませんがしばらく待ちましょう。
インストールが成功するともれなく「yoga」コマンドが使えるようになります。
コマンド一覧
設定系
| config | Yogafireコンフィグを設定 |
| use | プロファイル設定 |
EC2操作系
| ls | EC2インスタンスのリストを表示/操作 |
| ssh | EC2インスタンスへssh接続 |
| start | EC2インスタンスを起動 |
| stop | EC2インスタンスを停止 |
| reboot | EC2インスタンス再起動 |
| terminate | EC2インスタンスを削除 |
| create-image | EC2インスタンスからAMIイメージを作成 |
| expand-volume | EC2ボリュームを拡張 |
| info | EC2インスタンスの詳細情報を表示 |
| cmd | リモートサーバでコマンド実行 |
| get | リモートサーバからrsyncでファイルを取得 |
| put | リモートサーバへrsyncでファイルを送信 |
AMI操作系
| ls-ami | AMIリストを表示/操作 |
プラグイン
| all-region-info | 全てのリージョンをまたいで様々な情報を取得 |
| aws-status | AWSステータスを表示 |
| hosts | hostsファイルユーティリティ |
| region | リージョンリストを表示 |
| sshconfig | sshconfigユーティリティ |
| amiwatcher | AMIのステータス監視 |
| ec2watcher | EC2のステータス監視 |
| instance-type | EC2インスタンスタイプ一覧表示 |
| render | EC2レンダリングツール |
初期設定
利用するにはyogaコマンド用のコンフィグファイルを設定する必要があります。
yoga config --init
対話形式での設定を開始します。
AWS関連の環境変数を設定していればある程度自動で設定してくれます。
ただしpemファイルの在り処は入力する必要があるでしょう。
デフォルトでは「$HOME/.yoga」にコンフィグファイルが作られます。
コンフィグファイルの場所は環境変数「YOGAFIRE_CONFIG」で指定することも可能です。
このファイルを直接編集することも可能です(YAML形式)。
yoga use
yogafireでは複数のAWSアカウントを管理することができます。
プロファイルを複数用意し、useコマンドでプロファイル名を指定することによって
簡単に切り替えることができます。
通常は「global」プロファイルに紐付けられています。
# プロファイル一覧 yoga use # "account1"プロファイルに切り替える yoga use 'account1'
Yoga Core:利用頻度ランキング
自分がよく使う順に説明していきます。
yoga ssh
インスタンスに対してSSHします。runningのインスタンスのみが自動でピックアップされます。
# 起動中の全サーバを一覧表示し、番号を選択してsshログイン yoga ssh # Nameタグが「www01」のサーバにsshログイン yoga ssh www01 (以下でも同じ意味) yoga ssh --tagsname www01 # Nameタグが「www*」のサーバを一覧表示し、番号を選択してsshログイン yoga ssh 'www*' # --filterオプションでAPIのフィルターも自由にかけることも可能 # ※sshコマンドに限らず、他のコマンドでも同様 # http://docs.amazonwebservices.com/AWSEC2/2011-05-15/APIReference/index.html?ApiReference-query-DescribeInstances.html yoga ssh --filter='instance-state-name=running,availability-zone=ap-northeast-1,group-name=base'
yoga ls
インスタンスのリストを表示できます。全てのステータスが対象となります
(オプションで絞り込むことは可能)
# "www"でタグNameが始まるインスタンスのみ表示 yoga ls 'www*' (以下でも同じ意味) yoga ls --tagsname 'www*'
また、-iオプションを追加すると、表示したインスタンスに対して更にコマンド(ssh / start /stop /...)を
実行することができます。
# さらに追加コマンドを選択 yoga ls -i
yoga ls-ami
これをよく使うのは、AMI削除するときにスナップショットも一緒に消せるようにしているからですね。*3
# "www"でAMINameが始まるインスタンスのみ表示 yoga ls-ami 'www*' (以下でも同じ意味) yoga ls-ami --name 'www*'
lsと同じように、-iオプションを追加するとインタラクティブモードになります。
# さらに追加コマンドを選択 yoga ls-ami -i
yoga get
# Nameタグが「www02」サーバの「/tmp/hoge.log」をローカルの「./」に転送 yoga get www02 /tmp/hoge.log ./ # Nameタグが「www」で始まるサーバ全部に「/tmp/hoge.log」をローカルの「./」に転送 yoga get 'www*' /tmp/hoge.log ./ # ホスト名でも可能 yoga get hogehoge.example.com /tmp/hoge.log ./ # dry-runモード yoga get www02 /tmp/hoge.log ./ --dry-run # rsyncオプションを追加(node_modulesディレクトリを除外してsync) yoga get www02 ./nodapp ./ -o '--exclude=node_modules'
yoga put
getの反対でリモートサーバのファイルを取得します。
dry-runやrsyncオプションもgetと同じように指定できます。
# ローカルの「README」ファイルを、Nameタグが「www03」サーバの「/home/tori243」に転送 yoga put www03 README /home/tori243
yoga cmd
指定したコマンドをリモートサーバで実行します。
並列実行はTodo...
# Nameタグが「www04」のサーバでlsを実行 yoga cmd www04 'ls' # Nameタグが「www」で始まるサーバでuptimeを実行 yoga cmd 'www*' 'uptime' # Nameタグが「db」で始まるサーバでsudo+password実行 yoga cmd 'db*' -s -p '/etc/init.d/redis start'
Yoga Plugin:利用頻度ランキング
プラグインで自分がよく使う順に説明していきます。
yoga instance-type
idとタイプの紐付けや、スペックの確認に便利。
yoga region
リージョンのIDも忘れがちなので一覧で見れると便利ですね!
yoga render
割とお気に入りの機能です。EC2インスタンス情報をテンプレートで記述できます。
具体例をいくつか上げてみます。
# ステータスがrunningのサーバ全てを対象にdnsNameを生成
yoga render --template='"[% dnsName %]",\n' --state=running
(結果)
"ec2-xxx-xxx-xxx-xxx.ap-northeast-1.compute.amazonaws.com",
"ec2-yyy-yyy-yyy-yyy.ap-northeast-1.compute.amazonaws.com",
...
# タグNameが'www'で始まるサーバのグローバルIPを生成
yoga render --template='[% ipAddress %]\n' --tagsname='www*'
(結果)
xxx.xxx.xxx.xxx
yyy.yyy.yyy.yyy
# タグNameが'db'で始まるサーバ情報でPerlのコードっぽいのを生成
yoga render --template='{ instance => { instance_id => "[% instanceId %]", private_ip => "[% privateIpAddress %]", launch_time => "[% launchTime %]" } },\n' --tagsname='www*'
(結果)
{ instance => { instance_id => "i-bbbbbbb", private_ip => "x.x.x.x", launch_time => "2012-03-30T09:00:34.000Z" } },
{ instance => { instance_id => "i-ccccccc", private_ip => "y.y.y.y", launch_time => "2012-03-30T09:01:49.000Z" } }
yoga aws-status
awsステータス情報の通知を時系列に表示します。日付/リージョン/サービス名指定も可能。
yoga hosts
EC2インスタンスのipアドレスをhostsに自動更新します。
以下のようなフォーマットでファイルの末尾に追記されます。
更新時も「Yogafire Begin <-> Yogafire End」の間だけが自動で置換されます。
フォーマット
#======== Yogafire Begen ========# <public_ip or private_ip> <tag_Name> ... #======== Yogafire End ========#
実行例
# 更新後のhostsファイルをプレビュー yoga hosts --preview # プライベートIPでhostsファイルを置換します(バックアップ有り) yoga hosts --replace --private-ip --backup
更新後ファイルの例
127.0.0.1 localhost pn-agent pn-broadcast ::1 localhost fe80::1%lo0 localhost ... #======== Yogafire Begen ========# 59.1.1.1 wwwhoge 59.1.1.2 wwwfuga 59.1.1.3 dbpiyo #======== Yogafire End ========#
yoga sshconfig
EC2インスタンスのipアドレスをsshconfigに自動更新します。
以下のようなフォーマットでファイルの末尾に追記されます。
フォーマット
#======== Yogafire Begen ========#
Host <tag_Name>
HostName <dnsName>
IdentityFile <.yogaコンフィグの鍵ファイルパス>
User <.yogaコンフィグのユーザ名>
Port <.yogaコンフィグのポート番号>
...
#======== Yogafire End ========#
実行例
# 更新後のsshconfigファイルをプレビュー yoga sshconfig --preview # sshconfigファイルを置換します(バックアップ有り) yoga sshconfig --replace --backup
更新後ファイルの例
#======== Yogafire Begen ========#
Host wwwhoge
HostName hogehoge.com
IdentityFile /path/to/id.pem
User ec2-user
Port 22
Host wwwfuga
HostName fugafuga.com
IdentityFile /path/to/id.pem
User ec2-user
Port 22
Host dbpiyo
HostName piyopiyo.com
IdentityFile /path/to/id.pem
User ec2-user
Port 22
#======== Yogafire End ========#
他にも
割愛しますが、リージョンを横断して情報表示できる all-region-info や、
ステータスを監視して ステータスが変更されたらgrowl表示したりできる
ec2watcherやamiwatcherという機能もあったりします。
Tips的な話
ヘルプ
# 全部のコマンド一覧 yoga # コマンド毎のヘルプを見る yoga <command> --help
オートコンプリート
sshやls -iなど、番号/インスタンス名/インスタンスIDを入力するところでは
TABキーでオートコンプリートが効きます。
また、zsh補完を設定しておくと、コマンドラインでもいろいろと補完が効くようになります。
yogaコマンド補完
さらに絞り込んで補完とか。
インスタンス名補完
また、ssh / ls / start / stop /terminate / get /put などのコマンドでは
yoga <command>TABキー でもzsh補完でインスタンス名の補完が可能です。
カラムのカスタマイズ
ssh / ls / ls-ami などで表示される一覧のカラムは
コンフィグファイルでカスタマイズすることが可能です。
app1: access_key_id: aaaaaaaaaaaaaaaa identity_file: '/path/to/nyoro.pem' ############################################### # amiリストのカラム # VM::EC2::Imageのメソッドと一致するものを指定 # http://search.cpan.org/~lds/VM-EC2/lib/VM/EC2/Image.pm#METHODS # タグの場合は「tags_<タグ名>」で指定可能 image_column: - tags_Name - name - imageId - colorfulImageState ############################################### # インスタンスリストのカラム # VM::EC2::Instanceのメソッドと一致するものを指定 # http://search.cpan.org/~lds/VM-EC2/lib/VM/EC2/Instance.pm#METHODS # タグの場合は「tags_<タグ名>」で指定可能 instance_column: - tags_Name - tags_Role - instanceId - ipAddress - privateIpAddress - dnsName - launchTime - colorfulInstanceState region: ap-northeast-1 secret_access_key: bbbbbbbbbbbbbb ssh_port: 22 ssh_user: ec2-user
alias
指定しておくとさらに便利ですね。
# wwwサーバへssh alias yssh-www='yoga ssh "www*"' # dbサーバへコマンド実行 alias ycmd-db='yoga cmd "db*"' # /etc/hostsを置換 alias yhost-replace='sudo YOGAFIRE_CONFIG=/home/toritori0318/.yoga /path/to/yoga hosts --replace'
他のコマンドと連携してみるとか
yoga render コマンドの結果を用いてpsshに食わせたりとか夢ひろがりんぐですね。
Nameタグについての注意点
Nameタグの値が 'www 01 desuyo' のように、間にスペースがあると
動作に影響する可能性があります。スペース禁止!
Todo(たぶんやる)
まとめ
自分の用途に特化しているため、まとまりがなかったりAPIが微妙だったりするかもしれないですが
ssh / render / hosts などは割と便利だと思うので
興味がある方は触ってみてください。
また、コマンド自体はMouse::App::Cmdで定義しているだけなのでコマンド追加もコマンドファイル一つ作るだけでいけます。*5
コマンドを自分用に作るのもいいでしょう。
番外編:yogaコマンド依存度
ちなみに自分のコマンドランキングはこんな感じ。
566 cd 515 perl 486 git 407 yoga 404 vi 308 curl 178 make 150 ll 135 node 101 npm 101 ack
どんだけyogaコマンドうってるの…
2012-09-30
YAPC::Asia 2012感想
YAPC | |
毎年恒例のPerl祭り「YAPC::Asia2012」に行って参りましたので
トークや全体の感想などつらつらと。
前夜祭(今年は行けず…)
トークまとめ
Web::Security beyond HTML5
HTML5時代のWebアプリケーションのセキュリティについて
ブラウザ側とサーバ側でどういう脆弱性があるか、
またどういう対策をすべきか、というありがたいお話。
IEほんとひどい。
リアルタイム通知システムの舞台裏
リアルタイム通知システムを開発するにあたって、
課題となったところやそれを解決した方法などのお話。
実は今自分もかなり似たような仕組みを作っていて
課題のところなどは「あーそうですよねー」など妙に納得しながら聞いてました。
通知サーバをクラスタ化するのは自分もRedisで検証してみたんですけど
同時接続15000行かないくらいで頭打ちになってしまい止めてしまいました*1
RabbitMQのpubsubはまだ試してないので一度触ってみたいですね。
後ほど直接お話したかったんですが見つからず…
Perl初心者が作ったサーバ運用ツール
サーバ運用の自動化について。
マニュアルでやると大変だし失敗もするし
そういうことを減らすためにTouryoというツールを作ったというお話。
DSLで設定やテスト書いて(ロールごと?)sshでリモートインストールする、という感じ?
また、LTソンではTouryoをgithubに上げない理由をお話されていました。
もちろんそれらを理解した上なんですが、上げて欲しいなあと思いましたw
Perlと出会い、Perlを作る
世界一高速なPerlをスクラッチで書いている、というお話。
ほとんど趣味の範囲で書いているらしいですが徐々に動くところまではきている様子。
目標は「mixiのhome.plが動くまでがんばる」ということで楽しみですねw
実際のベンチマークでは既存のperlよりだいぶ高いスコアが出ていました。
続・Mobage を支える技術
Prallel::Prefork + Q4M のベストプラクティス的な話からスマートフォン通知やランキングの裏側の話まで。
複数ワーカでQ4Mを利用した時にシグナルを受け取ると子プロセスが処理中でも死んでしまう、
さらにqueue_waitで止まってしまう、などの
問題点を一つ一つ実例を挙げながら解決していくという素晴らしい内容でした。
スマートフォン通知はiPhone向け(APNs)とAndroid(GCM)にどのような仕組みでpush通知が行われているか、
それをPerlでどのように書くか、といった内容。
最後にリアルタイムランキングをRedis+MySQLでPerlでどのように実現するかというお話でしたが
だいぶ時間が押していて端折られていました。詳しくお聞きしたかった!
Redmine::Chan で IRC からプロジェクト管理
Redmineの登録フローをIRCから自動で行うというお話。
単にチケット登録するだけではなくて、きちんとフローになっているのが凄いなーと思いました。
実際に使ってみたいです。
平均レスポンスタイム50msをPerlで捌く中規模サービスの実装/運用
現状のWeb広告についてのお話と、DSP(Demand-Side Platform)システムの裏側のお話。
自分も昔ASPアドサーバの開発運用をしていたことがあるのですが、
まあそのサービス自体は「昭和」な感じでしたので中身はもう全然違いますね。
「古典的なことを地道にやる」「事実を積み上げて判断する」
というのはガツンときました。
Perlアプリケーションのベンチマークとプロファイリング
Webアプリケーションのボトルネックをどのように見つけていくか?
そのポイントと手法と考え方についてのお話。
実践的なお話かつ、いままさにプロダクションで負荷テストなど行なっているので
とても参考になりました。
Parallel::Benchmark+Furlでローカルテストしてみましたが、
ApacheBenchと比較しても(思ったより)差がでないくらいのパフォーマンスだったので
仕事でも使わせていただきたいと思います!
Perlハッカーは息をするようにCPANモジュールを書く
どのような動機でCPANモジュールを書いているか、
またCPANに上げる時のポイントやCPAN怖くないよ!というお話。
ドキュメントには「モジュールに対する想いを全部ぶつけるところ」らしい!熱い!
自分はgithubにたくさんモジュール眠らせてるタイプです…
LT
1日目/2日目とも全て楽しませていただきました!が、
やはりどちらもトリをつとめた方々(mayuminさん)(takesakoさん)は秀逸。
Keynote
How Perl Changed My Life
Perl、またはコミュニティから現在の自分にどのように影響しているかというお話でした。
自分も初めて触れたLLがPerlということもあり、
自分自身にも置き換えて考えてしまいました。
LTソン
LTソン本当よかったです。
集中してセッション聴いたあとにリラックスする場*3としてとても良かったと思います。
自分も飛び込みしたかったんですが、2日目の競争率が激しそうだったのもあり断念。
懇親会
ご飯も美味しかったしTwitterで見かけたり絡んだりする方とお話できてとても嬉しかったです!
毎年思っていることですが、もっとアグレッシブに行けばよかった、とか
ひと通り話し終わったあとに「あの話をすればよかった」とか後悔…
まとめ
Closingで「YAPCは懐の広いカンファレンスでありたい」という言葉がありました。
たしかにPerlに限らず他言語の話もたくさんあったにもかかわらず
一緒に盛り上がれるYAPCは凄いなと思いました。
丸々2日間本当に楽しかったです。ありがとうございました&お疲れ様でした!
そしてやっぱり来年も参加したいと思いました!
2012-02-12
TwitterAPIでRT削除にハマった件+α
Twitter | |
TwitterAPIでリツイート削除するのに結構調べたので備忘録で残しておく。
ぐぐってみると「destroyでOK」みたいなのは見つかるんだけど
destoryすると「他のユーザのツイートを削除することができません」
というエラーで削除できない。
この時点でハマってたんだけど、リツイートを削除するには
「リツイート元のステータスID」ではなく
「リツイートした時に新たに付与されるID」を使わないといけないらしい。
通常のタイムラインにはそのIDは表示されないため、
一度 retweet_by_me を叩いてリツイート元のIDを探す必要がある。
サンプルコード
retweet_by_meから元のステータスIDを探すんだけど、
直接指定することはできないのでループで元のIDを検索して
マッチしたらリツイートIDを取得する、
といったことをしないといけない。
ちょっと面倒ですね。
これだけでも何なので、
Twitter関連のTipsみたいなのも書いておきます。
Twitterのcreated_atを日付に変換したり
このあたり、Net::Twitterだと変換してくれるんですが
いろいろインストールされるのであまり使いたくないですよね!
そこで簡単な変換クラスを作ればいいと思います。
ちなみにREST APIで取得した場合とSearchAPIで取得した場合で
日付のフォーマットが違うので2つ用意してます。
friendを全員取得
これだけ。
ちなみに両想いの友達を取得したい場合は
上記レスポンスに「following」という要素があるので
これがONかどうかで判定することができます。













