4
6

More than 3 years have passed since last update.

Azuriteでローカル環境構築(Docker + PHP + Azure Storage)

Last updated at Posted at 2020-03-18

目的

Azuriteを利用してDocker + PHP + Azure Storageのローカル環境を構築します。
Dockerによるローカル環境構築を進めてきましたがStorageはAzureプラットフォームのを利用していたので、Azuriteを利用してローカル環境だけで完結させます。

Azuriteとは

Azure Storageのエミュレーター。

ローカルでの Azure Storage の開発とテストに Azurite エミュレーターを使用する (プレビュー)

AzuriteかAzure ストレージ エミュレーターか

Azurite は今後のストレージ エミュレーター プラットフォームです。Azurite は Azure ストレージ エミュレーターよりも優先されます。

ということなので今後もこちらを使っていけば良さそうです。

Azuriteのインストール方法

  1. Azurite Docker イメージをインストールして実行する

今回はDockerを利用するのでこちらを選択します。

Docker環境

Azurite - Docker Hub

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から接続してみる

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作成処理を実行すると・・・

explorer.png

作成されました。

パブリック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がサポートされました。

4
6
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
6