APIを別のGCP環境へデプロイする

お客さんからの依頼でAPIを開発する場合、最終的なGCP環境はお客さんのGoogleアカウントに紐づいたGCP環境であるケースが多いかと思います。そんな場合に、TemPlatで自分のGCP環境で構築したAPIをお客さんの環境から利用するパターンを紹介します。

①自分のGCPプロジェクトを共有する方法

いきなりお客さんのGCP環境を使わないケースからですが、一番手軽なやり方になります。

環境概要

TemPlat ConsoleであなたのGCP環境に作成したプロジェクトにお客様のGoogleアカウントをオーナーとして追加します。その上でプロジェクトの課金先だけお客様の請求先アカウントに設定することで、お客さんとの共有環境とする方法です。

※本番環境の費用をお客様が直接負担する場合を想定しています。もし契約上あなたが一旦費用負担して、別途なんらかの形で請求するような場合は何もする必要はないです。

この方法ですと、TemPlat Consoleからビルドされる環境をそのまま本番環境としてして利用することもできます。もちろん、同じプロジェクト内に別に本番環境を作ることもできます。

手順説明

この方法の手順は簡単です。

お客様のGoogleアカウントを開発用プロジェクトにオーナーとして追加

TemPlat ConsoleへログインしているGoogleアカウントでGCP Consoleへログインして、お客様と共有したいプロジェクトを選択します。
そして、「IAMと管理」メニューから「IAM」の画面に行きます。ここでメンバーの追加を選択してお客様のGoogleアカウントを追加していきます。

追加ボタンを押すと以下のような画面が表示されますので、お客様のGoogleアカウントを入力して、ロールを「オーナー」として保存します。

お客様の請求先アカウントを作成する(お客様作業)

お客様のGoogleアカウントでGCP Consoleにログインし(お客様に作業してもらう)、GCPの費用を支払うための請求先アカウントを作成してもらいます。

GCP Consoleのメニューの「お支払い→概要」を選択後、画面上部の選択部分から「請求先アカウントを管理」を選択すると辿り着けます。または以下のURLからも辿り着けます。
https://console.cloud.google.com/billing

そうすると請求先アカウントの一覧が表示されます。そこに「アカウントを作成」がありますので、ここから新規に作成できます。

請求先アカウントの作成方法はGCPのマニュアルに詳しくありますので、こちらを参考にしてください。
https://cloud.google.com/billing/docs/how-to/manage-billing-account

プロジェクトの請求先アカウントを設定する(お客様作業)

請求先アカウントが作成できたら、開発用プロジェクトの請求先アカウントをお客様の請求先アカウントに設定してもらいます。

請求先アカウントを作成した画面に「マイプロジェクト」というタブがありますので、そのタブを選択するとお客様に権限付与したあなたの開発用プロジェクトが表示されると思います。そのプロジェクトの「アクション」にある3点ボタンをクリックします。

「お支払い情報を変更」メニューが表示されるので選択します。

そうすると請求先アカウントを選択できるダイアログが表示されるので、作成した請求先アカントを設定してください。

②Dockerコンテナを移す方法

ここからは、あなたのGCP環境とは別で、お客さんのGCP環境にTemPlat Consoleで作成したAPIを動かす方法です。

環境説明

最初の方法は、TemPlatでビルドした際につくられたDockerコンテナをお客さんのコンテナリポジトリに移して、それをCloudRunにデプロイする方法です。

この方法ではDockerコンテナ以降をお客様の環境に乗せるので、ソース・ファイルはあなたの環境にのみあることになります。ソース自体はあなたの資産となるようなケースには良いかもしれません。この方法の場合は、Dockerのコンテナリポジトリ経由で環境のやりとりをするので、ローカルの開発環境にもDockerを用意する必要があります。

この後説明するソースから移す方法よりも、お客様の環境に準備するものは少ないのですが、CloudBuildによる自動ビルド&デプロイが利用できないので、モジュールをリリースする都度発生する作業は一番多いかもしれません。

※直接お客様のGCP環境からコンテナをpullすることもできるかもしれませんが、セキュリティ的にあなたの認証情報を入れるシーンが発生しそうなのでここではローカル経由としています。

手順説明

お客様の環境へのプロジェクト作成と権限付与

この方法ではお客様の環境にAPIの本番環境(DatastoreおよびCloudRun)を稼働させますので、事前にプロジェクトを作成してあなたのGoogleアカウントに「オーナー権限」を付与してもらうとこれ以降の作業がやりやすくなります。

お客様の環境にDatastoreを準備

まずはDatastoreを設定する必要があります。
Datastoreの設定方法は、TemPlat Consoleで新規にプロジェクト作成した時と同じ手順です。以下を参考にしてください。

お客様の環境にサービスアカウントを準備

お客様の環境にCloudRun実行用のサービスアカウントを用意して、DatastoreやStorageなどのをGCPリソースへのアクセス権限を設定します。

GCP Consoleのメニューより「IAMと管理」から「サービスアカウント」を選択します。画面上部に「サービスアカウントを作成」がありますのでこちらをクリックします。

最後の③はそのまま(指定は省略)で構いません。

サービスアカウントの鍵を作成して環境変数として設定

サービスアカウントの作成が終わったら、そのサービスアカウントの鍵を作成して、CloudRunにデプロイするAPIアプリから利用できるようにします。これにより、APIアプリからDatastoreやStorageへのアクセスができるようになります。

以下のようなダイアログがでるのでキーのタイプはJSONを選択してください。

作成ボタンを押すと、キーファイル(JSONファイル)がダウンロードされますあので、APIのソースツリーに以下の要領で配置してください。

APIアプリに環境変数を設定する

鍵を配置したらこの鍵が利用されるように環境変数を変更します。合せて、GCPのプロジェクト名も変更する必要があります。環境変数は本番環境(お客様の環境)でのみ変更したいので、/src/app/envにある「.prod.env」ファイルに記載します。

PROJECT_ID=【お客様のGCPプロジェクト名】
CREDENTIAL_FILE_PATH=/app/secret-prod.json

修正が終わったら、一度git commit後、開発環境のGSRにgit pushしておきましょう。pushすることで開発環境のCloudBuildにより新しいDockerコンテナがGCR(GCP Container Repository)にpushされます。

ローカルにDocker環境を用意

開発環境のGCRに作成されたDockerコンテナをお客様のGCPにコピーしたいのですが、ローカルのDockerに付随するコンテナリポジトリを経由するので、開発PCにDockerをインストールする必要があります。

Dockerのインストール方法はいろいろわかりやすい記事がありそうなので、そちらにおまかせします。MacまたはWindowsでは「Docker Desktop for Mac/Windows」というDockerアプリがありますので、そちらを使うのがよいかと思います。
Get Started with Docker
https://www.docker.com/get-started

Dockerコンテナをお客様環境へコピーする

ローカルにDocker環境ができたら、開発プロジェクトのGCRからコンテナをローカルにpull(取得)します。dockerコマンドは以下になります。

$ docker pull gcr.il/【GCPプロジェクト名】/【GCPプロジェクト名】-server:【タグ】

ここでの【GCPプロジェクト名】は開発環境用のプロジェクトになります。そして【タグ】はCloudBuildでビルド・デプロイされる時に自動で付与されるものになりますので、GCP ConsoleのGSR(Container Registry)の画面から確認ができます。
GCP Consoleのメニューから「Container Registry→イメージ」を選択してください。そこに「【GCPプロジェクト名】-server」という名前のイメージがあると思いますので、それを選択してください。

選択すると、イメージの作成履歴が表示されますので、最新のイメージを選択します。

ダイジェストの詳細画面が表示されます。ここに「pullコマンドを表示」というボタンがありますので、ここに表示されるコマンドを実行すれば取得できます。

以下がpullコマンドの表示例です。

取得したコンテナにタグをつける。

上記のdocker pullコマンドを実行するとローカルのDockerリポジトリにイメージが取得できているはずです。以下のコマンドで確認してください。

$ docker images
REPOSITORY                                        TAG                                        IMAGE ID       CREATED        SIZE
gcr.io/【GCPプロジェクト名】/【GCPプロジェクト名】-server   1419cff62b061e6aea5f21xxxxxxxxx   ef89axxxxxx   26 hours ago   53.7MB

上記のようにGSRからイメージが取得できていると思います。このイメージをお客様のGSRにpullするために、タグを付けます。

$ docker tag 【IMAGE ID】 gcr.io/【お客様のGCPプロジェクトID】/【イメージ名】

【IMAGE ID】は上記のdocker imagesで表示されているものを指定します。その上でpull先のGCP環境での名前をつけます。お客様のGCPプロジェクトIDを指定した上で【イメージ名】は任意の名前で指定します。開発環境のイメージ名と一緒にしておくのがわかりやすかもしれません。タグ名をここでは指定してないのですが、この場合は自動で「latest」というタグが付与されます。

取得したコンテナをお客様のGCRへpushする。

タグをつけたらお客様のGSRにpushします。コマンドは以下の通りです。先程つけたタグ名を指定してpushする形になります。

$ docker push gcr.io/【お客様のGCPプロジェクトID】/【イメージ名】

お客様環境でCloudRunを動かす

お客様のGCRにDockerコンテナイメージをpushできたら、そのイメージを使ってCloudRunを動かします。

GCP ConsoleのメニューからCloudRunを選択して、新規のサービスを追加します。

以下の流れで設定していきます。

コンテナイメージを選択したら「詳細設定」を開いて、環境変数のENVをprodという値で設定しておきます。これによりデプロイされたAPIのアプリが本番環境の環境変数を使って稼働します。これを設定しないと開発環境につなごうとしてエラーになってしまいます。

これでCloudRunサービスが稼働します。

最後にクライアントアプリ(Webやスマホアプリ)からこのAPIにアクセスするためのURLを記録しておきます。通常TemPlat Consoleにて作成されるSwaggerや、Swaggerから作成されるOpenAPIのJavaScriptモジュールに初期で設定されているURLは開発環境向けですので、本番用のクライアントを作成するときは、このURLを本番用に変更する必要があります。
※この部分はAPIの環境変数にて変更できるように改善予定です。

③ソースコードを移す方法

ソースも納品が必要なケースなどはこの方法が良いかと思います。TemPlat Consoleのビルドで自分のGSR(ソースリポジトリ)に保存されたソースを一旦ローカルgitに取得(pull)して、それをお客様のGCPに用意したGSRへpushする流れになります。

環境説明

TemPlat Consoleに接続されているGCP環境とほぼ同じセットをお客様の環境にセットアップすることになるので、最初準備する上でやるべき作業は少し多いです。ただ、一度準備してしまえばソースをgit pushするだけであとは本番環境までデプロイされるので運用の手間は小さいかと思います。

注意点としては、自分のGCPのキー情報などをpushしないようにしたいという点です。

手順説明(追記予定)

お客様の環境にDatastoreを準備する(手順②参照)。

お客様の環境にCloudRun実行用のサービスアカウントを用意して、権限を設定する(手順②参照)。

サービスアカウントの鍵を作成して環境変数として設定する(手順②参照)。

開発プロジェクトからソースをローカルにpullする

お客様のGCP環境にGSRのリポジトリを用意する。

お客様のGCP環境でCloudBuildの設定をする

お客様のGSRへソースをpushする