特集:事例で学ぶWindows Azure実用ポイント

業務システムでWindows Azureを使うための42の覚え書き

シグマコンサルティング 橋本 圭一
2010/02/23
Page1 Page2 Page3 Page4

SQL Azure

◇19:SQL Azureの仕様を押さえる

 SQL Azureはテーブル、ビュー、ストアド・プロシージャ、ファンクションといった機能は問題なく利用できる。その点で取り組みやすいのだが、皆さんの個々の要件が実現できるかどうか、SQL Azureで「できること」と「できないこと」について、以下の記事の内容を押さえることを推奨する。

◇20:SQL Server Management Studio(SSMS)からSQL Azureにつながらない その1

 SSMSでSQL Azureに接続する場合、ログイン画面から、問題なく接続できるのはSQL Server 2008 R2のSSMSのみ。ほかのバージョンのSSMSだと、一度ログインに失敗してから、再度接続する必要がある。次の画面は、SSMS 2008 R2の[オブジェクト エクスプローラー]を使用しているところ。

SSMS 2008 R2の[オブジェクト エクスプローラー]の使用例

◇21:SQL Server Management Studio(SSMS)からSQL Azureにつながらない その2

 SSMSからSQL Azureに接続できない場合、SQLCMDユーティリティ(コマンドライン・ツール)で接続を確認できる。

SQLCMD -S servername.database.windows.net -U myaccount@servername -P password -d DatabaseName
SQLCMDユーティリティで接続するためのコマンドライン例
SQL Server 2008 R2から-Nオプション(暗号化接続)が指定可能。

 SQLCMDユーティリティでも接続できない場合、SQL Azure側のファイアウォール(Firewall)によるIPアドレス制限の設定をチェックしてほしい。またクライアント側のネットワークで、1433番ポートへの外部アクセスが許可されているかチェックしてほしい。

◇22:SQL Azureデータベース初期環境の構築

 筆者は、SQLCMDユーティリティを利用してSQL Azureデータベース初期環境の構築を行っている。SQLCMDユーティリティの-iオプションを使えば、実行するSQLスクリプト・ファイル名(.sqlファイル)を指定できる。筆者の場合、テーブルの作成、ストアド・プロシージャやファンクションの登録などを、SQLスクリプト・ファイル内に記述している。

 開発の初期段階では、何度も初期環境に戻すことが多いため、バッチ・ファイルにしておくと便利だ。次のコードはバッチ・ファイルの例だ。

SQLCMD -S servername.database.windows.net -U servicename@servername -P mypassword -d HogeDb -i spCreateInitialEnvironment.sql
SQL Azureデータベース初期環境の構築を行うバッチ・ファイルの例(InitDB.bat)

◇23:SQL Azureのシステム標準時刻がUTC(世界協定時)

 SQL Azureのシステム標準時刻がUTCになっているので、時刻の扱いには注意が必要だ。例えば、リストボックスの日付の初期値を今日にする場合、日本時間にせずにUTCのまま扱うと時間がずれてしまう。

 日本での現在時刻を取得するには、UTCに9時間追加する必要がある。SQL文でこれを実現すると、次のコードのようになる。

--UTCに9時間追加して、日本の現地時刻を取得する
DECLARE @BaseDate datetime
SELECT @BaseDate = DATEADD(hour, 9, GETUTCDATE())
SELECT @BaseDate = DATEADD(hour, 9, SYSUTCDATETIME())
(UTC時間ではなく)日本時間で現在時刻を取得するサンプルSQLスクリプト

◇24:SQL Azureデータベースにおける日本語のデータ

 日本語のデータをnvarchar型のカラムに格納する場合は、クエリにNオプションが必要だ。次のコードはその例。

INSERT INTO [dbo].[M_Bank]
([Code], [Name], [CreatedOn], [UpdatedOn])
VALUES
('9999', N'テスト銀行 ', GETDATE(), GETDATE())
クエリにNオプションを付けてnvarchar型のカラムにデータを格納するサンプルSQLスクリプト

◇25:テーブルには、主キー(クラスタ化インデックス)が必要

 SQL Azureデータベースでも主キーが存在しないテーブルは作成可能だが、データをINSERTできないため、下記のSQLスクリプトのINSERT文は失敗する。

--M_Test
DROP TABLE M_Test
CREATE TABLE [dbo].M_Test(
  [Id] [int] NOT NULL,
  [Name] [nvarchar](20) NOT NULL
)
--M_Test
INSERT INTO [dbo].[M_Test]([Id], [Name]) VALUES(1, N'テスト')
主キーが存在しないテーブルを作成してデータをINSERTする際に失敗するサンプルSQLスクリプト
主キー(クラスタ化インデックス)を設定するには、対象のカラムに「PRIMARY KEY CLUSTERED」を指定する。

◇26:SQL Azureにおける文字データの照合順序

 下記のクエリを発行すると分かるがSQL Azureの既定の照合順序は、「SQL_LATIN1_GENERAL_CP1_CI_AS」だ。

SELECT SERVERPROPERTY('collation')

 SQL Azureでは、文字データの照合順序をサーバ・レベルやデータベース・レベルで設定できないので、列レベルか式レベルで設定する必要がある。

 テーブル作成時に列に対して照合順序(COLLATE句)を設定するか、クエリ文(=式)の発行時に照合順序(COLLATE句)を設定する。

 下記のSQLスクリプトは、列レベルで照合順序を設定する例。

DROP TABLE M_Test
CREATE TABLE [dbo].M_Test(
  [Id] [int] NOT NULL PRIMARY KEY CLUSTERED,
  [Name] [nvarchar](20) COLLATE JAPANESE_CI_AS NOT NULL
)
列レベルで照合順序を設定するサンプルSQLスクリプト

 また下記のSQLスクリプトは、式レベルで照合順序を設定する例である。なお、ひらがな、カタカナ、半角カタカナを区別したい場合は「COLLATE JAPANESE_BIN」を、したくない場合は「COLLATE JAPANESE_CI_AS」を指定する。

INSERT INTO [dbo].[M_Test]([Id], [Name]) VALUES(1, N'アイウエオ ')
--ひらがな、カタカナが区別されずヒットする
SELECT * FROM M_Test
  WHERE Name LIKE N'%あ%' COLLATE JAPANESE_CI_AS
--ひらがな、カタカナが区別されるのでヒットしない
SELECT * FROM M_Test
  WHERE Name LIKE N'%あ%' COLLATE JAPANESE_BIN
式レベルで照合順序を設定するサンプルSQLスクリプト

◇27:SQL Azureのバックアップ

 2010年前半に提供される予定のデータベース・クローニング機能によって、任意のタイミングでバックアップを作成可能になると説明されている。しかし、現在この機能はない。現時点では、クライアントPCからBCP(一括コピー・プログラム)ユーティリティSSIS(SQL Server Integration Services)によって手動バックアップを行うしかない。

 場合によってはバッチ・ファイルとして組んだ方が柔軟に扱える場合も多いので、ここではBCPユーティリティでSQL AzureデータベースのM_Bankテーブルをエクスポートして、オンプレミスのSQL ServerデータベースにインポートするSQLスクリプト・ファイルを例示する。まずはエクスポートのサンプルSQLスクリプト。

rem SQL Azureデータベースのエクスポート
bcp HogeDb.dbo.M_Bank out M_Bank.dat -S myserver.database.windows.net -U serviename@myserver -P  mypassword
SQL AzureデータベースからデータをエクスポートするサンプルSQLスクリプトの例(Export.bat)

 次に、上記のスクリプトによってエクスポートされたM_Bank.datファイル(バックアップ・データ)内のM_Bankテーブルを、SQL ServerデータベースにインポートするサンプルSQLスクリプトである。

rem SQLServerへのインポート
bcp HogeDb.dbo.M_Bank in M_Bank.dat -S PURPLE-BEAR -U mysa -P mypassword -f M_Bank.fmt
SQL ServerデータベースへデータをインポートするサンプルSQLスクリプトの例(Import.bat)
-fオプションは「M_Bank.fmt」というフォーマット・ファイルを指定している。フォーマット・ファイルの作成方法はMSDNのサイトを参照されたい。

既存システムを移行する場合の注意事項

◇28:既存システムで利用しているようなログの仕組みは利用できない

 各ロール・インスタンス内の任意のフォルダにログ・ファイルを生成できないため(キャッシュ領域として使えるローカル・ストアは用意されているが、任意のフォルダにファイルを作成することは不可能)、ログ・ファイルはMicrosoft.WindowsAzure.Diagnostics名前空間のクラスを利用して、ストレージに格納することになる(詳細前述)。このため、すでにログ出力処理を組んでいる場合は、該当部分の変更が必要になる。

◇29:セッション管理が異なる

 Webロールのインスタンスが複数になると、そのセッション情報をどこで管理するかが問題になってくる。一般的な方法の1つとして、SQL Serverを活用したセッション管理があるが、現状はSQL Azureをセッションステート・サーバとして利用できないようだ。

 「◇17:セッション管理」で紹介したAspProvidersのライブラリを利用する、もしくは自作するしかない。いずれにせよストレージに情報を格納する形になるので、スピードが遅くなってしまう可能性が高い。AspProvidersのライブラリを利用するとしても、「ストレージに格納されたセッション情報が自動的に削除されないバグ(仕様?)が存在する」という報告(英語)もある。

 また、仮にSQL Azureでセッション管理をするようになると、データの格納先としてストレージのみを活用しているクラウド・サービスが、さらにSQL Azureの契約も必要になるなどの弊害が出てくる。

◇30:帳票業務は単純に移行できない

 2010年2月23日現在、Crystal Reports、Active Reports、Telerik Reportingなどほとんどの帳票コンポーネントでPDF生成機能が動かない。またVisual Studio 2008のReportViewerコントロールもサポートが予定されていない(このため、Crystal Reportsでは、PDF生成のみならずプレビュー機能すら実行できない)。PDFが生成できない主な理由は、帳票をPDFファイル化する際などに、コンポーネント側で一時ファイルを生成する仕様になっており、その書き込み権限がないため、一時ファイルの生成に失敗してしまうためだ。Telerik Reportingに関しては、RTF形式で出力することは可能なので、筆者の事例では、現状その手段で運用している。

 帳票を必要とする業務システムが多いことは確かなので、マイクロソフトには何らかの善処か、代替案を期待したいところだ(ちなみに、まもなく提供が開始されると予想されるVM(仮想マシン)ロールでは、管理者権限が付与されるので、一時ファイルを作成できない問題を解消できる可能性がある)。

◇31:システム移行は、各種検証が必要

 システムをオンプレミス環境からクラウド環境へ移行する場合、クラウド環境独自の制限によりシステム本来の処理が実現できないかもしれない(例えば管理者権限がないなど)というリスクがある。プロジェクトが始動した後に気付いても遅いので、まずは各主要機能の最小版を作成して、Windows Azure上でも実行可能か試した方がよい。実際のところ、この懸念や調査が、移行になかなか踏み切れない理由となるので、マイクロソフトおよび、Windows Azure上のクラウド・サービスを開発するベンダは積極的に事例公開を行っていただきたい。

そのほか

◇32:開発の進め方

 開発プロジェクトのスケジュール検討の際、これまでのSI業務とは違ってハードウェアの調達期間がなくなる。よってプロジェクト期間をさらに縮めることも可能ではある。しかしながら、Windows Azureでのデプロイや運用はまだベスト・プラクティスがないので、開発プロジェクトの期間を短縮するのは、運用面などもよく検討してからにすべきであろう。

◇33:DNSの知識について

 自社ドメインにてWindows Azureクラウド・サービス(Webロール)を稼働させたい場合、DNSのCNAMEレコード(=ホスト名のエイリアス)の設定が必要だ。例えば以下は、Windows Azureクラウド・サービス(tiamat.cloudapp.net)に弊社のドメイン(tiamat.sigmact.com)を設定するためのCNAMEレコードの設定例である。

cname tiamat.sigmact.com tiamat.cloudapp.net.
Windows Azureクラウド・サービスに独自ドメインを設定するCNAMEレコードの設定例
※設定方法はドメイン管理会社によって異なる場合があるので注意。

◇34:Windows Azure向きな業務システムが見えてきた

 ここまでの内容から、以下のような特徴を持つ業務システムはWindows Azureには向いている。

  • Eコマースなど、もともとインターネットで提供されていたシステム
    特にポータル・サイトは、各コンテンツの保管方法がKey-Valueストア(=テーブル・ストレージ)に向いているので適しているだろう。
  • 楽観的同時実行制御を採用できるシステム
  • コンポーネントを多用せず、Webサーバとデータベースでシンプルに組まれているシステム
  • バッチ処理などサーバ側で単に計算処理を行いたいシステム
  • データベースのみをクラウドで利用するシステム
    例えば、帳票作成サービス「GreenTech Green Report」は、データベースのみSQL Azureを利用している。SQL Azureを利用することで、SQL Serverのライセンス費用が抑えられるので非常に良い選択だと思う。
  • BtoBでデータのやり取りを行うシステム

◇35:Windows Azureに向かない業務システムも見えてきた

 逆に、以下のような特徴を持つ業務システムはWindows Azureには向いていない。

  • 楽観的同時実行制御を採用できない、データの整合性に重きを置くシステム
  • 現状の99.95%というサービス・レベル契約(SLA)では不十分なシステム
  • 管理者権限を必要とするシステム
  • ミドルウェアなどの制約があるシステム

◇36:Key-Valueストアで構築できる業務システムとは?

 Key-Valueストアは、クラウド・コンピューティングを代表するデータ保存技術であり、スケーラビリティを考えると魅力的である。が、どういった業務で採用可能で、どのようなメリットがあるのか、より実践レベルの情報が必要だと感じている。

◇37:業務システムの要件をクラウドが満たすか?

 サービス・レベル契約(SLA)が保証する稼働時間がよく問題視されているが、「ビジネス・アワー(例えば9〜18時)のみの時間限定稼働であったり、1時間程度の停止を許容できるような要件であれば、クラウド環境でも十分に満たせるのではないか」という指摘もよく目にする。特に社内に最小限の代替環境(=クラウド環境と同等のオンプレミス側のサーバ環境)を用意するなどのリスクヘッジができるようであれば、積極的な活用ができるはずだ。

◇38:SaaSを作りたければ、ガイドラインを学ぼう

 Windows AzureをPaaSとして利用し、顧客向けにSaaSを展開したいと考えている方には、下記のリンク先にあるSaaS向けSLA(サービス・レベル契約)ガイドラインを一読しておくとよい。

◇39:Windows Azureのカレント・ステータスを調べる

 Windows Azure Platformの現在の健康状態(=カレント・ステータス)、つまり各サービスの稼働状況を確認できるページが、下記のリンク先に用意されている。自分のアプリケーションが正常に動いていない場合など、何かおかしいと思った場合は、確認することをお勧めする。

 次の画面は、「SouthEast AsiaのAppFabric Service Busで障害が起きていて、現在調査中」という情報が表示されている例だ。

Windows Azure Platform:Current Statusにおける障害状態の例

駆け込み寺や情報スポット

 Windows Azureはハマりどころが満載なので、筆者はいろいろなサイトのお世話になっている。

◇40:トラブルはMSDN Forum(英語)で質問

 MSDN Forum(英語)は、Windows Azureに関する技術的な質問と回答が充実している。解決できない壁に当たったときは、まず検索。どうしても情報がなければ、MSDN Forumに質問してみよう。レスポンスは意外と速く、マイクロソフトの本気度合いが伝わってくる。

◇41:ブログからの収集も欠かせない

 下記のAzureの鼓動は、必須アイテム。1日に1回は確認しよう。

 ほかにも、先進的な情報を提供しているブログをいくつか紹介する。

◇42:速報はTwitterで

 @shin135@tumada@SQLAzureJP@azure_1topi@isshiki、(英語:@WindowsAzure@SQLAzure@Azure_AppFabric@smarx)をフォローして最新情報を教えてもらおう。

 以上、事例とWindows Azureでハマらないためのメモを説明させていただいた。

 業務用途での使い方は非常に多岐に渡っており、「こういった場合に使えるのか?」といった疑問は皆さん絶えないだろう。また、Windows Azureを提供するマイクロソフトからのそういった説明が不足している事実も確かだ。

 筆者は「興味はあるのだが、制約事項がよく分からない。実際に自分たちの環境を移行できるのか分からない」という相談をよく受ける。「業務システムというくくりでWindows Azureを論じるには、まだまだ事例や議論が必要」という認識だ。そういったイベントが3月6日に予定されており、ぜひ皆さんと議論したい。End of Article

 

 INDEX
  特集:事例で学ぶWindows Azure実用ポイント 
  業務システムでWindows Azureを使うための42の覚え書き
    1.一般的なクラウドのメリットとデメリット/事例の紹介
    2.42の覚え書き:構成と課金/デプロイ
    3.42の覚え書き:ログなどの環境依存の機能
  4.42の覚え書き:SQL Azure/システム移行時の注意点/そのほか


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)
- PR -

注目のテーマ

業務アプリInsider 記事ランキング

本日 月間
ソリューションFLASH