Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

概要

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした