💭

GCSであとからACLをオンにした場合のエラーを解決する

2021/12/07に公開

Google Cloud Storage(GCS)では「均一」と「きめ細かい管理」という2種類のアクセス制御が設定できる。
これは、ACLをオフにしてIAMのみでアクセス制御するか、ACLをオンにしてIAMとACLを併存させてアクセス制御するかの設定だ。

Googleとしては「均一」を推奨しているが、一部のオブジェクトだけインターネットに公開したい場合など「きめ細かい管理」を使用したい場合も多い。

バケット作成時は「均一」に設定していたにも関わらず、あとから「きめ細かい管理」に変更した場合に問題があったので解決策をまとめる。

問題

具体的には gsutil でACLを変更できないという問題が起こった。
一部のオブジェクトに公開アクセスを設定しようとしてもエラーになる。

$ gsutil acl ch -u AllUsers:R gs://example-bucket/example-object
CommandException: Failed to set acl for gs://example-bucket/example-object. Please ensure you have OWNER-role access to this resource.

権限やログインユーザーを確認するが問題なさそうだった。

問題は、「均一」時にアップロードされたファイルにはACLが設定されていないことにあった。
バケット作成時に「きめ細かい管理」を設定したバケットでは、デフォルトACLが project-private として設定される。

しかしながら、あとから「きめ細かい管理」に設定したバケットではデフォルトACLが設定されていない。

$ gsutil defacl get gs://example-bucket
No default object ACL present for gs://example-bucket. This could occur if the default object ACL is private, in which case objects created in this bucket will be readable only by their creators. It could also mean you do not have OWNER permission on gs://example-bucket and therefore do not have permission to read the default object ACL. It could also mean that gs://example-bucket has Bucket Policy Only enabled and therefore object ACLs and default object ACLs are disabled (see https://cloud.google.com/storage/docs/bucket-policy-only).
[]

よってオブジェクトのACLも設定されていない状態になっていた。

$ gsutil acl get gs://example-bucket/example-object
[]

ACLが設定されていないため、ACLを追加する際に権限エラーになっていた。
IAMでどんなに強力な権限を持っていても意味がないようだ。

解決策

ACLを設定するために、ACLが必要なら堂々巡りで解決策がないように思え困り果てていたが、エラーになるのはカスタマイズACLを設定する場合のみで、事前定義ACLには適用されない。

そこで、まずは事前定義ACLを、バケット作成時に「きめ細かい管理」を設定した場合のデフォルト状態になるよう設定し、その後カスタムACLを設定する。

$ gsutil acl set -r project-private gs://example-bucket
$ gsutil acl ch -u AllUsers:R gs://example-bucket/example-object

今後アップロードされるファイルのデフォルトACLも、バケット作成時に「きめ細かい管理」を設定した場合のデフォルト状態になるよう設定した方がいいだろう。

$ gsutil defacl set project-private gs://example-bucket

ちなみにバケットレベルACLは、いつ「きめ細かい管理」に設定しても、問題なく project-private に設定されている。

セキュリティー的観点で難しいのかもしれないが、「きめ細かい管理」にいつ設定しても同じデフォルト設定になるようにして欲しいところだ。

Discussion