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


[The Go Programming Language](http://golang.org/)皆さんやってますか？[Technology Radar July 2014 | ThoughtWorks](http://www.thoughtworks.com/radar/#/)では ADOPT となり、あの @t_wada さんも [「2014年プログラミング大予測」に参加しました - t-wadaのブログ](http://t-wada.hatenablog.jp/entry/programming-forecast-2014) にて今年流行ると言っています。まさに今が旬な言語です。

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

![kobito.1404828211.848469.png](https://qiita-image-store.s3.amazonaws.com/0/31790/b8dba9a8-61a7-9b6e-155a-e42e69e313b7.png "kobito.1404828211.848469.png")

# 各プラットフォームに対応
[Downloads - The Go Programming Language](http://golang.org/dl/) をみればわかるとおり、Mac OS X、Linux、Windows と各プラットフォームに対応していることがわかります。親切にインストーラーも用意されていますので、簡単にインストールすることが可能です。

![kobito.1404828485.060400.png](https://qiita-image-store.s3.amazonaws.com/0/31790/8722a7d5-a596-7184-445d-479bc1712563.png "kobito.1404828485.060400.png")

# 日本語チュートリアルも用意されている
[A Tour of Go](http://go-tour-jp.appspot.com/#1) にて Hello, World から条件分岐、ループ、例外、HttpServer まで一通り説明されています。各トピックが１ページにまとまっており、PlayGroundですぐに実行して確認出来るため、既に他言語をやっている人にとって習得は用意だと思われます。

![kobito.1404828738.913070.png](https://qiita-image-store.s3.amazonaws.com/0/31790/ed606200-8a4e-7269-0ee0-22fcc5c9881c.png "kobito.1404828738.913070.png")

# Microsoft Azure Web サイトで Hello, World を出力する
Go 言語の紹介はここまでとして、ここからが本題です。

Microsoft Azure Web サイトで Go言語 が動かないかなと思いました。なぜなら以前に[Windows Azure Web サイトで Ruby を動かしてみた（CGI 編） - しばやん雑記](http://shiba-yan.hatenablog.jp/entry/20140203/1391436381) を見ていたからです。そして、 **試行錯誤した結果、動きました!!**

![kobito.1404829093.553753.png](https://qiita-image-store.s3.amazonaws.com/0/31790/d8f3a593-ee55-0977-d4b0-b840d732f3e1.png "kobito.1404829093.553753.png")

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

# 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](http://golang.org/dl/) から 「go1.3.windows-386.zip」 をダウンロードする。(無料では64bitが動かないため)

![kobito.1404828485.060400.png](https://qiita-image-store.s3.amazonaws.com/0/31790/8722a7d5-a596-7184-445d-479bc1712563.png "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](https://qiita-image-store.s3.amazonaws.com/0/31790/e8da626e-636d-2c1b-ba4a-897af6326fb0.png "kobito.1404830011.892774.png")

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

## Web.config の作成
しばやん先生の記事 [Windows Azure Web サイトで Ruby を動かしてみた（CGI 編） - しばやん雑記](http://shiba-yan.hatenablog.jp/entry/20140203/1391436381) を参考にWeb.configを次のように作成します。

```xml
<?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%引き出す « ブチザッキ](http://buchizo.wordpress.com/2013/12/22/windows-azure-web-sites%E3%81%AE%E9%AD%85%E5%8A%9B%E3%82%92120%E5%BC%95%E3%81%8D%E5%87%BA%E3%81%99/) を参照のことということで、確認するとどうやら空のASP.NETアプリケーションを作成して、applicationHost.xdt というファイルに次の設定を書いてあげる必要があるそうです。

```xml
<?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](https://qiita-image-store.s3.amazonaws.com/0/31790/23552836-9ec9-5301-119a-66625ec488d6.png "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](https://qiita-image-store.s3.amazonaws.com/0/31790/dbc0f4f5-51ef-dd6c-f31d-b472766a0f9d.png "kobito.1404831780.641097.png")

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

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

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

```go
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](https://qiita-image-store.s3.amazonaws.com/0/31790/d8f3a593-ee55-0977-d4b0-b840d732f3e1.png "kobito.1404829093.553753.png")

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

![kobito.1404826758.687288.png](https://qiita-image-store.s3.amazonaws.com/0/31790/d857adbf-3f36-ed54-d6ad-d4b8760bee21.png "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](https://qiita-image-store.s3.amazonaws.com/0/31790/58bf6305-58a0-61b2-fa42-dd3e8cd327e5.png "kobito.1404832778.213305.png")



#### 参考サイト
- [Windows Azure Web サイトで Ruby を動かしてみた（CGI 編） - しばやん雑記](http://shiba-yan.hatenablog.jp/entry/20140203/1391436381)
- [Windows Azure Web Sitesの魅力を120%引き出す « ブチザッキ](http://buchizo.wordpress.com/2013/12/22/windows-azure-web-sites%E3%81%AE%E9%AD%85%E5%8A%9B%E3%82%92120%E5%BC%95%E3%81%8D%E5%87%BA%E3%81%99/)
- [Azure Web サイトの新機能: 環境変数が構成可能に - Microsoft Azure Japan Team Blog (ブログ) - Site Home - MSDN Blogs](http://blogs.msdn.com/b/windowsazurej/archive/2014/03/26/new-azure-web-sites-feature_3a00_-configurable-environment-variables.aspx)
-[Windows Azure Web サイトの小ネタ集 - しばやん雑記](http://shiba-yan.hatenablog.jp/entry/20140222/1393074204)