本文へジャンプします。

オブジェクトストレージを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からでも利用できることを確認しました。

注意事項

  • 本サンプルプログラムの使用は利用者の自己責任となります。
  • 本サンプルプログラムによって生じたいかなる損害についても、当社は責任を負いかねます。
ニフティクラウド 導入相談窓口
ニフティクラウド 無料セミナー

閉じる

閉じる

クラウドブログ編集部

クラウドブログ編集部

ニフティクラウド ユーザーブログ編集部のアカウントです。 編集部からのお知らせや、レギュラーライター以外のゲストによる寄稿記事を掲載していきます。

浜中 慶

浜中 慶

1980年、神奈川県生まれ。2003年ニフティ入社。 ポータルサイト開発を中心に、音楽配信サービス、CGMサービスなど様々なプロジェクトに企画/デザイン/システム担当として参加。現在は@niftyのポータルサービス向けコンテンツ管理システムの企画/開発/運用を担当。

吉田 雄哉

吉田 雄哉

株式会社co-meetingの創業メンバー。「取締役&External- facing Technologist」と名乗り新しいIT技術を広く伝える活動とWebアプリケーション開発を行う毎日。パッケージベンダーでのSaaS立上げ・製造業の情報システム部門で企画やPM・受託開発と従事してきたため、ベンダーサイドとユーザサイド の両方の視点を持ち合わせる。

石田 健亮

石田 健亮

株式会社ドリーム・アーツで小売事業者向けSaaS「Shopらん」を企画、開発。メインの仕事はプログラマーだがサーバー管理や営業もこなすユーティリティプレイヤー。最近好きな事はパフォーマンスチューニング。特に並列化プログラミングがマイブーム。キライなことはデータセンターでの作業。騒音と乾燥が弱点。ニフティクラウドでデータセンターに行く必要が無くなったことが本当の利点だ と思っている。

五月女 雄一

五月女 雄一

ニフティでは「インフラを守る簡単な様で奥が深いお仕事」をしています。 夢はインフラの気持ちが読めるエンジニアになること。

わたなべ かずひろ

わたなべ かずひろ

専門学校卒業後、ソフトウェア開発会社で電力系統制御システムの開発に従事。その後、CD-ROM等マルチメディア系PCソフトの開発を経て、1998年フリーランスに。 2000年8月に株式会社イーツーの設立に参画。携帯を含む様々なWeb系のシステム開発に携わる。現在はiPhone/Androidアプリなどの開発も手がけている。

市角

市角

ニフティクラウドのコントロールパネル設計・開発をメインに、たまにインフラの運用やお手伝いもやっていたりします。コントロールパネルや新機能の活用方法、アイデアなどを中心に書いていく予定です。

仲山 昌宏

仲山 昌宏

歌って踊れるインフラエンジニア兼、PHPもRubyもJavaも書くPerl使い。 物理サーバの運用に飽きて、フルラックに格安サーバ詰めて自宅プライベートクラウドを構築中。 今年は個人的には分散処理を攻めていきます。

猪飼 賢広

猪飼 賢広

1984年、愛知県名古屋市生まれ。大学は福島県にある某大学。2008年ニフティに入社。 開発系部署に配属後、主に各種テーマサイト開発のシステム面調整、開発進行管理役などとして参加。 現在もPC・ガラケーサイトの開発まわりを担当。インフラまわりを触る案件にも携わっており、日々修行中。 好きな芸人はなかやまきんに君とレイザーラモンRG。

久江 裕之

久江 裕之

ニフティクラウドのインフラ運用、OS提供の仕事をしています。 新しいOSやイメージが出る時にこのブログでご紹介いたします。入社5年目。一流のインフラエンジニアを目指して日々勉強中。

竹内 豪

竹内 豪

ニフティクラウド エンジニア

山口

山口

ニフティクラウドの基盤設計、新サービス/アライアンス/インフラ企画、その他雑用全般を担当しています。 クラウドに欲しい機能や、こんなふうに使ってほしいという想いが共有できれば良いですね。

芳中 隆幸

芳中 隆幸

ニフティクラウドの開発、運用を担当しています。

酒井 浩平

酒井 浩平

ニフティクラウドの中にいます。 ネットワークまわりの運用・開発や自動化などに取り組んでいます。 すべてのエンジニアを幸せにすることを目指しています。

higebu

higebu

ニフティクラウド IaaSのエンジニアです。 ネットワーク、DRサービス with VMware vCloud® Air™ Technology辺りの担当をしています。

武田

武田

ニフティクラウドの開発・運用を担当しています。 各種機能の内容についてなどで執筆させていただく予定です。

森藤 大地

森藤 大地

データに関する仕事が好きです。

宮原徹

宮原徹

日本仮想化技術株式会社 代表取締役社長兼CEO。仮想化技術に関するコンサルタントとして長年活動しており、特にベンチマークテストによる性能評価を得意としている。

荒谷翔

荒谷翔

株式会社はてなでMackerelのセールスデベロッパーとして勤務しています

東條 望

東條 望

2014年にニフティへ中途入社。 入社後から現在まで、ニフティクラウドのサービス企画・開発を担当しています。 各サービスの紹介を執筆させていただく予定です。