Azure Web Apps Linux版 とりあえず Hello World

こんにちは。まーやです。
今日はつい最近プレビュー公開された Azure Web Apps のLinuxバージョンをざっくり触ってみたのでレポートしてみたいと思います。

# Agenda

- Azure Web Apps おさらい
- Azure Web Apps on Linuxとは
- 既存Windows版との違い
- 実際にNode.jsの簡易アプリをのっけてみよう

# Azure Web Apps おさらい
Microsoft製のWebアプリに特化した形で提供されるPaaSです。

Java/Python/Node.js/PHP/.NETに対応したプラットフォームをポータルからポチポチするだけで構築してくれます。もちろんhtmlの公開だけでもOKです(静的な公開なら別のサービスの方が安く作れますけどね！)。PaaSなので、サーバ回りを個人でいじることはできません。cliでゴリゴリTomcatの設定しちゃうぞ！なんてこともできません。Tomcatの最新バージョンがすぐすぐ使いたいのだ！Javaの最新マイナーバージョンをすぐ利用したいのだ！なんてことにも対応していません(ちょっと遅れて反映されます)。そういうことが必要な現場には不向きです。逆に、「個人でちょっと作ったものを公開してみたい」「サーバサイドは全部お任せしてアプリ開発に集中したいプロジェクトなんだ！」というときには大変便利な代物です(※1)。

ではそのPaaSの中身はなんなのか、というと基本はWindowsサーバなどMicrosoft製品で構築されています。ので、ポータルから利用できるコンソール画面などでコマンドラインを打つ場合は「ls -la」ではなく「dir」でした。IISの設定を書く場面もあります。とはいえ、私のようなLinux派でもWindowsサーバであることをあまり意識せずに利用ができます。意識するタイミングは本当に前述した2点(コマンドラインとIISあたり)だけなもんです。

# Azure Web Apps on Linuxとは
前項のように、全てがWindowsサーバで作られていたAzure Web Appsですが、2016年10月にとうとうLinux版が登場しました。今この記事を書いているのが2016年10月13日なので本当につい最近です。やはりWindows版Web Apps(既存のWeb Apps)と全く同じ、とはいかず、多少の違いが発生しているようです。

[Azure Web Apps on Linuxについてはこちらに書かれています](https://azure.microsoft.com/ja-jp/documentation/articles/app-service-linux-intro/)

良い面(?)としては、現在(※2)の公開はプレビュー公開のため、50％の割引で利用できます。現在用意されている料金プランは以下の通りです。今後本リリースになったらPremiumレベルは出てきそうですね。予想外だったのはこの時点でShareとFreeのレベルがなかったこと。単価が安く個人利用しやすい価格レベル帯のShareとFreeはぜひ作ってほしいなぁ・・・難しいのかなぁ・・・？機能は同じだからwindows版使ってくれよ、って感じなんですかね。
![価格レベル.png](https://qiita-image-store.s3.amazonaws.com/0/60850/b917dab4-a549-6bbd-75f8-7daca23ce819.png)


プレビューなことも相まって、その他色々と制限があります。この現在(※2)の制限については、次項の既存Windows版との違いの説明の中で触れていくことにします。

# 既存Windows版との違い
いくつか比較した点をピックアップしました。

① ポータル上の見え方
基本的なポータル上の見え方は今までほとんど変わりません。↓の図でいうと、linebot-testというのが既存Windows版、webapp-linuxというのがlinux版のWeb Appsです。    
![winかlinuxかはぱっと見見分けつかない.png](https://qiita-image-store.s3.amazonaws.com/0/60850/5d5e87f0-1c35-3e84-502b-28bc0510842f.png)
    
②リージョン
使えるリージョンは現在(※2)は次の3リージョンのみです。Azureの場合はどのリージョンを使ってもそれなりのレイテンシで帰ってくるので、AWSほどリージョンにシビアにならなくても大丈夫かと思います(※3)。

- 西ヨーロッパ
- 米国西部
- 東南アジア
    
③利用可能言語
使える言語はPHPまたはNode.jsのみとなっています。これは今後増えていきそうな予感がしています。というか、早くおいで。JavaとPython。私はPythonistaでJavaなSIerなので、JavaとPythonが公開されるのをとても楽しみにしています。

④言語指定手順
既存Windows版での言語選択(ランタイム選択)はサーバが立ちあがった後、「アプリケーションの設定」というメニューで設定を行っていましたが、linux版ではサーバを立てるときに選択をします(次項の手順の中でポータルの画像が出てくるので確認してみてください)。これにより、サーバを立てた後に利用言語変更をする、ということが出来なくなっています。最初にPHPでサーバ立てたけど、やっぱりNode.jsで、となった場合は、一度削除してから新しく作り直す必要があります。ちなみにPHPやNode.jsのバージョンについてはあとから変更できますのでご心配なく。

⑤ポータルメニュー
ポータルに用意されているメニューの数が大きく異なります。linux版の方が断然できることが少ないです。中でも個人的に悲しかったのは、ポータル上でのコンソール機能。この機能はポータル上で対象サーバの作業をcliで行える、というものなのですが(ちょっとファイルの存在確認とかパスの確認をしたいときに便利です)、残念ながらlinux版にはありません。ぜひこれから出てきてほしい・・・lsって打ちたいよ！
↓現行Windows版
![winにはあるのに.png](https://qiita-image-store.s3.amazonaws.com/0/60850/9126549e-a7c6-a91a-41bc-05c269454eb2.png)
↓linux版
![コンソールがない.png](https://qiita-image-store.s3.amazonaws.com/0/60850/285df8c9-7395-9e87-58df-3b49ea2eff97.png)

⑥Node.jsのデプロイ方法
Node.jsのデプロイ方法が変更になりました。GitもしくはFTPを使ってアップロードする、というところについては変わりませんが、設定するべき項目と設定方法が変わります。詳細については次項にて。

# 実際にNode.jsの簡易アプリをのっけてみよう
では早速サーバにアプリをのっけてみましょう。手順については[こちらの記事](https://azure.microsoft.com/ja-jp/documentation/articles/app-service-linux-using-nodejs-pm2/)を参考に作業を行いました。今回は↓のNode.jsで作った超簡単Hello World的アプリを動かします。

```
var express = require('express');　//制御にexpressを使います
var app = express();

app.get('/', function (req, res) {
  res.send('こんにちは～!! WebApps Linuxバージョンだよー！'); 
});

//このように設定しておくことで、localでは8000番、Web Apps上ではWeb Appsデフォルトの80番で接続ができます
var port = process.env.PORT || 8000; 
app.listen(port, function () {
  console.log('【connect】');
});
```

基本的なWeb Apps作成手順はWindows版Web Appsと同じです。まだ一度もWindows版を使ったことがない方は[こちらの資料](http://slides.com/maaya/20160426_javajo_lt-17#/25)も参照してみてください。この記事ではWindows版との変更点のみピックアップして記載します。

①ポータルで新規作成 > Web + モバイル > Web App On Linux (プレビュー) を選択し、次の項目を埋めていきます。アプリ名など上4つはいままでと変わりません。変更になったのは次の項目。ランタイムスタックで「Node.js or PHP」を選択します。合わせてバージョンの選択ができますので、利用するバージョンを選択してください。バージョンは後からでも変更できます。ここまで設定したら、下の方にある作成ボタンを押しておしまい。かんたん。
![1.png](https://qiita-image-store.s3.amazonaws.com/0/60850/82f41098-852d-5bd1-fb31-606033c7b03f.png)

②URLを叩いてみるとNode.js版の設定でサーバが立ちあがっていることが確認できます。
![2.png](https://qiita-image-store.s3.amazonaws.com/0/60850/68466e2b-9be8-a117-ccff-3acf8184ab84.png)

③アプリケーションと共にprocess.jsonというファイルをアップロードする必要があるため、作成します。各項目の説明は[こちら](http://pm2.keymetrics.io/docs/usage/application-declaration/)に書かれているので参照ください。今回大事になるのは、 `script` と `watch` です。 `script` にはprocess.jsonから見た実行ファイルのパスを記載しましょう。今回はprocess.jsonとapp.js(実行ファイル)を同じディレクトリにアップロードすることにします。 `watch` には変更をチェックさせたいファイルを配列で記載します。ここに書かれたファイルに変更が入った場合はアプリケーションが自動再起動されます。

```
    {
      "name"        : "worker",
      "script"      : "./app.js", 
      "instances"   : 1,
      "merge_logs"  : true,
      "log_date_format" : "YYYY-MM-DD HH:mm",
      "watch": ["./app.js"],
      "watch_options": {
        "followSymlinks": true,
        "usePolling"   : true,
        "interval"    : 5
      }
    }
```

④③で作成したprocess.jsonがどこに配置されているのかを「アプリケーション設定」のポータルメニューから設定します。`/site/wwwroot` からみたパスを指定してください。例えば `/site/wwwroot/xxx/process.json` に配置したのであれば、 `/xxx/process.json` といった具合です。
![3.png](https://qiita-image-store.s3.amazonaws.com/0/60850/fe8c0378-4df6-df64-0f01-505f459e6cc0.png)

⑤これであとはいつも通りに対象ファイルをサーバにアップロードすればOK。今回はこんなかんじのディレクトリ配置です。
![5.png](https://qiita-image-store.s3.amazonaws.com/0/60850/380cbec8-2faa-e52f-da08-b445f8a4348b.png)

サイトが立ち上がりました。
![4.png](https://qiita-image-store.s3.amazonaws.com/0/60850/e0cab672-e75b-f57c-e619-a674f46844ea.png)

# まとめ
まだまだプレビュー公開が始まったばかりということもあり、できることの制限なども多いですが、これからの伸びしろに期待したいですね。とりあえずJavaとPythonが早く利用できるようになるよう期待しています。




-----------------------------------------
※1：過去に書いた[こちらの記事](http://qiita.com/maaya8585/items/62faddb637f02d1c808e)や[Java女子部で使った資料](http://slides.com/maaya/20160426_javajo_lt-17#/25)もありますので、もう少し詳しく見てみたい方、実際にやってみたい方は参照してみてください。
※2：2016年10月13日
※3：個人的利用経験ですが、AWSで日本からヨーロッパのリージョンにサーバをたてて接続すると、ちょっとストレスフルなレベルのレイテンシが発生していました。大分前なので改善されているかもしれません・・・。もし改善されていてdisみたいに見えてしまったらごめんなさい・・・私はAWSも大好きです。