AWS SDK for PHPでAmazon S3にファイルをアップロードする

cloudpackエバンジェリストの吉田真吾@yoshidashingo)です。

タイトルのとおり、AWS SDK for PHPでAmazon S3にファイルをアップロードしてみましょう。

環境準備

今回は手元のMacでやります。PHPが入ってなければ入れましょう。
サーバー側でやる場合も同様です。プラットフォームに合った方法でインストールしてください。

AWS SDK for PHP 2をセットアップ

Getting Started with the AWS SDK for PHP を見ながら進めましょう。

インストール先のディレクトリの作成

$ mkdir -p ~/workspace/aws-php-sample
$ cd ~/workspace/aws-php-sample

Composerのインストール

$ curl -sS https://getcomposer.org/installer | php
#!/usr/bin/env php
All settings correct for using Composer
Downloading...

Composer successfully installed to: /Users/shingo/workspace/aws-php-sample/composer.phar

Composer.json作成

$ vim composer.json
{
  "require": {
    "aws/aws-sdk-php": "*"
  }
}

パッケージのインストール

$ php composer.phar install
Loading composer repositories with package information
Installing dependencies (including require-dev)
  - Installing symfony/event-dispatcher (v2.5.3)
    Downloading: 100%

  - Installing guzzle/guzzle (v3.9.2)
    Downloading: 100%

  - Installing aws/aws-sdk-php (2.6.15)
    Downloading: 100%

symfony/event-dispatcher suggests installing symfony/dependency-injection ()
symfony/event-dispatcher suggests installing symfony/http-kernel ()
aws/aws-sdk-php suggests installing doctrine/cache (Adds support for caching of credentials and responses)
aws/aws-sdk-php suggests installing ext-apc (Allows service description opcode caching, request and response caching, and credentials caching)
aws/aws-sdk-php suggests installing monolog/monolog (Adds support for logging HTTP requests and responses)
aws/aws-sdk-php suggests installing symfony/yaml (Eases the ability to write manifests for creating jobs in AWS Import/Export)
Writing lock file
Generating autoload files

IAM Roles for EC2を付与して起動したEC2以外の場合(MacやPCも含む)は、AWSのAPIを利用するためのクレデンシャルが設定されていないので、EC2やS3など使用したリソースを許可したIAMユーザーを発行し、取得したクレデンシャル情報を環境変数あたりに設定しておきましょう。
※サンプルプログラムで使うクレデンシャルはここから取得することにします。

環境変数にアクセスキーを設定する

$ vi .bash_profile
export AWS_ACCESS_KEY_ID=<AWSのアクセスキー※AKIから始まるヤツ>
export AWS_SECRET_ACCESS_KEY=<シークレットキー>
export AWS_DEFAULT_REGION=ap-northeast-1
complete -C aws_completer aws

※上記決め打ちで東京リージョン入れてますが、そこは要件に合わせてください

ここまでで環境は出来上がり

S3にファイルをアップロードする

  • コマンドライン引数でローカルのファイルパスを渡してアップロードします。
  • アップロード日時でS3内にディレクトリが切られます。
  • 処理が成功すると標準出力にアップロード先のURLが出力されます(S3のStatic Website Hostingを有効にしていれば、写真などの場合、このURLにアクセスすればすぐにWebで表示ができます。)

ソース

<?php

// Load Composer Vendor Modules
require_once('vendor/autoload.php');

$s3 = Aws\S3\S3Client::factory(array(
    'key'    => getenv('AWS_ACCESS_KEY_ID'),
    'secret' => getenv('AWS_SECRET_ACCESS_KEY'),
    'region' => getenv('AWS_DEFAULT_REGION')
));

date_default_timezone_set("Asia/Tokyo");

$result = $s3->putObject(array(
    'Bucket' => '<bucketname>',
    'Key'    => date('Y/m/d/H/i/s'),
    'Body'   => fopen($argv[1], 'r')
));

echo $result['ObjectURL'] . "\n";

使い方

$ php s3_upload_by_filepath.php <アップロードするファイルのファイルパス>

まとめ

  • AWS SDK for PHP、非常に導入が簡単です。
  • 今回はコマンドライン引数で「ファイルパス」を渡しましたが、Webサーバー側で「データストリーム」で受け取るようにすると便利だと思います。