vagrantからPDOでazure mysqlにssl接続する

以下のURLから証明書を取得し、BaltimoreCyberTrustRoot.crt.pemで、vagrantに保存する。
https://www.digicert.com/CACerts/BaltimoreCyberTrustRoot.crt.pem

azure mysqlのadminで接続のセキュリティがSSLを強制する、となっているか確認する。

optionで、PDO::MYSQL_ATTR_SSL_CA => ‘BaltimoreCyberTrustRoot.crt.pem’ と書きます。

$dsn = "mysql:dbname=sier;host=namysql.database.windows.net";
$user = "hoge";
$password = "hogehoge";
$options = array(
  PDO::MYSQL_ATTR_SSL_CA => 'BaltimoreCyberTrustRoot.crt.pem' 
);
try {
    $dbh = new PDO($dsn, $user, $password, $options);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
} 

$sql = "select * from forein";
// $sql = "show status like 'ssl_cipher'";
$stmt = $dbh->query($sql);
 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r('<pre>');
var_dump($result);
print_r('</pre>');

$sql = “show status like ‘ssl_cipher'”;と書くと、ssl通信の場合、[“Value”]=>string(10) “AES256-SHA” で返ってきます。

> .pemは、Base64で符号化された証明書です。.pem SSL サーバ証明書(連結SSLサーバ証明書)では複数のサーバ証明書を1ファイルに連結させることができ、SSLサーバ証明書のインストール用によく使われます。

いいね~
しかし、azure始めた途端、参照するブログ書いている方のレベルが高くなった気が。。。

では、続いてgit commit/pushしましょう。

auzreのmysqlからPDOでデータをselectする

$dsn = "mysql:dbname=sier;host=namysql.database.windows.net";
$user = "hoge@namysql";
$password = "hogehoge";
try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e){
    print('connection failed:'.$e->getMessage());
} 

$sql = "select * from forein";
$stmt = $dbh->query($sql);
 
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
print_r('<pre>');
var_dump($result);
print_r('</pre>');

ぎゃーーー!

って別に驚くことではないが。。

azure mysqlにデータを入れていく

vagrantから普通にtableを作って、データを入れていきます。

mysql -u adminuser@namysql -h namysql.database.windows.net -P 3306 -p

create database sier;

create table sier.forein(
	id int unsigned auto_increment primary key,
	company varchar(255),
	address varchar(255),
	station varchar(255),
	url varchar(2083),
	menu varchar(255)
);


INSERT INTO sier.forein(company, address, station, url, menu)
  VALUES ('Microsoft','〒108-0075 東京都港区港南 2-16-3 品川グランドセントラルタワー','品川','https://www.microsoft.com/ja-jp','office, windows, surface, xbox, お買い得商品,サポート');
INSERT INTO sier.forein(company, address, station, url, menu)
  VALUES ('Oracle','〒107-0061 東京都港区北青山2-5-8 オラクル青山センター','外苑前','https://www.oracle.com/jp/index.html','Cloud, イベント, whats new お客様成功事例');
INSERT INTO sier.forein(company, address, station, url, menu)
  VALUES ('Accenture','〒107-8672 東京都港区赤坂1-11-44 赤坂インターシティ','溜池山王','https://www.accenture.com/jp-ja/new-applied-now','トレンド,サービス,業界,採用情報,会社情報');
INSERT INTO sier.forein(company, address, station, url, menu)
  VALUES ('Cisco','〒107‐6227 東京都港区赤坂9丁目7−1 ミッドタウン・タワー','六本木','https://www.cisco.com/c/ja_jp/index.html','製品&サービス,サポート,購入案内,トレーニング&イベント,パートナー');

なにーー!文字化けしている。。。あれ、azureのmysqlってUTF-8じゃないのかしら?

>Japanese_CI_AS などの日本語照合順序での文字 “あ” は、文字コード 0x82A0として表現されますが、上記の例の場合、データベースの照合順序が SQL_Latin1_General_CP1 であるため、”あ” を表現しているつもりの文字コード 0x82A0 は、実際には “あ” ではなく SQL_Latin1_General_CP1 の文字として扱われます。尚、SQL_Latin1_General_CP1 の文字コード 0x82A0 に対応する Unicode 文字が存在しません。その結果、”あ” の変換結果は “?” となり、テーブル列に “?” が格納されることになります。

なるほど、対応するunicode文字がないようですね。

一旦テーブルを削除します。
mysql> drop table sier.forein;
Query OK, 0 rows affected (0.40 sec)

nvarcharで作り直します。

create table sier.forein(
	id int unsigned auto_increment primary key,
	company nvarchar(255),
	address nvarchar(255),
	station nvarchar(255),
	url nvarchar(2083),
	menu nvarchar(255)
);

今度こそ!

よっしゃ!

さー、次はpdoでselectですね!テンションが上がってまいりました!

Laravelからazure mysqlに接続する

.env.production

APP_ENV=production
APP_DEBUG=true
APP_KEY

DB_CONNECTION=mysql
DB_HOST=namysql.database.windows.net
DB_DATABASE=sampledb
DB_USERNAME=adminuser@namysql
DB_PASSWORD=hoge
MYSQL_SSL=true

vagrant config/database.php
追加

'sslmode' => env('DB_SSLMODE', 'prefer'),
    'options' => (env('MYSQL_SSL')) ? [
        PDO::MYSQL_ATTR_SSL_KEY    => '/ssl/BaltimoreCyberTrustRoot.crt.pem', 
    ] : []

migrateします。あら、いいですね!?

php artisan migrate --env=production --force
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated:  2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated:  2014_10_12_100000_create_password_resets_table
Migrating: 2015_10_27_141258_create_tasks_table
Migrated:  2015_10_27_141258_create_tasks_table

applicationkeyを作成

php artisan key:generate --env=production --force

vagrantでサーバーを起動する。
php artisan serve –env=production –host 0.0.0.0

!?
RuntimeException in Encrypter.php line 43:
The only supported ciphers are AES-128-CBC and AES-256-CBC with the correct key lengths.

うまくいかないので、別の方法を探します。

Azure Mysqlにfirewallを設定して、接続する

ここで、idアドレスを指定します。

az mysql server firewall-rule create --name allIPs --server namysql --resource-group myResourceGroup --start-ip-address 0.0.0.0 --end-ip-address 255.255.255.255

{
  "additionalProperties": {},
  "endIpAddress": "255.255.255.255",
  "id": "/subscriptions/hogehoge/resourceGroups/myResourceGroup/providers/Microsoft.DBforMySQL/servers/namysql/firewallRules/allIPs",
  "name": "allIPs",
  "resourceGroup": "myResourceGroup",
  "startIpAddress": "0.0.0.0",
  "type": "Microsoft.DBforMySQL/servers/firewallRules"
}

vagrantから接続する

[vagrant@localhost ~]$ mysql -u adminuser@namysql -h namysql.database.windows.net -P 3306 -p

Azureにcloud shellでMySQLサーバーを作成する

cloud shellを開き、mysql serverをcreateします。

az mysql server create --name mysql --resource-group myResourceGroup --location "North Europe" --admin-user adminuser --admin-password hogehoge

エラー

az mysql server create: error: the following arguments are required: --sku-name

–sku-name
The name of the sku, typically, tier + family + cores, e.g. B_Gen4_1, GP_Gen5_8.

なに?

クイックスタートをみて、–sku-name GP_Gen4_2 –version 5.7を追加します。

az mysql server create --name mysql --resource-group myResourceGroup --location "North Europe" --admin-user adminuser --admin-password hogehoge --sku-name GP_Gen4_2 --version 5.7

GP_Gen4_2は仮想コア2つのようです。2つもいらないな。と思ったら、こちらにスペック一覧があります。
https://docs.microsoft.com/ja-jp/azure////sql-database/sql-database-vcore-resource-limits

最大データ サイズ (GB) 1024 って記載がありますね。
いつも、mysqlにどれ位のデータサイズが入るのか気になっていましたが、1024Gですか。。
varchar255で1bit、1億レコードで10GBくらいでしょうから、これ相当入りますね。相当凄い!

と思ったら、またエラー

Deployment failed. Correlation ID: xxxx-xxxx. Specified server name is already used.

さすがに、グローバルな名前で–name mysql はなかったですね(笑) ひどい。

やり直します。cloud shellにパスワードが表示されるのはだめですね。
来た!MySQL5.7 これ、どういうことなんだろう?locationが選択できる(今回はnortheurope)ってことは、仮想マシンVMの中にmysqlをインストールしているわけではなくて、指定したlocationにつくっているってこと?VMの中に入れた方がrequest responseの通信距離が短くて効率的な気がするのですが。。よくわからないです。

t@Azure:~$ az mysql server create --name namysql --resource-group myResourceGroup --location "North Europe" --admin-user adminuser --admin-password hogehoge --sku-name GP_Gen4_2 --version 5.7
{
  "additionalProperties": {},
  "administratorLogin": "adminuser",
  "earliestRestoreDate": "2018-04-21T00:34:32.223000+00:00",
  "fullyQualifiedDomainName": "namysql.mysql.database.azure.com",
  "id": "/subscriptions/hoge/resourceGroups/myResourceGroup/providers/Microsoft.DBforMySQL/servers/namysql",
  "location": "northeurope",
  "name": "namysql",
  "resourceGroup": "myResourceGroup",
  "sku": {
    "additionalProperties": {},
    "capacity": 2,
    "family": "Gen4",
    "name": "GP_Gen4_2",
    "size": null,
    "tier": "GeneralPurpose"
  },
  "sslEnforcement": "Enabled",
  "storageProfile": {
    "additionalProperties": {},
    "backupRetentionDays": 7,
    "geoRedundantBackup": "Disabled",
    "storageMb": 5120
  },
  "tags": null,
  "type": "Microsoft.DBforMySQL/servers",
  "userVisibleState": "Ready",
  "version": "5.7"
}

azure mysql tutorial

まず、vagrant mysqlにcreate table

CREATE DATABASE sampledb;

tutorial用のファイル群をgit clone

git clone https://github.com/Azure-Samples/laravel-tasks
cd laravel-tasks
composer install

laravelのルートに.env ファイルをつくる

APP_ENV=local
APP_DEBUG=true
APP_KEY=

DB_CONNECTION=mysql
DB_HOST=localhost
DB_DATABASE=sampledb
DB_USERNAME=root
DB_PASSWORD=hoge

あれ、.envファイルって何でしょう?
.envファイル:.env ファイルを使用して、ユーザーは個人の作業環境変数をカスタマイズすることができる
>envファイルは、アプリケーションのソースコントロールに含めるべきでありません。各ユーザー/サーバは異なった環境設定が必要だからです。さらに、侵入者がソースコントロールリポジトリへアクセスすることが起きれば、機密性の高い情報が漏れてしまうセキュリティリスクになります。

なるほど、gitでpushしないようにってことですね。
migrationします。

[vagrant@localhost laravel-tasks]$ php artisan migrate
Migration table created successfully.
Migrating: 2014_10_12_000000_create_users_table
Migrated: 2014_10_12_000000_create_users_table
Migrating: 2014_10_12_100000_create_password_resets_table
Migrated: 2014_10_12_100000_create_password_resets_table
Migrating: 2015_10_27_141258_create_tasks_table
Migrated: 2015_10_27_141258_create_tasks_table

ほー

php artisan key:generate
php artisan serve


あれ、ipが127.0.0.1になってる。。192.168.33.10:8000にしないといけないのに。

なにーーーー

再度git push

まず、azure用のdirectoryを作成し、git initします。

mkdir azure
cd azure
git init
git add *
git commit -m "initial commit"

azureにpushするファイルを作成します。
index.php

hello world

リモートリポジトリの設定をします。

[vagrant@localhost azure]$ git remote add azure https://hoge@nanalytics.scm.azurewebsites.net/nanalytics.git
[vagrant@localhost azure]$ git push azure master

vagrantでphpサーバーを立てます。

azureにトラッキングコードタグの入ったphpファイルをpushします。

</style>
<body>
    <div class="box"></div>
</body>
<script type="text/javascript">
    var a = [['acount','007'],["ip","<?php echo $_SERVER&#91;'REMOTE_ADDR'&#93;; ?>"]];
    var b =['https://ajax.googleapis.com/ajax/libs/jquery/3.0.0/jquery.min.js', 'http://192.168.33.10:8000/na.js'];
    var i = 0;
    (function appendScript(){
        var script = document.createElement('script');
        script.src = b[i];
        document.body.appendChild(script);
        if(i++ < 2){
            script.onload = appendScript;
        }
    })();
</script>

commit、pushします。

[vagrant@localhost azure]$ git commit -am "second"
[master a1cf4be] second
 1 file changed, 23 insertions(+), 1 deletion(-)
 rewrite index.php (100%)
[vagrant@localhost azure]$ git push azure master

あああああああああああああ
azureからvagrant環境(192.168.33.10:8000)のjsには接続できない。。
しまったーーー 渾身のミス

VPSにmongoDB入れるか?
でもazureでのdb接続の方が先ですね。

azureにgit push

[vagrant@localhost php-docs-hello-world]$ git remote add azure https://name@hpscript.scm.azurewebsites.net/hpscript.git
[vagrant@localhost php-docs-hello-world]$ git push azure master
Password for ‘https://name@hpscript.scm.azurewebsites.net’:
Counting objects: 13, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (13/13), 2.07 KiB | 0 bytes/s, done.
Total 13 (delta 2), reused 0 (delta 0)
remote: Updating branch ‘master’.
remote: Updating submodules.
remote: Preparing deployment for commit id ‘cc39b1e4cb’.
remote: Generating deployment script.
remote: Generating deployment script for Web Site
remote: Generated deployment script files
remote: Running deployment command…
remote: Handling Basic Web Site deployment.
remote: KuduSync.NET from: ‘D:\home\site\repository’ to: ‘D:\home\site\wwwroot’
remote: Deleting file: ‘hostingstart.html’
remote: Copying file: ‘.gitignore’
remote: Copying file: ‘index.php’
remote: Copying file: ‘LICENSE’
remote: Copying file: ‘README.md’
remote: Finished successfully.
remote: Running post deployment command(s)…
remote: Deployment successful.
To https://name@hpscript.scm.azurewebsites.net/hpscript.git
* [new branch] master -> master

なんじゃこりゃー
昇天しそうだ。頭で必死に計算してるけど、追い付かない。

とりあえず優先的な重要事項は
1.今後はVPS・共有サーバーは使わずに、auzreかawsに構築していく
2.azurewebsites.netではなく、独自ドメインの場合の設定方法

1、2共に重要!

ほう

なるほど、では、復讐を兼ねて、vagrant側でphp server, mongoDBに接続して、azure(hoge.azurewebsites.net)にトラッキングコードを入力したhtmlファイルをデプロイ・アクセスして、しっかりトラッキングがviewに反映されるか作ってみたいと思います。