Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

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 X、Linux、Windows と各プラットフォームに対応していることがわかります。親切にインストーラーも用意されていますので、簡単にインストールすることが可能です。

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

参考サイト

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away