わーくあうと!

日々の作業でためになったことをアウトプットすることで自分の成長につながればなと。

sqlalchemy.exc.TimeoutError

開発中のdjangoアプリケーションでこんなエラーが。

build/bdist.linux-x86_64/egg/sqlalchemy/pool.py:945
 - connect
build/bdist.linux-x86_64/egg/sqlalchemy/pool.py:210
 - connect
build/bdist.linux-x86_64/egg/sqlalchemy/pool.py:371
 - __init__
build/bdist.linux-x86_64/egg/sqlalchemy/pool.py:685
 - _do_get

error:class 'sqlalchemy.exc.TimeoutError':QueuePool limit of size 30 overflow 0 reached, connection timed out, timeout 3

コネクション張りたいけど張れなくてタイムアウトしてるらしい。

これはhttpd.confで設定しているServerLimitの値のほうが大きいと、コネクション張れないプロセスが出てきてしまうため出るらしい。
30人しか座れないラーメン屋に60人きたようなもん。

なのでsqlAlchemyで設定しているコネクションプールの本数をServerLimitの数と同じにしておいた。

httpdが起動しなくなった

負荷かけてたらhttpdが落ちた。
で、スタートさせようとしたらこんなエラーが

$ service httpd start
httpd を起動中: (98)Address already in use: make_sock: could not bind to address [::]:80
(98)Address already in use: make_sock: could not bind to address 0.0.0.0:80
no listening sockets available, shutting down
Unable to open logs

status確認したらPIDが残ってるとの事だったので残っているプロセス消した

$ pkill httpd

で、起動を試す。

$ service httpd start

起動できた。

コマンドがどのパッケージに含まれているかを調べるコマンド

コマンドがどのパッケージに含まれているかを調べる。

rpm -qf コマンドのパス

whichと組み合わせるといい感じです。例えば「mysql」コマンドをどのパッケージから入れたのかを調べたい場合。

$ which mysql
/usr/bin/mysql

これでmysqlコマンドは「/usr/bin/mysql」に入っている事がわかった。
そのパスを「rpm -qf」で調べる

$ rpm -qf /usr/bin/mysql
mysql-5.5.18-1.el6.remi.x86_64

mysql-5.5.18-1.el6.remi.x86_64パッケージに含まれている事がわかった。

ディスク・ドライブの状態を確認するコマンド

マウントされているディスク・ドライブの状態を確認する。
df

$ df
Filesystem           1K-ブロック    使用   使用可 使用% マウント位置
/dev/xvda1             6192704   4589848   1288284  79% /
none                    856180         0    856180   0% /dev/shm

-hを付けると見やすい表示にしてくれる。

$ df -h
Filesystem            Size  Used Avail Use% マウント位置
/dev/xvda1            6.0G  4.4G  1.3G  79% /
none                  837M     0  837M   0% /dev/shm

このdfって何の略なんだろう

AWSのコマンドラインツールで接続できなかった件

EBSのボリュームサイズを変更したり、インスタンスタイプのストレージをアタッチしたりするのにはManagementConsoleからの起動では指定できないらしいのでコマンドラインツール使ってみた。が、認証に失敗して接続できなくて困ったので解決法をメモっておく。

環境

Mac osx lion 10.7.2

状況

Amazon EC2 API Tools」をダウンロードして適当に鍵ファイルもダウンロードしてきて環境設定の設定をしてec2verコマンドは通った。

$ ec2ver
1.5.2.4 2011-12-15

で、descrive-imagesするとエラーが出る。

$ ec2-describe-images -x all
Client.MalformedSOAPSignature: Invalid SOAP Signature. Failed to check signature with X.509 cert

ついでに--debugでも実行した結果

$ ec2-describe-images -a --debug
Client.MalformedSOAPSignature: Invalid SOAP Signature. Failed to check signature with X.509 cert
com.amazon.aes.webservices.client.Jec2SoapFaultException: SOAP Fault[code=Client.MalformedSOAPSignature, str='Invalid SOAP Signature. Failed to check signature with X.509 cert']
	at com.amazon.aes.webservices.client.Jec2Impl.UnwrapException(Jec2Impl.java:280)
	at com.amazon.aes.webservices.client.Jec2Impl.describeImages(Jec2Impl.java:469)
	at com.amazon.aes.webservices.client.cmd.DescribeImages.invokeOnline(DescribeImages.java:165)
	at com.amazon.aes.webservices.client.cmd.BaseCmd.invoke(BaseCmd.java:876)
	at com.amazon.aes.webservices.client.cmd.DescribeImages.main(DescribeImages.java:181)

ちゃんと「cert-XXX.pem」と「pk-XXX.pem」を入れてるのになんでー?と。

解決

で、色々調べてたら違う鍵ファイル使ってたみたい。
「cert-XXX.pem」と「pk-XXX.pem」のXXXの部分は同じ文字列のファイルが正解でした。
僕はamazonの証明書取得ページから「一対の鍵」の欄の所から鍵ダウンロードしてました。アホス。。

正しい取得方法は
・ X.509 証明書タブから新しいアクセスキーを作成するをクリック
・出てきたダイアログで2つのキーファイルをダウンロードしてくださいって画面が出るので両方ダウンロード。

その二つの「cert-XXX.pem」と「pk-XXX.pem」のファイルのパスを環境変数に指定し直せば通るはずです。

こんな所でハマる人はあまり居ないかもしれないけど、一応残しておく。

AWSのIAMが便利

最近ec2を触ってるのですがIAMってのが便利そうなのでメモっておく。

どんなものかって言うと、サービスごと(EC2とかS3とか)に権限(見るだけとか設定変更できるとか)を設定できるグループ、ユーザーを作成できる。

それこそ今まではunix系OSなどで常にrootログインしていたようなものが、それぞれ権限(rwx)を持ったグループやユーザーを作成してそのユーザーからログインするようにするのと同じ感じ。

詳しい設定方法はこの記事が詳しかった。

これで共同開発者にもAWS管理画面を安全に公開することができそう。


でもさっき試しにテストユーザー作ってAdministrator Access権限与えてみたけど管理コンソールからEC2やその他もろもろの情報が見れなかった・・・
IAMのページは観覧・編集できるのだけれども。
なんでだろう。。

windowsXPでbash

bash使いたくて試行錯誤した。
最初win-bashでやってみたけど配列とか使えなくて、cygwinもなんかあれだし結局SFUとやらを使いました。
・ダウンロードページ
http://www.microsoft.com/downloads/ja-jp/details.aspx?FamilyID=896c9688-601b-44f1-81a4-02878ff11778&DisplayLang=ja

で、ダンロード -> 解凍 -> 解凍先の「sfusetup.msi」ダブルクリックでインストール。
その後 スタート -> 全てのプログラム -> Windows Services for UNIX -> C Shell から色々遊んでみたけど
bashが無い....
ということで入れる。

まずはパッケージを簡単にインストールするためのコマンドを入れないといけないらしい。
http://www.suacommunity.com/pkg_install.htm
ここの「Bootstrap Installer (3.5) 」のリンクからダウンロード。
で「pkg-current-bootstrap35.exe」ってのダウンロードされたけどこれをどう使えばいいんだ!?って思ったけど実行したら使い方書いてあった。C Shellからposix使っていれるっぽい。
でも面倒なので【C:\SFU\tmp】にさっきのexeファイル入れてダブルクリックでいけた。

これでパッケージを簡単にインストールするためのコマンドが入ったので、あとはC Shellから

pkg_update -L bash

bash入る。


・参考サイト
http://www.atmarkit.co.jp/fwin2k/win2ktips/1369suatools/suatools.html

windowsでunixなコマンドを使う

cygwinも試したんだけどセットアップ面倒だしもっと手軽にコマンドプロンプトでdirの代わりにlsとか打てる手軽な方法ないかなーと思ってたらこんなのあった

・win-bash
http://sourceforge.jp/projects/sfnet_win-bash/

ここの「shell.w32-ix86.zip」をダウンロード->解凍してpath通せばコマンドプロンプトでlsとかcpとかcatとかmvとかrmとかのよく使うコマンドが使える。

便利!

wgetで保存ディレクトリとファイルの両方を指定する

「-O」と「-P」両方指定してみたけどなぜか効かなかったので(-Pが無視されるような挙動になった)下記の方法で指定した。

wget -O /root/unko http://hogehoge.com/

・保存したいディレクトリは「/root」
・保存したいファイル名は「unko」
とする。

ちなみにうまく動かなかった時は下記のように指定した。

wget -O unko http://hogehoge.com/ -P /root/

なんでだろう

SSHの鍵交換でPermission denied

パスワード入力無しでSSHを実現しようとして壁にぶつかったので解決方をメモしておく。

環境

centos6
秘密鍵名:id_hogehoge
公開鍵名:id_hogehoge.pub

状況

接続元のサーバーの~/.sshディレクトリに秘密鍵を入れて、接続先の~/.ssh/authorized_keysに公開鍵の内容を追記した。
その状態で SSH {接続先のIP} をしたけど下記のメッセージが表示されて接続できない。

Permission denied (publickey,gssapi-keyex,gssapi-with-mic).

解決

結論から言うと秘密鍵の名前(id_hogehoge)がまずかった。
sshに「-vvv」オプションをつけて実行するとデバッグプリントが表示されるのだけれど、どうもid_hogehogeを見に行ってくれてなさそうだという事で調べてみたら案の定そうだった。

どうやらデフォルトでは~/.ssh/id_dsa ,~/.ssh/id_ecdsaおよび~/.ssh/id_rsaの名前の秘密鍵しか読みにいかないらしい。
増やしたい場合は設定ファイル(/etc/ssh/ssh_config)にIdentityFileプロパティを追加する.

IdentityFile ~/.ssh/id_hogehoge

設定ファイルを編集したくなかったら秘密鍵の名前を大人しくid_rsaにするのでもOK。


ちなみにここにたどり着くまでに↓のような点もチェックした。
・ユーザーのホームディレクトリのパーミッションは適切か(700など).
・~/.ssh ディレクトリのパーミッションは適切か(700など).
・秘密鍵のパーミッションは適切か(600など).
puttyで作ったopenssh形式に公開鍵は変換("ssh-keygen -i -f Puttyで作った公開鍵 > openssh形式の公開鍵")しないといけない.