ラベル Azure の投稿を表示しています。 すべての投稿を表示
ラベル Azure の投稿を表示しています。 すべての投稿を表示

2017年3月8日

リバースプロキシを使っているWebサイトでHTTPからHTTPSに自動的にリダイレクトさせるための設定

IIS 8.5 での設定方法です。

まず、Webサーバーに「URL Rewrite」モジュールをインストールします。

URL Rewrite : The Official Microsoft IIS Site
https://www.iis.net/downloads/microsoft/url-rewrite


次に、該当のサイト直下のWeb.configを編集してsystem.webServerセクションにrewriteの設定を追加します。

リバースプロキシ(例えばAzureのApplication Gatewayなど)を使っていない場合は、こちらのサイトにある方法で問題無いと思います。

WebサイトでHTTPSへリダイレクトさせる | たんたか
http://blogs.gine2.jp/taka/archives/2790

リバースプロキシを使っている場合は、この方法だとリダイレクトが無限ループになってしまいます。

そこで下のように書き換えます。




これで無事思った通りにHTTPからHTTPSにリダイレクトしてくれるようになります。


リバースプロキシから送られてくるX_FORWARDED_PROTOヘッダの値をチェックして、「https」でない場合だけリダイレクトするという条件になっています。


また{REQUEST_URI}を使った場合は「appendQueryString="false"」を付けておかないと、REQUEST_URI自体が既にクエリー文字列を含んでいるためにURLの「?」以降の部分が2回重複して追加されてしまうようです。

URL Rewriteモジュールを使うとプログラムを書き換えずに対応出来るので便利ですね!






2016年3月25日

Azure AutomationでSQL Databaseからデータを取得してEメールで送信する

定期的にSQL Databaseからデータを取得してEメールで送信する必要があったので、試行錯誤しながら「Azure Automation」でやってみました。


やりたかった事


毎日1回(もしくは数時間に1回)SQL DatabaseにアクセスしてSQL文を実行し、結果を取得する。その結果が条件を満たす場合のみ特定の宛先にEメールを送信する。



1. Automationアカウントを作成する。





2. Runbookを作成する。






3. Runbookで実行するスクリプトを入力する。



スクリプトはPowerShellで作成する必要がある様です。

JavaScriptとかにも対応してくれると大変嬉しいのですが。^^)

今回作ったPowerShellスクリプトはこんな感じになりました。私の場合PowerShellを触る事はめったにないのですが、.NET Frameworkの機能が呼び出せるのでDBにアクセスしたりメールを送ったり、かなり色んな事が出来そうですね。






4. SQLサーバーとSMTPサーバーの認証情報を「資産」として登録する。


     

管理画面で「資産」として登録しておいた認証情報はスクリプトから

    $SmtpCred = Get-AutomationPSCredential -Name $SmtpCredName

のように呼び出して使う事が出来ます。上手い仕組みになっていると思いました。



5. Runbookをテスト実行する。


新ポータルのテスト実行用UIはかなり使いづらかったので、まだ現時点ではテスト実行には旧ポータルを使った方が良いのかも知れません。




6. Runbookを「発行」する。







7. Runbookが定期的に自動実行される様にスケジュールを設定する。



必要であればWebHookをトリガーにしてジョブが走る様に設定する事も出来る様です。



以上、大体こんな感じでやりたかった事が出来ました!

やってみた後で言うのもアレですが、Azure Automationはどうもどちらかと言うとAzure内のVM(や各種サービス)の起動・停止・設定変更やバックアップなどのプロビジョニングの自動化のために設計されたもののような気がして来ました。実際、提供されているテンプレートもそういうものが大半でした。そう考えるとスクリプトがPowerShell前提なのもうなずけます。

もしかすると今回の様なアプリケーション寄りのバッチ処理にはAzure App Serviceの「Web Jobs」の方を使った方が良いのかも知れません。Web Jobsの方はJavaScript(C#, BATなども)の実行も出来るみたいです。



参考URL:


PowerShellでSQL文の実行結果件数を取得してみました - Qiita
http://qiita.com/kurukurupapa@github/items/7f455b879e7c47372e3d

もりもりゲームブログ: Windows Power Shellから、ストアドプロシージャを使用する方法 http://morimorigameblogg.blogspot.com/2009/12/windows-power-shell.html

ワークフローでの Windows PowerShell コマンドの実行
https://technet.microsoft.com/ja-jp/library/jj574197.aspx

社内SEの徒然なる日記 powerShellでメールを送ってみた
http://harikofu.blog.fc2.com/blog-entry-2.html

Powershellでメールを送信する最も簡単な方法 | いろんなサーバー設定研究所
http://tech.lecume.net/power-shell/send-mail


2014年12月30日

Azure, Node.jsとsocket.ioで作る早押しクイズ大会アプリ

先日の忘年会のネタに早押しクイズ大会アプリを作りました。




1.主催者がアプリのURLをブラウザで開き、クイズ大会を開始。
2.画面にパスコードが表示されるのでアプリのURLとパスコードを参加者に伝える。
3.各参加者はスマホのブラウザでアプリのURLを開いてパスコードを入力。
4.人数が集まったら主催者が「開始」ボタンを押す。
5.参加者の画面に問題が同時に表示される。
6.最初の正解者が3点、2番目の正解者が2点、3番目が1点獲得。不正解はマイナス1点。
7.5〜6を繰り返す。
8.全ての問題が終わったら結果発表画面を表示。

という流れで動きます。


ソースコードはこちら。
https://github.com/mikehibm/EnkaiQuiz

ホスティングはもちろんAzure Web Sites。

コーディングは全てVS Online上で行いました。Azure Web SitesとVS Onlineを組み合わせるとNode.jsアプリの開発はローカルに環境を一切作らなくても出来るのでとても便利です。

快適にコーディング出来たVS Onlineの画面

一応、同時に複数のクイズ大会をホスト出来る様になっています。

今回初めてsocket.ioを使ってサンプルのチャット以外のアプリを作りましたが、思っていたよりスムーズに作る事が出来ました。

とは言っても、サーバー側からクライアントにメッセージを送るのに io.emit() を多用してしまっているのはまずいかも。本来なら特定のクイズ大会に参加している人のみに送信するべきですね。

リファレンスを見ると、「Custom namespaces」を使う方法と「Rooms」を使う方法の2種類あるのかな(?)
http://socket.io/docs/rooms-and-namespaces/

実は他にも色々と改善が必要な点が。(笑)

- サーバー(Node)のプロセスが落ちたら全部消える。→ サーバー側のデータはDBに永続化しないと。
- クライアント側のデータも出来ればLocalStorageに格納したい。
- エラー処理をもっとちゃんとしないと。
- 単体テストは...  ...


見直せば見直すほどいろいろ出て来ますが、また余裕が出来たら改善しようかと思います。今回の忘年会では参加者10人で問題なく動いてくれたのでとりあえずいいかなと。



残念ながら今年の忘年会シーズンはほぼ終わってしまいましたが、新年会で使えるかも(?)

クイズの問題と解答のデータは public/js/data.js にJSON形式で入っているので変更するのも簡単です。

実行時に動的に外部からデータだけ読み込める様に改造するのも良いですね。

動かしてみたい方はぜひGitHubのソースをForkして試してみて下さい!







 
.

2014年11月14日

Azureモバイルサービスを使ってNexus6の在庫をチェックしてみた

Nexus6 買いたいのに買えない。。。


いつ見ても「在庫切れ」という表示ばかりで、いつになったら買えるのやら。

https://play.google.com/store/devices/details/Nexus_6_64GB_Cloud_White?id=nexus_6_white_64gb


さすがに毎回ブラウザを開いて在庫状況をチェックするのが面倒になったので、Azureモバイルサービスを使って自動でチェックして見る事にした。



Azureモバイルサービス いいね!


requestモジュールとSendGridを使えば、「HTTPリクエストを発行して結果に応じてEメールを送信する」事が簡単に出来る。

しかもそれを最小1分単位に繰り返して実行する様にスケジューリングまで出来てしまう。





メール送信サービスの SendGrid はAzureの管理サイト内(Market Place)から申し込めば25000通/月まで送信出来る無料アカウントを作成してモバイルサービスと連携させる事が出来る。


作ったスクリプトは下の通り。


もちろんリクエストするURLと、結果の文字列の比較条件さえ変えればどんなWebサイトの監視にも使える。

サーバーすら立てずに無料でこういう事が出来るとは、便利な世の中になったものだなあー!


しかしN6の在庫は早くなんとかして欲しい。(笑)




※2014/11/19 (水) 追記

Google Playのページには英文で「毎週水曜日に在庫が補充されるよ」と書いてあったので「今日こそは」と思っていたけれどやっぱりダメ。ところが試しにSprintのサイトを見てみたら、なんとブルーの32GBだけが買える様になっていたので、そのままオーダーしてしまった。
$27の24回分割払い
なので、米国内であれば今のところGoogleから買うよりもキャリア経由で買ったほうが良いかも。







2014年5月1日

Azure仮想マシンのIIS8.0でFTPSを設定した時のメモ

色々と問題があったので忘れない様にメモ。

ローカルユーザーの設定


  • サーバーにFTP用のローカルユーザーを作成する。
  • FTP用ユーザーにアクセス対象ディレクトリへの権限を付与する。


IISのFTP設定


ルートレベル

  • 「FTP Firewall Support」でPassive接続に使うポート範囲を指定。
  • 「FTP SSL Setting」でSSL証明書を指定。


各サイトレベル

  • 「FTP Firewall Support」でPassive接続に使うグローバルIPアドレスを指定。
  • 「FTP SSL Setting」でSSL証明書を指定。(ルートレベルで設定したのと同じもの)
  • 「Bindings」でホスト名を指定。(複数のホスト名がある場合)
  • 「FTP Authentication」でBasic認証を有効化。
  • 「FTP Authorization」でアクセス許可するユーザーを指定。



ここまでの設定後「Microsoft FTP Service」のリスタートが必要なので注意。



Azure管理サイトでの設定


仮想マシンのEndpointsにFTP用の設定を追加。
Passive接続用のポートを許可するのを忘れない事。



「530 Valid Hostname is expected」エラーへの対処


  • 複数のホスト名で複数のFTPサイトを作成している時に発生する。
  • ログイン時のユーザー名を 「サイト名|ユーザー名」と指定すれば解決する。

http://www.net24.co.nz/kb/article/AA-00201/25/Virtual-Private-Servers/Windows/Error-530-Valid-Hostname-is-expected-using-FTP-to-IIS7.html


FileZillaからアップロード出来ない問題の対処


  • ファイルをアップロードすると、転送完了後にエラーになってファイルがサーバー側から消えてしまう。
  • IIS8.0の不具合らしい。
https://forum.filezilla-project.org/viewtopic.php?f=2&t=27898&start=120


  • 対策1 WinSCPを使ってTLS1.0で接続する。(非推奨)  
  • 対策2 サーバー側にHotFixを適用する。
http://support.microsoft.com/kb/2888853



以上、長かった!







.

2013年3月6日

Azure Mobile ServicesがAndroidに対応! Android2.2以降で実行可能


Windows Azure Mobile ServicesがAndroidに対応したそうだ。

Windows Azure Updates: Android Support, SQL Reporting Services, Active Directory, More… - ScottGu's Blog


これでバックエンドのサービスを簡単に作成する事が出来る。嬉しい!

ところが説明を読むと、「Android 4.2以降が必要」という注意書きが。。。

「え、うそでしょ~。4.2以降なんて現時点で使えるのはNexusシリーズぐらいじゃないの...」

と思ったけれども、サンプルコードをダウンロードしてマニフェストファイルを見ると、

android:minSdkVersion="8"
android:targetSdkVersion="17"

となっている。

なので、アプリの動作環境としてはAndroid 2.2以降なら問題ないみたいだ。


(「4.2以降が必要」というのは開発用のSDKのバージョンを指している様だ。)



試しに Android 2.3.5 が入ったHTC Evoでサンプルアプリケーションを動かしてみた所、Todoリストにデータを追加する部分については問題なく動作した。


Azure Mobile Servicesの管理画面からデータを確認したところ。



Todoリストのチュートリアルはこの後「ユーザー認証の追加」や「GCMを使ったプッシュ通知」の実装に続く。

まだそこまでは試していないけれど、多分Android2.2以降なら問題無さそうな気がするので、まずは一安心した。


これでさらにアプリ開発の可能性が広がりそうだ!



*追記:
ここにははっきり「2.2+」と書いてあるので、やっぱり大丈夫そうだ。

MS Open Tech develops the open source Android SDK for Windows Azure Mobile Services - Interoperability @ Microsoft - Site Home - MSDN Blogs







 

2013年2月14日

Azure仮想マシン上でNode.jsアプリケーションをデーモン化してユーザー権限で運用する方法

作ったNode.jsアプリケーション


初めてのNode.jsアプリケーションを作ってみた。
作ったのは、ここに載っていたもの。
Androidアプリからnode.js+Socket.IOと双方向通信する

早速Windows Azure上で動かそうと思ったのだけれど、いくつか苦労したのでメモしておきたい

「Windows Azure Web Sites」は現状ではWebSocketは不可


まず、「Windows Azure Web Sites」は現時点では使えない。このサービスのベースとなっているIISのバージョンが7.5で、まだWebSocketプロトコルに対応していないからだ。

試しにやってみると、ブラウザ同士で試すと問題なく動くが、実際にはWebSocket以外のプロトコルにフォールバックして動作している。この状態だとAndroidのネイティブアプリケーションからsocket.ioライブラリを使用しての接続は上手く行かなかった。

近い将来これが IIS8.0 にアップデートされてWebSocketが使える様になったら、多分これから下に書く様な面倒な作業は不要になると思う。


「Windows Azure 仮想マシン」でUbuntuサーバーを立てる


仕方ないのでAzure上にUbuntu仮想マシンを立ち上げる事にした。

Ubuntu 12.04 Serverのインスタンスを起動して、Node.jsやその他のパッケージをインストールするのは、何の問題もなく完了。

 node folder/app.js

で起動して3000番ポートで接続を待ち受ける。と同時にAzure仮想マシンの設定でエンドポイントを追加して、外側の80番ポートを内側の3000番ポートにつなげる。これでブラウザからもAndroidアプリからも接続出来て問題無く動作させる事が出来た。

素晴らしい!

ただ、Android側のネットワークをWiFiから3G回線にすると動作しなくなるという現象に遭遇した。どうやらキャリア側で80番ポート上のWebSocketの通信を遮断しているみたいだ。(というよりおそらく、キャリアが使っているProxyサーバーがWebSocketに対応していないのだと思う。)

これに対する対策として、Azure側のエンドポイントのポート番号を443に変更したら問題なく動作する様になった。(特に443番でなくてもいいと思うけれど、ユーザー側にFirewallがある場合に、外向きのTCPパケットがブロックされている可能性が80番の次に低いポート番号という事で、443番にしておいた。)


Node.jsアプリケーションをデーモン化したい


Node.jsのアプリケーションをデーモン化して動かすには、forever を使うのが簡単らしい。

foreverコマンドを実行するスクリプトを rc.localに追加するなり、/etc/rc2.d フォルダにシンボリックリンクを張るなりすればサーバー起動時に自動で実行される様になる。


ユーザー権限でデーモンを実行したい


ただ、root権限ではなくユーザー権限で実行する方法がすぐには見当たらなかったので、調べるのにちょっと時間がかかった。結論としては次の2つのどちらかが良さそうだ。

方法1: suコマンドと forever を使う

 su - [user] -c"cd [/home/directory] && forever start [folder]/app.js"

というコマンドへのシンボリックリンクを /etc/rc2.d フォルダに作成する。(または/etc/rc.localの最後に追加する。)


方法2: Upstartを使う
 

 Upstart を使ってお手軽 daemon 化 - インフラエンジニアway

ここに書いてある方法で initctl コマンドでデーモンとしての実行を管理出来る様になる。
実行ユーザーを指定するには、

 setuid [user]

を設定ファイルに追加すればOK。


Ubuntuの標準的な方法としては Upstart を使う方が良さそうなので、とりあえず今はこれでいいかな、と思う。