Google App Engine で始める Go 実践入門 Part 8 【デプロイ】

連載を通して簡単なブログアプリを作成しつつ Go/GAE について学んでいきます。
今回は デプロイ についての説明です。

- [Part 1. 『GO / Cloud SDK のインストール』](https://qiita.com/rema424/items/743bc508ef70cd980e17)
- [Part 2. 『GOPATH』](https://qiita.com/rema424/items/009f6345eb75a80bf369)
- [Part 3. 『プロジェクトの作成』](https://qiita.com/rema424/items/19b946c311f3b3b3f953)
- [Part 4. 『ディレクトリ構成』](https://qiita.com/rema424/items/1a6096c77b90ea350a26)
- [Part 5. 『Visual Studio Code』](https://qiita.com/rema424/items/b2ecdd2c7ec7fc1b0a7c)
- [Part 6. 『Hello World』](https://qiita.com/rema424/items/66ce1b02d7de588e63cf)
- [Part 7. 『リモートデバッグ』](https://qiita.com/rema424/items/996aaf0ab69670224af4)
- [Part 8. 『デプロイ』](https://qiita.com/rema424/items/dbf851908dbfc95f9b6f) ← イマココ
- [Part 9. 『Makefile』](https://qiita.com/rema424/items/3a099dfb023aa06086f5)
- [Part 10. 『Circle CI』](https://qiita.com/rema424/items/4dcb37346cecc544dfaa)
- Part 11. 『Dependency Injection』
- Part 12. 『ローカルDB with Docker』
- Part 13. 『gorm』
- Part 14. 『Cloud SQL』
- Part 15. 『Cloud SQL Proxy』
- Part 16. 『HTML』
- Part 17. 『CSS/JS』
- Part 18. 『Google Analytics』
- Part 19. 『Google Search Console』
- Part 20. 『A/B テスト』
- Part 21. 『ユーザーの作成』
- Part 22. 『Firebase Auth』
- Part 23. 『記事の作成』
- Part 24. 『コメントの作成』
- Part 25. 『ページネーション』

# デプロイ

アプリケーションをクラウド上にデプロイします。

GCP プロジェクトを作成した際に使用した個人の Google アカウントで認証を通してデプロイすることもできますが、後のデプロイ自動化も見据え、デプロイ用サービスアカウントを作成して認証を通します。

サービスアカウントは次の手順で作成します。

まずは GCP のダッシュボードにアクセスし、そこからサービスアカウントの作成画面へ移動します。

```
[GCPプロジェクトダッシュボード] > [ナビゲーションメニュー] > [API とサービス] > [認証情報] > [認証情報を作成] > [サービスアカウントキー]
```

サービスアカウントの作成に必要な情報を入力します。入力が完了したら [作成] をクリックします。

```yaml
サービスアカウント: 新しいサービスアカウント
  サービスアカウント名: (任意)
  役割: 
    - App Engine サービス管理者
    - App Engine デプロイ管理者
  サービスアカウントID: (任意)
キーのタイプ: JSON
```

[作成] をクリックすると秘密鍵が PC にダウンロードされます。
プロジェクトルートディレクトリ直下に `key` という名称のディレクトリを作成し、秘密鍵をこのディレクトリ内にリネームしつつ移動させます。

秘密鍵は GitHub 上にはアップしないので、`.gitignore` に `key` ディレクトリを追加します。

```sh
# ディレクトリ作成
mkdir key

# 秘密鍵をリネームしつつ移動
mv /path/to/secret-key.json ./key/deploy.json

# key ディレクトリを .gitignore に追記
echo 'key' >> .gitignore
```

![スクリーンショット 2019-03-24 13.15.17.png](https://qiita-image-store.s3.amazonaws.com/0/237863/f33b3444-a211-8296-db55-8f0d5d80a050.png)

次に __App Engine Admin API__ を有効化します。

```
[GCPプロジェクトダッシュボード] > [ナビゲーションメニュー] > [API とサービス] > [ライブラリ] > [App Engine Admin API] > [有効にする]
```

デプロイを実施します。

プロジェクト ID と バージョン番号が必要になります。
プロジェクト ID はダッシュボードのプロジェクト選択画面から確認できます。バージョン番号は任意です。

```sh
# 秘密鍵を使って認証を通す
gcloud auth activate-service-account --key-file key/deploy.json

# デプロイを実行する
appcfg.py update -A <your-project-id> -V <version> --oauth2_access_token=$(gcloud auth print-access-token 2> /dev/null) module/blog/main
```

`index.yaml` ファイルが残っている場合はここで 403 エラーが発生します。
`index.yaml` を削除するか、サービスアカウントに対して [Datastore インデックス管理者] の権限を付与することでエラーは出なくなります。

デプロイが完了したら App Engine ダッシュボードの右上のリンクからアプリケショーンにアクセスできます。

![スクリーンショット 2019-03-24 14.35.08.png](https://qiita-image-store.s3.amazonaws.com/0/237863/af5b714a-594a-954b-36d6-379a4c107803.png)


![スクリーンショット 2019-03-24 14.33.41.png](https://qiita-image-store.s3.amazonaws.com/0/237863/98be7b37-24fc-a820-8383-1c977e27cf1e.png)


2 回目以降のデプロイでは、トラフィックの移行といった作業も必要になります。

App Engine は Immutable Infrastructure を実践しているので、デプロイの度に新しいインスタンスが作成されます。そのため、ソースコードをデプロイするだけではなく、ルーティングを新しいインスタンスへと変更するといった工程も必要です。

少しソースコードを書き換えて再度デプロイしてみます。
バージョン番号は 1 回目のデプロイとは違うものにします。

```sh
# デプロイを実行する
appcfg.py update -A <your-project-id> -V <version> --oauth2_access_token=$(gcloud auth print-access-token 2> /dev/null) module/blog/main

# ルーティングを切り替える
appcfg.py migrate_traffic -A <your-project-id> -V <version> --oauth2_access_token=$(gcloud auth print-access-token 2> /dev/null) module/blog/main
```

`migrate_traffic` を実行すると、徐々にルーティングが切り替わっていきます。切り替わっていく様子は [App Engine ダッシュボード] > [バージョン] から確認できます。

トラフィックの移行が完全に完了したら、再度ブラウザでアプリケーションにアクセスしてみます。

![スクリーンショット 2019-03-24 14.48.23.png](https://qiita-image-store.s3.amazonaws.com/0/237863/97747b53-21ef-9cd0-6472-7ce14241bdf3.png)


[サービス アカウントを使用して承認する | Google Cloud](https://cloud.google.com/sdk/docs/authorizing?hl=ja#authorizing_with_a_service_account)
[appcfg.py コマンドライン引数 | Google Cloud](https://cloud.google.com/appengine/docs/standard/go/tools/appcfg-arguments?hl=ja)
[プロジェクト アクセス権の付与](https://cloud.google.com/appengine/docs/standard/go/granting-project-access)

# おわりに

次回のテーマは『[Makefile](https://qiita.com/rema424/items/3a099dfb023aa06086f5)』です。

よかったら Twitter フォローしてね。[@_rema424](https://twitter.com/_rema424)