LoginSignup
5
4

More than 3 years have passed since last update.

GAE/Go が 1.12 でだいぶ簡単になったみたいなので echo を使った普通のウェブアプリケーションを作ってみる

Posted at

はじめに

  • GAE/Go でウェブアプリケーションを作ろうとすると専用のライブラリを使う必要があったり専用のブートストラップ処理を実装する必要があったりとちょっと面倒だったのですが、Go 1.12 のランタイムからコンテナの実装が変わったということで普通のウェブアプリケーションと同じ感じで簡単につくれるようになったみたいです。
  • この記事ではその GAE/Go 1.12 環境で web application framework の echo を使い go modules で依存関係管理をする普通のウェブアプリケーションを作ってみます。

できたものがこちらです

  • 作ったアプリケーションはこちらです。
  • サンプルとして HTTP ハンドラがひとつあるだけのアプリケーションになります。

ファイル構成

app.go        # アプリケーションのメイン処理
app.yaml      # GAE 設定ファイル
go.mod        # go modules 設定ファイル
app/
  handler.go  # アプリケーションの HTTP ハンドラ
  template.go # アプリケーションのテンプレート処理
template/
  index.html  # テンプレートファイル
public/
  favicon.ico # 静的ファイル

アプリケーションのメイン処理

  • GAE/Go のメイン処理であるサーバーを立ち上げる部分ですが、以前は init() とかでやっていてちょっと特殊な感じでした。
  • Go 1.12 では main() で普通にウェブサーバーを立ち上げるだけで良くなったので気持ちいいです。
  • 特殊な点として環境変数 PORT で引き渡されたポートでウェブサーバーを起動する必要があります。
func main() {
    e := echo.New()

    e.Renderer = app.NewTemplate("templates/*.html")

    e.GET("/", app.IndexHandler)

    port := os.Getenv("PORT")
    if port == "" {
        port = "8080"
        e.Logger.Printf("Defaulting to port %s", port)
    }
    e.Logger.Fatal(e.Start(fmt.Sprintf(":%s", port)))
}

GAE 設定ファイル

  • 設定ファイルである app.yaml も項目が整理されてだいぶスッキリしたようです。
    • 公式ドキュメントはこちらです。
    • Deprecated になった項目はこちらから確認できます。

runtime: go112

handlers:
  - url: /favicon.ico
    mime_type: image/x-icon
    static_files: public/favicon.ico
    upload: public/favicon.ico

  - url: /public
    static_dir: /public

  - url: /.*
    secure: always
    script: auto

依存関係の管理

  • 依存関係の管理は go modules を使うようです。

go modules の利用準備

  • go 1.12 をインストールします

依存関係管理の初期化

  • 依存関係管理の初期化をするためにプロジェクトのルートで以下のコマンドを実行します
go mod init {MODULE_NAME}
  • go modules はプロジェクトルートが GOPATH 以下であるかや環境変数 GO111MODULE の値によって挙動が変わります。
  • 細かいことはおいておいて常に初期化を成功させたい場合は以下のコマンドを実行してください。
  • 詳細はこちらなどが参考になりました。
GO111MODULE=on go mod init {MODULE_NAME}

依存関係を解決する

  • go build など各種 go コマンドを実行するごとに自動で依存関係が解決され go.mod ファイルに記録されます

依存関係を反映させる

  • GAE/Go 1.12 は go modules に対応しており go.mod ファイルを置いておくとデプロイ先で依存関係を解決してくれるようです。

デプロイ

  • デプロイは gcloud コマンドで行います。
gcloud app deploy ./app.yaml --project PROJECT_NAME

他サービスとの連携

  • Cloud Datastore とのデータの読み書きをなどの他サービスとの連携をする場合、従来は http.Request から appengine.NewContext して認証情報を取得するというような面倒な手順がありました。
  • GAE/Go 1.12 ではサービスアカウントに権限を付けておくと golang.org/x/oauth2/google を使って認証できるようになるということで、ここのモック化が簡単であればだいぶ開発しやすくなっているはずだと思いますが、今検証できていないので後で時間があれば確認してみます。
  • 関連ドキュメントはこちらです。

おわりに

  • GAE/Go は便利だけどクセが強いのが微妙だと思っていたんですが、1.12 でだいぶ普通に使えるようになっているみたいなのがうれしいです。 今回さわりだけ見てみましたが、もうちょっとちゃんと時間使って使いこなせるようになろうと思います。
5
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
4