はじめに
前回までで紹介したストレージを利用すれば、BLOBやファイルなどのデータを保存することができるようになりますが、我々エンジニアにとって最も親しみのあるのはリレーショナルデータベースではないでしょうか。
本記事ではAzure上で利用可能なリレーショナルデータベースであるSQLデータベースを紹介します。
前回同様、本連載では次の環境で動作確認を行っています。
・Windows 10 Home
・Visual Studio Community 2017 Version 15.1(以降、VS2017)
本稿で説明するリストはサンプルの中に収録しています。ご活用ください。
SQLデータベース
AzureのSQLデータベースは、Microsoft社のSQL Serverエンジンをクラウド環境に適用したサービスです。Azure上のSQLデータベースは単独のSQL Serverと比較して、動的なスケール、各リージョンへのバックアップ、統合されたセキュリティモデルなどを通じて小さなWebサービスから、大規模なWebサービスまで簡単な手順で柔軟に拡張できるようになっています。
またビジネスとして考えた場合に、リソースのコスト管理はサービスの継続性を考えた上で重要な指標となります。このリソース管理の方法については、シングルデータベースとエラスティックプールの二通りの考え方があります。
シングルデータベース
1台の仮想サーバをデータベースとして利用します。データベースのスペックはパフォーマンスレベルによって選択できるようになっており、次の4種類から選択できます。
パフォーマンスレベル
種類 | 用途 |
---|---|
Basic | 開発やテストなど使用頻度の小さい小規模アプリケーション用 |
Standard | IO負荷が中程度で一般的なアプリケーション用 |
Premium | IO負荷が高く、トランザクション量が多い場合に選択するミッションクリティカルなサービス用 |
Premium RS | IO負荷が高く、可用性の保証を必要としない場合に選択する。分析用途など |
これらのパフォーマンスレベルは、サービスへの負荷によって柔軟に、無停止で変更することができます。
エラスティックプール
例えばECカートのサービスを提供しているようなケースでは、各テナントごとにデータベースを割り当てることになりますが、その負荷はテナントごとに変わってきます。テナントが10や20であればテナントごとにサーバのリソースを変更することもできますが、数百単位となると個別に管理するのは困難になります。そのような場合にエラスティックプールを利用すると、プール単位での上限指定をすることができ、個別のテナントのリソースはプールの設定範囲内で自動的に調整してくれるようになります。
Azure SQLデータベースの作成
それでは実際にAzure上のSQLデータベースを使ってみましょう。SQLデータベースの作成はAzureポータルから行います。Azureポータルのメニューから「SQLデータベースをデータベース」を選択します。
SQLデータベースの画面では、作成したSQLデータベースデータベースの一覧が表示されます。新しく作成するには上部の「追加」をクリックします。
SQLデータベースを追加するには、いくつかの情報を入力する必要があります。以降ではそれぞれの項目に沿って説明していきます。
データベース名、サブスクリプションの設定
まず最初にデータベース名を決めます。データベース名は管理しやすいものを自由に設定してください。データベース名として使用可能な文字は英数字、一部の記号となっており最大で128文字まで入力可能です。サブスクリプションは無料試用版、従量課金などAzureに設定しているものを指定してください。
リソースグループ、ソースの選択の設定
リソースグループは、Azure上のサーバなどのリソースをまとめて管理するための単位で、これまでの連載でもストレージやApp Serviceなどを管理するために作成しています。すでに登録している場合には「既存のものを使用」を選択して作成済みリソースグループを選択します。新しく作る場合には「新規作成」を選択してリソースグループ名を入力します。
次に作成するデータベースのもとになるデータを指定します。次の3つから選ぶことができます。
ソース選択肢
項目名 | 概要 |
---|---|
空のデータベース | 新規に空の状態からデータベース作成 |
サンプル(AdventureWorksLT) | サンプルのデータベースを利用して作成 |
バックアップ | すでに作成済みのデータベースのバックアップから作成 |
バックアップを指定した場合には、以下のようにどのデータベースのいつの時点かを指定することができます。この機能を使うことで、データベースに何らかの問題があった場合に運用中のデータベースを壊すことなく調査、検証を行うことができるようになります。
本記事では、サンプルとして新規にデータベース構築を行うため、「空のデータベース」を選択します。
サーバーの設定
この項目ではAzure上でSQLデータベースを実行させるためのサーバの設定を行います。すでにSQLデータベース用サーバが作成されている場合には、その中から選択することができます。1つもない場合や別のサーバを追加したい場合には次のような画面から必要な情報を入力して作成します。
サーバ名は、「database.windows.net」のサブドメインとなるため、ユニークな名前を設定する必要があります。サーバ管理者ログインユーザの名前は自由に決めることができますが、adminやrootなどの一般的な名称を使うことはできないため注意して命名してください。そしてパスワードを入力し、このサーバを動作させるデータセンターの場所を指定します。東日本、西日本以外の海外も指定することができます。
価格レベルの設定
本サンプルでは、検証用ということで一番小さいパフォーマンスレベルであるBasicを選択します。Basicの月額価格は575.17円(2017年4月時点)となっています。SQLデータベースの場合にはApp Serviceのように無料価格版は存在せず、このBasicが最低価格となります。このためアクセスが全く無い場合でも費用は発生しますのでご注意ください。
照合順序の設定
照合順序とは、文字列の比較を行う際のルールのことです。例えばアルファベットの大文字と小文字を区別するまたは区別しないなどの設定を行う場合に利用します。日本語では大きく次の3種類を指定することができます。
日本語で利用可能な照合順序
値 | 意味 |
---|---|
Japanese_BIN | バイナリの値により区別される |
Japanese_CI_AS | 大文字小文字は区別されず、アクセントは区別される |
Japanese_CS_AS | 大文字小文字は区別され、アクセントは区別される |
サンプルでは文字が異なればすべて別の値として扱うようにするため、「Japanese_BIN」を指定することにしました。
どのような値を指定できるかご興味のある方は、[SQL Server 照合順序名 (Transact-SQL)を御覧ください。
さてここまでの設定を行うと、次のようになります。「作成」ボタンをクリックしてSQLデータベースを作成します。
セキュリティの設定
作成したSQLデータベースはAzureクラウド上に存在するため、セキュリティ上の観点からデフォルトでは外部からアクセスすることができなくなっています。よって次に行うべきことは、開発者の環境からアクセスするための許可を設定することになります。
Azureポータルの「すべてのリソース」から、先程作成したSQLデータベースの項目を確認すると、次のようにSQLサーバとSQLデータベースの2つのリソースを見つけることができます。
ここでSQLサーバを選択し、「概要」から「ファイアウォール設定の表示」を選択します。
「クライアントIPの追加」をクリックすると、開発環境から接続しているIPアドレスが自動的に開始、終了IPの項目に設定されますので、この内容で問題なければ「保存」をクリックして設定を反映させます。
SQLデータベースにアクセスする
それではSQLデータベースの準備ができましたので、実際にアクセスしてみましょう。SQLデータベースにアクセスするには、内容をちょっと見てみたい場合やプログラムからアクセスしたい場合などの用途に応じていくつかの方法が用意されています。
SQL Server Management Studioを使ってアクセスする
最初に、SQL Server Management Studio(SSMS)を紹介します。これはマイクロソフト社のSQL Serverを管理するためのツールであり、そのサポートプロダクトの一つとしてAzure上のSQLデータベースにも対応しています。これはVS2017とは別途インストールする必要があるため、SQL Server Management Studio (SSMS)のダウンロードサイトからインストーラをダウンロードし、インストールします。
インストーラは900MBほどありますので、ちょっと確認したいだけの場合には、次に紹介するVS2017組み込みツールを使ってみてください。
インストールできたら、WindowsメニューからSSMSで検索し起動してみましょう。
起動すると接続画面が開きますので、ここで必要な情報を入力します。次の値を参考にご自身のSQLデータベース情報を入力してください。
Azure SQLデータベース
項目名 | 値 |
---|---|
Server type | Database Engine |
Server name | 「SQLサーバ」.database.windows.net |
Authentication | SQL Server Authentication |
Login | 「SQLサーバ作成時に指定したアカウント名」 |
Password | 「SQLサーバ作成時に指定したパスワード」 |
接続すると、次のようにSQLサーバ以下のデータを階層形式で確認することができます。
VS2017組み込みツールを使ってアクセスする
SQLデータベースにアクセスするには、VS2017に組み込まれている「SQL Serverオブジェクトエクスプローラー」を利用することもできます。このツールもAzure以外の一般的なSQL Serverにアクセスするために利用することができます。
SQLデータベースを使用したアドレス帳Webアプリケーション
サンプルとして、本連載の第3回、4回でストレージテーブルを使ったアプリケーションをSQLデータベースを使って再実装したいと思います。サンプルプロジェクトはこれまでと同様にASP.NET MVCを選択します。
接続ライブラリをインストールする
ASP.NETからAzureのSQLデータベースに接続するためには接続用のライブラリが必要となりますので、NuGetを使ってインストールします。VS2017のメニューから、[ツール]-[NuGetパッケージマネージャー]-[ソリューションのNuGetパッケージの管理]を選択し、検索窓に「EntityFramework」を入力して検索します。一覧に表示されたものからEntityFrameworkをインストールしましょう。
データモデルの作成
それでは早速データベースに入れるデータモデルの定義から始めます。今回はEntity FrameworkのCode First機能を使って、最初にデータモデルクラスを定義し、その情報からテーブルを作成する方法で進めていきます。
まず、ソリューションエクスプローラーから「Models」ディレクトリを選択し、右クリックメニューから[追加]-[新しい項目]を選択します。
新しい項目の追加ダイアログで、左側のツリーから「データ」を選択すると右側に色々なデータ関連の項目が表示されますので、この中から「ADO.NET Entity Data Model」を選択し、作成するクラス名として「AddressBookContext」を入力します。
追加ボタンをクリックすると、「Entity Data Modelウィザード」が表示されますので、ここで「空のCode Firstモデル」を選択して完了をクリックします。
コンテキストクラスの作成
生成されたAddressBookContextクラスは、DbContextクラスを継承したクラスで、コントローラからはすべてこのコンテキストクラスを経由してデータモデルにアクセスすることになります。本記事のサンプルでは、生成された「AddressBookContext.cs」ファイルにアドレス情報を表現するためのクラス(Address)を定義することにします。
AddressBookContext.cs(抜粋)
namespace AzureSQLDatabaseSample.Models
{
// 省略
public class AddressBookContext : DbContext
{
public AddressBookContext()
: base("name=AddressBookContext")
{
}
// (1)コンテキストクラスからAddressにアクセスするためのプロパティ
public virtual DbSet<Address> Addresses { get; set; }
}
// (2)アドレス情報を定義する
public class Address
{
public int Id { get; set; }
public string Email { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
}
まずアドレス情報を表現するクラスとしてAddressクラスを定義します(2)。特に何らかのクラスを継承したり、インターフェイスを実装したりする必要はなく、普通のクラスとして定義することができます。ここではId、メールアドレス、姓、名の4つのプロパティを定義しました。
次に、アドレス情報の一覧にアクセスするためのプロパティをコンテキストクラスに定義します(1)。プロパティ名は通常はデータモデルクラスの複数形をつけるようになっています。
コントローラ、ビューの作成
次にコントローラとビューを作成します。今回はVS2017のスキャフォールディング機能を使って、基本的なデータベース処理(作成、取得、更新、削除)を行うためのアクションを作成することにします。データモデル作成時と同様に、ソリューションエクスプローラーから「Controllers」ディレクトリを選択し、右クリックメニューから[追加]-[新規スキャフォールディングアイテム]を選択します。
表示される新しい項目の追加ダイアログで、「Entity Frameworkを使用した、ビューがあるMVC 5コントローラ」を選択して追加ボタンをクリックします。
コントローラの追加画面では、元になるデータモデルなどを選択します。このサンプルでは次の値を指定しました。
コントローラの追加で指定した値
項目名 | 指定した値 |
---|---|
モデルクラス | Address |
データコンテキストクラス | AddressBookContext |
コントローラ名 | AddressesController |
上記以外は、デフォルトのままの設定で大丈夫です。
コントローラの作成実行前にソリューションのビルドを行わないとコントローラ作成時にエラーになることがあります。もし皆さんの環境でコントローラがうまく作成できないという場合には、ソリューションのビルドを実行後に上記の手順を試してみてください。
開発環境で動作確認
以上で実装作業は終わりです。スキャフォールディング機能ではシンプルなビューを作成していますので、自動生成されたコードをもとにしていろいろとカスタマイズしてみてください。
まずは開発環境で動作確認してみましょう。データは開発環境で動作しているSQL ServerのローカルDBに格納されます。デバッグ実行した際にブラウザのアドレス欄に、「http://localhost:<開発環境のポート番号>/Addresses」と入力してください。
アドレス情報の、作成、取得、更新、削除を実行するための基本的な機能が用意されています。
App Serviceに公開
最後に作成したWebアプリケーションをAzureに公開します。これまでの連載で何度も行ってきましたが、今回はSQLデータベースに接続するための手順が一つ加わります。
VS2017の「Webの1クリック発行ツールバー」から新しいカスタムプロファイル作成を選択します。
ここで発行先としてAzureを選択し、新規作成か既存のものを選択かを選んで発行ボタンをクリックします。この連載を通じてApp Serviceのサーバはすでに作成しているため、既存のものから選択することにします。
ここで発行ボタンをクリックすると、AzureのApp Serviceに本サンプルのコードが発行されますが、SQLデータベースから値を取得しようとするとエラーになってしまいます。SQLサーバと接続するには、発行画面の「設定」から連携するSQLデータベースの情報を入力する必要があります。
設定をクリックして表示される画面を開き、左側のタブから設定を選択するとデータベースの設定項目が現れます。ここにAzureのポータル画面から取得した接続文字列を入力します。その際にIDとパスワードを正しいものに置き換えるのを忘れないようにしてください。
データベース情報の入力ができたら保存をクリックし、再度発行してみましょう。Azure上でデータの作成、更新、削除など確認してみてください。
本記事のサンプルプログラムをお試しいただく際には、ソリューションを開いたあとでNuGetを復元し、必要なパッケージのインストールを行ってください。パッケージの復元を実行するには、ソリューションエクスプローラーからソリューションを選択し、右クリックメニューから[NuGetパッケージの復元]を選択します。
また、従量課金でAzureのリソースを作成されている方は、お試しいただいた後に各種サーバの停止や削除を行うことをお忘れなく。特にSQLデータベースは何もアクセスしていなくても課金されます。
まとめ
SQLデータベースは、通常のRDBMSと同様に使うことができ、また急激なアクセス増加にも容易に対応できるようになっています。特にこれまでSQL Serverを使っていた方にとっては、大きな違いなく使えるという印象を持っていただけたのではないかと思います。
さて、これまではApp Serviceやストレージ、データベースなど何らかのサービスとしての機能を紹介してきましたが、次回はよりインフラに近い、AzureのVirtual Machineについて紹介する予定です。
WINGSプロジェクト 花田善仁著/山田祥寛監修
<WINGSプロジェクトについて>テクニカル執筆プロジェクト(代表山田祥寛)。海外記事の翻訳から、主にWeb開発分野の書籍・雑誌/Web記事の執筆、講演等を幅広く手がける。一緒に執筆をできる有志を募集中。