メンチカツ

ロースカツが好きです

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 with query expression .
言われます。

なもんで、取れなかったら取れるまでがんばりましょう。
リトライ回数を設定します。

boto(python) configファイルに以下を設定。

num_retries = 1000

PHP

$sdb = new AmazonSDB();
$sdb->set_max_retries(1000);

Ruby

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リージョンにできてました。

設定的なことはツール類でやらんでマネジメントコンソール使いましょうという
お話でした。