Louisa and Lily

GAEでGo言語製ウェブサーバーのためのapp.yamlの基本的な書き方

Date: January 13, 2018

Google Cloud PlatformApp Engine に作成したプログラムをデプロイし実行させるためには『app.yaml』というファイルを作成し、インスタンスの様々な設定、コンテンツをどう配信するかなどを書かなければなりません。

当ブログも GAE(App Engine)を利用しており、app.yaml も作成してデプロイしています。初めて GAE にデプロイする際、その記述方法について色々と調べましたが、古い情報ばかりであったり正しく動作しないことが多く苦戦しました。

そこで、今回は現在も利用できる記述方法で書き、シンプルだけど実用的な HTTPS に対応したGo言語製ウェブサーバーの場合での app.yaml をご紹介していきたいと思います。

app.yaml の例

まずは、実際に私が使用しているものを少しシンプルにした、基本的なものをご紹介します。解説は後ほどします。


# インスタンス設定
runtime: go
api_version: go1.8
env: standard
threadsafe: true
instance_class: F1

# アクセス振り分け
handlers:
  - url: /favicon.ico
    static_files: static/favicon.ico
    upload: static/favicon.ico

  - url: /css
    static_dir: css
  
  - url: /js
    static_dir: js

  - url: /.*
    script: _go_app
    secure: always
    redirect_http_response_code: 301

# 環境変数
env_variables:
  CLOUDSQL_CONNECTION_NAME: project-id:asia-northeast1:sql
  CLOUDSQL_USER: root
  CLOUDSQL_PASSWORD: 'password'

解説

では、軽く解説していきたいと思います。

インスタンス設定


# インスタンス設定
runtime: go
api_version: go1.8
env: standard
threadsafe: true
instance_class: F1

まずはインスタンス設定です。

使用プログラミング言語

『runtime』で使用する言語を指定します。今回は Go言語を使用するので『go』と書きます。

言語バージョン

『api_version』で使用する言語のバージョンを指定します。Go言語の場合、バージョン1.6を使うなら『go1.6』を指定し、1.8なら『go1.8』を指定します。

尚、サポートされている最新バージョンを使用する場合は『go1』を指定します。2018年1月14日現在におけるサポートされている最新バージョンは 1.8 なので『go1』を指定すると、バージョン1.8 の Go言語が使用されます。

インスタンスの種類

『env』でインスタンスの種類を指定します。

インスタンスには大きく分けて2種類あり、1つは使用出来るライブラリ等が大きく制限されますが、自動スケーリング性能に優れた『スタンダード環境』で『standard』と指定することで選べます。

もう1つは、スケーリング性能はスタンダードに比べると劣りますが、ライブラリなどの制限がほぼ無い『フレキシブル環境』で『flex』と指定することで選べます。

ウェブサーバーやアプリのためのサーバー、それらであれば大量のアクセスが来ても柔軟に対処しやすい『スタンダード環境』がオススメです。

スレッドセーフ

『threadsafe』でスレッドセーフにするかを選ぶことが出来ます。これをオフにしていると、アクセスに対する処理が順番待ちになるようです。処理時間が長くなるアクセスが来てしまった場合、他の処理が順番待ちとなるので通常はオンにしておくと良さそうです。

インスタンスクラス

『instance_class』で使用するインスタンスクラスを指定します。これを指定しなかった場合、デフォルトで『F1』クラスが選択されるようです。

インスタンスクラス名の頭文字が『F』だと自動スケーリングされ、『B』だとスケーリングはベーシックか、手動で行う必要があります。インスタンスクラス名の数字は上がる程、性能が良くなります。

GAE ではスタンダード環境であれば『1日28インスタンス時間』までであれば無料となり、超えた分のみ課金されます。なので、出来る限りスタンダード環境で動作するように設計するとお得になりますし、アクセスが少ない初期の頃には助かる仕様となっています。

インスタンス時間というのは、例えば28インスタンス時間であれば『F1』クラスで1日28時間起動した時間となります。1日は24時間なのにどうして28時間なのかと言うと、F1を2つ起動した場合なども考えられているからです。

F1 を2つ起動し、14時間使用したら28インスタンス時間となります。また、性能と料金が2倍になっている『F2』を14時間起動しても28インスタンス時間となります。F4 であれば7時間の起動で28インスタンス時間です。

アクセス振り分け


# アクセス振り分け
handlers:
  - url: /favicon.ico
    static_files: static/favicon.ico
    upload: static/favicon.ico

  - url: /css
    static_dir: static/css
  
  - url: /js
    static_dir: static/js

  - url: /.*
    script: _go_app
    secure: always
    redirect_http_response_code: 301

次にアクセスの振り分けです。初めに『handlers』と書き、その下へ URL ごとの処理を書きます。

URL の指定

『- url』で処理を振り分けたい URL を指定します。ルートに対するアクセスであれば『/.*』と指定します。

静的配信

GAE では、自分で作ったプログラムだけでなく、CSS や Javascript ファイルといった静的ファイルの配信も可能です。静的ファイルをローカルPC から GAE にアップロードする際は、app.yaml と同じフォルダに対象ファイルなどを置きます。

当ブログでは以下のようなフォルダ構成にしています。

静的ファイルのアップロード

今回は『- url: /favicon.ico』という静的ファイルを配信しています。ファイルのアップロードを行うには『static_files』と『upload』で指定します。

ローカルPCの『WebServer』フォルダにある『static/favicon.ico』というファイルが GAE にアップロードされ、『/favicon.ico』というアドレスでサーバーにアクセスすれば取得出来るようになります。

ディレクトリごとアップロード

ディレクトリ単位で行うためには『static_dir』でアップロードするフォルダ名を指定します。当ブログでは、ブログで使用している CSSフレームワークやシンタックスハイライト用のものを GAE から静的配信しています。

Goプログラムへ振り分け

作成したプログラムへの振り分けは『script』と書き、Goプログラムへは『_go_app』を指定します。

常時SSL化

HTTPからHTTPS へリダイレクトさせ、常時SSL化を行うためには『secure: always』と書きます。

また、リダイレクトさせる際の HTTPレスポンスコードを指定するには『redirect_http_response_code』を書き、次のコード番号を指定します。

環境変数の指定


# 環境変数
env_variables:
  CLOUDSQL_CONNECTION_NAME: project-id:asia-northeast1:sql
  CLOUDSQL_USER: root
  CLOUDSQL_PASSWORD: 'password'

当ブログでは Google Cloud SQL を使用して記事情報などを管理しており、データベースのユーザー名、パスワードなどは環境変数として app.yaml に指定しています。

環境変数を指定するためには『env_variables』と書き、それ以下に名前と値を書き込んでいきます。

さいごに

これで Go言語製ウェブサーバーにおける基本的な app.yaml の書き方の紹介と解説は以上です。app.yaml の詳しい仕様については app.yaml Reference をご確認ください。

関連記事