こんにちは。ニフティクラウド ストレージサービスチームの湊と申します。
「ニフティクラウド オブジェクトストレージ」は様々な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からでも利用できることを確認しました。
注意事項
- 本サンプルプログラムの使用は利用者の自己責任となります。
- 本サンプルプログラムによって生じたいかなる損害についても、当社は責任を負いかねます。