Storage Transfer Service 可以在两种转移类型中使用 Cloud Storage 目标(接收器)存储桶:
无代理转移:云到云转移,例如 AWS S3、Azure Blob Storage 或 Cloud Storage 到 Cloud Storage。权限会授予 Storage Transfer Service 服务代理。
代理驱动的转移作业:使用转移代理和代理池从文件系统、HDFS 或与 S3 兼容的存储空间到 Cloud Storage 的转移作业。必须向服务代理和转移代理账号授予权限。
在 Google Cloud 控制台中自动授予权限
如果您使用 Google Cloud 控制台创建无代理转移作业,并且拥有所需的用户权限,则系统会自动向服务代理授予目标存储桶的所需权限。
您可以跳过本页中的步骤。如果需要,请配置对来源的访问权限,然后创建转移作业。
前提条件
用户账号权限:如需授予本页面上列出的所需 IAM 角色,您的用户账号(或用户代管式服务账号)必须拥有修改目标存储桶和代理池项目上的 IAM 政策的权限。如需详细了解用户账号要求,请参阅用户账号权限。
基于代理的转移作业项目权限:对于代理驱动的转移作业,请确保您已为服务代理和转移代理账号配置了所需的项目级角色。请参阅基于代理的项目级权限。
找到服务代理的电子邮件地址
当您首次创建转移作业、运行 gcloud transfer 设置命令、访问Google Cloud 控制台中的 Storage Transfer 页面或调用 googleServiceAccounts.get 时,系统会自动创建服务代理。
如需获取服务代理的邮箱(用于在 Storage Transfer Service 命令中标识该服务代理),请执行以下操作:
- 前往
googleServiceAccounts.get参考页面。系统会打开标题为试用此方法的交互式面板。 - 在该面板的请求参数下,输入您的项目 ID。
- 点击执行。
复制 accountEmail 的值。其格式为:project-PROJECT_NUMBER@storage-transfer-service.。
授予所需权限
选择您的转移作业类型,查看授予访问权限的步骤。
无代理转移
以下预定义角色可共同向服务代理授予对目标存储桶的所需权限:
- Storage Legacy Bucket Reader (
roles/storage.legacyBucketReader) - Storage Object User (
roles/storage.objectUser);如果保留对象 ACL (ACL_PRESERVE),则为 Storage Object Admin (roles/storage.objectAdmin)。
将服务代理添加到目标存储桶 IAM 政策:
控制台
- 在 Google Cloud 控制台中,转到 Cloud Storage 存储桶页面。
- 点击目标存储桶的存储桶溢出菜单 ()。
- 选择修改访问权限。
- 点击 + 添加主账号。
- 在新的主账号中,输入您的服务代理电子邮件地址。
- 从选择角色下拉菜单中选择
Storage Legacy Bucket Reader。 - 点击添加其他角色,然后选择
Storage Object User;如果要保留对象 ACL,请选择Storage Object Admin。 - 点击保存。
gcloud
运行以下 gcloud storage 命令:
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/storage.OBJECT_ROLE
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/storage.legacyBucketReader
将
- BUCKET_NAME:目标存储桶的名称。
- SERVICE_AGENT_EMAIL:服务代理电子邮件地址。
- OBJECT_ROLE:默认指定
objectUser,如果保留对象 ACL (ACL_PRESERVE),则指定objectAdmin。
REST API
生成访问令牌,以对您的请求进行身份验证。如果您使用的是
gcloudCLI,请运行:gcloud auth print-access-token
检索现有存储桶 IAM 政策 (
GET https://storage./storage/v1/b/<var>BUCKET_NAME</var>/iam),将以下绑定附加到其bindings数组,然后将合并后的政策保存为sink_policy.json:{ "bindings": [ { "role": "roles/storage.OBJECT_ROLE", "members": ["serviceAccount:SERVICE_AGENT_EMAIL"] }, { "role": "roles/storage.legacyBucketReader", "members": ["serviceAccount:SERVICE_AGENT_EMAIL"] } ] }
将
- SERVICE_AGENT_EMAIL:服务代理电子邮件地址。
- OBJECT_ROLE:默认指定
objectUser,如果保留对象 ACL (ACL_PRESERVE),则指定objectAdmin。
使用
curl提交PUT请求:curl -X PUT --data-binary @sink_policy.json \ -H "Authorization: Bearer OAUTH2_TOKEN" \ -H "Content-Type: application/json" \ "https://storage./storage/v1/b/BUCKET_NAME/iam"
将
- OAUTH2_TOKEN:第 1 步中生成的 OAuth 2.0 访问令牌。
- BUCKET_NAME:目标存储桶的名称。
智能体驱动的转移
以下预定义角色可向服务代理授予对目标存储桶的所需访问权限:
- Storage Object Creator (
roles/storage.objectCreator) - Storage Object Viewer (
roles/storage.objectViewer) - Storage Legacy Bucket Reader (
roles/storage.legacyBucketReader)
以下角色会向转移代理账号授予对目标存储桶的所需访问权限:
- Storage Object User (
roles/storage.objectUser)
在目标存储桶上授予这些角色。
控制台
- 在 Google Cloud 控制台中,转到 Cloud Storage 存储桶页面。
- 点击目标存储桶的存储桶溢出菜单 (),然后选择修改访问权限。
- 点击 + 添加主账号。
- 在新的主账号中,输入您的服务代理电子邮件地址。
- 从选择角色下拉菜单中选择
Storage Object Creator、Storage Object Viewer和Storage Legacy Bucket Reader。 - 再次点击 + 添加主账号。
- 输入您的转让代理账号电子邮件地址。这是安装转移代理时使用的用户或服务账号。例如
my-agent-sa@PROJECT_ID.或user@example.com。 - 从选择角色下拉菜单中选择
Storage Object User。 - 点击保存。
gcloud
向服务代理授予日志记录和查看者角色:
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/storage.objectCreatorgcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/storage.objectViewergcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member=serviceAccount:SERVICE_AGENT_EMAIL --role=roles/storage.legacyBucketReader向转移代理账号授予写入和管理角色:
gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \ --member=serviceAccount_OR_user:TRANSFER_AGENT_ACCOUNT --role=roles/storage.objectUser将
- BUCKET_NAME:目标存储桶的名称。
- SERVICE_AGENT_EMAIL:服务代理电子邮件地址。
- serviceAccount_OR_user:如果您的转移代理账号是服务账号,请指定
serviceAccount;如果您的代理是使用用户账号安装的,请指定user。 - TRANSFER_AGENT_ACCOUNT:安装了转移代理的账号的邮箱。例如,
my-agent-sa@PROJECT_ID.或user@example.com。
REST API
生成访问令牌,以对您的请求进行身份验证。如果您使用的是
gcloudCLI,请运行:gcloud auth print-access-token
检索现有存储桶 IAM 政策 (
GET https://storage./storage/v1/b/<var>BUCKET_NAME</var>/iam),将以下绑定附加到其bindings数组,然后将合并后的政策保存为agent_sink_policy.json:{ "bindings": [ { "role": "roles/storage.objectCreator", "members": ["serviceAccount:SERVICE_AGENT_EMAIL"] }, { "role": "roles/storage.objectViewer", "members": ["serviceAccount:SERVICE_AGENT_EMAIL"] }, { "role": "roles/storage.legacyBucketReader", "members": ["serviceAccount:SERVICE_AGENT_EMAIL"] }, { "role": "roles/storage.objectUser", "members": ["serviceAccount_OR_user:TRANSFER_AGENT_ACCOUNT"] } ] }
将
- SERVICE_AGENT_EMAIL:服务代理电子邮件地址。
- serviceAccount_OR_user:如果您的转移代理账号是服务账号,请指定
serviceAccount;如果您的代理是使用用户账号安装的,请指定user。 - TRANSFER_AGENT_ACCOUNT:安装了转移代理的账号的邮箱。例如,
my-agent-sa@PROJECT_ID.或user@example.com。
通过
curl更新存储桶政策:curl -X PUT --data-binary @agent_sink_policy.json \ -H "Authorization: Bearer OAUTH2_TOKEN" \ -H "Content-Type: application/json" \ "https://storage./storage/v1/b/BUCKET_NAME/iam"将
- OAUTH2_TOKEN:第 1 步中生成的 OAuth 2.0 访问令牌。
- BUCKET_NAME:目标存储桶的名称。
精细权限参考文档
选择您的转移作业类型,以查看所需的角色和权限。
无代理转移
对于无代理转移作业,必须向 Storage Transfer Service 服务代理授予权限:
| 权限 | 说明 |
|---|---|
storage.buckets.get |
允许服务代理检查存储桶元数据和位置。 |
storage.objects.create |
允许服务代理将转移的对象写入目标存储桶。 |
storage.objects.get |
允许查看现有对象和元数据。如果您的转移作业配置为在不同或从不时覆盖接收器中的对象,则此权限是必需的。 |
storage.objects.list |
允许列出目标存储桶中的对象。如果检查对象是否已存在于接收器中,则为必需。 |
storage.objects.delete |
允许删除目标存储桶中的对象。如果启用了覆盖或唯一对象删除选项,则此权限是必需的。 |
storage.objects.setIamPolicy |
允许在目标存储桶中设置对象 ACL。如果启用了对象 ACL 保留 (ACL_PRESERVE),则必须填写此列。 |
storage.folders.createstorage.folders.get |
允许创建和读取文件夹。转移到启用了分层命名空间的目标存储桶时,此参数为必填项。 |
智能体驱动的转移
对于向 Cloud Storage 目标位置进行的代理驱动型转移作业,权限在两个主账号之间分配:
服务代理:需要拥有在目标存储桶中写入传输日志和验证对象是否存在的权限。
转移代理账号:运行转移代理的服务账号或用户账号,用于将文件写入 Cloud Storage。
服务代理权限
| 权限 | 说明 |
|---|---|
storage.buckets.get |
允许服务代理检查存储桶元数据和位置。 |
storage.objects.create |
允许在存储桶中创建转移日志。 |
storage.objects.get |
允许检查对象是否已转移。 |
转移代理账号权限
| 权限 | 说明 |
|---|---|
storage.objects.create |
允许代理在转移期间将对象写入目标存储桶。 |
storage.objects.get |
允许代理读取目标存储桶中的对象数据和元数据。 |
storage.objects.list |
允许代理列出目标存储桶中的现有对象。 |
storage.objects.delete |
如果您的转移作业配置为覆盖或删除接收器中的对象,则此权限是必需的。 |
storage.multipartUploads.createstorage.multipartUploads.abortstorage.multipartUploads.listPartsstorage.multipartUploads.list |
允许代理对大文件执行分段上传。自动包含在 roles/storage.objectUser 中。 |
storage.folders.createstorage.folders.get |
允许代理在转移到启用了分层命名空间的目标存储桶时创建和读取文件夹。 |
后续步骤
- 了解如何配置对来源的访问权限。
- 了解如何创建转移作业。
- 查看角色和权限参考文档。