たくあんポリポリ

勉強したことを載せていきます。最近、技術系の記事はZennに書いています。(https://zenn.dev/chittai)

【GCP】AppEngineにアプリをデプロイしてDatastoreを操作する

GCPのAppEngine(Standard)上にGoで作成したWebアプリをデプロイして、Datastoreにデータを書き込むまでを実践してみます。

今回実施したこと

大きく分けて、Goでのアプリの作成、AppEngineにデプロイ、Datastoreへのデータの書き込みに分けられます。今回はローカルPCでCloudSDKを使用して作業を行ったため、そのときの情報も残しておこうと思います。

  1. MacOSにCloudSDKをインストール
  2. GCP側の準備
  3. Goでアプリの作成
  4. app.yamlの作成
  5. ローカルPCでWebアプリのテスト
  6. AppEngineにデプロイ

MaxOSにGoogleCloudSDKをインストール

下記ドキュメントの通りに進めてください。 cloud.google.com

どこにダウンロードしたファイルを配置するかですが、私はダウンロードしたファイルを/usr/localに配置しましたディレクトリの用途からここにしようと思いました。このインストールの工程が完了すると、ローカルPCでもgcloudコマンドが使用できる様になります。

ここで、gcloudコマンドをいくつか実行するので、コマンドについて確認します。

gcloud init  -  CloudSDKの初期化を行うコマンドです。Cloud SDK をインストールした後に実行するコマンドです
gcloud auth list  -  認証情報が保存されているアカウントのリストが表示されます。
gcloud config list  -  プロパティのリストを表示します
gcloud info  -  Cloud SDK 環境と有効な SDK 設定に関する情報を表示します
gcloud help  -  コマンドに関する情報を表示します

GCP側の準備

AppEngineにデプロイするためにいくつか事前に作業をします。まずは自分が操作するプロジェクトをセットしましょう。gcloud config listを実行し、project の項目を確認します。

もし、対象が間違っていたらgcloud config set project ProjectIDを実行し、操作したいプロジェクトをセットします。

次に、gcloud app create コマンドを実行し、AppEngineを使用できるようにします。その後は作成したアプリケーションファイルがあるディレクトリに移動してgcloud app deploy でデプロイします。

下記にあるように、deployコマンド時はapp.yamlを指定することができます(app.yamlに関しては別途説明)。指定しないとカレントディレクトリにあるapp.yamlを対象としてデプロイします。

cloud.google.com

GoのWebアプリ

Goでウェブアプリを作成します。簡単な検証用に作成したので、本当に簡単な処理しか入れていないですが、下記を参照してください。

github.com

今回の記事でポイントになりそうな箇所を抜き出しました。

ここでは、AppEngineのパッケージをインポートしています。ローカルPCで開発するときは、go get google.golang.org/appengineでパッケージをダウンロードしてください。

import (
    "google.golang.org/appengine"
    "google.golang.org/appengine/datastore"
)

/put にアクセスした時にdatastoreputを実行します。datastoreputを見てもらえるとわかると思いますが、datastoreputは内部でp関数を呼び出しており、p関数ではGCPのDatastoreにてエンティティの作成を行う処理を書いています。つまり、/putにアクセスするとデータが登録されます。

func main() {
    http.HandleFunc("/put", datastoreput)
    appengine.Main()
}
func datastoreput(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "Put")
    p()
}

ここではエンティティを作成しています。KindはGameDataKindで作成されます。

func p(ctx context.Context) {
    gamedata := &GameData{
        Title: "nukitashi",
        Eval:  80,
    }

    key := datastore.NewIncompleteKey(ctx, "GameDataKind", nil)
    if _, err := datastore.Put(ctx, key, gamedata); err != nil {
        errors.New("my error 1")
    }
}

まずはGameData構造体を使用して登録するデータを作成しています(gamedata)。datastoreのNewIncompleteKeyを実行し、不完全キーを作成します。そして、Putを使用してDatastoreにデータを登録します。この時にエンティティが作成されます。

datastoreパッケージの詳細は下記です。 cloud.google.com

  • まとめ まずは、CloudSDKをインストールしましょう。そして、GCPのプロジェクトに対してAppEngineを使用できるようにして、自分で作成したアプリをデプロイする。

Datastoreにデータを登録したいときは、datastoreパッケージにある処理を使用して行いましょう。

他にも、ローカルPCでWebアプリを試す方法もありますが、一旦今回はここまでで。