サイト案内

運営してるひと: @sters9

妻と娘と猫と神奈川県に住んでいます。最近は Go, Ruby, Rails, Kubernetes, GCP, Datadog あたりをしていますがもっといろいろやりたい!

サイト案内

開発環境の紹介

プライバシーポリシー

tools.gomiba.co

サイト内検索

アーカイブ

2024/05 (1) 2024/04 (7) 2024/03 (4) 2024/01 (3)

2023/12 (1) 2023/11 (3) 2023/10 (1) 2023/09 (1) 2023/08 (2) 2023/05 (4) 2023/04 (4) 2023/03 (4) 2023/02 (2) 2023/01 (1)

2022/12 (1) 2022/11 (4) 2022/10 (3) 2022/09 (2) 2022/08 (4) 2022/07 (5) 2022/06 (4) 2022/05 (9) 2022/04 (8) 2022/03 (10) 2022/02 (21) 2022/01 (8)

2021/12 (11) 2021/11 (1) 2021/10 (4) 2021/09 (2) 2021/08 (1) 2021/07 (2) 2021/06 (5) 2021/05 (10) 2021/04 (1) 2021/03 (8) 2021/02 (12) 2021/01 (8)

2020/05 (2) 2020/04 (2) 2020/02 (2) 2020/01 (1)

2019/12 (3) 2019/11 (2) 2019/10 (5) 2019/09 (3) 2019/07 (6) 2019/06 (4) 2019/04 (3) 2019/01 (2)

2018/12 (6) 2018/10 (4) 2018/09 (6) 2018/08 (7) 2018/07 (16) 2018/06 (7) 2018/05 (7) 2018/04 (5) 2018/03 (3) 2018/02 (10) 2018/01 (6)

2017/12 (8) 2017/11 (6) 2017/10 (10) 2017/09 (12) 2017/08 (12) 2017/07 (3) 2017/06 (1) 2017/01 (4)

2016/12 (5) 2016/10 (3) 2016/09 (1) 2016/07 (2) 2016/06 (1) 2016/04 (1) 2016/02 (1) 2016/01 (2)

2015/12 (1) 2015/10 (1) 2015/09 (3) 2015/06 (1) 2015/01 (1)

2014/08 (2) 2014/07 (3) 2014/05 (1) 2014/01 (7)

2013/12 (2) 2013/11 (4) 2013/10 (1) 2013/09 (1) 2013/08 (3) 2013/07 (4) 2013/06 (5) 2013/05 (2) 2013/04 (7) 2013/03 (1)

Spreadsheet APIをGoから触る(jsonをローカルに持ってこない)

「サービスアカウントを作ってJSONを持ってきましょう!」ばかりでよくわからなかった。実際に動かす場所ではWorkload Identityを使う予定なので、手元の開発や動作確認でもJSONなしに動かせるようにしたい。

Application default credentialsを使うのがいいんじゃないか?と思っていたが、Goからスプレッドシートを見ようとするとこんなエラーが出てくる。

package main

import (
	"context"
	"fmt"
	"log"

	"google.golang.org/api/sheets/v4"
)

const spreadsheetId = "....."

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

	sheetService, err := sheets.NewService(ctx)
	if err != nil {
		log.Fatalf("%v", err)
	}

	sheet, err := sheetService.Spreadsheets.Get(spreadsheetId).Do()
	if err != nil {
		log.Fatalf("%v", err)
	}

	fmt.Printf("Sheet title: %s\n", sheet.Properties.Title)
}
$ gcloud auth application-default login
$ go run main.go
Unable to get Spreadsheets. googleapi: Error 403: Request had insufficient authentication scopes.
Details:
[
  {
    "@type": "type.googleapis.com/google.rpc.ErrorInfo",
    "domain": "googleapis.com",
    "metadata": {
      "method": "google.apps.sheets.v4.SpreadsheetsService.GetSpreadsheet",
      "service": "sheets.googleapis.com"
    },
    "reason": "ACCESS_TOKEN_SCOPE_INSUFFICIENT"
  }
]

More details:
Reason: insufficientPermissions, Message: Insufficient Permission

スコープが違うっぽいのでスコープをつけてみる。

LocalでApplication Default Credentialsを利用している時にG Suite APIやFirebase APIを実行するとgoogleapi: Error 403: Request had insufficient authentication scopes. になる · Issue #124 · gcpug/nouhau

これを真似しようと思ったが sheets.NewService の中でスコープが書いてあったのでこれを使ったほうがいいんじゃないだろうか?

https://github.com/googleapis/google-api-go-client/blob/main/sheets/v4/sheets-gen.go#L122

こうなった。

$ gcloud auth application-default login --scopes "https://www.googleapis.com/auth/drive,https://www.googleapis.com/auth/drive.file,https://www.googleapis.com/auth/drive.readonly,https://www.googleapis.com/auth/spreadsheets,https://www.googleapis.com/auth/spreadsheets.readonly,https://www.googleapis.com/auth/userinfo.email,https://www.googleapis.com/auth/cloud-platform,openid"

Quota projectが云々というのが出てきてしまったので、デフォルトのプロジェクトをやめてコードで書くことにしてみる。これ良さげだなあ。

gcloud にカレントプロジェクトを設定しない派 - ぽ靴な缶

sheetService, err := sheets.NewService(ctx, option.WithQuotaProject(gcpProjectID))
$ go run main.go
Sheet title: ワイワイ

これでOK。

ライブラリがデフォルトのクレデンシャルを読みにいって読めているので、Workload Identityになっても同じようにできるはず。認証情報を持たなくてよくなって便利。