AWS OpsWorksでセットアップが終わらない
AWS OpsWorksで、chefを仕込んでstartしたものの、
セットアップが終わらない!
running_setupステータスのまま変わらない!
なんてことがたまにあります。
終わらないとコンソールからログ見られないんですよね。
そんなときはsshでつないで、
sudo /usr/sbin/opsworks-agent-cli show_log
してみてください。どこで詰まってるか確認できます。
詳しくはフォーラムをどうぞ。
https://forums.aws.amazon.com/thread.jspa?messageID=450797
GitHubでmergeしたはずのmasterがでぐれった話
GitHubで、pull requestしたbranchをmergeして
もらったので、早速masterをpullしてタグを付けて
pushしたんですね。
そんでブラウザで付けたタグを確認すると、ソースが
merge前のものになってたんです。
!?
焦ってmasterを見ると、ちゃんとmergeされている。
あれおっかしーなと思ってタグを削除して再度push
するもエラーが出てしまってうまくいかない。
...
ひとまず落ち着いてmasterを別ディレクトリにclone、
以下のページを参考にタグを付け直しました。
gitでタグをつけ直す
http://qiita.com/items/1383d9f864703482c277
うまくいきました。
当たり前といえばそうなのですが、GitHubへのmergeの
反映に若干の遅延があるようです。
Amazon SimpleDBで"NumberSubmittedAttributesExceeded"言われたら
Amazon SimpleDBにputするときに、なにやら怒られるときがありますね。
Messageをみると
Too many attributes for item '<itemName()>' in a single call. Up to 256 attributes per call allowed.
言われてたりします。
Amazon SimpleDB、itemあたりのattributes数は256個なんですけど、
1つのattributeのなかに100個の値を入れてたら、100attributesていう
換算のようです。
Amazon SimpleDBさん、リレーショナルじゃないので複数のvalue値を
セットしたくなりますが、あまり詰め込んじゃだめなのねというお話でした。
Amazon SimpleDBにcsvを読み込んでインポートするphp置いておきますね
とくにたいしたこともしていないけど、どこかでだれかの
お役にたてたらいいなくらいのものですよ。
つかいかた
1ぎょうめにアトリビュート名
1れつめにitemNameにするID
[既にあるドメイン名].csv というファイル名
のファイルを、csvってフォルダをつくっていれておきます。
csvフォルダとおなじ場所に、適当なphpファイル名
(ここではcsv_to_sdb.phpにしときます)でファイルを
つくって以下のソースをコピペします。
<?php require_once '/path/to/aws-sdk-1.5.11/sdk.class.php'; try { $cts = new CsvToSdb(); $cts->import(); } catch (Exception $e) { var_dump($e); } class CsvToSdb { const MAX_BATCH_PUT = 25; protected $sdb = null; protected $files = null; public function __construct() { try { $this->sdb = new \AmazonSDB(); $this->sdb->set_region('[リージョンを設定してね]'); } catch (\SDBException $e) { throw new \Database_Exception($e->getMessage(), $e->getCode(), $e); } try { if ($handle = opendir(dirname(__FILE__).'/csv')) { while (false !== ($file = readdir($handle))) { if (preg_match('/(.*?).csv$/', $file, $matches)) { $this->files[] = array('name'=>dirname(__FILE__)."/csv/$file", 'domain'=>$matches[1]); } } closedir($handle); } } catch (Exception $e) { throw $e; } } public function import() { if($this->files === null) return; setlocale(LC_ALL, 'ja_JP.UTF-8'); try { foreach ($this->files as $f) { $fp = fopen($f['name'],"r"); $headers = null; $items = null; $put_count = 0; while($data = fgetcsv($fp)) { if($headers === null) { foreach ($data as $k => $v) { $headers[$k] = $v; } } else { $itemName = null; $attributes = null; foreach ($data as $k => $v) { //itemName is convert to zero padding format. if($itemName === null) $itemName = sprintf("%010s", $v); $attributes[$k] = $v; } foreach ($headers as $k => $v) { $items[$itemName][$v] = $attributes[$k]; } if(count($items) === self::MAX_BATCH_PUT) { $result = $this->sdb->batch_put_attributes($f['domain'], $items, true, null); $put_count += count($items); echo "executing 'batch_put_attributes' count at $put_count ...\n"; $items = null; } } if ($headers === null) break; } fclose($fp); if(count($items) > 0) { $result = $this->sdb->batch_put_attributes($f['domain'], $items, true, null); $put_count += count($items); echo "executing 'batch_put_attributes' count at $put_count ...\n"; $items = null; } } } catch (Exception $e) { throw $e; } } }
aws-sdkとリージョンの設定もしておいてください。
おわったら、
php csv_to_sdb.php
ってすると、まあおもったとおりのうごきをします。
Amazon SimpleDBで"QueryTimeout"言われたら
Amazon SimpleDBにselectするときに、タイムアウトして戻ってこない
ときがありますね。
HTTPでやりとりするサービスなんで、処理が重ければタイムアウトで返ってきます。
408のステータスコードで
A timeout occurred when attempting to query domain
言われます。
なもんで、取れなかったら取れるまでがんばりましょう。
リトライ回数を設定します。
boto(python) configファイルに以下を設定。
num_retries = 1000
$sdb = new AmazonSDB();
$sdb->set_max_retries(1000);
AWS.config(:max_retries => 1000)
webサービスはリトライ大事だねというお話でした。
Amazon S3で"SignatureDoesNotMatch"言われたら
S3にファイルをアップするときに、おまえのシグネチャーどうなってんだ
って言われるときがありますね。
ぐぐると、
content-typeを設定しれとか言われます。
ふつうは大体これで解決です。
それでも解決しないひとへ。
HTTPヘッダがおかしいかもしれません!
HTTP ヘッダの使用
HTTP ヘッダに指定できるのは印字可能な ASCII 文字のみで、大文字と小文字は区別されません。
とあります。
x-amz-meta-* でmetadataを追加するときは、自由になんでも入れられる
からってUnicodeとか入れちゃうとはじき返されます。5分前のわたしがそうでした。
web開発者ならRFC2616はちゃんと読んでおきましょうというお話でした。
Amazon S3で"The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint."言われたら
S3にファイルをアップするときに、おまえのエンドポイントどうなってんだ
って言われるときがありますね。
ぐぐると、
AWS::S3::DEFAULT_HOST.replace "s3-ap-northeast-1.amazonaws.com"
を設定しれとか
s3->set_region(AmazonS3::REGION_APAC_NE1);
しとけとか言われます。
ふつうは大体これで解決です。
それでも解決しないひとへ。5分前のわたしもそうでした。
一度落ち着いて、S3のManagement ConsoleをひらいてRegionのとこ見てみて
ください。
さっき必死に設定してたリージョンと、違うことがあります。
Tokyoリージョンのbucketの並びに軽いノリでS3Foxでbucket作って
東京気取りでいたら、普通にUSリージョンにできてました。
設定的なことはツール類でやらんでマネジメントコンソール使いましょうという
お話でした。