LoginSignup
8
2

More than 5 years have passed since last update.

Google Cloud Client Libraries for Go を使って Cloud Firestore のデータを更新してみる

Last updated at Posted at 2018-11-07

概要

google-cloud-go/firestore を使ってローカルからFirestoreを更新してみる。

環境

Go 1.11

環境変数

パッケージ管理にModulesを利用するため環境変数を下記の通り設定する。

GO111MODULE=on

手順

2パターンのcredential設定方法を記述する

  • 1. Application-defaultの秘密鍵を利用する場合
  • 2. サービスアカウントを発行してkey発行して確認する場合

1. Application-defaultの秘密鍵を利用する場合

(1) まずはGoogle Cloud SDKのauthorizeを行う。下記コマンドを入力してブラウザで設定を許可する。

$ gcloud auth login

(2) 次にローカルアプリケーションで使用するデフォルトのcredentialを設定する。こちらもブラウザで設定を許可する。

$ gcloud beta auth application-default login

(3) 今回使用するサンプルアプリケーションのディレクトリを作成する。

$ mkdir get-started-cloud-firestore && cd $_

(4) Modulesの初期化を下記コマンドで行う。

$ go mod init

(5) main.goを作成してコードを実装する

projectID := "[YOUR PROJECT ID]"の部分はGCPのプロジェクトIDを設定する。

main.go
package main

import (
    "fmt"
    "log"

    "cloud.google.com/go/firestore"
    "golang.org/x/net/context"
    "google.golang.org/api/iterator"
)

func main() {
    ctx := context.Background()

    // [START fs_initialize]
    // Sets your Google Cloud Platform project ID.
    projectID := "[YOUR PROJECT ID]"

    // Get a Firestore client.
    client, err := firestore.NewClient(ctx, projectID)
    if err != nil {
        log.Fatalf("Failed to create client: %v", err)
    }

    // Close client when done.
    defer client.Close()
    // [END fs_initialize]

    fmt.Printf("client: %v\n", client)

    // [START fs_add_data_1]
    _, _, err = client.Collection("users").Add(ctx, map[string]interface{}{
        "first": "Ada",
        "last":  "Lovelace",
        "born":  1815,
    })
    if err != nil {
        log.Fatalf("Failed adding alovelace: %v", err)
    }
    // [END fs_add_data_1]

    // [START fs_add_data_2]
    _, _, err = client.Collection("users").Add(ctx, map[string]interface{}{
        "first":  "Alan",
        "middle": "Mathison",
        "last":   "Turing",
        "born":   1912,
    })
    if err != nil {
        log.Fatalf("Failed adding aturing: %v", err)
    }
    // [END fs_add_data_2]

    // [START fs_get_all_users]
    iter := client.Collection("users").Documents(ctx)
    for {
        doc, err := iter.Next()
        if err == iterator.Done {
            break
        }
        if err != nil {
            log.Fatalf("Failed to iterate: %v", err)
        }
        fmt.Println(doc.Data())
    }
    // [END fs_get_all_users]
}

2. サービスアカウントを発行してkey発行して確認する場合

(1) Cloud Datastore編集者ののサービスアカウントを発行する

IAMと管理 > サービスアカウント からサービスアカウントを作成してCloud Datastoreの編集者権限を付与してjsonのキーをダウンロードする

(2) キーを任意のディレクトリに格納する

(3) GCLOUD_CREDENTIAL_FILE_PATHという環境変数に上記のjsonファイルのパスを設定する

(4) 今回使用するサンプルアプリケーションのディレクトリを作成する。

$ mkdir get-started-cloud-firestore && $_

(5) Modulesの初期化を下記コマンドで行う。

$ go mod init

(6) main.goを作成してコードを実装する

main.go
package main

import (
    "fmt"
    "log"

    "cloud.google.com/go/firestore"
    "golang.org/x/net/context"
    "google.golang.org/api/iterator"
    "google.golang.org/api/option"
    "os"
)

func main() {
    ctx := context.Background()

    // [START fs_initialize]
    // Sets your Google Cloud Platform project ID.
    projectID := "[YOUR PROJECT ID]"

    opt := option.WithCredentialsFile(os.Getenv("GCLOUD_CREDENTIAL_FILE_PATH"))

    // Get a Firestore client.
    client, err := firestore.NewClient(ctx, projectID, opt)
    if err != nil {
        log.Fatalf("Failed to create client: %v", err)
    }

    // Close client when done.
    defer client.Close()
    // [END fs_initialize]

    fmt.Printf("client: %v\n", client)

    // [START fs_add_data_1]
    _, _, err = client.Collection("users").Add(ctx, map[string]interface{}{
        "first": "Ada",
        "last":  "Lovelace",
        "born":  1815,
    })
    if err != nil {
        log.Fatalf("Failed adding alovelace: %v", err)
    }
    // [END fs_add_data_1]

    // [START fs_add_data_2]
    _, _, err = client.Collection("users").Add(ctx, map[string]interface{}{
        "first":  "Alan",
        "middle": "Mathison",
        "last":   "Turing",
        "born":   1912,
    })
    if err != nil {
        log.Fatalf("Failed adding aturing: %v", err)
    }
    // [END fs_add_data_2]

    // [START fs_get_all_users]
    iter := client.Collection("users").Documents(ctx)
    for {
        doc, err := iter.Next()
        if err == iterator.Done {
            break
        }
        if err != nil {
            log.Fatalf("Failed to iterate: %v", err)
        }
        fmt.Println(doc.Data())
    }
    // [END fs_get_all_users]
}

実行する

$ go run main.go

結果を確認する。

ドキュメントが追加されている。

スクリーンショット 2018-11-07 18.44.09.png

8
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
2