Windows Azure 用アプリケーション開発 Step-by-Step チュートリアル ガイド

第 3 章 Windows Azure 運用環境への展開 (2)

目次

3.3 SQL Azure データベース サービスへの移行

‣ 3.3.1 SQL Server Management Studio からの接続
‣ 3.3.2 テーブルの作成
‣ 3.3.3 データの移行
‣ 3.3.4 アプリケーションの接続文字列を変更
‣ 3.3.5 動作確認

3.4 Windows Azure ストレージサービスへの移行

‣ 3.4.1 ストレージ接続文字列の設定
‣ 3.4.2 Blob コンテナ・テーブルの作成


 

3.3 SQL Azure データベース サービスへの移行

ではまず、データベース サービスへの移行から解説します。

3.3.1 SQL Server Management Studio からの接続

まず、SQL Server Management Studio から SQL Azure データベースに接続します。

Note: 利用する SQL Server Management Studio のバージョンにより、利用できる機能範囲が変わります。2008 R2 November CTP 以降では、サーバー エクスプローラーを使用し、テーブル一覧などを表示できるようになりましたが、それ以前のバージョンのものだと、クエリの発行しかできません。サーバー エクスプローラーなどを使用するには、最新の Management Studio をお使いください。

接続の際には、以下 3 点に注意してください。

(3) の作業 (接続時に接続先のデータベースを選択する) は極めて重要です。一般に、通常の SQL Serverでは、どこかのデータベースに接続した後、use コマンドを利用して、同一インスタンス内の別データベースに切り替えることができましたが、データベース サービスではこれができません。これは SQL Azure データベース サービス特有の制限事項のため、注意してください。

ページのトップへ


3.3.2 テーブルの作成

次に、データベース サービス上にテーブルを作成します。クエリ ウィンドウから CREATE TABLE 命令などを発行し、テーブルを作成してください。(今回は簡単のため、authors テーブル、publishers テーブル、titles テーブル、titleauthor テーブルの 4 つだけ作成することにします。)

なお、SQL Azure データベースはアーキテクチャ的な特徴から、SQL Server データベースに比べてテーブルに関しては、仕様上の制限がいくつかあります。例えば以下 2 つなどです。

  • ユーザー定義型が使えない
  • クラスタ化インデックスを持たないテーブル (ヒープと呼ばれます) は作成できない

今回、サンプルで利用している PUBS データベースはこれらの制限に一部ひっかかるところがあり、そのままでは SQL Azure データベース上に移行することができません。このため、スキーマなどを一部修正したテーブルを利用します。作成時は以下のスクリプトを利用してください。

CREATE TABLE authors   
 (   
     au_id          varchar (11)   
            CHECK  (au_id like '[0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9][0-9][0-9]')   
            CONSTRAINT UPKCL_auidind PRIMARY KEY CLUSTERED,
     au_lname       varchar (40)       NOT NULL,
     au_fname       varchar (20)       NOT NULL,
     phone          char (12)          NOT NULL
            DEFAULT  ('UNKNOWN'),
     address        varchar (40)           NULL,
     city           varchar (20)           NULL,
     state          char (2)               NULL,
     zip            char (5)               NULL
            CHECK  (zip like '[0-9][0-9][0-9][0-9][0-9]'),
     contract       bit               NOT NULL
)
GO
     
CREATE TABLE publishers
 (
     pub_id         char (4)           NOT NULL
            CONSTRAINT UPKCL_pubind PRIMARY KEY CLUSTERED
            CHECK  (pub_id in  ('1389', '0736', '0877', '1622', '1756') OR pub_id like '99[0-9][0-9]'),
     pub_name       varchar (40)           NULL,
     city           varchar (20)           NULL,
     state          char (2)               NULL,
     country        varchar (30)           NULL
            DEFAULT ('USA')
)
GO
     
CREATE TABLE titles
 (
     title_id       varchar (6)
             CONSTRAINT UPKCL_titleidind PRIMARY KEY CLUSTERED,
     title          varchar (80)       NOT NULL,
     type           char (12)          NOT NULL
            DEFAULT  ('UNDECIDED'),
     pub_id         char (4)               NULL
            REFERENCES publishers (pub_id),
     price          money                 NULL,
     advance        money                 NULL,
     royalty        int                   NULL,
     ytd_sales      int                   NULL,
     notes          varchar (200)          NULL,
     pubdate        datetime          NOT NULL
            DEFAULT  (getdate ())
)
GO
     
CREATE TABLE titleauthor
 (
     au_id          varchar (11)
             REFERENCES authors (au_id),
     title_id       varchar (6)
            REFERENCES titles (title_id),
     au_ord         tinyint               NULL,
     royaltyper     int                   NULL,
            CONSTRAINT UPKCL_taind PRIMARY KEY CLUSTERED (au_id, title_id)
)
GO

ページのトップへ


3.3.3 データの移行

データベースが作成できたら、各テーブルのデータを SQL Azure データベース上にコピーします。データ コピーの方法は SSIS (SQL Server Integration Service) などを使用するのが正しいやり方ですが、ここでは簡単のため、非接続型データ アクセスを使ったコンソール アプリケーションを書き、アップロードします。以下のようなコードを使って、データをコピーしてください。 (※ サーバー名などは適宜、ご自身のものに変更してください。)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
namespace ConsoleApplication3
{
    class Program
    {
        static void Main (string[] args)
        {
            // 手元のファイルアタッチデータベースの SQL Server 上の
            // データを、SQL Azure 上にコピーする
            SqlConnection sqlcon1 = new SqlConnection (@"Persist Security Info=False;Integrated Security=true;Initial Catalog=PUBS;Server=mmasuda2\sqlexpress");
            SqlConnection sqlcon2 = new SqlConnection (@"Server=tcp:uevf0i1ffa.database.windows.net;Database=pubs;User ID=mmasuda@uevf0i1ffa;Password=xxxxxxxx;Trusted_Connection=False;");
            
            DataSet ds = new DataSet ();
            
            // データ読み取り
            SqlDataAdapter sqlda1 = new SqlDataAdapter ("SELECT * FROM publishers", sqlcon1);
            SqlDataAdapter sqlda2 = new SqlDataAdapter ("SELECT * FROM titles", sqlcon1);
            SqlDataAdapter sqlda3 = new SqlDataAdapter ("SELECT * FROM authors", sqlcon1);
            SqlDataAdapter sqlda4 = new SqlDataAdapter ("SELECT * FROM titleauthor", sqlcon1);
            sqlda1.Fill (ds, "publishers");
            sqlda2.Fill (ds, "titles");
            sqlda3.Fill (ds, "authors");
            sqlda4.Fill (ds, "titleauthor");
            
            // データ書き込み
            SqlDataAdapter sqlda5 = new SqlDataAdapter ("SELECT * FROM publishers", sqlcon2);
            SqlDataAdapter sqlda6 = new SqlDataAdapter ("SELECT * FROM titles", sqlcon2);
            SqlDataAdapter sqlda7 = new SqlDataAdapter ("SELECT * FROM authors", sqlcon2);
            SqlDataAdapter sqlda8 = new SqlDataAdapter ("SELECT * FROM titleauthor", sqlcon2);
            
            // 更新クエリ生成
            SqlCommandBuilder scb5 = new SqlCommandBuilder (sqlda5);
            SqlCommandBuilder scb6 = new SqlCommandBuilder (sqlda6);
            SqlCommandBuilder scb7 = new SqlCommandBuilder (sqlda7);
            SqlCommandBuilder scb8 = new SqlCommandBuilder (sqlda8);
            
            // 行ステータスを変更
            foreach  (DataTable table in ds.Tables)
            {
                foreach  (DataRow row in table.Rows)
                {
                    row.SetAdded ();
                }
            }
            // データアダプタ経由で INSERT 処理を実施
            sqlda5.Update (ds.Tables["publishers"]);
            sqlda6.Update (ds.Tables["titles"]);
            sqlda7.Update (ds.Tables["authors"]);
            sqlda8.Update (ds.Tables["titleauthor"]);
            
            Console.WriteLine ("データをコピーしました。");
        }
    }
}

ページのトップへ


3.3.4 アプリケーションの接続文字列を変更

先ほど作成したWeb アプリケーションは、ファイル アタッチ データベースを利用しています。データベース サービスを利用するように変更するには、接続文字列を書き換えるだけで済みます。以下のように web.config ファイル内の接続文字列を書き換えてください。

<configuration>
   ...  (前略) ...
   <!-- 変更前 -->
   <!--<connectionStrings>
     <add name="pubsConnectionString1" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\pubs.mdf;Integrated Security=True;User Instance=True"
         providerName="System.Data.SqlClient" />
   </connectionStrings>-->
   <connectionStrings>
     <add name="pubsConnectionString1" connectionString="Server=tcp:mbkz89u87g.database.windows.net;Database=PUBS;User ID=mmasuda@mbkz89u87g;Password=xxxxxxxx;Trusted_Connection=False;"
         providerName="System.Data.SqlClient" />
   </connectionStrings>
   ...  (後略) ...
</configuration>

ページのトップへ


3.3.5 動作確認

以上を行ったあとでクラウド サービス プロジェクトを Ctrl + F5 により実行し、WebForm2.aspx ページを呼び出すと、SQL Azure データベースからデータを読み出し、画面に表示するようになります。

ページのトップへ


3.4 Windows Azure ストレージ サービスへの移行

次に、ストレージ サービスへの移行を説明します。

3.4.1 ストレージ接続文字列の設定

まず、ストレージ接続文字列を修正します。

  • クラウド サービス プロジェクトの、プロパティ画面の [Settings] タブを開き、Diagnostic Monitor の接続先となるストレージを、開発用ストレージ (development storage) から、運用環境の方に変更します。
  • 下図のように、[Account Name] と [Account Key] を設定し、さらに接続方法として HTTPS プロトコルを設定してください。

  • 以上の設定の後、[OK] ボタンをクリックすると、Azure ストレージ接続文字列が作成され、"DiagnosticsConnectionString" という名称で保存されます。
  • 以下のような文字列になりますが、この文字列を次に利用しますので、コピーしておいてください。
    ※ "DefaultEndpointsProtocol=https;AccountName=nakama;AccountKey=… (== という文字で終了する文字列)…"

ページのトップへ


3.4.2 Blob コンテナ・テーブルの作成

次に、Diagnostic Monitor で利用する、Blob コンテナやテーブルを、ストレージ サービス内に作成します。前章の「Diagnostic Monitor によるアプリケーション監視」の、「Windows Azure ストレージ側の事前準備」の項で説明したサンプル コードを一部修正し、本番環境へ Blob コンテナやテーブルを作成します。

以下にフル ソース コードを示しますが、修正するのは下記ソース コード中の太字にされた行のみです。ここに、先に作成した接続文字列をペーストしてください。

コードを修正し、コンソール アプリケーションを実行すると、本番環境に Diagnostic Monitor 用の Blob コンテナやテーブルなどが作成されます。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            // 開発環境の場合(運用環境の場合には適宜コードを修正)
            //CloudStorageAccount storageAccount = CloudStorageAccount.DevelopmentStorageAccount;
            // 運用環境の場合
            CloudStorageAccount storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;AccountName=azuretest;AccountKey=xxxxxxxx")

            // 作成するコンテナ、テーブル、キューの名称一覧
            string[] containerNamesToCreate = new string[]
            {
                "wad-iis-failedreqlogfiles", "wad-iis-logfiles", "wad-crash-dumps"
            };
            string[] tableNamesToCreate = new string[]
            {
                "WADLogsTable", "WADDiagnosticInfrastructureLogsTable",
                "WADPerformanceCountersTable", "WADWindowsEventLogsTable", "WADDirectoriesTable" };
            string[] queueNamesToCreate = new string[] { };

            // コンテナ、テーブル、キューを作成
            CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
            foreach (string containerName in containerNamesToCreate)
            {
                CloudBlobContainer blobContainer = blobClient.GetContainerReference(containerName);
                bool created = blobContainer.CreateIfNotExist();
                if (created) Console.WriteLine("{0} : コンテナを作成しました。", containerName);
            }

            CloudTableClient tableClient = storageAccount.CreateCloudTableClient();
            foreach (string tableName in tableNamesToCreate)

            {
                bool result = tableClient.CreateTableIfNotExist(tableName);
                if (result) Console.WriteLine("{0} : テーブルを作成しました。", tableName);
            }
            CloudQueueClient queueClient = storageAccount.CreateCloudQueueClient();
            foreach (string queueName in queueNamesToCreate)
            {
                CloudQueue queue = queueClient.GetQueueReference(queueName);
                bool result = queue.CreateIfNotExist();
                if (result) Console.WriteLine("{0} : キューを初期化しました。", queueName);
            }
        }
    }
}

以上の作業で、利用するストレージが、開発用ストレージから運用環境のストレージ サービスへと変更されます。クラウド サービス プロジェクトを Ctrl + F5 キーで実行し、動作確認をしてみてください。先ほどと特に見た目は変わりませんが、内部の動作は以下のように変更されます。

各種のログ ファイルが、正しくストレージ サービスに、データ出力できているか否かを確認するには、マイクロソフトのサンプル アプリケーションである myAzureStorage (http://myazurestorage.cloudapp.net/) を使っていただくと簡単です。このツールは、Blob や Table ストレージの中をブラウジングできる Web アプリケーションになっており、簡単にストレージ サービスの中身を確認することができます。

Note: このツールは Microsoft が提供する非常に手軽なツールですが、開発用ストレージの中を見ることができない、データのダウンロードやアップロードができないなど、実際に利用するには、機能不足というのが正直なところです。取り急ぎでざっくりデータを確認したい、という場合に利用すると便利です。


ページのトップへ