imu-note
いむたろ
いむたろ
@imutaroh
新卒エンジニア / データ基盤 × AI

What — 3パーツの役割

1つのファイルのフルパスは3パーツに分かれる:

gs://example-bucket / tenant-a/Sales/ / 2026-06-01.csv
   └─ bucket ───┘  └─ prefix ──┘   └─ ファイル名 ─┘
パーツ役割どこから来る
bucket一番外側の入れ物コードで別引数として渡す
prefixバケット内の「どの引き出しを開けるか」自分で組み立てる
ファイル名引き出しの中身一覧した結果として返ってくる

重要なのは、Cloud Storage に本当は「フォルダ」が無いこと。prefix はオブジェクト名の前方一致フィルタにすぎない。tenant-a/Sales/ は「この文字列で始まる名前のオブジェクトを全部ちょうだい」という意味になる。

Info

prefix の役割は「どの引き出しを開けるか」であって「中の何を取るか」ではない。中身(ファイル名)は開けた後の一覧で分かる。

How — prefixの切り方

prefix は目的のファイル群が入っているフォルダ階層までを指定する。それ以上でも以下でもない。

  • 細かくしすぎない:ファイル名(日付)まで入れると1ファイルしか取れない。「未取り込みの全CSV」が欲しいので、絞るのはフォルダまで。どれを実際に取るかは一覧した後に決める。
  • ざっくりしすぎない:tenant-a/ だけだと、将来 tenant-a/Stock/ のような別データが混ざる。source まで付けて「テナント × データ種別」で1グループに切り出す。
// bucket は別引数。prefix にバケット名は含めない
prefix := fmt.Sprintf("%s/%s/", tenant, source) // 例: tenant-a/Sales/
objects, _ := gcs.ListObjects(ctx, bucket, prefix)
Warning

末尾の / が地味に効く。tenant-a/Sales(スラッシュ無し)は前方一致なので tenant-a/Sales2024/tenant-a/SalesBackup/ まで巻き込む。/ を付けて「Sales 直下」に限定する。

関連