目的
Azuriteを利用してDocker + PHP + Azure Storageのローカル環境を構築します。
Dockerによるローカル環境構築を進めてきましたがStorageはAzureプラットフォームのを利用していたので、Azuriteを利用してローカル環境だけで完結させます。
Azuriteとは
Azure Storageのエミュレーター。
ローカルでの Azure Storage の開発とテストに Azurite エミュレーターを使用する (プレビュー)
AzuriteかAzure ストレージ エミュレーターか
Azurite は今後のストレージ エミュレーター プラットフォームです。Azurite は Azure ストレージ エミュレーターよりも優先されます。
ということなので今後もこちらを使っていけば良さそうです。
Azuriteのインストール方法
- Azurite Docker イメージをインストールして実行する
今回はDockerを利用するのでこちらを選択します。
Docker環境
docker-compose.yml
version: '3'
services:
php:
# 省略
storage:
image: mcr.microsoft.com/azure-storage/azurite
prots:
- "10000:10000"
volumes:
- ./docker/storage/data:./data
PHPのコンテナについては割愛します。
公式のPHPライブラリ を利用してAzure Storageを利用できればAzuriteに関しても問題ないと思ってます。
また、今回はBlobだけを使用するのでTableとQueueについても割愛します。
Azure Storage Explorerから接続してみる
接続ダイアログから「ローカル エミュレーターにアタッチする」を選択してアタッチします。
AzuriteにBlobを作成する
phpでBlobを作成していきます。
<?php
require_once '../vendor/autoload.php';
$connection = '<接続文字列>';
$client = \MicrosoftAzure\Storage\Blob\BlobRestProxy::createBlobService($connection);
$container = 'sample'; // 事前に作成しておく
$blob = 'example.txt';
$content = 'Hello Azurite!';
$client->createBlockBlob($container, $blob, $content);
接続文字列について
$connection = 'UseDevelopmentStorage=true';
基本はこのショートカットでOK。
しかしDocker環境だと事情が異なります。
これで先程の処理を実行しようとすると・・・
cURL error 7: Failed to connect to 127.0.0.1 port 10000
Dockerコンテナ間で接続する場合、これでは不十分のようです。
先程のショートカットを展開した接続文字列からエンドポイントを変更していきます。
BlobEndpoint=http://127.0.0.1:10000/devstoreaccount1
ここのホスト名をコンテナのサービス名に変更します。
BlobEndpoint=http://storage:10000/devstoreaccount1
最終的な接続文字列は次の通りです。
$connection = 'DefaultEndpointsProtocol=http;AccountName=devstoreaccount1;
AccountKey=Eby8vdM02xNOcqFlqUwJPLlmEtlCDXJ1OUzFT50uSRZ6IFsuFq2UVErCz4I6tq/K1SZFPTOtr/KBHBeksoGMGw==;
BlobEndpoint=http://storage:10000/devstoreaccount1;';
AccountName、AccountKeyはエミュレーター固定です。
TableEndpoint、QueueEndpointは割愛します。
これで先程のBlob作成処理を実行すると・・・
作成されました。
パブリックURLが・・・
ひとつ問題が残りました。
// http://storage:10000/devstoreaccount1/sample/example.txt
echo $client->getBlobUrl($container, $blob);
接続文字列でホスト名をコンテナのサービス名にしたのはDockerコンテナ間で接続するためでした。
コンテナ外のブラウザからアクセスする場合は「127.0.0.1」にしなければならないです。
(パブリックアクセスの設定を変更して許可するのも忘れずに)
Docker + Azurite + ブラウザからアクセスするケース(例えばHTMLのaタグ、imgタグ等)はホスト名を書き換えなければいけません。
まとめ
微妙な部分もありましたがローカル環境としては十分だと思ってます。
「ちょっと動かすだけなのに、AzureプラットフォームにStorage
サービスを作成しないといけない」という点は解消できました。
問題等(追記)
使ってるなかで気がついた問題などです。
Append Blob がサポートされていない (2020/05/21更新)
Azurite v3.7.0 でAppend Blobがサポートされました。