🏝️

Go言語(golang)でGoogle Cloud Storageを操作する

2023/07/07に公開

はじめに

以前、書いたブログで JavaでGCS(Google Cloud Storage )のデータを操作する手順についてまとめましたが、今回はGo言語で操作する手順について調べてみました。

ファイルをアップロード

Bucketにファイルをアップロードします。

package main

import (
    "context"
    "fmt"
    "io"
    "log"
    "os"

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

func main() {
    bucketName  := "bucket-name"	// GCSバケット名
    localFileName := "localfile.txt"	// アップロードするファイルのパス
    gcsFileName := "path/file.txt"	// GCSバケットのアップロード先のパス
    credentialsFile := "keyfile.json"	// サービスアカウント鍵ファイルのパス

    // Google Cloud Storageクライアントの作成
    ctx := context.Background()
    client, err := storage.NewClient(ctx, option.WithCredentialsFile(credentialsFile))
    if err != nil {
        log.Fatal(err)
    }

    // アップロードするファイルを開く
    file, err := os.Open(localFileName)
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    // バケットオブジェクトの作成
    bucket := client.Bucket(bucketName)

    // バケット内のアップロード先のオブジェクトを作成
    obj := bucket.Object(gcsFileName)

    // ファイルをアップロード
    wc := obj.NewWriter(ctx)
    if _, err := io.Copy(wc, file); err != nil {
        log.Fatal(err)
    }
    if err := wc.Close(); err != nil {
        log.Fatal(err)
    }

    fmt.Println("file upload success")
}

ファイルをダウンロード

Bucketからファイルをダウンロードします。

package main

import (
    "context"
    "fmt"
    "log"
    "os"

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

func main() {
    bucketName  := "bucket-name"	// GCSバケット名
    gcsFileName := "path/file.txt"	// GCSバケットからダウンロードするファイルのパス
    localFileName := "savefile.txt"	// ダウンロードしたファイルの保存パス
    credentialsFile := "keyfile.json"	// サービスアカウント鍵ファイルのパス

    // Google Cloud Storageクライアントの作成
    ctx := context.Background()
    client, err := storage.NewClient(ctx, option.WithCredentialsFile(credentialsFile))
    if err != nil {
        log.Fatal(err)
    }

    // バケットオブジェクトの作成
    bucket := client.Bucket(bucketName)

    // ファイルの作成
    file, err := os.Create(localFileName)
    if err != nil {
        log.Fatal(err)
    }
    defer file.Close()

    // バケットからオブジェクトをダウンロード
    rc, err := bucket.Object(gcsFileName).NewReader(ctx)
    if err != nil {
        log.Fatal(err)
    }
    defer rc.Close()

    // ファイルに出力
    if _, err := file.ReadFrom(rc); err != nil {
        log.Fatal(err)
    }

    fmt.Println("file download success")
}

ファイルの一覧表示

Bucket内のオブジェクトを一覧表示してアップロードされているファイルを確認します。

package main

import (
    "context"
    "fmt"
    "log"

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

func main() {
    bucketName  := "bucket-name"	// GCSバケット名
    credentialsFile := "keyfile.json"	// サービスアカウント鍵ファイルのパス

    // Google Cloud Storageクライアントの作成
    ctx := context.Background()
    client, err := storage.NewClient(ctx, option.WithCredentialsFile(credentialsFile))
    if err != nil {
        log.Fatal(err)
    }

    // バケットオブジェクトの作成
    bucket := client.Bucket(bucketName)

    // バケット内のオブジェクト一覧を取得
    it := bucket.Objects(ctx, nil)
    for {
        attrs, err := it.Next()
        if err == iterator.Done {
            break
        }
        if err != nil {
            log.Fatal(err)
        }
        fmt.Println(attrs.Name)
    }
}

まとめ

Go言語にあまり慣れていなかった為、書き方に少し戸惑いましたが、Go言語の方が処理がシンプルで短時間で作成することが出来ました。

レスキューナウテックブログ

Discussion