Windows Azure Tips from Prospex

システム開発 × インフラ構築・運用 × グラフィックデザイン = プロスペックス

SQL Azureがサブスクリプション間で移動できるように

clock April 20, 2012 19:53 by author tanaka

 

2011年3月7日から、異なるサブスクリプション間でSQL Azureサーバーが容易に移動できるようになったようです。

Windows Azure管理ポータルから操作でき、無料評価版等で、利用していたSQL Azureサーバーを

そのまま他のサブスクリプションに移行したり、SQL Azureサーバーの費用を特定のサブスクリプションに集約/分散することが可能とのこと。

便利だなと思います。



Azure上でPowerShellを利用

clock March 8, 2012 21:45 by author tanaka

 

今回実現したいこと
Azureプロジェクトに含めたPowerShellファイルで構成ファイル(ServiceConfiguration.cscfg)のSetting要素から値を取得する。

ServiceConfiguration.cscfgファイル

-------------------

<ServiceConfiguration serviceName="WindowsAzureProject" xmlns="http://schemas.microsoft.com/ServiceHosting/2008/10/ServiceConfiguration" osFamily="" osVersion="">
  <Role name="WebRole1">
    <Instances count="1" />
    <ConfigurationSettings>
      <Setting name="MailServer" value="" />
    </ConfigurationSettings>
  </Role>
</ServiceConfiguration>

-------------------


PowerShellのファイル

上記構成ファイルのMailServerの値を取得したい場合、以下のようにする。

-------------------

[void][Reflection.Assembly]::LoadWithPartialName("Microsoft.WindowsAzure.ServiceRuntime")

$mailServer = [Microsoft.WindowsAzure.ServiceRuntime.RoleEnvironment]::GetConfigurationSettingValue("MailServer")

-------------------



SQL Azureへの接続について

clock January 26, 2012 11:19 by author tanaka




SQL AzureはSQL Serverと違って、負荷分散されているため、
データベースがサーバー間を移動することがあるので、
DBへのコネクションは再接続を考慮して作成しなければいけないようだ。

コネクションリトライを組み込んだコードは以下で紹介されています。
http://blogs.msdn.com/b/bartr/archive/2010/06/18/sql-azure-connection-retry.aspx



Azure上でWAPPSCmdletsを利用2

clock December 21, 2011 16:14 by author tanaka

 

今回も前回同様Azure上でWAPPSCmdletsネタ

PowershellでWAPPSCmdletsを利用する場合
まず、WAPPSCmdletsをインストールしてあげないといけない

※インストール方法は、以下のブログを参考にさせていただきました。
http://blogs.gine.jp/kusa/archives/1645

それで、今回はAzure上でWAPPSCmdletsを利用できる
ようにするわけなので、Azure上の仮想サーバーにもインストールする
必要がある。

私の場合以下の方法で対応

WAPPSCmdletsはインストール時に、SnapinかModuleか選択できるから、
Moduleを選択

以下のDLLができる
Microsoft.WindowsAzure.Samples.ManagementTools.PowerShell.dll

これをデプロイ予定のAzureのプロジェクトで参照する

参照したら、プロパティでローカルコピーをTrueに
しておく、

image


binフォルダの下に出力されるようになるので、
AzureのStartupタスクを利用してこのdllを.NetFrameWorkに追加してあげる
(Azure上で、プロジェクトがデプロイされる箇所は、E:\approot下)

IF EXIST %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe %SystemRoot%\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe E:\approot\bin\Microsoft.WindowsAzure.Samples.ManagementTools.PowerShell.dll
IF EXIST %SystemRoot%\Microsoft.NET\Framework64\v2.0.50727\InstallUtil.exe %SystemRoot%\Microsoft.NET\Framework64\v2.0.50727\InstallUtil.exe E:\approot\bin\Microsoft.WindowsAzure.Samples.ManagementTools.PowerShell.dll

すると、Startupタスクで呼び出すようにしたPowershellのスクリプトに
Add-PsSnapin WAPPSCmdletsと記述すれば、Azure上で利用可能となった。

おわり



Azure上でWAPPSCmdletsを利用する。

clock December 16, 2011 20:30 by author tanaka

 

AzureをPowershellで管理する際に利用するWAPPSCmdlets

Azure上で利用する場合どうするのか?


コマンドレットを利用する場合は、以下の情報が必要
1.サービス名 → ホステッドサービスの名前
2.サブスクリプションID
3.サービス証明書

※サービス証明書は、対象ホステッドサービスの証明書を右クリックして追加

image 

$serviceName = "chargemeter" 
$subscriptionId = "サブスクリプションID" 
$mgmtCert = Get-Item cert:\CurrentUser\MY\<サムプリント>

※サムプリントは、ポータルサイトの管理証明書で確認できる。


Azure上でサービス証明書を取得する方法に悩んでいた。

ローカルで、コマンドレットを利用する場合
こんな風に取得していた。
Get-Item cert:\CurrentUser\MY\*


Azure上では取得できない、


正解は、
Get-Item cert:\LocalMachine\My\*

これで、Azure上の証明書を取得できました。



AzureのStartupタスクでLogParserを利用

clock November 12, 2011 14:59 by author tanaka


今回テストしてみたこと

AzureのStartupタスクでLogparserを利用して、IISログの集計をSQL Azureにインポートする。

Webロールへの配置は、以下のような感じ
WebRoleにStartupタスクで利用する。startup.cmd、LogParser.exe、logparser.bat、ログファイル(u_ex111102.log)を配置
※本当は、Azure上で出力されるIISログを集計するつもりだが、まずはLogParserがAzure上で稼働するかどうかが、今回の目的なので、
とりあえず今回はプロジェクトにテストようのログファイルも含める。
あと、WebRoleに含めたStartupタスク用のファイルはapproot/bin下にコピーされるように、出力ディレクトりにコピーするように設定
もちろんビルドアクションはなし

image



それぞれのファイルに記載されている内容

Startup.cmdファイルはとりあえず1分ごとにlogparser.batを実行するタスクを登録
リモートスクトップで確認したら、デフォルトではタスクスケジューラのサービスは起動していなかった
なので、サービスを起動してあげるひつようがあるのです。net startの部分

-------------
@echo off

net start Schedule

SCHTASKS /Create /SC MINUTE /MO 1 /TN AzureLogparser /TR "%~dp0logparser.bat" /RU "NT AUTHORITY\NETWORKSERVICE" /F

exit
-------------


logparser.batファイルはLogParserを利用してIISログを集計して、SQL Azureにインポートする

-------------
@echo off

SET CURRENTDIR=%~dp0
SET LOGPARSER=%CURRENTDIR%LogParser.exe
SET INPUTFILE=%CURRENTDIR%u_ex111102.log
SET OUTPUTFILE=ServerTransferTest

%LOGPARSER% -i:IISW3C -o:SQL "SELECT EXTRACT_TOKEN(cs-uri-stem, 1, '/') AS TenantCode, Min(TO_TIMESTAMP(date, time)) as DateFrom,
Max(TO_TIMESTAMP(date, time)) as DateTo, SUM(sc-bytes) AS TransferSize, 1 as Deleted, TO_TIMESTAMP(SYSTEM_DATE(),SYSTEM_TIME()) as CreatedDate, 'batchuser' as CreatedUser, TO_TIMESTAMP(SYSTEM_DATE(),SYSTEM_TIME()) as ModifiedDate, '' as ModifiedUser INTO %OUTPUTFILE% FROM %INPUTFILE% Group by EXTRACT_TOKEN(cs-uri-stem, 1, '/')" -driver:"SQL Server" –Server<接続先のSQL AZURE> –username<ユーザー名> –password<パスワード> -database:<DB名> -ignoreIdCols:on
-------------


後はプロジェクトの定義ファイルServiceDefinition.csdefにStartupタスク実行用の構成を追加

-------------
<Startup>
<Task commandLine="Startup.cmd" executionContext="elevated" taskType="simple" />
</Startup>
-------------


準備が整ったので、デプロイ

結果、リモートデスクトップで確認すると、タスクスケジューラに登録されていることが確認できる。

image


SQL Azureにもインポートされたことがわかる。

image



これで、StartupタスクからLogParserを実行できることが分かったので、後はAzure上のIISログを処理するようにすればよい

AzureのIISログが出力される場所は以下のパスとなるから、
CmdLetを間にかませて処理してあげればいいと考えている。

C:\Resources\Directory\" + $_.DeploymentId + "." + $_.RoleName + ".DiagnosticStore\LogFiles


今日はここまで。



クラウドストレージの料金、最大容量制限を比較

clock August 8, 2011 20:11 by author tanaka

クラウドストレージの比較表を作成しました。

クラウドストレージ比較表(料金、最大容量等)

Windows Azure Storage

Amazon S3

Google Storage for Developers

ストレージ保管料金

$0.15/GB

$0.15/GB

$0.17/GB

トランザクション

$0.01 per 10,000 storage transactions

GET, HEAD requests: $0.01 per 10,000
PUT, POST, LIST* Requests: $0.01 per 1,000 Requests

GET, HEAD requests: $0.01 per 10,000
PUT, POST, LIST* Requests: $0.01 per 1,000 Requests

データ転送料金

Upload

$0

$0.10/GB

$0.10/GB

Download

Asia Pacific Region: $0.20 per GB out

$0.17/GB

$0.30/GB

単体ファイルの最大アップロード可能サイズ

1TB

5TB

不明

ストレージの最大容量

100 TB

上限なし

不明


1TB分のファイルをアップロードして1ヶ月間保管した場合

Windows Azure Storage

Amazon S3

Google Storage for Developers

ストレージ保管料金

$153.60

$153.60

$174.08

トランザクション(※1)

$1.00

$10.00

$10.00

データ転送料金

Upload

$0.00

$0.00

$102.40

Download(※2)

$2.00

$1.70

$3.00

合計金額

$156.60

$165.30

$289.48


2TB分のファイルをアップロードして1ヶ月間保管した場合

Windows Azure Storage

Amazon S3

Google Storage for Developers

ストレージ保管料金

$307.20

$307.20

$348.16

トランザクション(※1)

$2.00

$20.00

$20.00

データ転送料金

Upload

$0.00

$0.00

$204.80

Download(※2)

$4.00

$3.40

$6.00

合計金額

$313.20

$330.60

$578.96

 

(※1)1TBのアップロード時は1000000トランザクション、2TBのアップロード時は2000000トランザクションと仮定して計算
(※2)データ転送料金(DownLoad)は1TBの時は10GB、2TBの時は20GBと仮定して計算



ブロブについてまとめます。

clock June 27, 2011 19:36 by author tanaka

 

■ブロブの構造

1.ストレージアカウント

ストレージサービス全体を束ねる最上位概念です。

2.コンテナ

ブロブを束ねるフォルダのようなもの
ただし、コンテナの配下にコンテナを配置することはできません。
コンテナには共有ポリシーを設定することができます。

3.ブロブ

データ本体です。ブロブは以下のようなURIで表現できます。

http://<アカウント名>.blob.core.windows.net/<コンテナ名>/<ブロブ名>


■ブロブの分類

1.ディレクトリブロブ

  ブロブサービスはコンテナによってブロブを分類できます。
  ただし、コンテナの中にサブコンテナを作ることはできないため、
  管理するブロブ数が多くなった場合に分類にこまることも出てきます。

  Azureライブラリでは仮想的にディレクトリという概念を提供しています。

例えば「img/test.jpg」とすればあくまで「img/test.jpg」は一つの名前ですが、
「/」を区切り文字とすることで、この例であればimgをディレクトリ名とみなすことができるので
ディレクトリの配下にディレクトリを配置することがきます。

2.ブロックブロブ

ブロブは性質上、GBレベルのファイルを扱うこともありますので、
このようなファイルをまとめてアップロードしようとすると、極端に時間がかかります。
そもそもネットワークの問題でアップロード自体が失敗することもあります。

このような時、ブロブをブロック分割することで、アップロードに失敗した場合も特定のブロックだけ
再アップロードでき、複数のブロックを並行してアップロードできるので、アップロードの時間を短縮できるようになります。

3.ページブロブ

ほかにブロブはページという512バイト(固定長)の単位で分割することもできます。
ページ分割されたブロブのことをページブロブと呼びます。

最大の特徴は、ブロブにランダムにアクセスできるという点です。
この点を利用し、大容量ファイルをページ分割しながら部分取得し、途中で転送エラーが
発生した場合には、エラー発生箇所から再転送を開始するということが可能になります。

また、ブロブから必要に応じて特定範囲のデータだけを取り出して処理するなどの用途もあります。


■ブロブのバックアップ(スナップショット)

アプリケーションエラーやエンドユーザーによる操作ミスによるデータ破損などに対して、
バックアップ用途で利用できる、スナップショット機能があります。

スナップショットとは読み取り専用のブロブのことで、コピーや削除は行えますが、
更新処理はできません。

またスナップショットでは、オリジナルのブロブ(ベースブロブ)から更新されたブロック/ページ
についてのみ課金されるというメリットがあります。

もちろん、スナップショットをベースブロブにロールバック(昇格)することもできます。



Windows Azure AppFablic キャッシュサービスの検証1

clock June 10, 2011 20:44 by author tanaka

 

AppFablic キャッシュを利用したアプリケーションを検証しようということで、以下のサイトを参考にして検証してみます。

http://msdn.microsoft.com/ja-jp/magazine/gg983488.aspx

AppFabric キャッシュのセットアップ

Windows Azure AppFablic キャッシュを使うためにまず、以下のサイトにアクセスします。
(キャッシュ サービスについて知ることができる CTP ポータルで、無償)

portal.appfabriclabs.com

ポータルにログインしたら、Cache(キャッシュ)オプションを選択

image

New Namespace(新しい名前空間)をクリックして新しいキャッシュを作成します。

image

一意のサービス名前空間とキャッシュのサイズ (CTP 版では、128 MB と 256 MB のいずれかを選択)

image

※キャッシュが作成されたら、キャッシュのプロパティを確認できます
(後でコードで使用するために把握しておくべき情報として、サービス URL と認証トークンも表示されます。)

アプリケーションでキャッシュを行う


コーディングを開始する前にまず、Windows Azure AppFabric SDKのダウンロードを行います。
go.microsoft.com/fwlink/?LinkID=184288

上記サイトからダウンロードしたSDKをインストールします。

image

頑張ってインストールしています。

image

無事完了しました。

image


インストールが完了しましたので、コンソールアプリ(CacheDemoを作成)
プロジェクトのプロパティ(コンパイル)画面の詳細コンパイルオプションボタンをクリック
コンパイラの詳細設定で対象のフレームワークをデフォルトのClient Profileから
.Net FrameWork4に変更

image

image

C:\Program Files\Windows Azure AppFabric SDK\V2.0\Assemblies\NET4.0\Cacheにインストール
された2 つのアセンブリを追加
Microsoft.ApplicationServer.Caching.Client
Microsoft.ApplicationServer.Caching.Core

image

準備は整いましたので、次回実装したいと思います。



Baukupファイルの保存先としてAzureのBlobはどうだろう

clock May 23, 2011 21:21 by author Tanaka

 

ということで、まずはAzure Blobへバックアップファイルを持ってくのにどれくらい時間がかかるか測定してみよう。

結論から、今回は1.83GBのバックアップファイルでアップロードに36分かかりました。

ちなみに、今回アップロードしたデータセンターはイーストアジア(香港)で、
上記結果から帯域幅は約7.27Mbpsです。

帯域幅の計算方法(今回はMbpsを算出します。)
1.83(GB)×1024×1024×1024×8÷1000÷1000÷2160(秒)

時間かかるから、バックアップの対象は絞って、ファイル分割して保存する必要があるなー。

以下Azureへアップロードするだけのクラスと時間測定のコード

1.Azure上へアップロードするクラス

   1: Imports Microsoft.WindowsAzure
   2: Imports Microsoft.WindowsAzure.StorageClient
   3: Imports Microsoft.WindowsAzure.ServiceRuntime
   4:  
   5: Namespace AzureStorage
   6:  
   7:     Public Class BlobUploder
   8:  
   9: #Region "プライベート変数"
  10:  
  11:         Private blobStorage As CloudBlobClient
  12:         Private _connection As Microsoft.WindowsAzure.StorageCredentialsAccountAndKey
  13:         Private _container As CloudBlobContainer
  14:         Private _blobName As String
  15:  
  16: #End Region
  17:  
  18: #Region "プロパティ"
  19:  
  20:         ' ブロブコンテナ名 コンストラクタ
  21:         Public WriteOnly Property containerName As String
  22:             Set(ByVal value As String)
  23:                 _blobName = value
  24:             End Set
  25:         End Property
  26:  
  27: #End Region
  28:  
  29: #Region "パブリックプロパティ"
  30:  
  31:         '
  32:         Public Sub New(ByVal account As String, ByVal key As String)
  33:             _connection = New Microsoft.WindowsAzure.StorageCredentialsAccountAndKey(account, key)
  34:         End Sub
  35:  
  36:         ' ブロブストレージ作成 ブロックブロブへのアップロード
  37:         Public Sub SetCloudBlobContainer(ByVal blobUri As String)
  38:  
  39:             blobStorage = New CloudBlobClient(blobUri, _connection)
  40:             _container = blobStorage.GetContainerReference(_blobName)
  41:             _container.CreateIfNotExist()
  42:  
  43:             Dim permissions = _container.GetPermissions()
  44:             permissions.PublicAccess = BlobContainerPublicAccessType.Container
  45:             _container.SetPermissions(permissions)
  46:  
  47:         End Sub
  48:  
  49:         '
  50:         Public Function Upload(ByVal uploadFileUri As String) As Boolean
  51:  
  52:             Try
  53:                 Dim name = String.Format("{0:10}_{1}", Date.Now.Ticks, Guid.NewGuid())
  54:                 Dim blob = blobStorage.GetContainerReference(_blobName).GetBlockBlobReference(IO.Path.GetFileName(uploadFileUri))
  55:  
  56:  
  57:                 Using fs As New System.IO.FileStream(uploadFileUri, System.IO.FileMode.Open, System.IO.FileAccess.Read)
  58:  
  59:                     blob.UploadFromStream(fs)
  60:  
  61:                 End Using
  62:  
  63:             Catch
  64:  
  65:                 Return False
  66:  
  67:             End Try
  68:  
  69:             Return True
  70:  
  71:         End Function
  72:  
  73: #End Region
  74:  
  75:     End Class
  76:  
  77: End Namespace

 

2.アップロードして、時間測定

   1: Imports BakupLib.AzureStorage
   2: Imports System.Configuration
   3: Imports System.Diagnostics
   4: Imports System.IO
   5:  
   6: Module Module1
   7:  
   8:     Sub Main()
   9:  
  10:         Dim command As String = Microsoft.VisualBasic.Command()
  11:         Dim args() As String = command.Split(",")
  12:         Dim blobContainerName As String = args(0)
  13:         Dim blobContainerUri As String = args(1)
  14:         Dim serachDir As String = args(2)
  15:  
  16:         Dim blob As New BlobUploder(ConfigurationManager.AppSettings("ACCOUNT"), _
  17:                                     ConfigurationManager.AppSettings("KEY"))
  18:  
  19:         blob.containerName = blobContainerName
  20:         blob.SetCloudBlobContainer(blobContainerUri)
  21:  
  22:         Dim sw As New Stopwatch()
  23:  
  24:         sw.Start()
  25:         Dim bSuccess As Boolean
  26:         bSuccess = blob.Upload(searchUploadFile(serachDir))
  27:         sw.Stop()
  28:  
  29:         Console.WriteLine(sw.Elapsed)
  30:         Console.ReadLine()
  31:  
  32:     End Sub
  33:  
  34:     ' ディレクトリからアップロード対象の最新ファイルを取得する
  35:     Private Function searchUploadFile(ByVal dirUri As String) As String
  36:  
  37:         Dim directoryInformation As New DirectoryInfo(dirUri)
  38:  
  39:         Dim i As Integer = 0
  40:         Dim file As FileInfo = Nothing
  41:  
  42:         For Each item As FileInfo In directoryInformation.GetFiles
  43:  
  44:             If i = 0 Then
  45:                 file = item
  46:             End If
  47:             If file.LastWriteTime > item.LastWriteTime Then
  48:                 file = item
  49:             End If
  50:  
  51:             i = i + 1
  52:  
  53:         Next
  54:  
  55:         Return file.FullName
  56:  
  57:     End Function
  58:  
  59: End Module


Sign In