Go用 Google App Engine へようこそ。 App Engineを使えば、プログラミング言語 Go を使ってウェブアプリケーションを構築できます。 Go アプリケーションはGoogleの拡張可能なインフラ上で実行し、大規模な永続ストレージと各種サービスを使用します。
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 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で 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
ファイルを内包するようにする。.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
エラーを返すスタブに置き換えられているか、完全に削除されています。
App Engine Go SDK には、アプリケーションをテストし、アプリケーションのファイルをアップロードするためのツールが含まれています。
デベロップメントサーバを使うと、あなたのアプリケーションをローカル環境で開発やテストすることができます。 このサーバではApp Engineデータストア、サービス、サンドボックス制限をシミュレートします。 デベロップメントサーバ では、テスト中のアプリクエリー処理に基づくデータストアインデックスの設定を生成することもできます。
appcfg.pyと呼ばれる多目的ツールでは、App Engine上で動作するアプリケーションとのコマンドラインでの全てのやり取りを制御できます。
appcfg.py
ツールははあなたのアプリケーションを App Engineにアップロードしたり、単にデータストアインデックスの設定を変更してコードを更新する前に新たなインデックスを構築したりもできます。
またアプリのログデータもダウンロードできるので、あなたの独自ツールを使ってアプリのパフォーマンスを解析することもできます。
ローカルでアプリを動作させたり(goapp serve
)、アプリをApp Engineへ配置したり(goapp deploy
)するために使用されるツールは、通常Goアプリのルートディレクトリから起動されます。
また、アプリケーションのルートディレクトリをこれらコマンドに追加したり、アプリのyaml
ファイルへのフルパスや相対パスの一覧を指定することもできます。
これらコマンドの詳細情報についてはgoapp help serve
や goapp help deploy
を実行してください。
SDK には、 Go tool chainにあったいくつかのツールも含まれています:
Godocコマンドでは、Goプログラムのためにドキュメントの抽出と生成を行います。 Godoc コマンドでは、Go 標準ライブライリと SDKzipファイル内に含まれているGo App Engine SDKのソースコードを使用します。
Gofmtコマンドでは Goプログラムを見やすく整形します。