AzureのアクセスログをAWStatusで表示する。

Azureの診断機能によりIISのログを取得しているので、それをグラフィカルに集計したいと思いAWStatusを導入してみました。

環境は、ローカルのWindowsサーバでIISが動いていたので、そこに追加する形で設定しました。また、AzureのIISログはBlobからローカルへ定期的にDownloadしておきます。

  1. PerlによるCGIを動かすために、ActivePerl をインストール。
  2. AWStats Ver.7.0 完全日本語版 | Monoblogue of a security engineer よりAWStatusをダウンロード。
  3. 次にIISの設定ですが、サイトを追加しAWStatusを解凍したフォルダを物理パスに設定しておきます*1IISの設定で、「ハンドラーマッピング」で「スクリプト マップの追加」を行い、以下の様に設定します。

要求パス:*.pl
実行可能ファイル:ActivePerlのインストールしたパス(ex. C:\Perl64\bin\perl.exe "%s")
名前:何でも問題ないが「Perl CGI Script」等

  1. AWStatusでは、標準では一つのログファイルしか参照できません。しかし、AzureのIISログは1時間毎にファイル名がローリングされるようになっていて、さらに通常は2インスタンス以上で動かしていると思われるのでインスタンス分だけファイルが作られます。そういう時のために、toolsフォルダの中に、logresolvemerge.pl というスクリプトがありますので、以下のコマンドを実行することでログファイルをマージできます。
> logresolvemerge.pl (IISのログファイルフォルダ)\*.log
  1. AWStatusの設定は、wwwroot/cgi-binにある awstats.model_jp.conf を awstats.(ドメイン名).conf にコピーしてから、そのファイルを以下の箇所を変更します。これ以外の設定は、適宜自分で必要な項目を修正して下さい。

LogFile =(上記のlogresolvemerge.plによって作成されたログファイルのパス)
LogFormat = "%time2 %other %other %cluster %method %url %query %other %logname %host %other %ua %other %referer %virtualname %code %other %other %bytesd %other %other" (LogFormatは、IISで何も変更しない場合に出力されるログに合わせてあります*2。)
SiteDomain=(Azureでサービスしているサイトのドメイン名)
ShowAuthenticatedUsers=PHBL (ログインしているユーザの統計を取る場合)
LoadPlugin="timezone +9" (AzureではログがUTCで出力されるため、JSTに修正する場合にはこれを指定する)

  1. 最後に、logresolvemerge.pl でまとめたログを元にサイトの情報を更新します。以下のコマンドを実行するとサイトの情報が更新されます。後は、/cgi-bin/awstats.pl にアクセスすることでアクセス情報が閲覧できます。
> awstats.pl -config=ドメイン名 -update
  1. 上記の手順で、AzureのIISログをAWStatusで見ることができました。後は、タスクスケジューラ等で「ログファイルのマージ」→「サイト情報の更新」を定期的に行って行くことで最新の情報を閲覧できるようになります。

*1:外部に公開する場合には、不要なファイルを置かないようにしたり、色々と気を使って下さい

*2:ログファイルのヘッダ行に「#Fields: date time s-sitename s-computername s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs-version cs(User-Agent) cs(Cookie) cs(Referer) cs-host sc-status sc-substatus sc-win32-status sc-bytes cs-bytes time-taken」と記述されていれば、この定義で問題ありません。

Windows Azure で、対象ホスト毎にVMサイズを変更する方法

だいぶ間が空きましたが、Windows AzureでSSL接続を行うためには - しがないプログラマ の日記 のさらに続きです。

今回は、Production環境ではVMサイズが SだけどDevelopment環境ではVMサイズを XSにしたい場合の設定方法を書いて行きたいと思います。
しかし、インスタンス数はVisualStudioから各環境別に設定可能ですが、VMサイズは全体としてしか設定できません。もちろん、管理ポータルからもインスタンス数は「構成」から変更可能ですが、VMサイズはデプロイ時にしか変更できません。そのため、VMサイズの変更は「ServiceDefinition.csdef」ファイルをビルド時に書き換えるという、強引な手段で解決することにしました。
結論から言いますと、Azureプロジェクトのプロジェクトファイル(拡張子が ccproj)に、以下のTargetを追加することで構成ファイルを変更できます。

  
    
  

この例ですと、ビルドターゲットが「Release-XSmall」だった場合に、VMサイズの項目をExtraSmallに書き換えています。注意点としては、デフォルトではvmsizeが記述されていないため、うまく動きませんので明示的にVMサイズを設定する必要があります。VisualStudioのプロパティでVMサイズを何か変更してからSmallに戻せばOKです。

これで何をしているのかの解説は以下で。

続きを読む

Windows Azure でSSL証明書を複数ホストで別々に設定する方法

Windows AzureでSSL接続を行うためには - しがないプログラマ の日記 の続きです。

1つのWebRoleに対して、Azure上に複数環境用意することは良くあると思います。例えば、Production環境とDevelopment環境等。
この場合「サービス構成」を変更することで、それぞれの環境毎にデプロイできるようにするのが一般的だと思います。少なくとも、自分はそういうやり方をしていました。その際に、それぞれの環境向けにSSL証明書を取得した後、どう設定するのかが分かりづらかったので、追加メモです。

準備

Production環境とDevelopment環境の2つ環境があり、それぞれに対してドメイン名をCNAMEで prod.example.com, dev.example.com と設定したことにします。さらに、それぞれのドメイン向けにワイルドカード証明書ではなく、通常の証明書を発行した場合を想定しています*1

設定方法

WebRoleのプロパティを開き、証明書の追加を行います。この時、名称はどちらのドメインでも使用するので分かりづらくならないように気をつけます。証明書は一旦 LocalMachine/My に入っている prod.example.com の証明書を選択します。次に、エンドポイントを追加を行います。これは前回と同じで、Input/https/443 として 先ほど追加した証明書を選択します。
これで、prod.example.comHTTPSで接続できるようになりますが、dev.example.comには接続できません。ここで、証明書の設定タブに戻り、上部にある「サービス構成」をdev向けにします。すると、ほとんどの設定項目がグレイアウトしますが、サムプリントだけは変更可能なのです。後はサムプリントで dev.example.com向けの証明書を選択すれば完了です。
これで、それぞれの環境毎に証明書が設定できました。ポイントは、1つのエンドポイントに対して1つの証明書しか設定できませんが、証明書の中身は環境毎に選択できるので、問題ないってことですね。

*1:ワイルドカード証明書の場合には、どちらの環境でもそれを使用するように設定すればOKです

Windows AzureでSSL接続を行うためには

Azureを使う際に、HTTPSでアクセスするためには結構面倒な手続きが必要だったのでメモメモ。

証明書の発行について

【Azure for ITPRO】サービス証明書の準備 – Junichi Anno's blog ここを参考に進めたので、序盤はほとんど同じです。

そんな訳で、AzureへHTTPSでアクセスするためにはSSL証明書が必要となりますが、自己証明書を使う場合にはこの先の話は関係ないので飛ばして下さい。
証明書を発行するためには、ドメイン名が必要ですが Azureのホステッドサービスに割り当てられるドメイン名は hoge.cloudapp.netとなっています。この *.cloudapp.net はMicrosoftが管理しているドメインとなるため、hoge.cloudapp.netに対して他の人が証明書発行を行うことはできません。そのため独自のドメインを用意し、DNSのCNAMEによってドメインの別名を割り当て、その割り当てたドメインに対して証明書の発行を行うことになります。これによって、https://fuga.example.com のようなURLでAzureへアクセスできるようになります。

証明書の発行手続き

Azureで使用できる証明書の形式は決まっているためIISを使用する必要があります。
IISのインストールは完了した後、管理ツール→「インターネット インフォメーション サービス (IIS) マネージャー」を起動します。機能ビューの中の「サーバ証明書」を選択し、「証明書の要求の作成...」を実行します。
最初に表示される「識別名プロパティ」は証明書に使われる情報なので、正しく入力します。「一般名」にはFQDN(つまり、上記の場合 fuga.example.com)、「組織」には申請団体の正式な英語組織名を、「市区町村」「都道府県」にはそれぞれ住所をローマ字表記で、「国/地域」はデフォルトの JP でOKです。
次に、「暗号化サービスプロバイダのプロパティ」の画面が表示されます。暗号化サービスプロバイダは「Microsoft RSA Schannel Cryptographic Provide」のままで、ビット長を申請先の指定長より長いものにして下さい(通常は、2048か1024になるでしょう)。
最後に、CSRをどこに保存するかを聞かれるので、適当な場所を指定し保存します。中身はテキストファイルなので拡張子は、txtなり csrなり適当に。

後は、SSL発行手続きでこのCSRを提出し、サーバソフトウェアでは Microsoft IISを選択すればOKです。
手続きが終わるとCSRと似たようなテキストデータが発行されます。このデータをファイルに保存し、また「インターネット インフォメーション サービス (IIS) マネージャー」を起動します。先ほどと同様に「サーバ証明書」を開き、「証明書の要求の完了...」を実行します。後は、先ほどん保存したデータファイルを指定し、「フレンドリ名」には表示名称を入力します。これは証明書を表示した際の名称に使われるので、何でも良いですが適切な名前をつけて下さい。

Azure環境への適用

ここまでの流れで、ローカルの環境にはSSL証明書がインストールされた状態になります。しかし、証明書をAzureで使うためには管理ポータルからの登録が必要となります。そのためには、登録した証明書をエクスポートし管理ポータルで証明書の追加を行うことになります。
それでは、まずは証明書のエクスポートを行います。ファイル名を指定して実行から、「mmc」を実行します。ファイルメニュー→スナップインの追加と削除 を選択し、選択画面の「利用できるスナップイン」の一番下にある「証明書」を選択し利用ボタンをクリック。「証明書スナップイン」というダイアログが開くので「コンピューターアカウント」を選択し「次へ」、さらに「ローカルコンピューター」を選択し「完了」。以上で、OKボタンをクリック。
これでローカルコンピューターに登録されている証明書が全て見れます。左のペインにあるツリーから、「個人」→「証明書」を選択すると、登録したSSL証明書があると思います。右クリックし、「全てのタスク」→「エクスポート」を選びます。
「証明書のエクスポートウィザード」が開くので、「次へ」をクリック。「秘密キーのエクスポート」では「はい、秘密キーをエクスポートします」を選択し「次へ」。「エクスポートファイルの形式」は、Azureでは PFX形式しか使用できないので「Personal Information Exchange」を選択し「証明のパスにある証明書を可能であればすべて含む」にチェックを入れて「次へ」。「パスワード」ではこの証明書を使用する際のパスワードを決めて入力します。最後に出力するファイル名を入力して完了です。これで、pfxファイルが作成されました。
次に、ブラウザから https://windows.azure.com/default.aspx へ行きます。後はホステッドサービスで「証明書の追加」を選び、pfxファイルと自分で決めたパスワードを入力すれば登録完了です。

WebRoleの設定

ここまで設定しても、まだAzureへのHTTPSでの接続はできません。WebRole側に、エンドポイントの追加+HTTPSの場合にどの証明書を使うか、を設定する必要があります。この設定を行うためには、VisualStudioから設定できますが証明書がインストールされている必要があります。そのため、複数人で開発する場合には作成したpfxファイルを各々のPCにインストールすることが必要となります。
それでは、VisualStudioを立ち上げて設定をしていきます。WebRoleのプロパティ*1を開き、「証明書」のタブを開きます。ここで「証明書の追加」をクリックしSSL証明書を登録します。名前は、次のエンドポイントの設定で使うのでわかりやすい名称を付けておきます。サムプリントがAzureへ登録したものと同じであることを確認できたら証明書の設定は完了です。
次に、「エンドポイント」のタブを開きます。通常でしたら、ここには Input/http/ポート80 だけしか無いと思われます。「エンドポイントの追加」をクリックし Input/https/443 を追加します。この時、SSL証明書の名前の欄で先程追加した証明書の名称が選択できるはずなので、それを選択して完了です。
あとは、このプロジェクトをデプロイすれば httpsで接続できるようになります。

*1:Azureプロジェクトのプロパティではなく

あけましておめでとうございます

三が日を過ぎてしまいましたが、今年もよろしくお願いします。
今日から、もう仕事始めです。UIE Japanで働き出してからもう4ヶ月も経ち、だいぶ慣れてきました。
去年は、あまり技術書を読む余裕がなくサボり気味だったので、初心忘れず1年1言語の心積もりで勉強していきたいと思います。まずは、ScalaHaskellをもうちょっと勉強しようかな?

ランダムな文字列の生成

pythonのFlaskを使う際に、SECRET_KEYを作らないとならかなったので、作り方を忘れないようにメモ

$ python
>>> import os
>>> os.urandom(24)
'\xf8\x01s\x87\xba\xb8U\\\x88\xec\x99]\x12\xf3\x93O\xd4y\x1cK\xd4\xfb"%'

os.urandom を使うと、指定した文字数分 /dev/urandom を使って、ランダムな文字列を生成してくれるらしい。

しばらく更新していなかったですが、9月から UIE Japan という会社で働いてます。

DevQuiz

先週末、とりあえずチャレンジ以外のとこだけ終わらせて、平日に入ってからちまちまとスライドパズルに挑戦しているんですが、難しいですね。
とりあえず、3x3を全探索で解くことはできたけど、このままじゃ3x6でも全然終わらないので枝刈りを考えないとダメですね。