Windows Azure

セッション概要

Developer Camp 2012 Japan Fall
Day1 2012年10月4日(木)16:40~17:40

Microsoft Corporation
Azure Application Platform Team
Software Development Engineer in Test
河野通宗

Togetter:Inside Windows Azure Web Sites by @superriver
セッション資料

Windows Azure Web サイト (コードネーム Antares) の内部の仕組みについて詳しくお話します。Web サイトのロール構成、プロビジョニング時の動作をはじめ、高可用性とスケーラビリティを提供するメカニズムについて、開発チーム中唯一の日本人エンジニアが開発途中のエピソードも交えてお伝えします。エバンジェリストも知らない話が聞けるかも知れません。

河野通宗さん

Azure Webサイトを作っている人。
SDET(Test Developer:テストコードを毎日書いて触ってきゃっはーと楽しんでいる)人で
Twitter:superriver(帝国兵と俗に呼称されている)

チーム

Azure Webサイトのコードネーム:アンタレス(Antares)
アンタレスチームは40人(Dev/Test/PM)。
スコット・ガスリー配下のチームメンバーは2~300人。

AAPT(Azure Application Platform)チームで、Websites以外にも幾つか存在する。
部屋の看板?
imageスコット・ガスリー配下のチームロゴなんだって。
image

Windwos Azure Websiteとは

Strat Simple

  • 数クリックで1つのWebサイトをクラウド上に作成できる。
  • ギャラリーから作成できるサイトは幾つかメジャーなOSSに対応している。
    メジャーなOSSの定義は、マイクロソフトが提供している簡単にパッケージをインストールできるツールであるWebPI(Web Plat form Installer)のダウンロード数が多いところから結構選んでいる。(Websitesに入れたいOSSがある場合は、WebPIでせっせとダウンロードしたら対応するかも)
  • データベースを提供している。
    MySQLは20MBまで設定不要で最初から使えるようになっている。
  • お試しで10サイトまで無料で使えるようになっている。

Go Live

  • 皆さんが使用しているリポジトリや開発環境をできるだけ受け入れたいということで、当初からGitとTFSはサポートしようと話していた。FTPは技術的に厄介な部分がありましたが、何とか解決しました。

Rapid Scale

  • クラウドの特徴といわれるスケーリングがとても簡単である。
    スケールアウトはインスタンスを簡単に増やせる。トラフィックが多いときにインスタンスを増やすことで簡単に対応できる。
    スケールアップは、一つのインスタンスがメモリが足りない、サイズが足りないなどの場合に柔軟に変更できる。

image宣伝文句で、ASP.NET、MVC、Python、PHPをサポートとなっている。
Rubyはサポートしないのかという話ですが、クラウドサービスの方では使えるなっていますが、Websitesの方でも使える。

開発動機

昔、大きくチームが2つありました。
河野さんは元々ファンダメンタルよりのAzureチームにいた。もっとデプロイの手続きを簡単にしたいと考える人がファンダメンタルなチームにいっぱいいました。

具体的に改善したいと思ったことがあって、ミニプロジェクトが立ち上がった。

  • デプロイ時間
  • スケール
    スケールが簡単だとは言っていたがスケールを変えようと思うとクラウドサービスではコンフィグレーションを書き換えないといけなくて言うほど簡単ではなかった。
  • 既存資産が再利用しづらい
    クラウドサービスは、WebロールやWorkerロールなどで基本従来のWindowsの開発モデルとはだいぶ違うところがあった。既存資産の再活用がしずらかった。

一方で、IIS 6やIIS 7を開発し続けていたチームがありました。
IISの基本機能として元々マルチテナントの機能を持っていたが、それなりの問題点もあった。

問題点があり、改善しようとプロジェクトが走っていました。

  • ストレージの保守
    100ホストとか、たくさんのホストをテナントした場合にファイルの容量を増やすのが容易ではなかった。
  • スケーリング困難
    スケーリングするのに、メモリを増やしたりHDDを増やすのが容易ではない。ダウンタイムが発生する。
  • 複雑な初期設定

この2つのプロジェクトが社内のデモの場か何かで、お互いの存在を認識し、似たようなことやってるなら一緒にやろうよっとなり、プロジェクト・アンタレスが1年半ほど前に始まった。

imageAntares開発プロジェクトの原則

どこかに明文化されているわけじゃないけど、開発の経緯をみてきて河野さんなりにまとめてみた。

  • セキュリティの確保されたマルチテナント環境
    マルチのテナント環境でセキュリティとかプロテクションは絶対に提供しないといけない。普通のIISではアプリケーションプールだけですが、もっとセキュリティを確保したホスティング環境を提供する必要がある。
  • 単一ビルドでクラウドとオンプレミス双方をサポート
    Websitesはプログラム自体は、単一のビルドでオンプレミスでも動くようになっていて、また動くように作った。msiのパッケージになっていてWindows Serverに普通にインストールできる。大きな制約でAzure特有の機能を一切使用できなかった。Service Busとか使わない縛りの上でやっている。
  • 可用性重視(ダウンタイムをゼロに近づける)
    クラウドと言っても、ハードウェアとソフトウェアの上で起きることは何でも起きるのがクラウド。だからできるだけダウンタイムを減らして、アベイラビリティを高める。これは重視して、投資をしている。
  • パフォーマンス低下をできるだけ抑える
    いろいろやろうとすると当然ながらパフォーマンスが低下する。その低下をできるだけ抑えるように開発した。

全体構成

次の図が全体構成。ピンクの部分はAzure自体のインフラで、この部分はAzure Websaitesチームは触れることができない。Azureインフラの上にWebsitesを構築している。

赤色の部分がAzure Websitesの部分で、大きく2つに分かれている。
1つが、Websites master API endpoint。Azureのインフラと直接通信して、サイトを作成したり、削除したりする。メインのコントローラー部分。
そして、Stamp。実際にサイトを作成した時に、サイトが格納される場所となっている。

Azure Websitesは、クラウドサービスとして実装されていて、Azureの上に作られている。

image

Stampの部分が世界各地のデータセンターに展開されていて、今後増やしていきたいと思っている。
アジアにも1つStampを置く予定となっている。今、設定をしたりする。

サイト新規作成

サイトを作成するときの挙動についての説明。

  1. ポータルに対してsite1を作成する指令を出す。
  2. 指令を出すと、site1作成命令のクエリがMasterに届く。
  3. site1作成の指令をした際に指定したリージョンに対応したStampのAPIに対してリクエストする。
  4. Stampにサイトを作成。
  5. 作成できたら、StampのAPIからAzureのインフラ(DNSサーバ)に対して、site1はStamp2にあるっと登録する。
    Azure Webサイトの外側からもsite1のIPがわかるようになる。
    image
  6. 無事成功したら、リターンコードが返る。
    image

サイト呼び出し

Webブラウザ開く際の挙動についての説明。

  1. クライアントからAzureのDNSサーバーにsite1のIP問い合わせ。site1は、Stamp2にあると知っているので、Stamp2のロードバランサーのエンドポイントのIPを返す。
  2. クライアントは、Stamp2のロードバランサーのエンドポイントのIPにパケットを飛ばす。
  3. Stamp2にも負荷分散のために複数あるエンドポイントのどれかに対して、ロードバランサーはリクエストを投げる。
    SNAGHTMLa45dbb4
  4. stampにアクセスが来ると複数あるFrontendにランダムにパケットが飛ぶ。
  5. Frontendは、どのWebWorkerにパケットを投げていいのかを知らないので、Runtimeデータベースと通信し、ストアドプロシージャが一番負荷の少ないWebWorkerを選択し、Frontendに返す。
  6. Frontendは、選ばれたWebWorkerの情報を内部のキャッシュに格納する。Frontendは選ばれたWebWorkerにパケットを転送する。
    image
  7. WebWorkerに対してリクエストが投げられたが、この段階ではWebWorkerにはコンテンツが何もない。
    image
    WebWorkerはRuntimeデータベースと通信し動的にサイトを構築する。具体的にはアプリケーションコンフィグを作成する。WebWorkerはsite1の実態を作り出す。
    image
  8. サイトの中身は、File Serverを経由してVHDファイルを持ってくる。サイトのコンテンツによっては、サイトごとにデータベースを持っているので、SQLにデータを発行してデータベースを作成する。
  9. サイトが作成されたのでFrontendにHtml、XMLのフォーマットで返す。
    image

サイト呼び出し(Hot)

前の手順は複雑で時間がかかる。すでに一度WebWorkerの上にサイトが作成された場合について説明する。

  1. AzureのロードバランサーからFrontendにリクエストが飛ぶ。
  2. Frontendは、どのWebWorkerにsite1が乗っているかを知っているので、Runtimeのデータベースにアクセスせずに直接WebWorkerにパケットを投げる。
  3. WebWorkerも情報を持っているので、データベースを参照せずFileServerを見に行く。変更がなければFile ServerにキャッシュされているのでVHDにアクセスしにいきません。
    blobsは容量は大きいがローカルディスクに比べて遅いので、キャッシュしてアクセスを減らすようにしている。
    image

この仕組みがあるだけで、エクストララージでホストされているWebWorker1つで、1000以上のサイトを軽くホスティングすることができる。DWSがこのサービスの肝になっている。
データベースがパフォーマンスのボトルネックとなるので、サイトがすでに出来上がっている場合は、データベースへのアクセスを抑えるように実装されている。Runtimeのデータベースがダウンするとシステム全体がダウンしてしまうので、システムの弱いところとなっている。

もっと厄介なのがサイトと直接通信するSite DB。こちらはコンテンツ(CMS)次第なので手出しができない。CMSによっては秒間数百のトランザクションを発行させるので、1つのWebWorkerにいくつもホストされるとスロットリングを起こしてしまい、ほかのサイトまでアクセスできなくなってしまう。
問題解決が困難なのでSQLのアクセスだけは、移し替えてある。

※行間を勝手に補足して想像してみると……。
同一のWebWorkerから、SQL Databaseに大量にアクセスすると、SQL Detabaseのスロットリングサービスの対象になってしまう。
根本解決が困難なので、SQL Databaseにアクセスするサイトは別のWebWorkerに載せ替えて、高速に動作するようにしている。高速に動作すればSQLの問い合わせ時間が短くなるのでスロットリングサービスの対象になりにくい……ってことかな?
じゃ、Dos Guardの対象にもなっちゃったりするのかな?さすがに無いか……。

Stampの内部構造

Stampの内部構造は、次の要素で構成されている。

image

API endpoint Stamp内のAPIエンドポイントがStamp内のサイト作成などをつかさどっている。
Frontend IIS ARR上に実装されたロードバランサー
WebWorker WebWorkerのインスタンスの上でサイトのコンテンツが読み込まれ動作している。シェアとかリザーブなどいくつかある種類は、WebWorkerの種類を指している。
Runtime DB SQL Databaseには、Runtimeの情報を保存している。
Publish endpoint WebDeployとかFTPなどの外からのリクエストを受け取るエンドポイント。FTPは、データのパスとコントロールのパスと2つセッションをはるが、Azureのロードバランサーはラウンドロビンでしか動かないので、Publish Endpointのインスタンスが複数あると分離されてしまってうまく動かないことがあるので、Publish endpointはAzure内ではあるがIPが固定されている。
File Server VHD Blobsに対してproxyの役割を果たすインスタンス。

上の図では、赤い四角1つしか書いてないところがあるが、全部複数のインスタンスを使用している。赤い四角を全部足して、1つのStampごとに1000インスタンスぐらい動作していて、今全部で5000インスタンスぐらい動いている。

ストレージ

コンテンツは、BlobのVHD上に格納されている。
File Serverは、VHDをドライブとしてマウントしている。File Serverは全部のVHDをマウントしている。File Serverには、必ずスペアの空いているスタンバイ用のFile Serverを用意している。
image
File Serverに障害が発生したら、スペアのFile Severが切り離されたVHDをマウントしてダウンタイムを少なくしている。現在は切り替えに30秒ほどかかるので、短くしたいと考えている。
image

現在のAzureドライブの仕様上限である1TBのVHDをたくさん保持している。1TBのVHDファイルを1つのStorageに100個までしか保存できないので、全部で100TBしかない。サブスクリプション辺りの容量が1GBなので、10万人程度しかホストできない。
なので、たくさんグループ化して使用するようにしている。これで無制限の容量を使用できるようになる。
image

リージョンとサイト

「East USしか選べない」
「West USしか選べない」と言う質問がある。
一番最初にサイトを作成するときは、3~4か所から選べたが、一度選んでしまうと以後は、そのリージョンにしか作成できないようになっている。

サブスクリプションが課金単位。Websitesの中に、Webspaceという概念があり、ユーザー割り当て単位となっている。1つのサブスクリプションには1つのWebspaceという制約となっており、1つのWebspaceの中に最大10個までのWebsiteを作成できる。(これは実装上の問題なので、将来的には変更する可能性が高い。)

image

Websitesはいろんなことができる

WEBMARIXをクリックすると自動的にPublish設定ファイルをダウンロードしてきて、サイトを発行できる。

image

空っぽのサイトを作成。
image

App_Codeというディレクトリを作成して、クラスを作成する。クラスを作成するとPublishした先で自動的にコンパイルして実行されるので便利。

image

リファレンスを追加。

image

クラスに追記。

image

スタートしていないので修正。

image

もっかい修正。

image

Defaultに記載。

image

image

デバッグするために、詳細エラー表示のためcustomErrosをoffに変更。

image

最後は、デバッグ過程であれやこれやとなったのでファイル名を変更して無事完了。

image

image

こんな感じで、プロセスを実行することもできる。
system32も見える。
他のサイトのコンテンツとかクラウドサービスは見えないようになっていたり、ローカルでWebsocketsを開いたり、セキュリティホールになりそうなものはプロテクションしている。
その範囲を除いて、いろいろできる。
notepadとか起動すると返ってこなくなってしまうので注意が必要。

監視系

独自の監視を作りこんでいる。
Azureがモニタリングのインフラを提供しているので、それを採用している。
各コンポーネントに対して、Azureインフラでモニタリングしている。

さらにAzureのロードバランサー経由で、外側からFrontendやPublisherに対してデプロイしたりアクセスしたりして正常に動作しているかを確認している。

全世界にインスタンスを置いて相互に死活監視をしてくれるゴメスというマイクロソフト外部のサービスを活用して死活監視をしている。

image

Failすると大量のメールが…。多いと一日1000通とかくる。
//マイクロソフトも開発者側への通知はメールなんだなぁ……。

image

開発プロセス

アジャイル開発で、1つのスプリントは3週間から長くても6週間。
バックログからフィーチャ洗い出しして、優先順位つけて実装するフィーチャを決定する。
スクラムは毎日短いミーティングをして情報共有している。
進捗を細かく確認しながら進める。
最初は30人全員でやっていたが、今はフィーチャごとに細かくチームを分けてスクラムを実施している。

image

テスト

以下のテストをすべて自動化していて、河野さんテスターチームは、テスト用コードを書くお仕事。自動化するメリットは、一度動いてしまえば以後は自動的にテストできる。

  • 機能テスト
  • End-to-endシナリオテスト
  • ストレステスト
  • パフォーマンステスト
  • 可用性テスト
  • セキュリティテスト
  • アップグレードテスト
  • アプリケーション互換性テスト

テストフレームワークは、(TFS便利だなぁ使おうかなと思った)作るのが好きなので、基本全部自分たちで作ってしまう。当然、ほかのチームが開発したもので使用できるものは使用する。再利用しやすいテストコードを書いている。

アップグレード

Azure固有の機能を使用しないという原則があるので、次のようなアップグレードとなっている。

  • VIP swap不使用
  • ダウンタイム ゼロ
  • データベースのフリーズなし

アップグレードには注力していて、完璧と言えるまでは決してアップグレードを実施しない。サービスがダウンしないように注力している。

まとめ

クラウドとは?
クラウドとは何かを定義していません。
ユーザー含めて、みんなで使っていくものだと思う。
どんどん使ってフィードバックください。フィードバックに飢えています。

面白い使い方を教えてください。
教えてもらえると、チーム側のインプットになる。

クラウドは生もの。

Windows Azure

分散ストレージ技術を使用したNOSQL型のOSSであるriakをWindows Azure Virtual Machineにインストールする方法が紹介されていたので、ざっくり意訳してみた。

ざっくりとしたインストール手順は次の4ステップ。

  1. Windows Azure Previce Management Portalを使用してCentOSの仮想マシンを作成する
  2. PuttyやSSHを使用してCentOS仮想マシンに接続する
  3. シェルスクリプトを使用してCentOSとRiakを設定する
  4. Riakのクラスター化とテストデータをロードする

CentOS仮想マシンを作成する

Windows Azure Virtual Machine Preview機能をサインアップする。

仮想マシンをWindows Azure上に作成するには、Windows Azure Virtual Machine Previewに申し込む必要があります。もし、まだWindows Azureアカウントを持っていないなら、フリートライアルアカウントをサインアップすることもできます。

  1. https://account.windowsazure.com/ に移動し、Windwos Azureアカウントでインストールする
  2. アカウント→プレビュー機能をクリックする。Virtual Machine & Virtual Networkをクリック。
    image

CentOS Linuxが動作する仮想マシンを作成する

  1. Windows Azure Preview Management PortalにWindows Azureアカウントでログインする
  2. Managementポータルで、ページの左下の「+NEW」をクリックする。
    image
  3. [Compute]-[Virtual Machine]を選択。
    image
    [From Gyallery]を選択する。
    image
    [PLATFORM IMAGE]-[OpenLogic CentOS 6.2]を選択する。右下の矢印ボタンをクリックする。
    image
  4. VM Configurationページで、次の情報を設定します。
    CONNECT TO EXISITING VIRTUAL MACHINE
    Virtual Machine Name:「testlinuxvm」
    User Name:「newuser」
    Password:強力なパスワードを入力
    Confirm Password:パスワードの再入力
    ドロップダウンリストからサイズを選択する
    image
  5. VM Modeページで、次の情報を設定します。
    STANDALONE VIRTUAL MACHINEを選択する。
    DNS名に、任意のDNS名を入力する。たとえば、「testlinuxvm」
    Storage Accountで、Use Automatically Generated Storage Accountを選択する
    REGION/AFFINITY GROUP/VIRTUAL NETWORKで、仮想マシンのイメージをホストするリージョンを選択する。
  6. VM OptionページのAvailability Setで、noneを選択する
  7. Windows Azure上に仮想マシンの準備が完了します。

エンドポイントの設定

Windows Azure 仮想マシンにリモート接続するには、必ずエンドポイントを設定しなければなりません。

  1. Management Portalで、Virtual Machineを選択し、新しい仮想マシン名を選択し、Endpointを選択します。
    image
  2. エンドポイントの設定ページの下部の「Edit Endpoint」ボタンを選択します。パブリックポート22番のSSHエンドポイントの設定をします。
    image
  3. [Add Endpoint]ボタンを選択し、次の情報を設定します。
    riak_web
    TCP
    8098
    8098
    image

CentOS仮想マシンにPuttyかSSHで接続する

SSHかPuttyを使用して設定したEndpointで仮想マシンに接続します。
Linux/Macユーザー

$ ssh newuser@testlinuxvm.cloudapp.net -o ServerAliveInterval=180

シェルスクリプトを使用してCentOSとRiakの設定をする

次のコマンドを入力する。

sudo su –

curl –s https://github.com/glickbot/riak_on_azure/blob/master/azure_install_riak.sh|sh

参考情報

https://github.com/glickbot/riak_on_azure

SQL Azure

新しいWindows Azure SQL Databaseのサービスアップデートが発表されました。
主な新しい機能は次の通り。

  • Windows Azure SQL DatasebaseをSQL Serverのリンクサーバーと分散クエリの対象にすることができるようになった
  • Windows Azure SQL Databaseで再起トリガーに対応
  • Windows Azure SQL DatabaseでDBCC SHOW_STATISTICSに対応
  • データベースレベルでWindows Azure SQL Databaseファイヤーウォールルールを設定できるようになった
    • Azure SQL Databaseをリンクサーバーと分散クエリの対象にできる

      Windows Azure SQL Databaseをリンクサーバーに追加できるようになり、それを使用してオンプレミスとクラウド間で、分散クエリを発行できるようになりました。

      従来はODBC~OLEDBプロキシを使用することで分散クエリを発行できましたが、パフォーマンスに難がありました。

    オンプレミスとクラウド間で分散クエリを発行できるようになったということは、
    オンプレミスのデータベースのテーブルと、クラウドのデータベースのテーブルとを
    結合するようなクエリを発行できるということです。

    image

    リンクサーバーの設定

    次のクエリを、オンプレミスのSQL Serverで実行します。
    なお今回の対応は、オンプレミスとクラウド間のリンクサーバーと分散クエリの対応なので、
    クラウドとクラウドは対応していません。
    Azure SQL Databaseにクエリを発行して、リンクサーバーを定義しようとしてもはじかれます。

    リンクサーバーを定義します。

    EXEC sp_addlinkedserver
    @server=’nora’, — 任意のリンクサーバー名を指定する
    @srvproduct=”,    
    @provider=’sqlncli’, — SQL Server native clientを使用します
    @datasrc=’xxxxxx.database.windows.net’,   — Azure SQLのサーバー名を指定する
    @location=”,
    @provstr=”,
    @catalog=’AdventureWorksDWAZ2008R2’  — データベース名を指定する

    リモートサーバー(Azure SQL Database)の認証情報を設定します。

    EXEC sp_addlinkedsrvlogin
    @rmtsrvname = ‘nora’, — 上で指定したリンクサーバー名を指定する
    @useself = ‘false’,
    @rmtuser = ‘userName’,             — ログイン名を指定する
    @rmtpassword = ‘P@ssw0rd’ — パスワードを指定する
    EXEC sp_serveroption ‘nora’, ‘rpc out’, true;

    この2つのクエリを発行すると、オンプレミスのSQL Serverにリンクサーバーを定義できます。
    SQL Server Management Studioのオブジェクトエクスプローラーで確認できます。

    image

    この状態で、オンプレミスのSQL Serverに対して次のようなクエリを発行できるようになります。

    select *
    into test
    from nora.AdventureWorksDWAZ2008R2.dbo.DimDate

    Windows Azure SQL Databaseのテーブルからデータを取得して、それをオンプレミスのテーブルに格納しています。
    当然、クエリの結合も可能です。

    リンクサーバーの詳細については、http://technet.microsoft.com/ja-jp/library/ms188279.aspxを参照してください。

    再起トリガーの作成

    再起トリガーを実行できるようになりました。
    データベースの既定値がONになっているので、再起トリガーを実行できる状態になっています。
    再起トリガーの有効、無効の切り替えは次のクエリで実行できます。

    ALTER DATABASE YOURDBNAME SET RECURSIVE_TRIGGERS ON|OFF;

    再起トリガーの詳細については、http://msdn.microsoft.com/ja-jp/library/ms190739.aspxを参照してください。

    DBCC SHOW_STATISTICSが使用できる

    Windows Azure SQL Databaseで、どのような統計情報が生成されているのかを確認できるコマンドを使用できるようになりました。
    詳細は、http://msdn.microsoft.com/ja-jp/library/ms174384.aspxを見てください。
    //ムッシュBlogによると前からつかえたような…?

    Azure SQL Databaseでデータベース毎にFirewall設定ができる

    Azure SQL Databaseでデータベース毎にFirewall設定ができるようになりました!」で、案内している通り、データベース毎にルール設定できます。
    詳細は、http://msdn.microsoft.com/ja-jp/library/windowsazure/ee621782.aspxを参照してください。これBlogで告知し忘れていた?のか、今さらなアピールですね。

    image

    情報源

    Announcing Updates to Windows Azure SQL Databaseを参照しました。

    SQL Azure

    SQL Azureと呼ばれていたWindows Azure SQL Databaseのサービス内容合意書(SLA)では、マイクロソフトが管理できない外的要因からのデータ消失への対応は例外扱いにしています。
    外的要因とは、戦争や空爆、暴動、犯罪もしくは、地震や噴火、洪水のような自然災害などです。
    これらによりデータセンターがダメージを受け、レプリカやオンサイトバックアップからデータをリカバリできなくなることがあります。
    現在、Windows Azure SQL Databaseはオフサイトバックアップを取得していません。

    SQL Database チームは、SQL Databaseでのビジネス継続性の維持に関する素晴らしいガイドラインを提供しています。

    この投稿では、他のリージョンにあるWindows Azureデータセンターで稼働しているWindows Azure SQL Databaseにオフサイトバックアップを簡単に取得する方法について説明します。
    Windows Azureポータルを使用して、データ層アプリケーションロジカルバックアップ(BACPAC)を他のデータセンターにあるWindows Azure Storageへエクスポートします。

    Windows Azure SQL Databaseのコピー作成

    BACPACは論理バックアップで、トランザクションは考慮されません。
    ユーザーがデータベースに書き込みをしている際にBACPACを取得すると、BACPACはデータ不整合が発生する可能性があります。たとえば、外部参照キーの不整合などがありえます。
    そのため、最初にデータベースのコピー(Windows Azure SQL Database Copy)を作成し、作成したデータベースのコピーからエクスポートを実行する必要があります。
    データベースのコピーはトランザクションが考慮されます。

    1. SQL Server Management Studioを使用してWindows Azure SQL Databaseに接続します
    2. オブジェクトエクスプローラーでエクスポートしたいデータベースを選択し、
      右クリックから「新しいクエリ」を選択します。
    3. クエリウィンドウで次のクエリを入力します。
      CREATE DATABASE <destination_database_name> AS COPY OF <source_database_name>
    4. このコマンドを実行すると、すぐに結果が返ってきます。
      しかし、Windows Azure SQL Databaseはバックグラウンドでコピーを処理しています。
      コピーの実行上状況は、sys.dm_database_copiessys.databasesビューでモニタリングすることができます。
    5. コピーが完了したら、コピーしたデータベースからBACPACを作成します。
      コピーしたデータベースには、INSERTやUPDATE、DELETEは実行しないように注意してください。

    データベースコピーについては、「データベース・コピーを使用してSQL Azureデータベースをバックアップする」も参照してください。

    Windows Azureポータルを使用したBACPACファイルの作成

    Windows Azureポータルを使用すると、Windows Azure SQL Databaseから直接Windows Azure Storage BlobにBACPACファイルを出力することができます。

    出力方法については、「管理ポータルからSQL Azureデータベースのインポート/エクスポート」を参照してください。

    情報源

    Prevent Data Loss from Force Majeure」をざっくりと大胆にまとめた記事です。

    SQL Azure

    SQL Data Sync(旧称:SQL Azure Data Sync)Preview 6がリリースされました。
    このリリースでは、おもに次の2点改善されています。

    • 同期タスクと初期プロビジョニングの性能が改善されました
    • オンプレミスのデータベースとWindows Azure SQL Database間の同期性能が改善されました

    新しいエージェントを、「SQL Azure Data Sync Agent Preview」からダウンロードできます。

    また、すべての後続のプレビューリリースを通常のサービスアップデートの代わりに、Previewと呼称するつもりです。

    情報源

    SQL Data Sync Preview 6 is now live!