如何使用服务帐户跨项目访问 GCS 存储桶对象?
How to access GCS bucket objects across projects using service account?
我创建了一个 Google App Engine 应用来侦听 Google Cloud Storage 通知,每当在 GCS 上创建新对象时,该应用都需要打开新对象并根据它的内容。当应用程序和 gcs 存储桶在不同的项目中时,我无法访问对象内容。
配置:
我在项目 A 中创建了一个具有 Storage Object Admin 权限的服务帐户,将 GAE 应用与其相关联,使用以下方法激活了服务帐户:
gcloud auth activate-service-account [ACCOUNT] --key-file=KEY_FILE
然后我在与我的 GAE 应用相同区域的项目 B 中创建了一个存储桶 gs://some_bucket,并将我的服务帐户添加为水桶。
我将我的服务帐户添加为具有 "Storage Object Admin" 权限的项目 B 的成员。
我使用
在我的应用程序和存储桶之间创建了一个 watchbucket 通道
gsutil notification watchbucket -i [ChannelId] -t [Token] https://[app-name].appspot.com/ gs://some_bucket
我的应用程序现在正在接收 post 请求,我可以解析它们,找到源存储桶、大小、对象名称等,但我无法读取对象本身。我收到以下错误。
{Location: ""; Message: "Access Denied: File gs://some_bucket/some_object: Access Denied"; Reason: "accessDenied"}
我在同一个项目(项目 A)中测试了上述配置,我能够读取对象并对它们进行操作。这是我无法弄清楚的权限问题。
GCS 存储桶权限与 GCS 对象权限不同,作为存储桶所有者并不转化为对象所有者或拥有对象访问权限。您可以使用以下递归方式授予对存储桶中所有现有 GCS 对象的读取权限:
gsutil -m acl ch -u name@project.iam.gserviceaccount.com:R -r gs://example-bucket
这将递归地授予服务帐户对存储桶中所有对象的读取权限。
您可能还想更改存储桶对象的默认权限,以便所有未来进入您的 GCS 存储桶的对象都具有所需的权限
gsutil defacl ch -u name@project.iam.gserviceaccount.com:READ gs://example-bucket
更改对象 ACL:https://cloud.google.com/storage/docs/gsutil/commands/acl
更改默认对象 ACL:https://cloud.google.com/storage/docs/gsutil/commands/defacl
我创建了一个 Google App Engine 应用来侦听 Google Cloud Storage 通知,每当在 GCS 上创建新对象时,该应用都需要打开新对象并根据它的内容。当应用程序和 gcs 存储桶在不同的项目中时,我无法访问对象内容。
配置:
我在项目 A 中创建了一个具有 Storage Object Admin 权限的服务帐户,将 GAE 应用与其相关联,使用以下方法激活了服务帐户:
gcloud auth activate-service-account [ACCOUNT] --key-file=KEY_FILE
然后我在与我的 GAE 应用相同区域的项目 B 中创建了一个存储桶 gs://some_bucket,并将我的服务帐户添加为水桶。
我将我的服务帐户添加为具有 "Storage Object Admin" 权限的项目 B 的成员。
我使用
在我的应用程序和存储桶之间创建了一个 watchbucket 通道gsutil notification watchbucket -i [ChannelId] -t [Token] https://[app-name].appspot.com/ gs://some_bucket
我的应用程序现在正在接收 post 请求,我可以解析它们,找到源存储桶、大小、对象名称等,但我无法读取对象本身。我收到以下错误。
{Location: ""; Message: "Access Denied: File gs://some_bucket/some_object: Access Denied"; Reason: "accessDenied"}
我在同一个项目(项目 A)中测试了上述配置,我能够读取对象并对它们进行操作。这是我无法弄清楚的权限问题。
GCS 存储桶权限与 GCS 对象权限不同,作为存储桶所有者并不转化为对象所有者或拥有对象访问权限。您可以使用以下递归方式授予对存储桶中所有现有 GCS 对象的读取权限:
gsutil -m acl ch -u name@project.iam.gserviceaccount.com:R -r gs://example-bucket
这将递归地授予服务帐户对存储桶中所有对象的读取权限。
您可能还想更改存储桶对象的默认权限,以便所有未来进入您的 GCS 存储桶的对象都具有所需的权限
gsutil defacl ch -u name@project.iam.gserviceaccount.com:READ gs://example-bucket
更改对象 ACL:https://cloud.google.com/storage/docs/gsutil/commands/acl
更改默认对象 ACL:https://cloud.google.com/storage/docs/gsutil/commands/defacl