Windows10でPython3.7アプリ「Hello World！」をGoogle App Engine スタンダード環境にデプロイする

# GAEにおけるPython開発環境の設定

参考：https://cloud.google.com/python/setup

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/2b4a734d-03ae-cee6-5231-c28a4cea2f0d.png)

## Python 2 と Python 3 の最新バージョンのインストール
[Python のウェブサイト](https://www.python.org/downloads/windows/)から Python 2 と Python 3 両方の最新バージョンのWindowsインストーラをダウンロードし、インストールします。

> **【Python2をインストールする理由】**Cloud SDK は Python で作成されています。アプリの開発に使用する Python のバージョンにかかわらず、Cloud SDK は Python 2.7.9 以降が必要になります。ただし、Python 3 virtualenv を使用している場合でも、Cloud SDK が Python 2 のインストールを検出し、使用できます。

##virtualenv のインストールと使用
virtualenvをインストールします。

```
py -3 -m pip install --upgrade virtualenv
```

次のコマンドで、virtualenvのバージョンを確認できます。

```
py -3 -m virtualenv --version
```

virtualenv がインストールされたら、プロジェクト内に仮想環境を作成できます。次の virtualenv により、venv フォルダに Python のインストール全体の仮想コピーを作成します。
※ Python 3.7をC:\Python37にインストールしている場合、つぎのようにpython.exeのパスを指定します。

```
cd <my-prpject-folder>
py -3 -m virtualenv --python "C:\Python37\python.exe" venv
```

コピーが作成されたら、次のように仮想環境を有効化して、Python の virtualenv のパスを shell に通します。

```
.\venv\Scripts\activate
```

仮想環境を有効化にすると、他のプロジェクトやグローバルの Python インストールに影響を与えずにパッケージをインストールできます。
たとえば、pipコマンドにパスが通っており、この仮想環境にgoogle-cloud-storageをインストールできます。

```
pip install google-cloud-storage
```

仮想環境の使用をやめてグローバル Python に戻る場合は、次のコマンドで無効化できます。

```
deactivate
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/b6932e4f-d49c-fa70-b9b2-096ee35c0b3a.png)

# Cloud SDK をインストールして、App Engine 用に GCP プロジェクトを設定

参考：https://cloud.google.com/appengine/docs/standard/python3/quickstart

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/04d7ff2d-34dd-b3d0-7489-38c4072573ac.png)


##Cloud SDK のインストール
[Google Cloud SDK のドキュメント](https://cloud.google.com/sdk/docs/)から、最新のCloud SDK のインストーラをダウンロードし、インストールします。
※ gcloud init を実行する前に、GCPでプロジェクトを事前に作成しておくことをお勧めします。

> インストールが完了したら、次のオプションを受け入れます。
> - Cloud SDK シェルを起動する
> - gcloud init を実行する

##プロジェクトの確認と設定
プロジェクトが作成されたことを確認します。

```
gcloud projects describe [YOUR_PROJECT_ID]
```

次のようなプロジェクトの詳細が表示されます。

>createTime: year-month-hour
lifecycleState: ACTIVE
name: project-name
parent:
id: '433637338589'
type: organization
projectId: project-name-id
projectNumber: 499227785679

プロジェクトで App Engine アプリを初期化し、そのリージョンを選択します。

```
gcloud app create --project=[YOUR_PROJECT_ID]
```

プロンプトが表示されたら、App Engine アプリケーションを配置するリージョンを選択します。
※アプリのリージョンを設定した後で変更することはできません。

ここで、プロジェクトで課金が有効になっていることを確認します。アプリケーションを App Engine にデプロイするには、課金アカウントをプロジェクトにリンクする必要があります。

[課金を有効](https://console.cloud.google.com/projectselector/billing)にします。

##Python 3.7 用の App Engine 拡張機能
次のコマンドを実行して、Python 3.7 用の App Engine 拡張機能が含まれる gcloud コンポーネントをインストールします。
※コマンドプロンプトを管理者権限で実行している必要があります。

```
gcloud components install app-engine-python
```

#Hello World サンプルアプリ
##Gitをインストール
Hello World アプリをダウンロードするために、[Gitをダウンロード](https://git-scm.com/)し、インストールします。

##Hello World アプリをダウンロードする
Hello World サンプルアプリ リポジトリのクローンをローカルマシンに作成します。

```
cd C:\workgit
git clone https://github.com/GoogleCloudPlatform/python-docs-samples
```

##ローカルマシンで Hello World を実行する

プロジェクトの**外部のディレクトリ**にvirtualenvで Python 仮想環境を作成し、それを有効化します。

```
cd C:\workgit
mkdir myenv
cd myenv
py -3 -m virtualenv --python "C:\Python37\python.exe" venv
```
```
.\venv\Scripts\activate
```

プロジェクト ディレクトリに移動し、依存関係をインストールします。

```
cd C:\workgit\python-docs-samples/appengine/standard_python37/hello_world
pip install -r requirements.txt
```

アプリケーションを実行します。

```
python main.py
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/2278ffec-4b3c-9aba-2e22-774a06bfd1cc.png)

ウェブブラウザに次のアドレスを入力します。

```
http://localhost:8080
```
Ctrl+C キーを押してアプリケーションを終了します。

仮想環境の使用をやめてグローバル Python に戻る場合は、次のコマンドで無効化できます。

```
deactivate
```

# App Engine にデプロイして実行する
##App Engine スタンダード環境にデプロイする
standard_python37/hello_world ディレクトリから次のコマンドを実行して、Hello World アプリをデプロイします。

```
cd C:\workgit\python-docs-samples/appengine/standard_python37/hello_world
gcloud app deploy
```

##デプロイ時のエラーの対処
APIを有効にする旨の指示（エラー）が出たので、指示に従って、有効にします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/47f3ecd8-7844-4f42-0cfc-9e297ea83375.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/c024ad30-b200-323f-a6f8-3b5fd4c37c7a.png)

再度、実行するとデプロイに成功します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/252891/c0637b5a-e001-d133-160e-85f0299dfb6c.png)

#クリーンアップ
課金されないようにするには、GCP プロジェクトを削除してプロジェクト内のすべてのリソースへの課金を停止します。

1. GCP Console で [プロジェクト] ページに移動します。[プロジェクト ページに移動](https://console.cloud.google.com/iam-admin/projects)
1. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
1. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

#まとめ
- Python2とPython3をインストールし、仮想環境（virtualenv）を設定しました。
- Google Cloud SDK をインストールし、Python環境を構築しました。
- 仮想環境を有効化し、Python3.7とFlaskとで、アプリ「Hello World!」をローカルで実行しました。
- ローカル環境で実行したアプリをデプロイし、GAE上で実行しました。
- 課金されないように作成したGCPプロジェクトを削除しました。