クラウドインフラ構築記

現在AWSの構築支援に携わっております。今注視しているのは、GKE、BigQuery、Google Dataflowなどサービスを展開しているGoolge Cloud Platformです。

2013年7月25日
から hiruta
CloudnのObjectStorageで、MultipartUploadがうまくいかない。(Try編) はコメントを受け付けていません

CloudnのObjectStorageで、MultipartUploadがうまくいかない。(Try編)

CloudnのObjectStorageで、MultipartUploadを試してみました。

AWS SDK for PHP 2は、getcomposer.org よりインストールしました。インストール方法はこちらの記事を参照。

<?php
require_once("aws/vendor/autoload.php");

use Aws\Common\Aws;
use Aws\Common\Enum\Size;
use Aws\S3\Enum\CannedAcl;
use Aws\Common\Enum\Region;
use Aws\Common\Exception\MultipartUploadException;
use Aws\S3\Model\MultipartUpload\UploadBuilder;
use Aws\S3\S3Client;

$access_key = '--access_key---';
$secret_key = '---secret_key---';

$region = Region::AP_NORTHEAST_1; // Region::AP_NORTHEAST_1 = Tokyo Region
$end_point_url = 'http://str.cloudn-service.com';
$bucket = 'devstore';

try {
 // S3
// $s3 = Aws::factory(array(
// 'key' => $access_key,
// 'secret' => $secret_key,
// 'base_url' => $end_point_url
// ))->get('s3');
 $config = array(
 'key' => $access_key,
 'secret' => $secret_key,
 'base_url' => $end_point_url
 );
 $s3 = S3Client::factory($config);
 $filename = 'P1000267.JPG';
 $transfer = UploadBuilder::newInstance()
 ->setClient($s3)
 ->setSource($filename)
 ->setBucket($bucket)
 ->setKey($filename)
 ->setMinPartSize ( 5 * Size::MB)
 ->build();

$transfer->upload();

} catch (MultipartUploadException $e) {
 echo $e->getPrevious();
 $transfer->abort();
}

実行させると、以下エラーとなってしまう。過去のフォーラムの投稿をみていると、AWS SDK for PHP 2のバグでBucketに”(ダブルコーティション)を利用しているとエラーになることがあるが、SDK自体は最新を使っている(と思う。たぶん)のでこのケースは考えにくい。S3に正常にアップロードできるので、あとはCloudn側しか原因が考えられない。


$ php upload-test2.php
Aws\S3\Exception\MalformedXMLException: AWS Error Code: MalformedXML, Status Code: 400, AWS Request ID: ACEE3A10F51811E2, AWS Error Type: client, AWS Error Message: The XML you provided was not well-formed or did not validate against our published schema., User-Agent: aws-sdk-php2/2.4.1 Guzzle/3.7.1 curl/7.19.7 PHP/5.3.3 MUP[

また、S3で対応しているブラウザからストレージにアップロードを行える『 Browser-Based Uploaded by POST』にはObject StorageではPOST Objectをサポートしていないので、使うことができない。(同じクラウドストレージ基盤を使用しているニフティクラウドストレージも未サポートでした。)

上記の件でCloudnのサポートから以下の回答を頂きました。結論分割送信は現時点で動作しないとことです。

こちらでも、調査確認させていただきましたが、お客様と同様のエラーとなることを確認
させていただきました。
現時点では、もうしわけございませんが、確固たる原因およびその対策について明確に返信
することがでません。
引き続き、調査を進めてまいります。情報にアップデートがございましたら、FAQサイトに
追記させていただきたく思います。

S3が一番使い勝手がいい。S3の場合、トラフィック課金があるので、トラフィック量によっては、コストが掛かる場合もありうる。アップロードは、ブラウザを使わず、Javaで実装がいいのか。

CompleteMultiUploadにバグがあった模様。バグfixする前も、S3では問題ない動作をしていたのは疑問が残るところ。

https://twitter.com/tatsuya6502/status/383525950907904000

2013年7月25日
から hiruta
aws-sdk-php環境構築 はコメントを受け付けていません

aws-sdk-php環境構築

aws-sdk-phpのライブラリをgetcomposerから構築可能。PEARでもインストールは可能だが、PEARでインストールする場合、root権限が必要なので、root権限がない環境に構築する際便利。
getcomposer.orgにWordPressサイトのバックアップとかを行える便利なパッケージ等いろいろあるようです。
pomander https://packagist.org/packages/pomander/wordpress

curl -s http://getcomposer.org/installer | php 

 

vi composer.json
{
"require":{
"aws/aws-sdk-php" : "dev-master"
  }
}

 

php composer.phar install

あとは、AWS SDKを使うファイルの先頭で、以下を入れればAWS SDK for PHP 2が使用できます。

 require "aws/vendor/autoload.php";

2013年7月22日
から hiruta
昨日契約したUQ WIMAX 端末が届きました。 はコメントを受け付けていません

昨日契約したUQ WIMAX 端末が届きました。

昨日契約したUQ WIMAXの端末が今日宅急便で届いた。(佐川急便)契約プラ

P1000399

ンは、UQ  Step(2段階プラン)設定は簡単。電源オン

。契約チェックが行われて、小窓のディスプレイにアンテナと「WIMAX」が表示されれば、開通。WPSに対応しているので、無線LANの暗号キーを入力なしで、ルーターの設定情報を自動的に設定して、Wi-Fi接続してすんなり終了。(らくらく無線スタートもでいるようです。)WIMAXの場合、大容量通信を行っても、3Gのような速度制限の心配もないので、無線インターネットでは最適。ただし、エリア的には地方では3Gには劣るので、さらなるエリア拡大、品質向上が望まれるところ。

グローバルIPアドレスが割り当てはオプションになったので、ルーターのWAN側にはプライベートIPアドレスが割り当てられている。(100.64.3で始まるもの)通常の利用はプライベートIPアドレスでも問題なさそうです。グローバルIPアドレスオプションも月額+100円。

勉強会会場などでちょっとネットに接続できると便利なので、このような場合に活用する予定。(公衆無線LANはスポットレベルなのでNG)

ルーターの管理画面も用意されているので、詳細な設定も可能。MACアドレスのフィルタリングを設定していますが、許可するMACアドレスを追加する度に、設定を保存するときに再起動がかかる。この点がマイナスポイント。設定変更の度に、再起動が必要なところ以外は文句はありません。

P1000401

MACアドレスフィルタリングで特定MACアドレスのみに早速制限をしました。

スマホのWi-Fi接続も、スマホがWPSに対応していたので、ものの1分ほどで設定完了。

2013年7月21日
から hiruta
AWSSDK for PHP 2を使う場合のnginxなどのタイムアウトの設定 はコメントを受け付けていません

AWSSDK for PHP 2を使う場合のnginxなどのタイムアウトの設定

AWS SDK for PHP 2のMultipartUploadでアップロードする際、webサーバーのタイムアウト時間を延ばしてやる必要があります。

nginxのFastCGIのタイムアウト時間の設定から (/etc/nginx/conf.d/default.conf)

fastcgi_send_timeout 1800;
fastcgi_read_timeout 1800;
fastcgi_connect_timeout 1800;

次に、php-fpmの設定 (/etc/php-fpm.d/www.conf)

request_terminate_timeout = 1800

最後に、phpの設定 (/etc/php.ini)

max_execution_time = 1800

Connection reset by peerがnginxのログにある場合、タイムアウト時間を疑うといい。

2013/07/21 09:29:16 [error] 7746#0: *3569 recv() failed (104: Connection reset b
y peer) while reading response header from upstream, client: xxx.xxx.xxx.xxxx, ser
ver: www.webtechlogy.net, request: "GET /sample/upload-cn.php HTTP/1.0", upstrea
m: "fastcgi://127.0.0.1:9000", host: "www.xxxx.net"

2013年7月20日
から hiruta
MultipartUpload を試してみました。 はコメントを受け付けていません

MultipartUpload を試してみました。

Amazon S3にAWS SDK for PHP 2からMultipartUploadを試してみました。以下例は、5M単位で分割して送信を行うようになっています。回線負荷も分散が可能になります。createMultipartUpload → uploadParts → completeMultipartUploadで処理が行われます。uploadPartsは分割分処理が走ります。(Amazon S3はメディアファイルの配信には最適。)


require_once("AWSSDKforPHP/aws.phar");

use Aws\Common\Aws;
use Aws\Common\Enum\Region;
use Aws\S3\Enum\CannedAcl;
use Aws\S3\Exception\S3Exception;
use Guzzle\Http\EntityBody;
use Aws\Common\Exception\MultipartUploadException;
use Aws\S3\Model\MultipartUpload\UploadBuilder;

$access_key = 'access key';
$secret_key = 'secret key';
$region = Region::AP_NORTHEAST_1; // Region::AP_NORTHEAST_1 = Tokyo Region
$end_point_url = 'http://str.cloudn-service.com';
$bucket = 'xxxx';

try {
 // S3
 $s3 = Aws::factory(array(
 'key' => $access_key,
 'secret' => $secret_key,
 'region' => $region,
// 'base_url' => $end_point_url,
 ))->get('s3');

 $info = new FInfo(FILEINFO_MIME_TYPE);

// Upload File
 $filename = "sample.mp4";
 $body = EntityBody::factory(fopen($filename, 'r'));
 $filetype = $info->file($filename);
 $key = "test" . time();

$response = $s3->createMultipartUpload(array(
 'Bucket' => $bucket,
 'Key' => $key
));

$uploadId = $response['UploadId'];
echo('createMultipartUpload: Finished with id: ' . $uploadId);

$chunkSize = 5242880;
 $start = 0;
 $part = 0;
 $length = $body->getSize();
 while($start < $length) {
 $end = $start + $chunkSize;
 if($end > $length)
 $end = $length;

 $body->seek($start);
 $body->setSize($end);
 $real_chunk_size = $end - $start;
 var_dump('Sending part #'. $part . ' containing '.$start.' through '. $end . ' of ' . $length);
 $response = $s3->uploadPart(array(
 'Bucket' => $bucket,
 'Key' => $key,
 'Body' => $body->read($real_chunk_size),
 'PartNumber' => (string)$part+1,
 'UploadId' => $uploadId,
 'ContentMD5' => hash_file('md5', $filename)
 ));
 $etag = $response->getPath('ETag');
 $requestId = $response->getPath('RequestId');
 var_dump('Part Received with Etag: '.$etag.' and RequestId: ' .$requestId);
 $part++;
 $start += $chunkSize;
 }

 $parts = $s3->listParts(array(
 'Bucket' => $bucket,
 'Key' => $key,
 'UploadId' => $uploadId,
 ));

 $s3->completeMultipartUpload(array(
 'Bucket' => $bucket,
 'Key' => $key,
 'UploadId' => $uploadId,
 'Parts' => $parts['Parts']
 ));

 var_dump('Done');

} catch (S3Exception $e) {

$s3->abortMultipartUpload(array(
 'Bucket' => $bucket,
 'Key' => $key,
 'UploadId' => $uploadId
 ));

S3互換を歌っているCloudnのObjectStorageへのMultipartUploadを試しているのだが、completeMultipartUploadで例外が発生。

putObjectでは問題なくアップロードが完了するので、MultipartUploadの設定ではと考えれる。

あとは、Browser Based Uploaded Using POST が実現できれば。

2013年7月18日
から hiruta
CloudnのObjectStorageをAWS PHP SDKから操作してみました。 はコメントを受け付けていません

CloudnのObjectStorageをAWS PHP SDKから操作してみました。

CloudnのObjectStorageをAWS SDK for PHP 2 から操作してみました。

まずは、必要なライブラリのインストール。(検証はさくらのVPSで行いました。)


pear install aws/sdk
pear channel-discover pear.amazonwebservices.com
pear channel-discover guzzlephp.org/pear
pear channel-discover pear.symfony.com

以下は、指定Bucket( 以下の場合 xxxx)内のファイルを羅列するだけの簡単なプログラムになります。ひとつ気をつけないといけないは、「baae_url」を「http://」から記載する必要があるところ

アクセスキーとシークレットキーは契約している個々の情報に置き換えてください。


require_once("AWSSDKforPHP/aws.phar");

use Aws\Common\Aws;
use Aws\Common\Enum\Region;
use Aws\S3\Enum\CannedAcl;
use Aws\S3\Exception\S3Exception;
use Guzzle\Http\EntityBody;

$access_key = 'access key';
$secret_key = 'secret key';
$end_point_url = 'http://str.cloudn-service.com';
$bucket = 'xxxx;

try {
 // S3
 $s3 = Aws::factory(array(
 'key' => $access_key,
 'secret' => $secret_key,
'base_url' => $end_point_url,
 ))->get('s3');

$info = new FInfo(FILEINFO_MIME_TYPE);
 $iterator = $s3->getIterator('listObjects',array(
 'Bucket' => $bucket
 ));

foreach ($iterator as $object) {
 echo $object['Key'] . "\n";
}

} catch (S3Exception $e) {

}

AWSで使っているものも簡単にCloudnに移植ができると思われます。さすが、ベンダーロックインフリーを歌っていることはあります。

AWSがトラフィック量によっては、月額コストが上がるのに対し、Cloudnは月額の上限が設定されているので、財布にもやさしいと思われます。(さくらのクラウドも月額上限があります。)
ファイルアップロードもputObjectでできるかと思われますが、次回。

2013年7月16日
から hiruta
さくらのクラウドにVPSからのマイグレーション機能が将来提供! はコメントを受け付けていません

さくらのクラウドにVPSからのマイグレーション機能が将来提供!

さくらのクラウドにVPSからのマイグレーション機能が付くようだ。VPSのディスクからアーカイブを生成してさくらのクラウドで使えるようになるようです。さくらのVPSの場合、大阪と石狩リージョンがあるのだが、さくらのクラウドと同じリージョンに限定されるかは不明。

2013-07-17に、VPSからマイグレーションさせる機能がβ版として提供。VPSのリージョンの制限とか記載されていないので、大阪リージョンでも対応できるのだろうか。

さくらのクラウドのVM(仮想マシン)のベンチマークは他クラウド(Amazon ?)よりベンチマークが良いようだが、現在共用100Mのみのインターネット回線の回線アップグレード(専用サーバーで提供されているものに相当するもの)に是非対応してもらいたい。

動画など仮想マシンのhttpdやnginxリソースを使わなくても、アップロード、ダウンロードが行えるストレージ機能がほしいところ。(Amazon S3やCloudnのObject Storageに相当するもの)

2013年7月8日
から hiruta
0件のコメント

次世代プロトコルSPDY

WEBを高速化できる技術であるSPDYの記事があります。

SPDY自体、Google発の技術で、1TCPセッションで複数のリクエストを取得することが可能になります。

SPDYの恩恵を受けるには、サーバー、クライアント(ブラウザ)側で対応が要。

まず、サーバー側から。apache(mod_spdy)、nginx(–with-http_spdy_module)とも対応は可能。ただし、SSLは必須。

次に、クライアント。Chrome、Firefox(15-),Windows 8.1に搭載されるIE11がSPDYに対応しています。

[tmkm-amazon]4774157198[/tmkm-amazon]

Googleサービスサイト(GMail等)はSPDYに対応済み。SPDY Indicatorを入れるとアドレスバーでSPDYが有効かどうかがわかります。

2013年7月3日
から hiruta
GrowthForecastのサイトレスポンスグラフが表示されない はコメントを受け付けていません

GrowthForecastのサイトレスポンスグラフが表示されない


growthForecastのサイトレスポンスグラフが最近表示されなくなっていたのを、調べていたら、td-agentへのログ送信がうまくいっていないのがわかった。

うまくいかない原因が、nginxのアクセスログ(LTSV)のtd-agentユーザが読めないからでした。

nginxのアクセスログのgroupがadmでしたので、td-agentをadmグループに追加し、しばらく後、td-agent側に送信できるようになりました。

2013年6月28日
から hiruta
0件のコメント

POP before SMTPをSMTP認証(postfix)と共存するには

CentOS 6になると、MTAがpostfixがデフォルトになります。postfix単体ではPOP before SMTPには対応していないので、pop-before-smtpを実現するものを組み込む必要があります。drac + drac_pluginでも、できるとブログに記載していましたが、自分のさくらのVPSでは、drac_pluginをビルド中に、-fPICを付けてrecompileしろとかで失敗してしまう。いろいろ試したが、drac方式は諦めました。

pop-before-smtp-1.42を使用して、postfix + dovecot環境で、POP before SMTP方式を、SMTP認証と共存できたので、方法を残して起きます。

まず、pop-before-smtp-1.42 をここからダウンロードします。

適当なフォルダで展開して、プログラム、設定ファイル、起動スクリプトをコピーします。

cp pop-before-smtp /usr/sbin
cp pop-before-smtp-conf.pl /etc
cp pop-before-smtp.init

使用しているPOP3のところのコメントを削除します。dovecotを使っているので、dovecotのところをコメント削除しました。

# For Dovecot POP3/IMAP when using syslog.
$pat = '^[LOGTIME] \S+ (?:dovecot: )?(?:imap|pop3)-login: ' .
    'Login: .*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]';
$out_pat = '^[LOGTIME] \S+ (?:dovecot: )?(?:imap|pop3)-login: ' .
    'Disconnected.*? (?:\[|rip=)[:f]*(\d+\.\d+\.\d+\.\d+)[],]';

BerkeleyDBを使うので、以下=cutを削除。場合によってはperl-BerkeleyDBでperlのBerkerleyDBライブラリをインストールします。

=cut #====================== Postfix BerkeleyDB =======================START=

=cut #====================== Postfix BerkeleyDB =======================END=

main.cfの以下部分を変更します。

check_client_access_pbs = check_client_access hash:/etc/postfix/pop-before-smtp
smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,$check_client_access_pbs,reject_unauth_destination

最後に、サブミッションポートでPOP before SMTP認証を有効にします。

submission inet n – n – – smtpd
# -o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject

POP before SMTP自体ISPでもサービス終了する中、未だに使い続けているところがあります。迷惑メールの踏み台にされないために、SMTP認証に移行するのが望ましいと考えます。マイVPSサーバーも検証で試しただけで、検証後は無効化しました。