【ハンズオン】はじめてのGoogle Cloud App Engine

# はじめに

本記事では、Google Cloud App Engine（GAE）のスタンダード環境にアプリケーションをデプロイし、実行するまでの手順を説明します。

## この記事で触れないこと

* Google Cloudのアカウント作成、設定手順
* Google Cloudプロジェクトの作成手順
* Google Cloud CLIのインストール手順（[こちら](https://cloud.google.com/sdk/docs/install-sdk?hl=ja)を参照してください）
* サーバーレスの説明

## 事前条件

* Google Cloudに請求情報が登録されていること（GAEの環境構築時に必要）
* Google Cloud CLIがインストールされていること（アプリケーションのデプロイ時に必要）

## 免責事項

本記事で使用している画面キャプチャ、ロゴ、商標等の知的財産権は、それぞれの権利所有者に帰属します。  
引用しているGoogle Cloudの画面については、Google LLCのガイドラインに基づき、教育・技術共有を目的として引用しています。  
また、記事の内容は筆者の個人的見解に基づくものであり、所属企業・団体の立場や意見を代表するものではありません。

# Google Cloud App Engine（GAE）とは

Google Cloud上で動作するサーバーレスプラットフォームです。
特に、以下2つの環境があります。
* スタンダード環境
    * 特定の言語とバージョン向けに最適化されたアプリケーション実行環境
    * 最小インスタンス数はゼロまでスケールダウン可能（スケール・トゥ・ゼロ）
    * <font color="red">**無料枠が利用可能**</font>
* フレキシブル環境
    * Dockerコンテナ実行環境
    * スタンダード環境ではサポートされていないプログラミング言語やバージョンの利用が可能
    * 最小インスタンス数はゼロにできない
    * <font color="red">無料枠**なし**</font>

# ハンズオン

以下、環境の作成から動作確認、課金されないように無効化するまでの手順です。

## Step1 App Engine作成

1. ダッシュボードの「プロダクト」から、「すべてのプロダクトを表示」をクリックします
![スクリーンショット 2025-05-02 9.56.51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/65659246-ba30-4c36-96a9-492395605e52.png)
1. 「サーバーレス」の「App Engine」をクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/02e3de85-d767-4b75-b36b-ec2ae24420b2.png)
1. 「アプリケーションを作成」ボタンをクリックします
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/d4df00d5-be47-46ef-8cbe-2fd565b13544.png)
1. リージョンの各項目に下図赤枠の設定を入力し、「次へ」をクリックします
（リージョンのasia-northeast1は東京リージョンです）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/e1590c18-d5c4-4092-a64f-b4704143bab5.png)
1. しばらく待って、下図のメッセージ「Your App Engine application has been created. 〜」が表示されたら、GAEの利用準備完了です
赤枠内のプログラミング言語と環境は、このハンズオンではデフォルト（言語：Python、環境：標準）のままにしておきます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/68be0de0-54d8-42f6-835c-42808da10146.png)

## Step2 Pythonアプリケーション作成

ローカルで以下のコードを実装した`main.py`を作成します。今回のハンズオンでは[Flask](https://ja.wikipedia.org/wiki/Flask)と[Gunicorn](https://ja.wikipedia.org/wiki/Gunicorn)を利用します。
```python:main.py
from flask import Flask

app = Flask(__name__)

@app.route('/')
def hello():
    return 'Hello, World from App Engine Standard Environment in Tokyo!'

if __name__ == '__main__':
    app.run(host='127.0.0.1', port=80, debug=True)
```
あわせて、`requirements.txt`[^1]も以下の内容で作成します。
```plaintext:requirements.txt
Flask
gunicorn
```

## Step3 設定ファイル作成

`main.py`と同じディレクトリに以下設定内容の`app.yaml`を作成します。
```yaml:app.yaml
runtime: python312
entrypoint: gunicorn -b :$PORT main:app

instance_class: F1
automatic_scaling:
  min_instances: 0
  max_instances: 1
```
:::note
設定値について
* runtime : 使用するPythonのランタイムを指定（適切なバージョンに変更してください）
    * 設定例として、Python3.10で動作確認したプログラムをデプロイする場合は`python310`を設定する
* instance_class : F1では28時間の無料インスタンス時間/日が適用されます
:::

## Step4 アプリケーションのデプロイ

`main.py`が格納されているディレクトリをターミナルで開き、以下のコマンドを実行してください。
```zsh:zsh
gcloud app deploy
```

以下のようにデプロイ内容の確認を求められるので、内容に問題がなければ「Y」を入力し、エンターキーを押します。
```plaintext:zsh
Services to deploy:

descriptor:                  [/Users/yoda/AppEngine/app.yaml]
source:                      [/Users/yoda/AppEngine]
target project:              [YOUR_PROJECT_ID]
target service:              [default]
target version:              [yyyyMMddthhmmss]
target url:                  [https://YOUR_PROJECT_ID.***.com]
target service account:      [YOUR_PROJECT_ID@***.com]


Do you want to continue (Y/n)?  
```
:::note
「YOUR_PROJECT_ID」には、自身のプロジェクトIDが表示されます
:::

ターミナルに以下のメッセージが表示されます。
Deployed serviceから始まる行に、URLが表示されるのでコピーしておきます。
```plaintext:zsh
Beginning deployment of service [default]...
╔════════════════════════════════════════════════════════════╗
╠═ Uploading 0 files to Google Cloud Storage                ═╣
╚════════════════════════════════════════════════════════════╝
File upload done.
Updating service [default]...done.                                                                                     
Setting traffic split for service [default]...done.                                                                    
Deployed service [default] to [https://YOUR_PROJECT_ID.***.com]

You can stream logs from the command line by running:
  $ gcloud app logs tail -s default

To view your application in the web browser run:
  $ gcloud app browse
```

## Step5 ブラウザでアクセス

お好みのブラウザに、前項でコピーしたURLを貼り付けアクセスします。
![HelloWorld.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/6a805b15-d2cf-48f3-8c2f-fed170b44009.png)
ブラウザ上に、Pythonアプリの実行結果が表示されました。

:::note
CLIから`gcloud app browse`コマンドを実行することで、アクセスすることも可能です。
:::

## Step6 App Engineサービスの無効化（課金対策）

1. 左側ナビゲーションメニューから「設定」をクリックします
![スクリーンショット 2025-05-02 13.35.53.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/4a2dc382-a6f6-432c-9729-2ecf9544f7b8.png)
1. 「アプリケーションを無効にする」ボタンをクリックします
![スクリーンショット 2025-05-02 13.41.30.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/ac3f6224-fe8f-4a1d-a6cb-f2b2f028ed23.png)
1. 下図赤枠にアプリケーションIDを入力し、「無効にする」をクリックします
![スクリーンショット 2025-05-02 13.43.01.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3551450/b9a5f0a7-2b69-4e67-a323-d616d777a67c.png)
1. Step5でアクセスしたURLを再度開き、Not Foundになることを確認します

:::note warn
サービスの無効化を怠ると、公開しているURLへ大量にアクセスされて無料枠を使い切ってしまい、**多額の請求をされる可能性がある**ので注意してください。
参考：[App Engineの料金](https://cloud.google.com/appengine/pricing?hl=ja)
:::

# 最後に

今回はPythonとFlaskで簡単にサーバーレス環境を作りましたが、GAEでは他にもGoやJava、Node.js、PHP、Rubyがサポートされています（2025年5月現在）。

このハンズオンも、途中で`requirements.txt`を書き忘れる等、いくつかのケアレスミスで何度かつまずきましたが、初めてでも2〜3時間程度でアプリを動かすところまで到達できたので、学習コストとしては低いように感じられました。

学習のハードルは予想よりだいぶ低く感じられましたので、クラウドサービスの入門としてGAEを使ってみても良いかもしれません。

[^1]:pip install コマンドでインストールするパッケージ一覧を記述したファイル。GAEではデプロイと同時に、このファイルに記載されたパッケージを自動的にインストールする。