ニフクラ ブログ

ニフクラやクラウドの技術について、エンジニアが語るブログです。

オブジェクトストレージをPHP・Bashから使ってみる

こんにちは。ニフティクラウド ストレージサービスチームの湊と申します。

ニフティクラウド オブジェクトストレージ」は様々なREST APIを提供しており、利用者はこのAPIを経由してバケット・オブジェクトの操作を行うことができます。

提供APIの詳細な仕様につきましては、APIリファレンスをご確認ください。

オブジェクトストレージがサポートしているAPIインターフェースは「SDK for Java」のみですが、ほかのインターフェース(PHP・Bash)からでも利用できるかどうかを検証してみます。

なお、紹介するサンプルプログラムはシグネチャーの生成およびリクエストをオブジェクトストレージへ送る箇所に重点を置いているため、一部割愛しています。 したがって、実行時はエラーを参照しつつ適宜サンプルプログラムを修正してください。

また、サンプルプログラム内で生成するシグネチャーのバージョンはすべてv2になります。

共通環境

以下のニフクラVM上で動作確認しました。

項目
OS CentOS 6.6
サーバータイプ medium4
リージョン east-2

対象APIは「PutObject」(ファイルのアップロード)・「GetObject」(ファイルのダウンロード)です。

PHP

オブジェクトストレージにおいてPHP経由でファイルのアップロード・ダウンロードができることを確認します。 シグネチャーとリクエストヘッダーをキー情報・リクエストメソッドから生成し、それらをcurlのパラメーターに指定することでAPIが実行されます。

動作環境

項目
PHPバージョン 5.4.45

PutObject

$bucket = 対象バケット名;
$endpoint = "https://jp-east-2.os.cloud.nifty.com";
$file = アップロードファイル名;
$type = 'text/plain';
$content = file_get_contents ( $file );
$method = 'PUT';
$md5 = base64_encode ( md5 ( $content, true ) );
$date = gmdate ( \DateTime::RFC2822 );
$resource = "/$bucket/$file";
$stringToSign = $method . "\n" . $md5 . "\n" . $type . "\n" . $date . "\n" . '' . $resource;
// シグネチャーを生成。
$signature = base64_encode ( hash_hmac ( 'sha1', $stringToSign, SECRET_KEY, true ) );
$auth = "AWS " . ACCESS_KEY . ":" . $signature;
// リクエストヘッダを作成。
$headers = [ 
        "Date: ".$date,
        "Content-Type: ".$type,
        "Content-MD5: ".$md5,
        "Authorization: ".$auth 
];
$options = [ 
        CURLOPT_URL => $endpoint . $resource,
        CURLOPT_CUSTOMREQUEST => $method,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_POSTFIELDS => $content,
                CURLOPT_HEADER=>true
];
$ch = curl_init ();
curl_setopt_array ( $ch, $options );
// curl実行。
$res = curl_exec ( $ch );   

実行結果。

HTTP/1.1 200 OK
Date: Fri, 28 Oct 2016 04:32:22 GMT
Server:  
ETag: "ad74d3059a5f047882fc138a1ab7ac86"
Content-Length: 0
Accept-Ranges: bytes
x-amz-request-id: tx00000000000000157130e-005812d4d6-612bb3-default
Connection: close
Content-Type: text/plain; charset=UTF-8

GetObject

$bucket = 対象バケット名;
$endpoint = "https://jp-east-2.os.cloud.nifty.com";
$file = ダウンロードオブジェクト名;
$type = '';
$method = 'GET';
$md5 = '';
$date = gmdate ( \DateTime::RFC2822 );
$resource = "/$bucket/$file";
$stringToSign = $method . "\n" . $md5 . "\n" . $type . "\n" . $date . "\n" . '' . $resource;
// シグネチャーを生成。
$signature = base64_encode ( hash_hmac ( 'sha1', $stringToSign, SECRET_KEY, true ) );
$auth = "AWS " . ACCESS_KEY . ":" . $signature;
// リクエストヘッダを作成。
$headers = [ 
        "Date: ".$date,
        "Authorization: ".$auth 
];
$options = [ 
        CURLOPT_URL => $endpoint . $resource,
        CURLOPT_CUSTOMREQUEST => $method,
        CURLOPT_HTTPHEADER => $headers,
                CURLOPT_HEADER=>true
];
$ch = curl_init ();
curl_setopt_array ( $ch, $options );
// curl実行。
$res = curl_exec ( $ch );

実行結果。

HTTP/1.1 200 OK
Date: Fri, 28 Oct 2016 04:33:55 GMT
Server:  
Content-Length: 85
Accept-Ranges: bytes
Last-Modified: Fri, 28 Oct 2016 04:32:22 GMT
ETag: "ad74d3059a5f047882fc138a1ab7ac86"
x-amz-request-id: tx000000000000001570ce0-005812d533-6180f2-default
Connection: close
Content-Type: text/plain; charset=UTF-8

PutObject・GetObjectともに「HTTP/1.1 200 OK」と200応答が返され、正常に処理されていることがわかります。

Bash

オブジェクトストレージにおいてBash経由でファイルのアップロード・ダウンロードができることを確認します。 基本的なフローは前述のPHPと同じです。

動作環境

項目
Bashバージョン 4.1.2

PutObject

file=アップロードファイル名
bucket=対象バケット名
endpoint="jp-east-2.os.cloud.nifty.com"
resource="/${bucket}/${file}"
contentType="text/plain"
date="$(LC_ALL=C date -u +"%a, %d %b %Y %X %z")"
stringToSign="PUT\n\n${contentType}\n${date}\n${resource}"
#シグネチャーを生成。
signature=`${ECHO} -en ${stringToSign} | ${OPENSSL} sha1 -hmac ${secretKey} -binary | base64`
${CURL} -X PUT -T "${file}" \
  -H "Host: ${endpoint}" \
  -H "Date: ${date}" \
  -H "Content-Type: ${contentType}" \
  -H "Authorization: AWS ${accessKey}:${signature}" \
  https://${endpoint}/${bucket}/${file} -v

実行結果。

< HTTP/1.1 200 OK
< Date: Fri, 28 Oct 2016 04:40:06 GMT
< Server:  
< ETag: "4729f35bda896cb0c0c7712c333384af"
< Content-Length: 0
< Accept-Ranges: bytes
< x-amz-request-id: tx0000000000000015711e7-005812d6a6-6180f2-default
< Connection: close
< Content-Type: text/plain; charset=UTF-8

GetObject

file=ダウンロードオブジェクト名
bucket==対象バケット名
endpoint="jp-east-2.os.cloud.nifty.com"
resource="/${bucket}/${file}"
contentType=""
date="$(LC_ALL=C date -u +"%a, %d %b %Y %X %z")"
stringToSign="GET\n\n${contentType}\n${date}\n${resource}"
#シグネチャーを生成。
signature=`${ECHO} -en ${stringToSign} | ${OPENSSL} sha1 -hmac ${secretKey} -binary | base64`
${CURL} -X GET -T "${file}" \
  -H "Host: ${endpoint}" \
  -H "Date: ${date}" \
  -H "Authorization: AWS ${accessKey}:${signature}" \
  https://${endpoint}/${bucket}/${file} -v

実行結果。

< HTTP/1.1 200 OK
< Date: Fri, 28 Oct 2016 04:41:05 GMT
< Server:  
< Content-Length: 82
< Accept-Ranges: bytes
< Last-Modified: Fri, 28 Oct 2016 04:40:06 GMT
< ETag: "4729f35bda896cb0c0c7712c333384af"
< x-amz-request-id: tx000000000000001570acf-005812d6e1-618170-default
< Connection: close
< Content-Type: text/plain; charset=UTF-8

PutObject・GetObjectともに「HTTP/1.1 200 OK」と200応答が返され、正常に処理されていることがわかります。

まとめ

  • 上記すべてのサンプルプログラムにおいて、200応答(正常応答)を得ることができました。
  • 動作を保証するわけではありませんが、PutObject・GetObjectについてはPHP・Bashからでも利用できることを確認しました。

注意事項

  • 本サンプルプログラムの使用は利用者の自己責任となります。
  • 本サンプルプログラムによって生じたいかなる損害についても、当社は責任を負いかねます。