世界のやまさ

SEKAI NO YAMASA

Microsoft Azure Web サイト で Go言語 を CGI で動かす

The Go Programming Language皆さんやってますか?Technology Radar July 2014 | ThoughtWorksでは ADOPT となり、あの @t_wada さんも 「2014年プログラミング大予測」に参加しました - t-wadaのブログ にて今年流行ると言っています。まさに今が旬な言語です。

まず最初は Hello, World から

http://golang.org を開くと、最初に目につくのは Hello World です。(正確には Hello, 世界になってたけど) おもむろに Run をクリックすれば表示されます。

kobito.1404828211.848469.png

各プラットフォームに対応

Downloads - The Go Programming Language をみればわかるとおり、Mac OS XLinuxWindows と各プラットフォームに対応していることがわかります。親切にインストーラーも用意されていますので、簡単にインストールすることが可能です。

kobito.1404828485.060400.png

日本語チュートリアルも用意されている

A Tour of Go にて Hello, World から条件分岐、ループ、例外、HttpServer まで一通り説明されています。各トピックが1ページにまとまっており、PlayGroundですぐに実行して確認出来るため、既に他言語をやっている人にとって習得は用意だと思われます。

kobito.1404828738.913070.png

Microsoft Azure Web サイトで Hello, World を出力する

Go 言語の紹介はここまでとして、ここからが本題です。

Microsoft Azure Web サイトで Go言語 が動かないかなと思いました。なぜなら以前にWindows Azure Web サイトで Ruby を動かしてみた(CGI 編) - しばやん雑記 を見ていたからです。そして、 試行錯誤した結果、動きました!!

kobito.1404829093.553753.png

これだけですが、結構いろいろやらないといけなくて大変で、動いたときはちょっとガッツポーズしてしまいましたw

CGI として Go を動かす

Go のチュートリアルでは、HttpServer も建てられてしまうので、CGI として動かすのは勿体ないというか無駄かもしれませんが、まずは CGI から初めていきたいと思います。

用意するものは次の通りです。

  • Microsoft Azure Web サイト(無料でOK)
  • Go Runtime
  • Web.config
  • Site Extensions
  • Microsoft Azure Webサイト の設定
  • hello.go(ソースファイル)

順番に説明していきます。

Microsoft Azure Web サイト

管理ポータルからWebサイトを作ってください。無料で十分動きます。詳細は省きますね。

Go Runtime のインストール

Downloads - The Go Programming Language から 「go1.3.windows-386.zip」 をダウンロードする。(無料では64bitが動かないため)

kobito.1404828485.060400.png

Azure Web サイトに Kudu を使用して、アップロードします。Kudu へのアクセス方法は Webサイト のアドレスに scm という文字列を挿入するとアクセスすることが出来ます。例えば、「 https://nnasaki-spring.azurewebsites.net/ 」ならば、「 https://nnasaki-spring.scm.azurewebsites.net/ 」のようにします。

Debug Console から、Power Shell を開いて D:\home\site\wwwroot まで移動します。移動後、ブラウザへ「go1.3.windows-386.zip」をドラッグアンドドロップするとアップロードできます。

アップロードしたzipは PowerShell にて、unzip go1.3.windows-386.zip して解凍します。実行した結果次のようになります。

kobito.1404830011.892774.png

※ go の Runtime は公開ディレクトリじゃないところに格納したほうが良いですが、テスト的にこのまま進めます。

Web.config の作成

しばやん先生の記事 Windows Azure Web サイトで Ruby を動かしてみた(CGI 編) - しばやん雑記 を参考にWeb.configを次のように作成します。

<?xml version="1.0" encoding="utf-8"?>

<configuration>
  <system.webServer>
    <handlers>
      <add name="GoCGI"
           verb="*" path="*.go"
           modules="CgiModule"
           scriptProcessor="D:\home\site\wwwroot\go\bin\go run D:\home\site\wwwroot\hello.go"
           resourceType='Unspecified' />
    </handlers>
    <cgi createProcessAsUser="false"/>
  </system.webServer>
</configuration>

hello.go 決め打ちですが、まぁ、まずはミニマム構成で進めましょう。

Web.config は先ほどと同じように Kudu を使用して、D:\home\site\wwwroot にアップしておきます。

Site Extensions を追加する

Web.config だけでは動くようにはならず、Site Extensions を追加しないとダメなようです。Site Extensions については Windows Azure Web Sitesの魅力を120%引き出す « ブチザッキ を参照のことということで、確認するとどうやら空のASP.NETアプリケーションを作成して、applicationHost.xdt というファイルに次の設定を書いてあげる必要があるそうです。

<?xml version="1.0" encoding="utf-8"?>

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <system.webServer>
    <security>
      <isapiCgiRestriction> 
        <add path="D:\home\site\wwwroot\go\bin\go run D:\home\site\wwwroot\hello.go"
 allowed="true" xdt:Transform="Insert" />
      </isapiCgiRestriction>
    </security>
  </system.webServer>
</configuration>

いちいち作るのは面倒だと思うので、http://1drv.ms/1xMvVDW にアップしました。 cgi.zip をダウンロードして、 Kudu にて D:\home\SiteExtensions に移動して、cgi.zip をアップして、Unzip してください。解凍直後はこんな画面になると思います。

kobito.1404831455.835479.png

Microsoft Azure Webサイト の設定

Microsoft Azure のポータルサイトで設定が必要です。ポータルサイトのWebサイトの構成を開き、下のほうにスクロールして、「アプリケーション設定」に次の Key/Value を設定します。

  • GOROOT=D:\home\site\wwwroot\go
  • WEBSITE_PRIVATE_EXTENSIONS=1

kobito.1404831780.641097.png

GOROOT は環境変数で、これが無いと Go が動きません。 WEBSITE_PRIVATE_EXTENSIONS は先ほど自分で作成した Web Extensions を有効にします。

設定を追加したら「保存」して「再起動」をします。

hello.go の配置

だいぶ前置きが長くなりました! hello.go のソースを次のように記載して、D:\home\site\wwwroot\に置きます。

package main

import "fmt"

func main() {
    fmt.Println("Content-type: text/html\n\n")
    fmt.Println("Hello, World")
}

https://nnasaki-spring.azurewebsites.net/hello.go にアクセスします!次のように表示されると思います。

kobito.1404829093.553753.png

尚、Content-Typeを設定しないと次のようなエラーが表示されます。

kobito.1404826758.687288.png

私も最初忘れてて D:\home\LogFiles\DetailedErrors を見て、The CGI process has a flaw and does not return a complete set of HTTP headers. で思い出しました。こんなエラー画面です。

kobito.1404832778.213305.png

参考サイト