【GCPを使いたい】QwiklabsでGAEを学ぶ

日曜プログラマーの皆さん、こんにちは。

今回は、GAEのデプロイ方法とapp.yamlについて学ぼうと思います。GAEって簡単にデプロイできるので、デプロイできればいいじゃんって感じでapp.yamlの記述とか意外とスルーしちゃうんですよね…。

QwiklabsでHello GAE!

今回お試しで使っていく環境は、Qwiklabsの「App Engine: Qwik Start – Go」です。Qwiklabsは、普段GCPが提供するサービスの利用方法を学ぶために使っているので、Qwiklabsを使っていこうと思います。

Qwiklabs「App Engine: Qwik Start – Go」

実際の講座にコマンドと説明が記載されているので、講座の内容はざっくり進めます。

gcloud app deploy command
## サンプルコードのダウンロード
$ git clone https://github.com/GoogleCloudPlatform/golang-samples.git

## ディレクトリ移動
$ cd golang-samples/appengine/go11x/helloworld

## コマンドインストール エラーが出ました(笑)
$ gcloud components install app-engine-go

ERROR: (gcloud.components.install)
You cannot perform this action because the Google Cloud CLI component manager
is disabled for this installation. You can run the following command
to achieve the same result for this installation:

sudo apt-get install google-cloud-sdk-app-engine-go

## 再度コマンドインストール(クラウドシェルには基本的なgcloudコマンドがインストールされているのでアップデートなし)
$ sudo apt-get install google-cloud-sdk-app-engine-go
...
google-cloud-sdk-app-engine-go is already the newest version (375.0.0-0).
0 upgraded, 0 newly installed, 0 to remove and 8 not upgraded.

## 一応参考までにgcloud versionで確認
$ gcloud version
Google Cloud SDK 375.0.0
alpha 2022.02.25
app-engine-go 1.9.72
app-engine-java 1.9.95
app-engine-python 1.9.99
app-engine-python-extras 1.9.96
beta 2022.02.25
bigtable
bq 2.0.74
bundled-python3-unix 3.8.11
cbt 0.11.0
cloud-build-local 0.5.2
cloud-datastore-emulator 2.1.0
core 2022.02.25
datalab 20190610
gsutil 5.6
kpt 1.0.0-beta.13
local-extract 1.4.0
minikube 1.24.0
pubsub-emulator 0.6.0
skaffold 1.36.0

## GAEにデプロイしてみる
$ gcloud app deploy
You are creating an app for project [qwiklabs-gcp-00-5e4c45612376].
WARNING: Creating an App Engine application for a project is irreversible and the region
cannot be changed. More information about regions is at
<https://cloud.google.com/appengine/docs/locations>.

Please choose the region where you want your App Engine application located:

 [1] asia-east1    (supports standard and flexible)
 [2] asia-east2    (supports standard and flexible and search_api)
 [3] asia-northeast1 (supports standard and flexible and search_api)
 [4] asia-northeast2 (supports standard and flexible and search_api)
...
 [24] cancel
Please enter your numeric choice:  4

Creating App Engine application in project [qwiklabs-gcp-00-5e4c45612376] and region [asia-northeast2]....done.     
Services to deploy:

descriptor:                  [/home/student_04_459e7d075272/golang-samples/appengine/go11x/helloworld/app.yaml]
source:                      [/home/student_04_459e7d075272/golang-samples/appengine/go11x/helloworld]
target project:              [qwiklabs-gcp-00-5e4c45612376]
target service:              [default]
target version:              [20220312t143708]
target url:                  [https://qwiklabs-gcp-00-5e4c45612376.dt.r.appspot.com]
target service account:      [App Engine default service account]

Do you want to continue (Y/n)?  Y

Beginning deployment of service [default]...
Created .gcloudignore file. See `gcloud topic gcloudignore` for details.
Uploading 6 files to Google Cloud Storage
...
100%
File upload done.
Updating service [default]...done.     
Setting traffic split for service [default]...done.   
Deployed service [default] to [https://qwiklabs-gcp-00-5e4c45612376.dt.r.appspot.com]
...

## URLにアクセスしてみよう!!(ブラウザでも可!)
$ curl https://qwiklabs-gcp-00-5edcf4289890.dt.r.appspot.com
Hello, World!

app.yamlを触ってみよう

よく使いそうな設定を書いてみました。ほかにも設定可能な項目もたくさんありますので、気になる方は、調べてみてください。

runtime: go115
service: app-hello-go115

instance_class: F1
automatic_scaling:
  target_cpu_utilization: 0.6
  target_throughput_utilization: 0.6
  max_instances: 5
  min_instances: 0
  max_idle_instances: automatic  # default value
  min_idle_instances: 0
  max_concurrent_requests: 10
  • runtime
    • どんな言語のバージョンを使っているの?って感じです。
  • service
    • GAEにデプロイするときのサービス名になります。GAEデプロイ後に払い出されるURLの文字列にも含まれます。サービスを設定しない場合、サービス名「default」でデプロイされます。何もGAEにサービスが存在しない場合、必ずdefaultサービスが存在しないといけないというルールになっています。いきなり「default」以外のサービスをデプロイしようとすると、エラーになります。
  • instance_class
    • GAEのマシンタイプです。一番安いマシンタイプはF1、その上はF2、F3、F4と上がっていきます。Fクラスのインスタンスの無料枠は、一日当たり28インスタンス時間なので、一日中1インスタンスを立ち上げる分には無料枠で動かせますが、オートスケーリングで2インスタンス稼働すると無料枠から外れる可能性があるので注意!
  • target_cpu_utilization
    • 新しいインスタンスを立ち上げるCPU指標。設定範囲は「0.5~0.95」。0.6の場合、現在の全体インスタンスの60%以上の使用率だった場合、新しいインスタンスを立ち上げます。1インスタンスのパフォーマンスを最大限引き出すのであれば、高く設定したほうがいいでしょう。
  • target_throughput_utilization
    • 同時リクエスト数によってインスタンスを立ち上げる指標。1インスタンスで複数のリクエストを処理すると遅延が発生する可能性があるので、アクセス数が増えた場合にインスタンスを立ち上げるよってこと。
    • 設定範囲は「0.5~0.95」。max_concurrent_requestsと合わせて使う設定値で、「同時リクエスト数=max_concurrent_requests×target_throughput_utilization」に達した場合、新しいインスタンスを立ち上げます。
  • max_instances、min_instances
    • max_instances:最大インスタンス数。お金を絶対かけたくない場合、max_instancesは「1」にすることで、それ以上立ち上がることはない。
    • min_instances:常に立ち上がってほしいインスタンス数。「立ち上がりが遅いアプリケーション」「常時立ち上がってほしい」「急なアクセスに対応したい」といった場合に利用できそう。
  • max_idle_instances、min_idle_instances
    • max_idle_instances:アクティブな状態になるインスタンスを準備したものの数の最大数。少なすぎると、コストを抑えることができる反面、急な負荷にインスタンスの立ち上がりが遅くなる可能性がある。
    • min_idle_instances:最小のアイドルインスタンスを設定することで、急な負荷に迅速に対応することができるが、コストが増える可能性がある点に注意。
  • max_concurrent_requests
    • インスタンスが受け入れることができる同時接続数。設定値の範囲は「10~80」。デフォルトは10で、10より小さい数値はお勧めしないと公式に記載あり。必ずシングルスレッドで動かさないといけないアプリケーションの場合はその限りではないっぽい。

QwiklabsでGCPを学ぶ理由

Google Cloud Platformには無料枠があるけど…。

Google Cloud Platform(以下、GCP)は、従量課金制のクラウドサービスです。GAEを含め、一部のサービスでは無料枠が設けられているので、自分しか使わない(または、アクセス数が少ない)環境で動かすだけであれば、無料で使えるケースがほとんどです。

でも、「どのぐらいで無料枠から有料になる?」「莫大な料金を請求されたら怖い」などなど、気づかないうちに無料枠から外れて、料金が発生しているケースを想像すると怖くなりませんか?

Qwiklabsでは、各カタログで独立したGCP Projectが立ち上がり、必要なリソースのみを利用することができます。その間に利用したGCPリソースは請求されないので安心です。

Google Cloud Platformの無料枠以外のサービスを使ってみたい!

GCPが提供するサービスは多岐にわたっており、無料枠では提供されていない機能のほうが多くあります。「仕事でクラウドサービスを使うことになったので学んでおきたい」「ほかのサービスも使ってみたい」など、Qwiklabsに存在するチュートリアルなどのカタログの中から気になるサービスを利用してみることで、よりGCPについて理解が深まると考えています。

Qwiklabsは有料です。

Qwiklabsで学ぶことの利点をお話ししましたが、Qwiklabsは有料のサービスです。(一部、無料で提供されている講座もあります。)

Qwiklabsの料金「クレジット」と呼ばれる単位で決まっています。1クレジット=1ドルで、各講座ごとに利用するクレジットが異なります。クレジットの購入は、都度購入とサブスクリプションが存在します。

Qwiklabsをたくさん利用するよ!って方は、サブスクリプションに登録することで、クレジットを気にすることなく、様々な講座を受けることができるので、サブスクリプションがおすすめです。