Azure×EC-CUBEでお手軽ネットショップ構築

第7回[開発合宿]Azure+EC-CUBEでマルチサイト構成を組んでみた

はじめまして。株式会社クロスキューブの佐々木です。concrete5 JapanのCTOを務めておりまして、普段はEC-CUBEとconcrete5を組み合わせたECサイトの制作なども行っています。今回は、Microsoft AzureでEC-CUBEを使ってみようという開発合宿に参加させて頂きました。

今回取り組んだ内容

合宿で何をするか、アイデアソンから始まったのですが、色々悩んだ結果、せっかくクラウド環境を使うので、クラウドっぽい何かをしてみようと思い、Microsoft Azure上のVMからAzure上にEC-CUBEをたくさん作るマルチサイト環境を作ることにしました。

実際にEC-CUBEの案件のお話しをいただく際に「ショッピングモールを作りたい」というお問合せは多く、⁠簡単にマルチショップとしてモールっぽいものを作るにはたくさんEC-CUBEをインストールしちゃうのが楽ですよー」というお話しをよくしていました。

そういった簡易的なショッピングモールのような構成のECサイトを構築したい場合に、今回のような組み合わせであれば楽に店舗を増やせる環境が作れると思いました。

当初はPaaSからPaaSを作れるようにしようと思ったのですが、認証の問題でPaaS(Azureでは「Webサイト」と言うそうです)では、AzureのAPIを直接使うことができませんでした。

そこでPaaSを増やしたり立ち上げたりする管理側はIaaSで単純なLAMP構成のサーバを作り、その上にconcrete5を管理画面として置いて、その上でAzureのAPIを呼び出してEC-CUBEのPaaSを増やしたり立ち上げたりする構成にしました。

画像
  • 管理サーバからAzureのAPIを叩いてPaaSを作ります。
  • 管理サーバが持っているgitのリポジトリからEC-CUBEのコードをPaaSに展開します。
  • 管理サーバ上のMySQLに新しいDBを作って、PaaS用にEC-CUBEのdumpデータを流し込みます。

開発の舞台裏

まずAPIを叩いてみよう!叩けない!(認証の壁)

PHPのSDKは最新の機能に追従していないらしく、動作が怪しかったのでcurlのライブラリなどを使って、RESTのAPIを叩こうと思っていました。

まずはMacOSからHTTPでRESTのAPIを呼び出すことを考えました。Azureのドキュメントを読むと、RESTのAPI自体は素直にできている感じです。ただし、SSLのユーザ認証が最初のトラップでした。

AzureではAPIの認証すべてでこの証明書を使います。

  • 「どこの認証局の?」
  • 「勝手証明書でいいの?」

などなど、初めて見たこの証明書でとても苦労しました。

Microsoftの佐藤さんに色々聞いて、AzureのWebサイトにログインした状態で https://manage.windowsazure.com/publishsettings/index?client=xplat にアクセスすると、Base64でエンコードされた証明書情報を含むアカウントファイルがダウンロードできることがわかりました。

これをテキストエディタで開いて、証明書部分を抜き出し、Base64でデコードしたものをpublicAndprivate.pfxとかの名前で保存し、

openssh pkcs12 -in publicAndprivate.pfx -nocerts -out privateKey.pem

と実行するとようやくpem形式の証明書が作れます(詳細はこちらをご覧ください⁠⁠。

ためしにブラウザでこの証明書でRESTのAPIを叩いてみようと思ったのですが、なぜかこの証明書を指定することができずに認証を突破できませんでした。

この時点で1日目はほぼ終了しており、ここからRESTのAPIを叩いてパースしてというインターフェイスを書くのは時間的に厳しい状況です。もうRESTのAPIを叩くのは諦めて、Microsoftが提供しているLinuxでも動くコマンドラインツールを使うことにしました。

PaaSでAPIを叩けない!

冒頭でも書きましたが、当初はミドルウェアの面倒を見なくて良いメリットがあるので、PaaSからAPIを叩こうとしていました。しかし、APIの認証の問題でRESTのAPIを叩くのは諦めていたので、コマンドラインツールのコマンドを叩かないといけません。

試しにPaaS上のPHPで

exec("dir",$res);

と実行してみましたが、やはりコマンドを実行する系のexec()やshell_exec()、system()は許可されていませんでした。今回は詰みました。現状ではAzureのPaaSからAPIを叩くのは至難の道です。

仕方無く方向転換です。AzureのIaaSでUbuntuのLAMP環境を作り、そこでAPIを叩いたりの管理系の処理をすることにしました。

感想~コマンドラインツールが優秀

Azureのコマンドラインツールはnode.jsでできています。これがとても使いやすかったです。ヘルプもかなり充実して実装されており、少しわからなくてもソースコードがjsなので、読めば細かい点までわかります。しかもコードも結構読みやすくて助かりました。

AzureのコマンドラインツールはLinux系のOSであれば、node.jsをインストールした後に

npm install -g azure-cli

と実行すればインストールされます。

その後に先ほどのURLから落としてきた自分の証明書ファイルを

azure account import credentials.publishsettings

とかすると証明書もインポートされてすぐAPIを叩ける様になります。

azure --help

と叩くとヘルプが見れるので、後はこれを見ながら叩くコマンドを覚えます。

できあがったもの

管理画面:http://multiecadmin.cloudapp.net/

管理画面:http://multiecadmin.cloudapp.net/

当初は、SDKでAPIを叩いて~と気軽に考えていたのですが、最終的にはいつものLinuxでWebサイト(PHP)からごりごりコマンドを叩くという、とても野性的な仕様の物になってしまいました。

管理画面は慣れているconcrete5で作りました。

とても危険なことをやっているので、管理画面へのアクセスはCMSの管理機能に任せます。サブドメインとリージョンを指定して「作成!」ボタンをクリックするとPaaSが作成され、DBのdumpが流れてDBができあががり、PaaSのGitリポジトリにEC-CUBEのコードをpushしてデプロイされます(このGit連携の部分は時間の都合で間に合いませんでしたが簡単そうです⁠⁠。

画像

このようにきちんとAzureの管理画面でも指定したPaaSができ上がっている事が確認できます。

まとめ

通常、Azureの管理画面からPaaS(Webサイト)を作るとMySQLのクラウドサービスであるClearDBが一緒に作れるのですが、コマンドラインからはそれができないとのことで、管理サーバのIaaSにMySQLを立ち上げて、そこに全てのPaaSが繋げに来る様にしました。 副作用で管理サーバ側で売上の集計をしたりとかもしやすくなりました。

今回は限られた時間の中で手探りで色々触ってみましたが、コマンドラインツールが優秀なので、これを使ってさまざまなことができそうです。Azureの管理画面をクライアントに公開したくないときに、APIをラッパしたものを作るのも結構簡単だなと思いました。

何よりMicrosoft Azureは、WindowsやWindowsアプリと相性が良いので、Windows関連のアプリと連携するようなBtoBサービスではなかなか便利なのではないでしょうか?

おすすめ記事

記事・ニュース一覧