2017年7月29日土曜日

AzureのMySQLへEC-CUBEから接続

SYSTEM_KDです。
 
Nexus5Xが再起動ループに陥ったあたりからずっとブログを更新していなかったのですが、久々の投稿です。
 
Azuren にある開発者のための管理されたMySQLデーターベース(Azure Database for MySQL)にEC-CUBE3 から接続する方法になります。
 
 

まずはMySQLを用意する

 
ということで、早速。
まずは、Azure 環境に MySQL を用意します。
Azure のコンソールに入ったら、メニューの一番下にある「More services >」を選択します。
 
 
すると、サービスの一覧が表示されますので、検索ボックスに「mysql」と入力します。
mysql という文言で、絞込検索が行われるので、「MySQLサーバー向けの・・・」を選択します。
 
 
 
選択すると、MySQL サーバー向けの Azure データーベース 画面が表示されますので、「+追加」をクリックして MySQL サーバーを作成します。
 
 
 
 
下記の情報を入力または選択して、作成ボタンにて作成します。
・サーバー名
・リソースグループ
・サーバー管理者ログイン名
・パスワード
・パスワードの確認
・場所
・バージョン
・価格レベル
 
気をつける部分としましては、「バージョン」と「価格レベル」になるかと思います。
 
バージョンは、デフォルトで 5.7 が選択されていますが、色々と難しいので 5.6 を選択するのが無難かと思います。
(※完全に個人的意見です)
 
価格レベルは、Basic がデフォルとで選択されている(というか、プレビュー版なのでBasicしか選択できない)のですが、コンピューティングユニットが 100 の全力設定になっているので、ミニマムの 50 に変更を行います。
(※価格的な問題です)
 
その他は、思いのままで大丈夫かと思います ^^;
 
 
 

EC-CUBEから接続(のための準備)

 
それでは、EC-CUBEから接続・・・と言いたいところですが、事前準備を行っておきます。
 
Azure のコンソールにて、作成した MySQL サーバーを選択します。
 
メニューが表示されたら、「接続のセキュリティ」をクリックします。
 
 
 
 
SSL規則とファイヤーウォール規則の設定が表示されますので、ひとまず「SSL接続を矯正する」を「無効」にします。
 
次に、自分のIPからの接続を許可するように、「自分のIPを追加」をクリックします。
ファイヤーウォール規則の部分へ自動で設定が挿入されますので、画面上部の「保存」ボタンをクリックします。
 
※ローカル開発環境からの接続を想定しておりますが、EC-CUBEが別の場所にある場合は、その場所のグローバルIPアドレスを設定します。
 
 
 
 
ここまで設定ができたら、MySQL用のクライアントソフトを利用して、作成した MySQL サーバーに接続が行えるようになっているかと思います。
 
接続を行って、ついでに新規でDBを作成しておきます。
 
ちなみに、接続情報は先程のメニューの「接続文字列」の情報を確認するか、「概要」部分に記載されている、サーバー名(ホスト名)・サーバー管理者ログイン名(ユーザー名)・指定したパスワードになります。
 
 
 

EC-CUBEから接続

 
設定ができましたので、今度こそ EC-CUBE から接続を行います。
 
といっても、普通にEC-CUBEをインストールするだけです。
 
接続情報は先程クライアントソフトで利用したものと同じです。
(データーベースも先程作成したものを指定すればOKです)
 
※インストールには結構な時間がかかりますので気長に待ちましょう!!
(クライアントソフトで接続して、マイグレーションテーブルがどこまで進んでいるか更新ボタンを連打しながら待ちました(笑))
 
 
実際、EC-CUBE側の画面は真っ白になると思いますので、マイグレーションがどこまで進んでいるかでみるのが良い気がします。
具体的には、「doctrine_migration_versions」テーブルの中身を確認します。
 
バージョン 3.0.15 ですと、20170225120000 のデータが登録されたらOKとなります。
 
ちなみに私の環境では、「dtb_base_info」が空のまま&config.yml にインストール完了が更新されない状態になってしまったので、それぞれ下記の方法にて対応しました ^^;
 
dtb_base_info は手動でレコード追加
config.yml  はいったん設定ファイルを削除して、データーベースを初期化しないチェックを入れて再度インストール
 
 
完了後、トップページにアクセスして表示できれば接続OKです!
 
 
 
 
はい。接続できました。と、言いたいところですが本番はここからです(笑)
 
現在、MySQL サーバーに接続する際に、SSLの規則でSSLでの接続強制を無効化しておりますが、セキュリティ的には有効(強制)のが良いですよね。ということでSSLで接続をおこないたいと思います。
 
ということで、Azureのコンソールにて、SSL強制を無効にした部分を「有効」に戻しておきます。
 
 
 

EC-CUBEから接続(SSL強制で接続)

 
SSLで接続を行うには、こちらのページを参考に、証明書を用意します。
 
指示通り実行して、pem ファイルが用意できたら、そのファイルをEC-CUBEに配置します。
 
特にここに配置するというのは無いのですが、config.yml と同じ場所、 app/config/eccube/ に配置しました。
 
次に database.yml の変更を行います
( app/config/eccube/ にあります)
 
 
どう変更するかというと、、・・・どう変更するのだろう・・・^^;
 
 
 ということで、調べてみるとオプション値としてpem ファイルを追加してやると良いということでした。
 
defaultTableOptions に設定を追加します。
 
  
    driverOptions:
1012 : ‘/var/www/app/config/eccube/MyServerCACert.pem'
※pem ファイルへのパスは読み替えて下さい。
 
 
設定を変更したので、ページを表示。

 

An exception occured in driver: SQLSTATE[HY000] [2001] SSL connection is required. Please specify SSL options and retry.

 
エラーが出ました。。
 
何かが違うようです。
 
再度調べてみると、PHPバージョンによって違うとかなんとか、、
 
私の環境(PHP7.0) では、こっちが正解
 
    driverOptions:
1009 : ‘/var/www/app/config/eccube/MyServerCACert.pem'
 
 
というのも、この 1009 は定数(PDO::MYSQL_ATTR_SSL_CA)から持ってくるのが正しいようです。
 
では、TOPページを表示。
 
 
 

PDO::__construct(): Peer certificate CN=

 
はい。エラーが出ました ^^;
 
 
さらに調べてみると、sqlmode の指定によって動作が違うから・・と本家に書いてあるようで、、
 
現在、サービスへの mysql.exe 接続で "--ssl-mode=VERIFY_IDENTITY" オプションを使用した場合に、接続が次のエラーで失敗するという既知の問題が確認されています。ERROR 2026 (HY000): SSL connection error: SSL certificate validation failure Downgrade to "--ssl-mode=VERIFY_CA" or lesser SSL modes (エラー 2026 (HY000): SSL 接続エラー: SSL 証明書の検証エラー "--ssl-mode=VERIFY_CA" または以前の SSL モードにダウングレードしてください)。 "--ssl-mode=VERIFY_IDENTITY" を使用する必要がある場合は、この問題が解決するまで、リージョン サーバー名を使用してください。 サーバー名 (westeurope1-a.control.database.windows.net など) を ping してリージョン サーバーを確認し、確認したリージョン サーバー名を接続で使用してください。 この制限は、今後削除する予定です。
 
 
ということで、その支持に従って、
 
ping xxx..mysql.database.azure.com
 
を実行して、でてきたリージョンサーバーのドメインを、database.yml の host に設定します。
 
ようやくSSL強制にて接続できました。
 
 
 
 
 
 

まとめ

 
始めは簡単だと思っていたのですが、ひっかかりまくってしまいました ^^;
 
(そんなこともあって、記事のターゲットが謎な状態に・・・)
 
 
今回は、database.yml に設定を記述しましたが、database.php を作成してそれを読み込むようにした方が良さそうです。
(EC-CUBE3 は php ファイルがあるとそちらを先に読み込んでくれるので)
 
 
<php

$database = array(
'driver' => 'pdo_mysql',
'host' => 'pingで確認したホスト名',
'dbname' => 'データーベース名',
'port' => '',
'user' => 'ユーザー名',
'password' => 'パスワード',
'charset' => 'utf8',
'defaultTableOptions' => array('collate' => 'utf8_general_ci'),
'driverOptions' => array(PDO::MYSQL_ATTR_SSL_CA => 'pemファイル')
);

return array('database' => $database);
 
こんな感じ、database.php を作成して同じ場所へ配置してやれば行けるんじゃないかと思います。
(疲れたので、未確認です ^^;
 
 
 
以上、AzureのMySQLへEC-CUBEから接続でした
 

0 件のコメント:

コメントを投稿