Azure SDK for PHPでwebsiteからblob一覧を参照してみた

## 概要
Azureでwebsiteとblobを連携させたかった。ググると[How to use blob storage (PHP) | Microsoft Azure](http://azure.microsoft.com/ja-jp/documentation/articles/storage-php-how-to-use-blobs/)とか見つかるけど、リンク切れてたりちょっと日本語がわからなかくて地味にハマったのでめも。

website作って、ftpでコンテンツあげて、storage作って、explorerで確認して、sdk準備して、websiteからblob呼べるようになる、な一連の流れについて記載します。公式説明のサンプルコード準拠で動くためにいろいろ設定しているため、必要に応じて適宜必要なところは変えていただければと。 
なおhogeとか書いてあるURLは実際には見れないです。自分が実際に作った場合の値を置き換えてください。

## 1.websiteを作る
念のため、websiteというのはPaasでアプリをアップロードすればすぐwebアプリが使えるね!なものです。

[新規サイトが素早く立ち上げられるWindows Azure Webサイト － ＠IT](http://www.atmarkit.co.jp/fdotnet/special/introazwebsite_01/introazwebsite_01_01.html)とか参照ですが、azureでアカウントすでに作ってて、「ポータル」と言ってどこか分かるならポチポチしてればできるかと。

[ポータル]→[新規]→[コンピューティング]→[WEBSITE]→[簡易作成]ででURL入力して作成ですね。 http://hoge.azurewebsites.net/ みたいなのを作ると以下なhello worldページが表示されるはずです。

![helloworld.png](https://qiita-image-store.s3.amazonaws.com/0/26677/f6248e2c-ba63-4f28-5132-6e6ed419f26e.png)

## 2.ftpでwebsiteにコンテンツをアップロード

まず手元にfilezillaとかある前提で進めます。

ユーザ名とパスワードは、作ったwebsitesのダッシュボードの右側から[発行プロファイルのダウンロード]からtxtをDLして中身のuserNameとuserPWDがそうです。(web deploy用とftp用2つあるので後ろの方)

ホスト名は同じページ右側さらに下の[FTPホスト名]の ftp://hoge-hoge-hoge.ftp.azurewebsites.windows.net みたいなやつです。

なお、対象websiteの[構成]タブでphpやtomcatのミドルウェアが有効化とドキュメントルート設定が記載させています。 デフォルトはだいたい/が/site/wwwrootとかなのでそこに以下phpinfo.phpとか置いて、 http://hoge.azurewebsites.net/phpinfo.php にアクセスするといつものアレが見れます。

```php:phpinfo.php
<?php
	phpinfo(); 
?>
```


ftpクライアント側からはだいたいこんな感じですね。

![ftp.png](https://qiita-image-store.s3.amazonaws.com/0/26677/a5da98cb-3c90-a2fb-6267-71aceca48710.png)


## 3．blobを作る
念のため、blobというのはちょっとしたサイズのデータを入れるのにいい感じのストレージです。 ここでは画像をブロックblobとしてためてます。
アカウント(DB名)→コンテナ(ディレクトリ)→blob(データ実体)みたいな感じになっててrest apiとかで叩け、1つのストレージアカウントでblob、テーブル、キューの3つのサービスが紐付いてきます。

長文説明でしたら[第2回 Windows Azureを簡単ファイルサーバーに！？ | Think IT（シンクイット）](http://thinkit.co.jp/story/2012/03/27/3493)
とか[ストレージ サービス | Windows Azure のテクニカル ドキュメント ライブラリ](http://msdn.microsoft.com/ja-jp/library/azure/gg433040.aspx)以下を参照です。

作り方は[レッスン 1: Windows Azure ストレージ オブジェクトの作成](http://msdn.microsoft.com/ja-jp/library/jj720557.aspx)とか参照です。
ここも[ポータル]→[新規]→[データベース]→[ストレージ]→[簡易作成]な感じでポチポチしてれば出来るかと思います。

すると https://hoge.blob.core.windows.net/ なURLが割り振れます。

## 4．azure storage explorerでblobにアクセス

とはいえblob叩くものをrest apiごりごり最初からするのはつらいです。そこでexplorerなGUIアプリがありますのでちょっと中身をみてみましょう。
[Azure Storage Explorer - Home](https://azurestorageexplorer.codeplex.com/)からアプリをDLしてインストールしてみます。

で、ポータルの対象ストレージから画面下の[アクセスキーの管理]から[ストレージアカウント名]と[プライマリ アクセス キー]をstorage explorerの[Add Account]押して出てきたところに入力するとつながります。

![explorer.png](https://qiita-image-store.s3.amazonaws.com/0/26677/a65f7ef8-d19c-3690-eeb9-c66ccc43c297.png)

上記はimageというコンテナを作って、h1.pngとh2.pngをアップロードした状態です。
GUI見れば分かる通り、追加削除参照したりできて、あと一覧をcsvで出力とかもできるそうです。

ちなみにここでアップロードしたものはパブリックでコンテナを作成していればURLを叩けばすぐにアクセスできます。

explorerの対象ファイルを選択して[View]の[Uri]のとこをブラウザで開く感じですね。
http://hoge.blob.core.windows.net/image/h1.png でそれっぽいものが見えるはずです。

## 5.Azure SDK for PHPの準備

ココらへんが地味に[How to use blob storage (PHP) | Microsoft Azure](http://azure.microsoft.com/ja-jp/documentation/articles/storage-php-how-to-use-blobs/)を読んでるだけだとハマりましたというか単純に普段php書かないのがたたっただけかもですが...

下準備としては[Azure SDK for PHP をダウンロードする](http://azure.microsoft.com/ja-jp/documentation/articles/php-download-sdk/)を参照しながらやるとよく、ここではcomposerでsdkを入れてます。

なおここでは私の環境は作業してるのはwindows PC、sdk用のphpとか準備するのはawsだったりするのでご注意を。

```bash
### 適当なプロジェクト用のディレクトリを掘る
$ mkdir azure-php
$ cd azure-php/

### composerの設定
$ vi composer.json
> {
>     "require": {
>         "microsoft/windowsazure": "*"
>     },
>     "repositories": [
>         {
>             "type": "pear",
>             "url": "http://pear.php.net"
>         }
>     ],
>     "minimum-stability": "dev"
> }

### composerインストール
$ wget http://getcomposer.org/composer.phar
$ php composer.phar install

### vendorができてる! 

```

あとはvendorをwebsiteの/site/wwwroot以下にftpでアップロードすれば終わりです。
ちなみにここに置いてるのは後述の公式ソースコードが require_once 'vendor\autoload.php';とかしてるためですのでご随意に変更ください。

## 6. blob一覧を出力するphpコード
sdkの準備ができたのでようやくwebアプリ部分が作れます。 ものは[How to use blob storage (PHP) | Microsoft Azure](http://azure.microsoft.com/ja-jp/documentation/articles/storage-php-how-to-use-blobs/)のサンプルほぼそのままなので以下変更してます。

* 最初と最後を<?phpと?>で囲む
* $connectionStringをコード内で宣言(これが一番ハマりました...)
* コンテナ名を指定
* getUrlの行の下にimgタグ追加(見栄えのため)

ものとしては以下になります。

```php:blob.php
<?php
require_once 'vendor\autoload.php';

use WindowsAzure\Common\ServicesBuilder;
use WindowsAzure\Common\ServiceException;

// Create blob REST proxy.
$connectionString = "DefaultEndpointsProtocol=http;AccountName=[Your storage account];AccountKey=[Your storage key]";
$blobRestProxy = ServicesBuilder::getInstance()->createBlobService($connectionString);


try {
    // List blobs.
    $blob_list = $blobRestProxy->listBlobs("image");
    $blobs = $blob_list->getBlobs();

    foreach($blobs as $blob)
    {
        echo $blob->getName().": ".$blob->getUrl()."<br />";
        echo "<img src='".$blob->getUrl()."'><br />";
    }
}
catch(ServiceException $e){
    // Handle exception based on error codes and messages.
    // Error codes and messages are here: 
    // http://msdn.microsoft.com/en-us/library/windowsazure/dd179439.aspx
    $code = $e->getCode();
    $error_message = $e->getMessage();
    echo $code.": ".$error_message."<br />";
}
?>
```

これをftpでまたドキュメントルートにアップロードすれば、 http://hoge.azurewebsites.net/blob.php をブラウザで見ると以下な感じでblobの一覧とその画像を表示できます。

実際ブラウザから表示されるのはこんな感じ。

![blob-php.png](https://qiita-image-store.s3.amazonaws.com/0/26677/f08140b3-3971-2066-ddfb-84d2b78102df.png)

やったぜ!

## 所感

Iaasは結構触ったことあったのですが、azureといいますかPaasとかパブリックストレージはあんま触ったことなく、いろいろ勉強になりました。

一番ハマったconnectionStringは上記公式説明で「Azure のストレージ接続文字列の設定」のところにいろいろ触れられていますが、実はポータルのwebsiteのとこにも「リンク済リソース」とか「構成」の中に「接続文字列」とかあって最初こっちに設定するのかと思ってたのですがなんか違ったですね...
そしてサンプルコードに「$connectionStringは自分で定義しろよ」的なのもうちょっと書いて欲しかったなというかいろいろ理解が足りてなくていけない。

きっとクラウドデザインパターン的なのをお勉強して、パブリッククラウドにそのまま載せられるようにシステムを組めば、それはそのまま程よく抽象化されていい感じのものができる思うのでいろいろ使って行きたいなと思います。

以上。