サイトのトップへ戻る

Google App Engine ドキュメント日本語訳

Go ランタイム環境

Go用 Google App Engine へようこそ。 App Engineを使えば、プログラミング言語 Go を使ってウェブアプリケーションを構築できます。 Go アプリケーションはGoogleの拡張可能なインフラ上で実行し、大規模な永続ストレージと各種サービスを使用します。

  1. はじめに
  2. Go ランタイムを選択する
  3. Go アプリを整理する
  4. サンドボックス
  5. Go SDK とツール


はじめに

App Engine は、セキュア"サンドボックス"環境を使ってGo アプリケーションを実行します。 あなたのアプリはこの環境とやり取りをすることでウェブのリクエストを受信し、処理を実行し、応答を返します。

Go SDK では標準のGohttp packageと同様のインタフェースが使用できます; Go App Engine アプリを記述する作業は、スタンドアローンの Go ウェブサーバを記述するのと似ています。

Go ランタイム環境は Go version 1.4を使用します。 その SDK には Go コンパイラと標準ライブラリが含まれているので、依存関係のあるものを追加する必要はありません。 他のランタイムと同様、サンドボックス内で全ての標準ライブラリの機能が使えるわけではありません。 例えば、ソケットを開こうとしたりファイルに書き込みをしようとしたりするとos.ErrPermissionエラーが返ります。

SDK にはアプリをコンパイルするための自動ビルドサービスが含まれているので、あなたが自分でコンパイラを実行する必要はありません。 そして—Python SDKと同様に—あなたのアプリはソースを変更する度に自動でリコンパイルされます。

App Engineの Go ランタイム環境では goroutinesをフルサポートしていますが、並列実行はサポートしていません: goroutinesは単一のオペレーションシステムスレッド上にスケジュールされます。このシングルスレッド制限は、将来のバージョンで解除される可能性があります。 複数のリクエストを、指定したインスタンスで同時に処理することができます; これは、あるリクエストが datastore API 呼び出しを待っている場合に、同じインスタンスで別のリクエストを処理できるということです。

Go アプリはライブラリの制限されたセキュア"サンドボックス"環境内で動作します。 例えば、アプリはデータをローカルファイルシステムに書き込んだり、勝手にネットワークコネクションを作成したりできません。 その代わり、App Engineが提供している、データを保存したりインターネット上で通信ができる拡張可能なサービスを使用します。

App Engine プラットフォームでは、コード上から呼び出せる多くの サービス が使用できます。

まだ見ていない場合は、Goと Google App Engineを使ったウェブアプリケーションの開発を対話的に学ぶことができる、 Go 入門ガイドを参照してください。



Go ランタイムを選択する

Go SDK付属のappcfg.pyという名前のツールを使ってapp.yamlという名前のファイルを設定することで、 あなたのアプリケーションコードで使うGo ランタイム環境をApp Engineに通知できます。 以下の設定エレメントを使って、Go ランタイム環境を選択します:


runtime: go
api_version: go1

最初のエレメント runtimeでは Go ランタイム環境を選択します。

二つ目のエレメント api_versionでは、使用するGo ランタイム環境のバージョンを選びます。 この記事を書いている時点では、最新のGo 環境のバージョンはgo1です。 App Engineの開発チームが既存のコードと互換性のない環境への変更をリリースする必要がある場合に、このバージョン識別子を新しくしたうえで変更を行います。 これは、あなたのアプリを更新してapi_version設定を変更しなければ、古いAPIを使い続けられるということです。



Go アプリを整理する

Goで App Engine app を開発する時、あなたのコードは一つ以上のモジュールに分割されます; 各モージュールは通常モジュール用のapp.yamlファイルと一緒に独自のディレクトリに格納されます:


- project-dir
   - module1-dir
      app.yaml
      src1-1.go
      src1-2.go
   - module2-dir
      app.yaml
      src2-1.go
      src2-2.go

Go アプリケーションは、あなたのソースファイルのディレクトリ構造をコピーしたパッケージに整理されます。 App Engineソースコードでimportステートメントを使用した時、 SDK ツールは二つのimport 方法で相対パスを認識します:

  • モジュールのapp.yamlファイルが含まれるディレクトリへの相対パス

  • GOPATH内の全てのディレクトリのsrcサブディレクトリへの相対パス (これは"完全修飾" インポートパスと呼ばれます)

例えば、以下の方法でGOPATH が定義され:


export GOPATH=/home/fred/go

そして上記サンプルのプロジェクトディレクトリ内にあるsrc1-1.goファイルに以下が記載されている場合:


import "foo/bar"

あなたがmodule1の実行か配置を行う時、SDKは以下の階層内で"foo/bar" パッケージを探します:


project-dir/module1/foo/bar
/home/fred/go/src/foo/bar

GOPATHにパッケージの場所を含める場合、 app.yamlファイルを格納した App Engine プロジェクト内のディレクトリにソースコードを配置しないよう注意しなければなりません。 でないと、モジュールのディレクトリへの相対パスで一回、完全修飾パスで一回と、合計二回もパッケージが読み込まれてしまいます。 これにより些細な問題が発生する可能性があるので、Go SDKはあなたのプロジェクトとGOPATHをスキャンし、このケースを検知するとそれをエラーとして報告します。

ベストな結果を得るため、以下を推奨します:

  • プロジェクト内では、各モジュールごとにディレクトリを分けて作成する。
  • 各モジュールのディレクトリは、モジュールのapp.yamlファイルと一つ以上の.goファイルを内包するようにする。
  • Do not include any subdirectories in a module's directory.
  • .go ファイルでは完全修飾パスを使ってパッケージをインポートする; place all package code beneath src directories that are direct children of the project directory, or not under your project directory at all.

Go モジュールの構造に関する詳細情報については、Go モジュール設定を参照してください。

GoでのGOPATH導入とそれが App Engine開発とどう関係するかについては、App Engine SDK とワークスペースを参照してください。



サンドボックス

複数のウェブサーバーにまたがったアプリケーションへのリクエストを分散し、アプリケーションが別のアプリケーションへ干渉しないようにするために、 App Engineでは制限された"サンドボックス"環境内でアプリケーションを実行させます。 この環境では、アプリケーションはコードを実行し、App Engineデータストア内でデータを保存したり呼び出したり、App EngineメールやURLフェッチやUsers サービスを使用したり、ユーザーのウェブリクエストを精査して応答の準備をしたりできます。

App Engine アプリケーションでは以下のことができません:

  • ファイルシステムへの書き込み。 データを永続的に保存する場合、アプリケーションではApp Engine データストアを使用しなければなりません。 ファイルシステムからの読み込みは可能で、アプリケーションと一緒にアップロードされた全てのファイルも読み込み可能です。

  • ゆっくり応答する。アプリケーションへのウェブからのリクエストは、数秒以内に処理されなければなりません。 応答にかなり時間がかかる処理は、ウェブサーバーへの負荷を避けるために終了されます。

  • 他の種類のシステムコールを作成する。

Go ランタイム環境では、サンドボックスのポリシーに違反する標準ライブラリパッケージは制限されます。 そうした機能は、 os.ErrPermission エラーを返すスタブに置き換えられているか、完全に削除されています。



Go SDK とツール

App Engine Go SDK には、アプリケーションをテストし、アプリケーションのファイルをアップロードするためのツールが含まれています。

デベロップメントサーバを使うと、あなたのアプリケーションをローカル環境で開発やテストすることができます。 このサーバではApp Engineデータストア、サービス、サンドボックス制限をシミュレートします。 デベロップメントサーバ では、テスト中のアプリクエリー処理に基づくデータストアインデックスの設定を生成することもできます。

appcfg.pyと呼ばれる多目的ツールでは、App Engine上で動作するアプリケーションとのコマンドラインでの全てのやり取りを制御できます。 appcfg.pyツールははあなたのアプリケーションを App Engineにアップロードしたり、単にデータストアインデックスの設定を変更してコードを更新する前に新たなインデックスを構築したりもできます。 またアプリのログデータもダウンロードできるので、あなたの独自ツールを使ってアプリのパフォーマンスを解析することもできます。

ローカルでアプリを動作させたり(goapp serve)、アプリをApp Engineへ配置したり(goapp deploy)するために使用されるツールは、通常Goアプリのルートディレクトリから起動されます。 また、アプリケーションのルートディレクトリをこれらコマンドに追加したり、アプリのyaml ファイルへのフルパスや相対パスの一覧を指定することもできます。 これらコマンドの詳細情報についてはgoapp help servegoapp help deployを実行してください。

SDK には、 Go tool chainにあったいくつかのツールも含まれています:

Godocコマンドでは、Goプログラムのためにドキュメントの抽出と生成を行います。 Godoc コマンドでは、Go 標準ライブライリと SDKzipファイル内に含まれているGo App Engine SDKのソースコードを使用します。

Gofmtコマンドでは Goプログラムを見やすく整形します。