はじめに

Cloud Storage の 管理フォルダ機能をプレビューで利用できるようになりました ので、それの機能を試します。

管理フォルダとは

Cloud Storage のアクセス権限を IAM で制御しつつ、階層構造で管理することが可能になります。
管理フォルダに詳細記載されています。

管理フォルダを試す

では、管理フォルダ機能を試していきます。
今回試すのはこんな階層で試します。

- バケット
    - test01 →管理フォルダとして設定し、サービスアカウントへのオブジェクト参照権限付与
        - test01.html
    - test02.html

バケット配下に test01 という prefix として作成します。
同様に管理フォルダをそのパスで設定します。
そうすることでバケット配下のリストは参照できず、バケット/test01 の配下のリストは参照できるはずです。

管理フォルダ作成

feedbackCreate and manage managed foldersを参照し、管理フォルダを作成します。
以下のコマンドで管理フォルダを作成します。
※管理フォルダ名は「/」で終わるように設定します。

gcloud alpha storage managed-folders create gs://BUCKET_NAME/test01/

内容を確認します。

gcloud alpha storage managed-folders describe gs://BUCKET_NAME/test01/
bucket: BUCKET_NAME
metageneration: 2
name: test01/
storage_url: gs://BUCKET_NAME/test01/

こちらで確認できましたら、管理フォルダと同じ名前の prefix がない場合、作成し、適用対象を作成します。
その prefix 配下に権限が適用されます。

管理フォルダ権限設定

Use IAM with managed foldersを参照し、IAM権限を設定していきます。
※記載内容が不明であればプリンシパルRole 情報を参照するとわかりやすいです。

IAM 権限と適用対象を纏めた json を準備します。

{
 "bindings":[
   {
     "role": "IAM_ROLE",
     "members":[
       "PRINCIPAL_IDENTIFIER"
     ]
   }
 ]
}

オブジェクト参照権限をサービスアカウントを設定する場合、以下のようになります。

{
 "bindings":[
   {
     "role": "roles/storage.objectViewer",
     "members":[
       "serviceAccount:サービスアカウント名@プロジェクト名.iam.gserviceaccount.com"
     ]
   }
 ]
}

jsonが作成できたら以下のコマンドで管理フォルダに権限設定します。

gcloud alpha storage managed-folders set-iam-policy gs://BUCKET_NAME/test01/ POLICY_FILE.json

作成された json の内容から管理フォルダのオブジェクト参照権限をサービスアカウントに対して付与できます。
今回のサービスアカウントは GCE に設定されており、そのサービスアカウント自体にオブジェクト参照権限が設定されていない場合でも、対象の管理フォルダのオブジェクトが GCE から閲覧可能になります。

動作確認

これまでの設定を行い、対象の GCE に SSH し確認対象オブジェクト確認します。

gcloud storage ls --recursive gs://BUCKET_NAME/test01/test01.html

確認結果です。

gs://BUCKET_NAME/test01/test01.html

想定していた通り対象オブジェクトを確認することができました。
今回は読み取りのみでしたが、書き込み権限を付与することも可能です。

例えば確認できない prefix を閲覧した場合です。

gcloud storage ls --recursive gs://BUCKET_NAME/

確認結果です。

ERROR: (gcloud.storage.ls) User [h-saito-test-sa-testweb-prd@プロジェクト名.iam.gserviceaccount.com] does not have permission to access b instance [h-saito-managed-folder-test] (or it may not exist): h-saito-test-sa-testweb-prd@プロジェクト名.iam.gserviceaccount.com does not have storage.objects.list access to the Google Cloud Storage bucket. Permission 'storage.objects.list' denied on resource (or it may not exist).

確認できない場合、上記の通り管理フォルダのアクセス権限が無いことがエラーとしてでます。
そのため、先程は機能が正常動作して、list 表示できたことがわかります。

Cloud Storage FUSE でどうなるか

バケットの管理フォルダアクセスで SDK 経由でアクセスすることはもちろん多いですが、GCE から Cloud Storage をマウントした場合の挙動を確認してみます。

Cloud Storage FUSE を使用して Cloud Storage バケットをマウントするのフォルダマウントを参照し、対象フォルダのマウントを行います。

バケット内のディレクトリをマウントします。

gcsfuse --only-dir test01 my-bucket /mnt/test01

結果を確認します。

{"time":"日付 時間","severity":"INFO","msg":"Start gcsfuse/1.2.1 (Go version go1.21.3) for app \"\" using mount point: /mnt/test01\n"}

無事マウントできました。サービスアカウントで制限することで gcs fuse も必要な権限を払い出し利用することが可能でした。

もちろんアクセス権限が無い場所をマウントしようとするとエラーがでます。

daemonize.Run: readFromProcess: sub-process: mountWithArgs: mountWithStorageHandle: fs.NewServer: create file system: SetUpBucket: Error in iterating through objects: googleapi: Error 403: h-saito-test-sa-testweb-prd@プロジェクト名.iam.gserviceaccount.com does not have storage.objects.list access to the Google Cloud Storage bucket. Permission 'storage.objects.list' denied on resource (or it may not exist)., forbidden

所感

地味な機能ではありますが、Cloud Storage でアクセス権限を定義したい場合には有効な機能であることがわかりました。
アクセス権限という兼ね合いで、単純な SDK アクセスだけでなく、FUSE を利用した内容についても確認してみましたが、こちらにも管理フォルダ機能が効いた状態でアクセスが可能であり、FUSE で利用したい場合も問題ないことがわかりました。
今のところ、管理フォルダの状況は SDK での確認しかできないように見受けられるので、ここがCloud Storage の GUI 上で確認できたり、アクセス権限のリストなどが一覧表示されるようなものがあると、視覚的にも明快であり、より利用しやすい機能になると思いました。
まだプレビューとなりますが、覚えておきたいと思います。