tweeeetyのぶろぐ的めも

アウトプットが少なかったダメな自分をアウトプット<br>\(^o^)/

【BigQuery】Golang x BigQueryでのCredentialの指定方法メモ

はじめに

GolangでBigQueryをざつに扱っています。

ローカルで開発するときはCredentialを指定しますが、
よく使う2つの方法を忘れがちなので自分メモ。

アジェンダ

1. Credentialの作成

これは必ずやることとして、Credentialを作成します。

具体的には、以下2つを行います。

  • Service Accountの作成
  • keyの作成(これがCredential)

ここは本旨ではないので軽く触れる程度で省きます。

Service Accountの作成は、以下から行います。

f:id:tweeeety:20210404004104p:plain

Service Accountを作成したら、Manage keysを選択します。

f:id:tweeeety:20210404004113p:plain

次の画面にてADD KEY > Create new keyでkeyを作成します。

f:id:tweeeety:20210404004123p:plain

keyのタイプはjsonを選択してください。
このあとつかうCredentialsファイルになります。

ブラウザのダウンロードが始まるのでプロジェクトルートなどに置いてください。
この記事ではファイル名をkey.jsonとして保存しています。

2. 環境変数で設定する

上記で作成した、credentialsファイルを環境設定で指定する方法です。

まんまなので以下のコマンドを打つだけです。

$ export GOOGLE_APPLICATION_CREDENTIALS=./key.json

環境変数に設定しておくことで、bigqueryパッケージが環境変数に設定されていれば読み込んでくれます。

ただし、端末やPCの再起動で設定は消えてしまうので再設定が必要です。

3. プログラムで指定する

こちらはプログラムに書くので再設定が必要ありません。
option.WithCredentialsFileを使ってcredensialsを読み込みます。

package main

import (
    "context"
    "fmt"
    "log"

    "cloud.google.com/go/bigquery"
    "google.golang.org/api/iterator"
    "google.golang.org/api/option"
)

const (
    key       = "./key.json"
    projectID = "your-project"
    query     = "select * from your-project.datasetName.tableName"
)

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

  // client作成時にoption.WithCredentialsFileでファイルを読み込む
    client, err := bigquery.NewClient(ctx, projectID, option.WithCredentialsFile(key))

    if err != nil {
        fmt.Printf("Failed to create client: %v", err)
    }
    defer client.Close()

    it, err := client.Query(query).Read(ctx)
    if err != nil {
        log.Printf("Failed to Read Query: %v", err)
    }

    for {
        var values []bigquery.Value
        err := it.Next(&values)
        if err == iterator.Done {
            break
        }
        if err != nil {
            fmt.Println("Failed to Iterate Query:%v", err)
        }
        fmt.Println(values)
    }
}

参照

試したコードスニペットをおいておきます

おわりに

BigQueryは触っていて楽しいですが、golangから扱うときにちょくちょく面倒なことがありますね!