配置对来源的访问权限:Cloud Storage

Storage Transfer Service 可以在两种转移类型中使用 Cloud Storage 源存储桶:

  • 无代理转移:云到云转移,例如 Cloud Storage 到 Cloud Storage、Cloud Storage 到 AWS S3 或 Cloud Storage 到 Azure Blob Storage。权限会授予 Storage Transfer Service 服务代理。

  • 代理驱动的转移作业:涉及文件系统或本地存储空间的转移作业,使用转移代理和代理池。必须向服务代理和转移代理账号授予权限。

在 Google Cloud 控制台中自动授予权限

如果您使用 Google Cloud 控制台创建无代理转移作业,并且拥有所需的用户权限,则系统会自动向服务代理授予来源存储桶的所需权限。

您可以跳过本页中的步骤。如果需要,请配置对目标的访问权限,然后创建转移作业。

前提条件

  • 用户账号权限:如需授予本页面上列出的所需 IAM 角色,您的用户账号(或用户代管式服务账号)必须具有修改源存储桶和代理池项目上的 IAM 政策的权限。如需详细了解用户账号要求,请参阅用户账号权限。

  • 基于代理的转移作业项目权限:对于代理驱动的转移作业,请确保您已为服务代理和转移代理账号配置了所需的项目级角色。请参阅基于代理的项目级权限。

找到服务代理的电子邮件地址

当您首次创建转移作业、运行 gcloud transfer 设置命令、访问Google Cloud 控制台中的 Storage Transfer 页面或调用 googleServiceAccounts.get 时,系统会自动创建服务代理。

如需获取服务代理的邮箱(用于在 Storage Transfer Service 命令中标识该服务代理),请执行以下操作:

  1. 前往 googleServiceAccounts.get 参考页面。系统会打开标题为试用此方法的交互式面板。
  2. 在该面板的请求参数下,输入您的项目 ID。
  3. 点击执行。

复制 accountEmail 的值。其格式为:project-PROJECT_NUMBER@storage-transfer-service.。

授予所需权限

选择您的转移作业类型,查看授予访问权限的步骤。

无代理转移

以下预定义角色可向服务代理授予对源存储桶的所需权限:

  • Storage Legacy Bucket Reader (roles/storage.legacyBucketReader)
  • 另外还需要以下角色之一:
    • Storage Object Viewer (roles/storage.objectViewer)(如果保留源对象)。
    • Storage Object User (roles/storage.objectUser)(如果在转移后删除源对象 [deleteObjectsFromSourceAfterTransfer])。
    • Storage Object Admin (roles/storage.objectAdmin)(如果保留对象 ACL [ACL_PRESERVE])。还支持在转移后删除源对象。

将服务代理添加到源存储桶 IAM 政策:

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud Storage 存储桶页面。

    进入“存储桶”

  2. 点击源存储桶的存储桶溢出菜单 ()。
  3. 选择修改访问权限。
  4. 点击 + 添加主账号。
  5. 在新的主账号中,输入您的服务代理电子邮件地址。
  6. 从选择角色下拉菜单中选择 Storage Legacy Bucket Reader。
  7. 点击添加其他角色,然后选择以下角色之一:
    • Storage Object Viewer
    • Storage Object User
    • Storage Object Admin
  8. 点击保存。

gcloud

运行以下 gcloud storage 命令:

gcloud 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:SERVICE_AGENT_EMAIL --role=roles/storage.OBJECT_ROLE

将

  • BUCKET_NAME:源存储桶的名称。
  • SERVICE_AGENT_EMAIL:服务代理电子邮件地址。
  • OBJECT_ROLE:根据您的转移选项,选择以下选项之一:
  • objectViewer:如果保留源对象。
  • objectUser:如果在转移后删除源对象。
  • objectAdmin:是否保留对象 ACL。还支持在转移后删除来源对象。

REST API

  1. 生成访问令牌,以对您的请求进行身份验证。如果您使用的是 gcloud CLI,请运行:

    gcloud auth print-access-token
  2. 检索现有存储桶 IAM 政策 (GET https://storage./storage/v1/b/<var>BUCKET_NAME</var>/iam),将以下绑定附加到其 bindings 数组,然后将合并后的政策保存为 source_policy.json:

    {
    "bindings": [
      {
        "role": "roles/storage.legacyBucketReader",
        "members": ["serviceAccount:SERVICE_AGENT_EMAIL"]
      },
      {
        "role": "roles/storage.OBJECT_ROLE",
        "members": ["serviceAccount:SERVICE_AGENT_EMAIL"]
      }
    ]
    }

    将

    • SERVICE_AGENT_EMAIL:服务代理电子邮件地址。
    • OBJECT_ROLE:如果保留源对象,请选择 objectViewer;如果删除源对象,请选择 objectUser;如果保留对象 ACL,请选择 objectAdmin。
  3. 使用 curl 提交 PUT 请求:

    curl -X PUT --data-binary @source_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 Legacy Bucket Reader (roles/storage.legacyBucketReader)
  • Storage Object Creator (roles/storage.objectCreator)

以下角色会向转移代理账号授予对源存储桶的所需访问权限:

  • Storage Object Viewer (roles/storage.objectViewer)(如果保留来源对象),或 Storage Object User (roles/storage.objectUser)(如果在转移后删除来源对象)。

在源存储桶上授予这些角色。

控制台

  1. 在 Google Cloud 控制台中,转到 Cloud Storage 存储桶页面。

    进入“存储桶”

  2. 点击源存储桶的存储桶溢出菜单 (),然后选择编辑权限。
  3. 点击 + 添加主账号。
  4. 在新的主账号中,输入您的服务代理电子邮件地址。
  5. 从选择角色下拉菜单中选择 Storage Legacy Bucket Reader 和 Storage Object Creator。
  6. 再次点击 + 添加主账号。
  7. 输入您的转让代理账号电子邮件地址。这是安装转移代理时使用的用户或服务账号。例如 my-agent-sa@PROJECT_ID. 或 user@example.com。
  8. 如果要保留源对象,请选择 Storage Object Viewer;如果要在转移后删除源对象,请选择 Storage Object User。
  9. 点击保存。

gcloud

  1. 向服务代理授予存储桶元数据读取和传输日志写入角色:

    gcloud 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:SERVICE_AGENT_EMAIL --role=roles/storage.objectCreator
  2. 向转移代理账号授予对象访问权限角色:

    gcloud storage buckets add-iam-policy-binding gs://BUCKET_NAME \
        --member=serviceAccount_OR_user:TRANSFER_AGENT_ACCOUNT --role=roles/storage.OBJECT_ROLE

    将

    • BUCKET_NAME:源存储桶的名称。
    • SERVICE_AGENT_EMAIL:服务代理电子邮件地址。
    • serviceAccount_OR_user:如果您的转移代理账号是服务账号,请指定 serviceAccount;如果您的代理是使用用户账号安装的,请指定 user。
    • TRANSFER_AGENT_ACCOUNT:安装了转移代理的账号的邮箱。例如,my-agent-sa@PROJECT_ID. 或 user@example.com。
    • OBJECT_ROLE:如果要保留源对象,请指定 objectViewer;如果要在转移后删除源对象,请指定 objectUser。

REST API

  1. 生成访问令牌,以对您的请求进行身份验证。如果您使用的是 gcloud CLI,请运行:

    gcloud auth print-access-token
  2. 检索现有存储桶 IAM 政策 (GET https://storage./storage/v1/b/<var>BUCKET_NAME</var>/iam),将以下绑定附加到其 bindings 数组,然后将合并后的政策保存为 agent_source_policy.json:

    {
      "bindings": [
        {
          "role": "roles/storage.legacyBucketReader",
          "members": ["serviceAccount:SERVICE_AGENT_EMAIL"]
        },
        {
          "role": "roles/storage.objectCreator",
          "members": ["serviceAccount:SERVICE_AGENT_EMAIL"]
        },
        {
          "role": "roles/storage.OBJECT_ROLE",
          "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。
    • OBJECT_ROLE:如果要保留源对象,请指定 objectViewer;如果要在转移后删除源对象,请指定 objectUser。
  3. 通过 curl 更新存储桶政策:

    curl -X PUT --data-binary @agent_source_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:源存储桶的名称。

跨项目 Cloud Storage 转移作业

如需在不同 Google Cloud 云项目中的 Cloud Storage 存储桶之间转移对象,您必须向创建转移作业的项目的服务代理授予源存储桶和目标存储桶上的权限。

创建转移作业的用户账号或用户代管式服务账号只需要创建转移作业的项目上的权限。

如需为跨项目转移作业授予角色,请执行以下操作:

  1. 获取将运行转移作业的项目的服务代理电子邮件地址。请参阅找到服务代理的电子邮件地址。
  2. 在源存储桶上,向该服务代理授予以下角色:
    • Storage Legacy Bucket Reader (roles/storage.legacyBucketReader)
    • 以及以下对象角色之一:
      • Storage Object Viewer (roles/storage.objectViewer)(如果要保留源对象)。
      • Storage Object User (roles/storage.objectUser)(如果在转移后删除源对象 [deleteObjectsFromSourceAfterTransfer])。
      • Storage Object Admin (roles/storage.objectAdmin)(如果保留对象 ACL [ACL_PRESERVE])。还支持在转移后删除源对象。
  3. 在目标存储桶上,向同一服务代理授予以下角色:
    • Storage Legacy Bucket Reader (roles/storage.legacyBucketReader)
    • Storage Object User (roles/storage.objectUser);如果保留对象 ACL (ACL_PRESERVE),则为 Storage Object Admin (roles/storage.objectAdmin)。

如需了解如何授予目标存储桶访问权限,请参阅配置对接收器的访问权限:Cloud Storage。

组织权限限制

如果您的组织已应用组织政策限制条件,请确保这些限制条件允许跨项目服务代理访问:

  • 网域限制共享 (constraints/iam.allowedPolicyMemberDomains):托管存储桶的项目上的政策必须允许包含服务代理的成员网域。请参阅限制网域。
  • 停用跨项目服务账号使用 (constraints/iam.disableCrossProjectServiceAccountUsage):确保此限制条件不会阻止跨项目服务账号访问。请参阅限制服务账号。
  • VPC Service Controls:如果存储桶属于不同的服务边界,请配置入站和出站规则,以允许转移通信。请参阅为云对象存储区转移配置 VPC Service Controls。

精细权限参考文档

选择您的转移作业类型,以查看所需的角色和权限。

无代理转移

对于无代理转移作业,必须向 Storage Transfer Service 服务代理授予权限:

权限 说明
storage.buckets.get 允许服务代理获取存储桶的位置。
storage.objects.list 允许服务代理列出存储桶中的对象。
storage.objects.get 允许服务代理读取存储桶中的对象。
storage.objects.delete 允许服务代理删除存储桶中的对象。如果 deleteObjectsFromSourceAfterTransfer 为 true,则必须提供此值。
storage.objects.getIamPolicy 允许读取源对象上的 ACL。如果启用了对象 ACL 保留 (ACL_PRESERVE),则必须填写此列。
storage.folders.list
storage.folders.get
允许列出和读取文件夹。从启用了分层命名空间的存储桶转移数据时,此参数为必填项。

智能体驱动的转移

对于从 Cloud Storage 来源进行的代理驱动型转移作业,权限在两个主账号之间分配:

  • 服务代理:需要存储桶级读取权限才能解析存储桶元数据和位置,以及对象创建权限才能写入代理转移日志。

  • 转移代理账号:用于创建转移代理的服务账号或用户账号。

服务代理权限

权限 说明
storage.buckets.get 允许服务代理检查存储桶元数据和位置。
storage.objects.create 允许服务代理在从 Cloud Storage 转移到文件系统时将代理转移日志写入源存储桶。

转移代理账号权限

权限 说明
storage.objects.list 允许代理列出源存储桶中的对象。
storage.objects.get 允许代理从源存储桶中读取对象。
storage.objects.delete 如果启用了 deleteObjectsFromSourceAfterTransfer,则允许代理删除源对象。
storage.folders.list
storage.folders.get
允许代理在从启用了分层命名空间的存储桶传输数据时列出和读取文件夹。

后续步骤

您必须配置对目标的访问权限: