ピロローグ

主に技術ネタについて書いてみる

VNet Integrationを利用してWeb apps とAzure Databaseを接続してみる

現在Web apps - Azure Database間はAzureのデータセンターネットワークを通じ接続する仕様となっているかと思いますが、先日プレビューで公開された New App Service VNet Integration feature を利用してVNet、サービスエンドポイント経由で接続できるかやってみました。
イメージ的には以下の通りです。

f:id:pir0:20190129102947p:plain
イメージ

準備

まずは各リソースを用意します。

f:id:pir0:20190128125601p:plain
リソース一覧
Web apps(App Service)はWin版をS1で設定。Azure DatabaseはMySQL版を汎用プランで設定しました。

VNetはサブネットをWeb appsのみ用意します。 Azure Databaseとサービスエンドポイント経由で接続するため、サービスの設定をお忘れなく。

f:id:pir0:20190128152405p:plain
サブネット詳細

VNet統合設定

VNetの追加(プレビュー)からVNet, サブネットをそれぞれ選択し、設定します。

f:id:pir0:20190128131017p:plain
VNet統合

完了後はこちら。

f:id:pir0:20190128131209p:plain
VNet統合設定完了

Azure Database VNet追加

続いてAzure DatabaseのVNetルールに先程のサブネットを追加します。

f:id:pir0:20190128151012p:plain
VNetルール追加

ファイアウォール規則も追加してみました。

f:id:pir0:20190128151300p:plain
VNetルール追加後
SSLは簡略化のためオフにしてますが、要件に合わせて設定ください。  

接続確認

以下テストスクリプトを用意し、Webappsの公開ディレクトリ(wwwroot)直下に配置します。  

<?php

// データベース接続チェック
// 接続情報は予め仕込んだアプリケーション設定から取得しております。
$dbc = mysqli_connect(getenv('CUSTOMCONNSTR_db_host'), getenv('CUSTOMCONNSTR_db_user'), getenv('CUSTOMCONNSTR_db_password'), getenv('CUSTOMCONNSTR_db_name'));
//echo ($dbc);
if (!$dbc) {
die('db connection failed \n'.mysql_error());
}
echo('DB connect success!! <br>');

// userテーブルからユーザ名を取得する
$sql = "select user from user;";
if ($result = $dbc->query($sql)) {

while ($row = $result->fetch_assoc()) {
echo $row["user"]. "<br>";
}
// 結果セットを閉じる
$result->close();
}

if (mysql_close($dbc)){
echo 'disconnect success!! \n';
}
?>

  ブラウザでアクセスしてみます。

f:id:pir0:20190128151952p:plain
ブラウザ表示結果
ユーザ一覧が取得できてますね。

ちなみに外部からアクセスできないか確認してみます。

$ mysql -h vnetintegrationtest.mysql.database.azure.com -u vnetintegration@vnetintegrationtest -p
Enter password:
ERROR 9000 (HY000): Client with IP address 'x.x.x.x' is not allowed to connect to this MySQL server.

もちろんですが、できないですね。

2019/1/28時点でまだプレビュー段階ですが、GAが待ち遠しいです。 Webapps - Azure Database間をよりセキュアに接続したい要件などありましたら検討してみてはいかがでしょうか。