Windows環境のPHPでAmazon S3を操作する。

2013年3月25日

Pocket

こんにちは。山本です。

たまには開発部っぽいこともブログに書いておかないとバイヤー(ヤバい)かな~とか思ったので、Windows環境下(っていうかXAMPP)でAmazon Web ServicesのS3を操作するときに多分ハマるんじゃないかと思われるポイントを、いくつか書いておこうと思います。

知ってることだけですよ。知ってることだけ。

猫物語(黒) 第一巻/つばさファミリー(上)(完全生産限定版) [Blu-ray]

まず公式のSDKをインストールするところからです。現在はAWS SDK for PHP 2ですが、インストール自体は別に問題なくPEARなどで行えるでしょう。強いて言えば、PEARにチャンネルを追加するところぐらいでしょうか。

pear channel-discover pear.amazonwebservices.com
pear channel-discover guzzlephp.org/pear
pear channel-discover pear.symfony.com

以上でOKです。あと強いて言えば、Windows Vista以降であれば、コマンドプロンプトを管理者権限で実行しないとPEARがうまく動きません。ってぐらいですね。

じゃあこの状態でサンプルコードを動かしてみましょう。実際にアップロードなどを行うにはバケットの作成などの準備が必要ですが、まぁそのへんはドットインストールのS3回でも見てください。以下、サンプルコードです。

require 'AWSSDKforPHP/aws.phar';
use Aws\Common\Aws;
use Aws\Common\Enum\Region;
use Aws\S3\Enum\CannedAcl;
use Aws\S3\Exception\S3Exception;

try {
  $s3 = Aws::factory(array('key' => 'あなたのアクセスキー',
                      'secret' => あなたの秘密鍵',
                      'region' => Region::TOKYO))->get('s3');

  $response = $s3->putObject(array('Bucket' => 'バケット名',
                              'Key'    => $key,  //保存するキー
                              'Body' => fopen($file_name, 'r'),
                              'ContentType' => $mime_type,
                              'StorageClass' => 'REDUCED_REDUNDANCY',
                              'ACL' => CannedAcl::PUBLIC_READ));
} catch (S3Exception $e) {
}

さて、実行してみると、こんなエラーが出た人も多いのではないでしょうか。

Guzzle\Http\Exception\CurlException [ Error ]: [curl] 60: SSL certificate problem, verify that the CA cert is OK. Details: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed [url] https://xxxx.s3-ap-northeast-1.amazonaws.com/xxxxx

このエラーは、cURLがSSL証明書の正当性チェックで落ちています。とりあえずXAMPPでふつーに入れるとcURLの通信時に使う証明書が入っていないので、まず次の証明書をphpのインストールフォルダに保存してください。そしてphp.iniの末尾に、以下を追記してください。

[cURL]
curl.cainfo = C:\xampp\php\cacert.pem

そしてApacheを再起動すれば、先のコードは問題なく動くはずです。まぁよく出くわす問題ですが、チラッと見たら日本語での情報がネット上に見当たらない感じだったので、書いておきました。ついでにファイルをS3から取得するサンプルコードも書いておきます。

//require及びuse句は省略

$s3 = Aws::factory(array('key' => 'あなたのアクセスキー',
                    'secret' => 'あなたの秘密鍵',
                    'region' => Region::TOKYO))->get('s3');

$obj = $s3->getObject(array('Bucket' => 'バケット名',
                       'Key'    => $key));  //保存したキー名

header('Content-type: ' . $obj->get('ContentType'));
echo $obj->get('Body');

さて、ホビープログラマの中にはXAMPPを愛用している人も多いと思いますが、ホビープログラマがWebサービスを公開するのにAWSは割と向いています。特にアクセスをスケールさせたい場合は。

そんな事情も加味して、XAMPP+AWS SDKで嵌りそうかな? って思った所をつらつらと書いて見ました。誰かお一人でも参考になれば幸いです。

でわでわ。

Leave a Comment

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)