配置对来源的访问权限:Amazon S3

您可以使用以下两种方法之一设置对 Amazon S3 存储桶的访问权限:

支持的区域

Storage Transfer Service 能够从以下 Amazon S3 区域转移数据:af-south-1ap-east-1ap-northeast-1ap-northeast-2ap-northeast-3ap-south-1ap-south-2ap-southeast-1ap-southeast-2ap-southeast-3ca-central-1eu-central-1eu-central-2eu-north-1eu-south-1eu-south-2eu-west-1eu-west-2eu-west-3me-central-1me-south-1sa-east-1us-east-1us-east-2us-west-1us-west-2

所需权限

如需使用 Storage Transfer Service 转移来自 Amazon S3 存储桶的数据,您的用户账号或联合身份角色必须具有该存储桶的相应权限:

权限 说明 使用
s3:ListBucket 允许 Storage Transfer Service 列出存储桶中的对象。 始终必需。
s3:GetObject 允许 Storage Transfer Service 读取存储桶中的对象。 如果要转移所有对象的当前版本,则为必需。如果您的清单指定了对象版本,请改用 s3:GetObjectVersion
s3:GetObjectVersion 允许 Storage Transfer Service 读取存储桶中特定版本的对象。 如果您的清单指定了对象版本,则为必需。否则,请使用 s3:GetObject
s3:DeleteObject 允许 Storage Transfer Service 删除存储桶中的对象。 deleteObjectsFromSourceAfterTransfer 设置为 true 时必需。

使用访问凭据进行身份验证

如需使用访问密钥 ID 和密钥向 AWS 进行身份验证,请执行以下操作:

  1. 创建 AWS Identity and Access Management (AWS IAM) 用户,并设置便于识别的用户名,如 transfer-user

  2. 对于 AWS 访问类型,选择 Access key - programmatic access(访问密钥 - 以程序化方式访问)。

  3. 向用户授予以下角色之一:

    • AmazonS3ReadOnlyAccess 提供对来源的只读权限。 它允许转移,但不支持在转移完成后删除来源中的对象。
    • 如果您的转移作业配置为删除来源中的对象,请授予 AmazonS3FullAccess
    • 具有上文所需权限表中的相应权限的自定义角色。最小权限的 JSON 示例如下:

      {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::AWS_BUCKET_NAME/*",
                    "arn:aws:s3:::AWS_BUCKET_NAME"
                ]
            }
        ]
      }
  4. 在成功创建用户后,记下访问密钥 ID私有访问密钥

如何将访问密钥 ID 和私有访问密钥传递给 Storage Transfer Service 取决于您用于启动转移作业的界面。

Cloud 控制台

直接在转移作业创建表单中输入值。

如需开始使用,请参阅创建转移作业

gcloud CLI

按以下格式创建 JSON 文件:

{
  "accessKeyId": "AWS_ACCESS_KEY_ID",
  "secretAccessKey": "AWS_SECRET_ACCESS_KEY"
}

使用 source-creds-file 标志将文件的位置传递给 gcloud transfer jobs create 命令:

gcloud transfer jobs create s3://S3_BUCKET_NAME gs://GCS_BUCKET_NAME \
  --source-creds-file=PATH/TO/KEYFILE.JSON

REST API

您的 transferSpec 对象必须包含密钥信息作为 awsS3DataSource 对象的一部分:

"transferSpec": {
  "awsS3DataSource": {
    "bucketName": "AWS_SOURCE_NAME",
    "awsAccessKey": {
      "accessKeyId": "AWS_ACCESS_KEY_ID",
      "secretAccessKey": "AWS_SECRET_ACCESS_KEY"
    }
  },
  "gcsDataSink": {
    "bucketName": "GCS_SINK_NAME"
  }
}

客户端库

请参阅创建转移作业页面中的示例。

在 Secret Manager 中保存您的访问凭据

Secret Manager 是用于存储和管理密码等敏感数据的安全服务。它使用强大的加密、基于角色的访问权限控制和审核日志记录来保护您的 Secret。

Storage Transfer Service 可利用 Secret Manager 来保护 AWS 访问凭据。您需要将凭据加载到 Secret Manager 中,然后将 Secret 资源名称传递给 Storage Transfer Service。

启用该 API

Enable the Secret Manager API.

Enable the API

配置其他权限

用户权限

创建 Secret 的用户需要以下角色:

  • Secret Manager Admin (roles/secretmanager.admin)

了解如何授予角色

服务代理权限

Storage Transfer Service 服务代理需要以下 IAM 角色:

  • Secret Manager Secret Accessor (roles/secretmanager.secretAccessor)

如需向您的服务代理授予角色:

Cloud 控制台

  1. 按照说明检索您的服务代理电子邮件

  2. 在 Google Cloud 控制台中,转到 IAM 页面。

    转到 IAM

  3. 点击授予使用权限

  4. 新的主账号文本框中,输入服务代理电子邮件地址。

  5. 选择角色下拉列表中,搜索并选择 Secret Manager Secret Accessor

  6. 点击保存

gcloud

使用 gcloud projects add-iam-policy-binding 命令将 IAM 角色添加到服务代理。

  1. 按照说明检索您的服务代理电子邮件

  2. 从命令行中,输入以下命令:

    gcloud projects add-iam-policy-binding PROJECT_ID \
      --member='serviceAccount:SERVICE_AGENT_EMAIL' \
      --role='roles/secretmanager.secretAccessor'
    

创建 Secret

使用 Secret Manager 创建 Secret:

Cloud 控制台

  1. 转到 Google Cloud 控制台中的 Secret Manager 页面。

    转到 Secret Manager

  2. 点击创建密钥

  3. 输入名称。

  4. 密钥值文本框中,按以下格式输入凭据:

    {
      "accessKeyId": "AWS_ACCESS_KEY_ID",
      "secretAccessKey": "AWS_SECRET_ACCESS_KEY"
    }
    
  5. 点击创建密钥

  6. 创建 Secret 后,请记下 Secret 的完整资源名称:

    1. 选择概览标签页。

    2. 复制资源 ID 的值。它使用以下格式:

      projects/1234567890/secrets/SECRET_NAME

gcloud

如需使用 gcloud 命令行工具创建新 Secret,请将 JSON 格式的凭据传递给 gcloud secrets create 命令:

printf '{
  "accessKeyId": "AWS_ACCESS_KEY_ID",
  "secretAccessKey": "AWS_SECRET_ACCESS_KEY"
}' | gcloud secrets create SECRET_NAME --data-file=-

检索 Secret 的完整资源名称:

gcloud secrets describe SECRET_NAME

请记下响应中 name 的值。它使用以下格式:

projects/1234567890/secrets/SECRET_NAME

如需详细了解如何创建和管理 Secret,请参阅 Secret Manager 文档

将 Secret 传递给作业创建命令

将 Secret Manager 与 Storage Transfer Service 配合使用需要使用 REST API 创建转移作业。

将 Secret Manager 资源名称作为 transferSpec.awsS3DataSource.credentialsSecret 字段的值传递:

POST https://storagetransfer.googleapis.com/v1/transferJobs

{
  "description": "Transfer with Secret Manager",
  "status": "ENABLED",
  "projectId": "PROJECT_ID",
  "transferSpec": {
      "awsS3DataSource": {
          "bucketName": "AWS_BUCKET_NAME",
          "credentialsSecret": "SECRET_RESOURCE_ID",
      },
      "gcsDataSink": {
          "bucketName": "CLOUD_STORAGE_BUCKET_NAME"
      }
  }
}

使用联合身份进行身份验证

如需使用联合身份向 AWS 进行身份验证,请执行以下操作:

  1. 在 AWS 中创建新的 IAM 角色。

  2. 选择 Custom trust policy(自定义信任政策)作为可信实体类型。

  3. 复制并粘贴以下信任政策:

    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "accounts.google.com"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "accounts.google.com:sub": "SUBJECT_ID"
            }
          }
        }
      ]
    }
    
  4. SUBJECT_ID 替换为开始使用 Storage Transfer Service 时自动创建的 Google 管理的服务账号的 subjectID。如需检索 subjectID,请执行以下操作:

    1. 进入 googleServiceAccounts.get 参考页面

      系统会打开标题为试用此方法的交互式面板。

    2. 在该面板的请求参数下,输入您的项目 ID。您在此处指定的项目必须是您用于管理 Storage Transfer Service 的项目。

    3. 点击执行。响应中包含 subjectId

  5. 向该角色授予以下权限政策之一:

    • AmazonS3ReadOnlyAccess 提供来源的只读权限。它允许转移,但不支持在转移完成后删除来源中的对象。
    • 如果您的转移作业配置为删除来源中的对象,请授予 AmazonS3FullAccess
    • 具有上文所需权限表中的相应权限的自定义角色。最小权限的 JSON 示例如下:

      {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:GetObject",
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::AWS_BUCKET_NAME/*",
                    "arn:aws:s3:::AWS_BUCKET_NAME"
                ]
            }
        ]
      }
  6. 为该角色分配名称并创建角色。

  7. 创建完成后,查看角色详细信息以检索 Amazon 资源名称 (ARN)。请记下该值,它的格式为 arn:aws:iam::AWS_ACCOUNT:role/ROLE_NAME

如何将 ARN 传递给 Storage Transfer Service 取决于您用于启动转移作业的界面。

Cloud 控制台

直接在转移作业创建表单中输入 ARN。

如需开始使用,请参阅创建转移作业

gcloud CLI

按以下格式创建 JSON 文件:

{
  "roleArn": "ARN"
}

使用 source-creds-file 标志将文件的位置传递给 gcloud transfer jobs create 命令:

gcloud transfer jobs create s3://S3_BUCKET_NAME gs://GCS_BUCKET_NAME \
  --source-creds-file=PATH/TO/ARNFILE.JSON

REST API

您的 transferSpec 对象必须包含 ARN 信息作为 awsS3DataSource 对象的一部分:

"transferSpec": {
  "awsS3DataSource": {
    "bucketName": "AWS_SOURCE_NAME",
    "roleArn": "ARN"
  },
  "gcsDataSink": {
    "bucketName": "GCS_SINK_NAME"
  }
}

客户端库

请参阅创建转移作业页面中的示例。

IP 限制

如果您的 AWS 项目通过 IP 来限制对存储空间的访问权限,您必须将 Storage Transfer Service 工作器使用的 IP 范围添加到允许的 IP 列表。

由于这些 IP 范围可能会发生变化,因此我们会将当前值以 JSON 文件的形式发布到下面的永久地址:

https://www.gstatic.com/storage-transfer-service/ipranges.json

向文件添加新范围后,我们至少会等待 7 天,之后才会使用该范围处理来自 Storage Transfer Service 的请求。

我们建议您至少每周从本文档中提取一次数据,以确保您的安全配置保持最新。如需查看从 JSON 文件提取 IP 范围的示例 Python 脚本,请参阅 Virtual Private Cloud 文档中的这篇文章

如需将这些范围添加为允许的 IP,请在存储桶政策中使用 Condition 字段,详情请参阅 AWS S3 文档:基于特定 IP 地址管理访问权限