CodeZine(コードジン)

特集ページ一覧

Microsoft Azureで使えるデータベースはSQL Serverだけじゃない! フルマネージドなAzure Database for MySQL/PostgreSQL入門

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2018/03/08 14:00

 Microsoft Azure(以下、Azure)が提供するフルマネージドなSQLデータベースは、2017年5月にMySQLとPostgreSQLがパブリックプレビューとして追加されるまで、SQL Serverのみでした。今回はその2つをAzure Portalで作成する方法と、PHPから実際に使う方法をご紹介いたします。

1. Azure Database for MySQL/PostgreSQLとは?

 MySQLとPostgreSQLが追加されたラインナップ拡充の背景として、以前からAzureではClearDBというサードパーティー製のMySQLを提供していましたが、利用者からはMicrosoftが提供するマネージドなMySQLやPostgreSQLを利用したいという要望が数多くあり、それが実現したという結果になります。

 Azureの要望は見える化がされていて、Feedback Forumsでは、執筆時点で2328 vote(投票)もありました。タイトルは「ClearDBを消してネイティブなAzure MySQL互換データベースを作って欲しい」という少し過激な内容が含まれていますが、ClearDBは現在も使用できます。

 投票は誰でもできますし、自分で新たに作成することもできます。気になるものがありましたら、皆さんも投票することでAzureの新機能が実装されるかもしれません。

サービスの特徴

 大きな特徴は、フルマネージドなPaaS型のサービスであることです。Virtual MachineなどのIaaSと異なり、皆さん自身でOSのアップデートやデータベースのセキュリティパッチを適用する必要はありません。

 標準で冗長化されており、もしお使いのデータベースインスタンスで不具合があった場合は自動でフェールオーバーされます。冗長化の恩恵として、ダウンタイムなしのスケールアップ、スケールダウンが可能です。

 データは自動バックアップされており、ポイントインタイムリカバリ(PITR)が最大35日間可能です。

 Azure Database for MySQL/PostgreSQLを使い始めるのに特別なドライバやツールは必要なく、オンプレのMySQLやPostgreSQLと同じように使えます。新たに覚えなければいけないこともありませんし、マイクロソフト製のツールやドライバも不要です。

Virtual Machineとは一味違う、サービスの仕組み

 Azure Database for MySQL/PostgreSQLは単純にVirtual Machine上で動いているのではなく、Service Fabric上で動いています。

 Service Fabricは長年Azureの基幹サービスとして使われており、Azure SQL Databaseも同様にService Fabric上で運用されています。長年蓄積されたAzure SQL Databaseの運用ノウハウをもとにMySQLとPostgreSQLサービスを展開しているので、皆さんはセキュリティやファイル破損などを気にすることなく、安心してサービスを利用できます。

サービスの概念と接続イメージ

 冒頭でAzure Database for MySQL/PostgreSQLは「標準で冗長化されている」と記載しました。皆さんのクライアントから接続するデータベースは「論理データベース」であり、実際のデータベースインスタンスはService Fabricのクラスタ上で動作しています。下図のようなイメージです。

サービスの概念と接続イメージ
サービスの概念と接続イメージ

 このように冗長化されているため、SLAは99.99%で提供されています。2018年3月に一般提供が開始され、SLAが設定されました。

セキュリティの仕組み

 データベースで最も気になるポイントの一つはセキュリティです。Azure Database for MySQL/PostgreSQLは次の3つの層でセキュリティを管理しています。

  1. ID管理
    • MySQL/PostgreSQLネイティブ認証
  2. アクセス管理
    • SSL接続
    • ファイアウォール(IPホワイトリスト方式)
  3. データ保護
    • データベースバックアップ
    • 暗号化(AES 256)

 1点だけ、IPアドレスはパブリックIPとなり、VNET統合はまだサポートされていませんのでご注意ください。パブリックIPというと、通信が不特定多数のインターネット上に流れてしまい、情報漏えいを心配される方がいるかもしれませんが、ほとんどのケースでは安全です。

 例えば、プライベートIPを持つVirtual Machineから、パブリックIPのAzure Database for MySQLに接続した場合の通信は、Microsoftのネットワーク内でルーティングされるので極めて安全であり、高速に動作します。つまり、Azureのサービス同士で使用するならば、皆さんは安心してお使いいただけます。

セキュリティの仕組み
セキュリティの仕組み

その他運用面でのメリット

 フルマネージドならではのメリットが多数あります。

  • 自動的にパッチを適用
  • メトリック監視とアラート機能
  • サーバーログの保存(最大7日分)
  • 最大35日分のポイントインタイムリカバリ可能なバックアップ
  • MySQL/PostgreSQLのコンフィグを編集可能(一部のみ)

 注意点として、パッチ適用時は自動フェールオーバーにより、接続が切断される可能性があります。プログラムでは再接続可能なように設定しておくと良いでしょう。

2. Azure Database for MySQLを使ってみる

 ここからは実際に試してみましょう。

Azure Database for MySQLの新規作成

 Azure Portalにブラウザでアクセスし、「新規」-「Database」-「Azure Database for MySQL (preview)」の順に選択します。

 「サーバー名」「サブスクリプション」「リソースグループ」「サーバー管理者ログイン名」「パスワード」「パスワードの確認」「場所」「バージョン」「価格レベル」を適宜入力していきます。価格レベルは「Standard」の最低スペックにしました。

 「OK」選択で価格レベルを確定して、「作成」を選択すると、早速デプロイが始まります。

 デプロイが終わりました。概要の画面が表示されます。

 表示されている[サーバー名][サーバー管理者ログイン名]と、作成時に入力した[パスワード]は後ほど使用します。[サーバー管理者ログイン名]は一般的なオンプレミス環境と異なり、作成時に入力した文字列に加えて「@」(アットマーク)と[サーバー名]が加わっていますのでご注意ください。

Azure Database for MySQLの接続設定

 ファイアウォールが有効になっており、デフォルトではすべての接続を受け付けてくれません。

 まず「接続のセキュリティ」から「SSL接続を強制する」を「無効」に設定します。本来であれば、「有効」とすべきところですが、お試しに使う場合は設定が複雑になるため、あえて「無効」とします。

 次に「自分のIPを追加」を選択すると、ファイアウォール規則にブラウザを立ち上げているマシンのIPが自動で設定されます。こちらも、開発時に一時的に使用するようにしてください。

 上記の設定を行ったら、「保存」を選択します。

データベースの接続確認

 mysqlコマンドでデータベースに接続できるかを確認します。

mysql -u [サーバー管理者ログイン名] -h [サーバー名] -P 3306 -p
実行結果
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 65455
Server version: 5.6.26.0 MySQL Community Server (GPL)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

 quitで切断します。

実行結果
mysql> quit
Bye 

PHPサンプルスクリプトの実行

 PHPを使用して単純にサーバーのバージョンを表示するスクリプトを実行します。ソースは次のとおりです。

<?php $mysqli = new mysqli("[サーバー名]", "[サーバー管理者ログイン名]", "[パスワード]");
echo $mysqli->server_info;

 こちらのソースをsample-mysql.phpというファイル名で保存し、次のコマンドで実行します。

php sample-mysql.php 

 正常にデータベースに接続できれば、次のような出力結果となります。

5.6.26.0

3. Azure Database for PostrgreSQLを使ってみる

 Azure Database for PostrgreSQLも同様に試してみましょう。データベースの作成まではMySQLと同様になります。

Azure Database for PostrgreSQLの新規作成

 Azure Portalにブラウザでアクセスし、「新規」-「Database」-「Azure Database for PostgreSQL (preview)」の順に選択します。

 「サーバー名」「サブスクリプション」「リソースグループ」「サーバー管理者ログイン名」「パスワード」「パスワードの確認」「場所」「バージョン」「価格レベル」を適宜入力していきます。価格レベルは「Standard」にします。

 「OK」を選択して価格レベルを確定し、「作成」を選択すると、早速デプロイが始まります。

 デプロイが終わりました。概要の画面が表示されます。ここまでMySQLとほとんど同じですね。

 MySQLと同様に[サーバー管理者ログイン名]は一般的なオンプレミス環境と異なり、作成時に入力した文字列に加えて「@」(アットマーク)と[サーバー名]が加わっていますのでご注意ください。

Azure Database for PostgreSQLの接続設定

 MySQLと同じ設定をします。

 「接続のセキュリティ」から「SSL接続を強制する」を「無効」にし、「自分のIPを追加」を選択後、「保存」を選択します。

データベースの接続確認

 psqlコマンドでデータベースに接続できるか確認します。

psql -h [サーバー名] -U [サーバー管理者ログイン名] -d postgres -W
実行結果
psql (10.0, server 9.6.5)
SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES256-SHA384, bits: 256, compression: off)
Type "help" for help.

postgres=> 

 \qで切断します。

実行結果
postgres=> \q

サンプルスクリプトの実行

 MySQLと同様にPHPを使用して単純にサーバーのバージョンを表示するスクリプトを実行します。ソースは次のとおりです。

<?php
$dbconn = pg_connect("host=[サーバー名] dbname=postgres user=[サーバー管理者ログイン名] password=[パスワード]") or die('Could not connect: ' . pg_last_error());
$v = pg_version($dbconn);
echo $v['server'];
pg_close($dbconn);

 phpコマンドで実行した結果は次のような出力となります。

9.6.5

4. Ruby on Railsを試してみる

 Azure Database for MySQLとAzure Database for PostgreSQLをRuby on Rails(以下、Rails)で試してみましょう。

Railsの環境構築

 次のコマンドでインストールを行います。Windowsを使用している方は「Ruby on Railsのインストール手順」を参照して環境を構築してください。

gem install rails --no-ri --no-rdoc

 バージョンを次のコマンドで確認します。

rails -v

 正常にインストールされると、次のように表示されます。

Rails 5.1.5

一行掲示板を作ってみよう

 Railsアプリを新規に作成してみましょう。ここでは例として、一行掲示板を作ってみます。データベースはMySQLを使用します。

rails new miniboard --skip-bundle --database mysql

 なお、PostgreSQLで試す場合は、--databaseにpostgresqlと変えてください。

rails new miniboard --skip-bundle --database postgresql

 miniboardディレクトリに移動して、次のコマンドを実行します。

cd miniboard
bundle install --path vendor\bundle

 config/database.ymlのusername、passwordとhostを各自の環境に応じて修正します。

default: &default
  adapter: mysql2
  encoding: utf8
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: [サーバー管理者ログイン名]
  password: [パスワード]
  host: [サーバー名]

 データベースを作成します。

bundle exec rake db:create

 データベースの作成が終わったら、scaffoldを次のコマンドで作成します。

rails generate scaffold Article title:string

 データベースをマイグレーションします。

rake db:migrate

 Railsサーバーを立ち上げます。

rails server

 「http://localhost:3000」をブラウザで開くと、次の画面が表示されます。

 [New Article]をクリックして、[Title]に「テスト」と入力して[Create Article]をクリックします。

 次の画面が表示されれば成功です。

 [Back]をクリックして戻ると一覧が表示されます。[Edit]で編集が行え、[Destroy]で削除ができます。

5. まとめ

 Azure Database for MySQL/PostgreSQLはAzure Portalから簡単に作成が可能で、PHPやRubyからも今までと同じように扱えます。他のプログラミング言語でも同様です。皆さんもぜひチャレンジしてみてはいかがでしょうか?

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

修正履歴

  • 2018/03/22 17:13 一般提供(GA)の開始に伴い、本文を一部更新しました。

著者プロフィール

  • 山本 誠樹(ヤマモト マサキ)

     スマホアプリからクラウドアプリまで作成するフリーのデベロッパー。記事へ質問などあればお気軽にご連絡ください。 Twitter:@nnasaki blog:http://blog.nnasaki.com

All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5