Go 言語で GCP Cloud Storage のバケットの中身をすべて取得する

はじめに

Go 言語で GCP cloud Storage のバケットの中身を操作したかったのですが、 Cloud Storage を Go 言語で操作するのが初めてだったので、 まずはバケット内のオブジェクトをすべて取得し標準出力するスクリプトを書いてみることにしました。

検証環境

1
2
$ go version
go version go1.17.2 darwin/amd64

準備

作業ディレクトリを作成し、スクリプトを作成します。

1
2
3
4
5
6
$ mkdir gcs-example

$ cd gcs-example

$ go mod init genzouw/gcs-example
go: creating new go.mod: module genzouw/gcs-example

生成された go.mod ファイルを確認します。

1
2
3
4
$ cat go.mod
module genzouw/gcs-example

go 1.17

スクリプト作成

エディタで main.go ファイルを作成します。 もちろんファイル名や使用するエディタは何でも構いません。

GCP アクセスの認証は、今回は設定済みの前提です。 ( すでに gsutil ls <BUCKET_NAME> コマンドで、バケット名が閲覧できるようになっています。 )

1
$ vi main.go

main.go

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
package main

import (
	"context"
	"fmt"
	"os"

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

func main() {
	client, _ := storage.NewClient(context.Background())

  // バケット名は環境変数から取得
	bucket := client.Bucket(os.Getenv("GCP_BUCKET"))

	it := bucket.Objects(context.Background(), nil)

	for {
		attr, err := it.Next()

		if err == iterator.Done {
      // 終了時は err が特定の値になっている
			break
		} else if err != nil {
			fmt.Println(err)
			break
		}

    // 取得できたオブジェクトの格納されているバケット名と、オブジェクト名を出力
		fmt.Printf("%v, %v\n", attr.Bucket, attr.Name)
	}
}

スクリプト実行

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 依存ライブラリを取得
$ go mod tidy
go: finding module for package google.golang.org/api/iterator
go: finding module for package cloud.google.com/go/storage
go: downloading google.golang.org/api v0.60.0
go: found cloud.google.com/go/storage in cloud.google.com/go/storage v1.18.2
go: found google.golang.org/api/iterator in google.golang.org/api v0.60.0
go: downloading google.golang.org/genproto v0.0.0-20211021150943-2b146023228c
go: downloading golang.org/x/sys v0.0.0-20211025201205-69cdffdb9359
go: downloading github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0
go: downloading github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed
go: downloading github.com/OneOfOne/xxhash v1.2.2
go: downloading github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72
go mod tidy  4.38s user 3.19s system 83% cpu 9.032 total

# 環境変数を設定
$ export GCP_BUCKET=genzouw-com-testbucket

# 実行
$ go run ./main.go
genzouw-com-testbucket, 0u4dphauo2l2e6z1f0odrigluae6
genzouw-com-testbucket, 10cjf9ty9zivzttrn7ktdv77ejl7
genzouw-com-testbucket, 1d1ugh94fygzksahv9fowo2q4s3f
genzouw-com-testbucket, 1ebfotlpdx7ba9obmda4poqvyth9
genzouw-com-testbucket, 1fx7awlk9bwgkcm98duae6a1ge5d
...

ひとこと

シェルだと gcloud ls で終わりなんですけどね。