GCP - App Engine アプリケーション構築チュートリアル改編

App Engineを利用するために必要なサービスアカウントの権限や認証周りなどの設定方法からデプロイ手順を紹介します。

# サービスアカウントの作成
まず初めに行いたいのがサービスアカウントの作成です。
サービスアカウントとはユーザーの代わりにシステムがGCP各サービスを利用するためのアカウントのこと。

#### アカウントの作成
今回は[コンソール　サービスアカウント](https://console.cloud.google.com/iam-admin/serviceaccounts)から作成をします。

| ユーザー名       |       ロール1 |    ロール2    |
|:-----------------|:------------------|:------------------|
| minarai-app-engine|App Engine 管理者|Cloud Buildサービスアカウント|

#### 捕捉：アクセス制御
1. 基本ロールでEditor権限（アプリケーション コードのデプロイ）が必要なので設定してあげる。
詳しくは「[App Engine へのアクセスを許可する役割](https://cloud.google.com/appengine/docs/flexible/python/roles?hl=ja)」を参照。

2. [PROJECT_NUMBER]@cloudbuild.gserviceaccount.comにはApp Engine 管理者のロールとCloud Buildサービスアカウントのロールを 付与してあげる。
詳しくは「[App Engine へのデプロイ](https://cloud.google.com/cloud-build/docs/deploying-builds/deploy-appengine)」及び「[クイックスタート: デプロイ](https://cloud.google.com/cloud-build/docs/quickstart-deploy)」を参照。

#### サービスアカウントの鍵を作成
サービスアカウント一覧に`minarai-app-engine@****`が表示されたら`操作`から**鍵を作成（json)**を選択すると鍵が生成されローカルPCにダウンロードされるので適切な場所に配置する

#### サービス実行アカウントを変更
作成したサービスアカウントをアクティブにする

- 現在の設定一覧とアクティブなアカウントを確認する

```
% gcloud config configurations list
NAME     IS_ACTIVE  ACCOUNT                 PROJECT      COMPUTE_DEFAULT_ZONE  COMPUTE_DEFAULT_REGION
default  True       アカウント@gmail.com  プロジェクトID

# （省略化）　ついでにCOMPUTE_DEFAULT_ZONEも追加した
gcloud config set compute/region asia-northeast1
gcloud config set compute/zone asia-northeast1-a

# （省略化）　改めて確認
% gcloud config configurations list               
NAME     IS_ACTIVE  ACCOUNT                 PROJECT      COMPUTE_DEFAULT_ZONE  COMPUTE_DEFAULT_REGION
default  True       アカウント@gmail.com  プロジェクトID  asia-northeast1-a     asia-northeast1
```
- [新しいコンフィグを作成する](https://cloud.google.com/sdk/gcloud/reference/config/configurations/create?hl=ja)

`構文： gcloud config configurations create NAME FLAG`

```
% gcloud config configurations create minarai-app-engine --activate

% gcloud config configurations list                                
NAME                IS_ACTIVE  ACCOUNT                 PROJECT      COMPUTE_DEFAULT_ZONE  COMPUTE_DEFAULT_REGION
default             False      アカウント@gmail.com  プロジェクトID  asia-northeast1-a     asia-northeast1
```

- [サービスアカウントをコンフィグに紐づける](https://cloud.google.com/sdk/gcloud/reference/config/set?hl=ja)

`構文: gcloud config set core/project プロジェクトID`
`構文： gcloud config set core/account サービスアカウント`
`構文： gcloud　config set compute/region リージョン`
`構文： gcloud config set compute/zone ゾーン`

```
% gcloud config set core/project プロジェクトID
% gcloud config set core/account サービスアカウント
% gcloud config set compute/region asia-northeast1
% gcloud config set compute/zone asia-northeast1-a

% gcloud config configurations list 
NAME                IS_ACTIVE  ACCOUNT                                                 PROJECT      COMPUTE_DEFAULT_ZONE  COMPUTE_DEFAULT_REGION
default             False      アカウント@gmail.com                                  プロジェクトID  asia-northeast1-a     asia-northeast1
minarai-app-engine  True       minarai-app-engine@アカウント.iam.gserviceaccount.com  プロジェクトID  asia-northeast1-a     asia-northeast1
```

- サービスアカウントの認証

```
% gcloud auth activate-service-account --key-file ~/Documents/key.json
```

# [App Engine 用の基本的なウェブサービスの作成](https://cloud.google.com/appengine/docs/standard/python3/building-app/writing-web-service?hl=ja)

#### [Cloud Build のドキュメント](https://cloud.google.com/cloud-build/docs)
App Engineはファイルのアップロード＆ビルドを行います。
ビルドの際に[Cloud Buildサービス](https://console.cloud.google.com/apis/api/cloudbuild.googleapis.com)が利用されるため、Cloud Buildを有効にする必要があります。

Cloud Build は、Google Cloud Platform インフラストラクチャでビルドを行うサービスです。Cloud Build は、Google Cloud Storage、Cloud Source Repositories、GitHub、Bitbucket からソースコードをインポートし、仕様に合わせてビルドを実行して、Docker コンテナや Java アーカイブなどのアーティファクトを生成します。

Cloud Build は、一連のビルドステップとしてビルドを実行します。各ビルドステップは、Docker コンテナで実行されます。ビルドステップでは、環境に関係なく、コンテナから実行可能なすべての処理を実行できます。タスクを実施するには、Cloud Build が提供するサポート対象のビルドステップを使用するか、独自のビルドステップを作成します。

GAEではアプリケーションファイルを`Cloud Storage`にアップロードし、`Cloud Build`を使ってデプロイを行う。

# App Engine アプリケーションを作成する
App Engineを利用するためにはまずApp Engineアプリケーション作成を行う。
アプリケーションの作成は**コマンド**から**コンソール**からの２つの作成方法がある。
**作成するアカウントはプロジェクトのオーナーである必要があります。**

- コマンドから作成する

```
# プロジェクトが未作成の場合は次のコマンドを実行して Cloud プロジェクトを作成
gcloud projects create

# 次のコマンドを実行して、リージョンを選択し、App Engine アプリケーションを作成
gcloud app create
```

# サンプルアプリケーションデプロイ

```
% git clone https://github.com/GoogleCloudPlatform/python-docs-samples
% cd python-docs-samples/appengine/standard_python37/building-an-app/building-an-app-1


% pip install -r requirements.txt
Could not build wheels for Flask, since package 'wheel' is not installed.
Could not build wheels for Jinja2, since package 'wheel' is not installed.
Could not build wheels for Werkzeug, since package 'wheel' is not installed.
Could not build wheels for itsdangerous, since package 'wheel' is not installed.
Could not build wheels for click, since package 'wheel' is not installed.
Could not build wheels for MarkupSafe, since package 'wheel' is not installed.
# 上記エラーが出たら下記を実行して再度インストール
% pip install wheel
% pip install -r requirements.txt

# ローカルでテスト
% python main.py

# appl サービス作成
% gcloud app create
# deploy
% gcloud app deploy

API [appengine.googleapis.com] not enabled on project [860884311409]. 
Would you like to enable and retry (this will take a few minutes)? 
(y/N)?  y

Enabling service [appengine.googleapis.com] on project [860884311409]...
ERROR: (gcloud.app.deploy) PERMISSION_DENIED: Service Usage API has not been used in project 860884311409 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/serviceusage.googleapis.com/overview?project=プロジェクトNumber then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
- '@type': type.googleapis.com/google.rpc.Help
  links:
  - description: Google developers console API activation
    url: https://console.developers.google.com/apis/api/serviceusage.googleapis.com/overview?project=プロジェクトNumber

```

[Service Usage API](https://console.developers.google.com/apis/api/serviceusage.googleapis.com/)を有効にしてくださいと怒られたので有効にしてもう一度デプロイ実行します

```
% gcloud app deploy
```

今度は[App Engine Admin API]( https://console.developers.google.com/apis/api/appengine.googleapis.com/)を有効にしてくださいと言われましたので有効にしてもう一度デプロイ実行します

```
% gcloud app deploy

File upload done.
Updating service [default]...done.                                                                                                                                                                                                           
Setting traffic split for service [default]...done.                                                                                                                                                                                          
Deployed service [default] to [https://minarai-gcp.an.r.appspot.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
```

#### サンプルサービスをブラウザで表示
下記コマンドでブラウザを起動し表示させることができる

```
gcloud app browse
```

[GCP - App Engine アプリケーション構築チュートリアル GCS編](https://qiita.com/minarai/private/ca09941ace4eca710192)へ続きます