事件驱动型转移

Storage Transfer Service 可以侦听 AWS 或 Google Cloud 中的事件通知,以自动转移在来源位置添加或更新的数据。支持从 AWS S3 或 Cloud Storage 到 Cloud Storage 的事件驱动型转移。

事件驱动的转移会侦听发送到 Amazon SQS for AWS S3 来源的 Amazon S3 事件通知。Cloud Storage 来源向 Pub/Sub 订阅发送通知。

事件驱动型转移的优势

由于事件驱动的转移作业会侦听源存储桶的变化,因此更新会近乎实时地复制到目标位置。Storage Transfer Service 不需要对来源执行列出操作,从而节省时间和金钱。

用例包括:

  • 事件驱动型分析:将数据从 AWS 复制到 Cloud Storage 以执行分析和处理。

  • Cloud Storage 复制:在 Cloud Storage 存储桶之间启用自动异步对象复制。

    使用 Storage Transfer Service 的事件驱动型转移与 Cloud Storage 的增强型复制默认复制不同,它会在其他存储桶中创建数据的副本。

    这具有以下优势:

    • 将开发和生产数据保存在单独的命名空间中。
    • 共享数据但不提供对原始存储桶的访问权限。
    • 备份到其他大洲或双区域和多区域存储未涵盖的区域。
  • DR/HA 设置:在数分钟内将对象从来源复制到备份目标位置:

    • 跨云备份:在 Cloud Storage 上创建 AWS S3 备份的副本。
    • 跨区域或跨项目备份:在其他区域或项目中创建 Cloud Storage 存储桶的副本。
  • 实时迁移:事件驱动型转移可以支持停机时间较短(停机时间为数分钟)的迁移,作为一次性批量迁移的后续步骤。

设置从 Cloud Storage 进行的事件驱动型转移

配置权限

  1. 找到项目的 Storage Transfer Service 服务代理的名称:

    1. 前往 googleServiceAccounts.get 参考页面

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

    2. 在该面板的请求参数下,输入您的项目 ID。您在此处指定的项目必须是您用于管理 Storage Transfer Service 的项目,该项目可能与来源存储桶的项目不同。

    3. 点击执行

    服务代理的电子邮件地址会作为 accountEmail 的值返回。复制此值。

    服务代理的电子邮件地址采用 project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com 格式。

  2. Pub/Sub Subscriber 角色授予 Storage Transfer Service 服务代理。

    Cloud 控制台

    按照通过 Google Cloud 控制台控制访问权限中的说明,向 Storage Transfer Service 服务授予 Pub/Sub Subscriber 角色。可以在主题、订阅或项目级层授予该角色。

    gcloud CLI

    按照设置政策中的说明添加以下绑定:

    {
      "role": "roles/pubsub.subscriber",
      "members": [
        "serviceAccount:project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com"
    }
    

配置 Pub/Sub

  1. 请确保您已满足将 Pub/Sub 与 Cloud Storage 搭配使用的前提条件

  2. 配置适用于 Cloud Storage 的 Pub/Sub 通知:

    gcloud storage buckets notifications create gs://BUCKET_NAME --topic=TOPIC_NAME
    
  3. 为该主题创建拉取订阅:

    gcloud pubsub subscriptions create SUBSCRIPTION_ID --topic=TOPIC_NAME --ack-deadline=300
    

创建转移作业

您可以使用 REST API 或 Cloud 控制台创建基于事件的转移作业。

Cloud 控制台

  1. 转到 Google Cloud 控制台中的创建转移作业页面。

    转到创建转移作业

  2. 选择 Cloud Storage 作为来源和目的地。

  3. 选择存储桶及其中的文件夹(可选),以用作来源和目标。

  4. 转移作业执行模式屏幕中,选择事件驱动

  5. 使用以下格式输入订阅名称:

    projects/PROJECT_NAME/subscriptions/SUBSCRIPTION_ID

  6. (可选)输入转移作业的开始时间和结束时间。如果未指定时间,转移作业将立即开始运行,直到手动停止为止。

  7. 指定任何转移选项。如需了解详情,请参阅创建转移作业页面。 无法将事件驱动的转移作业配置为从来源删除文件。

  8. 点击创建

创建后,转移作业将开始运行,且事件监听器会等待 Pub/Sub 订阅上的通知。作业详情页面每小时显示一次操作,并包含每项作业转移的数据的详细信息。

REST

如需使用 REST API 创建事件驱动型转移作业,请将以下 JSON 对象发送到 transferJobs.create 端点:

transfer_job {
  "description": "YOUR DESCRIPTION",
  "status": "ENABLED",
  "projectId": "PROJECT_ID",
  "transferSpec" {
    "gcsDataSource" {
      "bucketName": "GCS_SOURCE_NAME"
    },
    "gcsDataSink": {
        "bucketName": "GCS_SINK_NAME"
    }
  }
  "eventStream" {
    "name": "projects/PROJECT_NAME/subscriptions/SUBSCRIPTION_ID",
    "eventStreamStartTime": "2022-12-02T01:00:00+00:00",
    "eventStreamExpirationTime": "2023-01-31T01:00:00+00:00"
  }
}

eventStreamStartTimeeventStreamExpirationTime 是可选的。如果省略开始时间,转移作业会立即启动;如果省略结束时间,转移作业将继续运行,直到手动停止。

设置来自 AWS S3 的事件驱动型转移作业

创建 SQS 队列

来自 AWS S3 的事件驱动型转移使用来自 Amazon Simple Queue Service (SQS) 的通知来了解源存储桶中的对象何时已修改或添加。

  1. 在 AWS 控制台中,转到 Simple Queue Service 页面。

  2. 点击创建队列

  3. 输入此队列的名称

  4. 访问权限政策部分中,选择高级。此时会显示一个 JSON 对象:

     {
        "Version": "2008-10-17",
        "Id": "__default_policy_ID",
        "Statement": [
          {
            "Sid": "__owner_statement",
            "Effect": "Allow",
            "Principal": {
              "AWS": "01234567890"
            },
            "Action": [
              "SQS:*"
            ],
            "Resource": "arn:aws:sqs:us-west-2:01234567890:test"
          }
        ]
      }
      

    AWSResource 的值对于每个项目都是唯一的。

  5. 将您的特定 AWSResource 值从显示的 JSON 复制到以下 JSON 代码段:

    {
      "Version": "2012-10-17",
      "Id": "example-ID",
      "Statement": [
        {
          "Sid": "example-statement-ID",
          "Effect": "Allow",
          "Principal": {
            "Service": "s3.amazonaws.com"
          },
          "Action": "SQS:SendMessage",
          "Resource": "RESOURCE",
          "Condition": {
            "StringEquals": {
              "aws:SourceAccount": "AWS"
            },
            "ArnLike": {
              "aws:SourceArn": "S3_BUCKET_ARN"
            }
          }
        }
      ]
    }
    

    上述 JSON 中的占位符值采用以下格式:

    • AWS 是表示 Amazon Web Services 项目的数值。例如 "aws:SourceAccount": "1234567890"
    • RESOURCE 是标识此队列的 Amazon Resource Number (ARN)。例如 "Resource": "arn:aws:sqs:us-west-2:01234567890:test"
    • S3_BUCKET_ARN 是标识源存储桶的 ARN。例如 "aws:SourceArn": "arn:aws:s3:::example-aws-bucket"。您可以从 AWS 控制台的存储桶详情页面的属性标签页中找到存储桶的 ARN。
  6. 访问权限政策部分中显示的 JSON 替换为上面更新后的 JSON。

  7. 点击创建队列

完成后,记下队列的 Amazon 资源名称 (ARN)。ARN 的格式如下:

arn:aws:sqs:us-east-1:1234567890:event-queue"

在 S3 存储桶上启用通知

  1. 在 AWS 控制台中,转到 S3 页面。

  2. 存储桶列表中,选择您的源存储桶。

  3. 选择属性标签页。

  4. 事件通知部分,点击创建事件通知

  5. 指定此事件的名称。

  6. 事件类型部分中,选择所有对象创建事件

  7. 目标位置部分,选择 SQS 队列,然后选择您为此转移作业创建的队列。

  8. 点击保存更改

配置权限

按照“配置对来源的访问权限:Amazon S3”中的说明创建访问密钥 ID 和密钥或 Federated Identity 角色。

将自定义权限 JSON 替换为以下内容:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sqs:DeleteMessage",
                "sqs:ChangeMessageVisibility",
                "sqs:ReceiveMessage",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:GetBucketLocation"
            ],
            "Resource": [
                "arn:aws:s3:::AWS_BUCKET_NAME",
                "arn:aws:s3:::AWS_BUCKET_NAME/*",
                "AWS_QUEUE_ARN"
            ]
        }
    ]
}

创建后,请记下以下信息:

  • 对于用户,请记下访问密钥 ID 和密钥。
  • 对于 Federated Identity 角色,请记下 Amazon 资源名称 (ARN),其格式为 arn:aws:iam::AWS_ACCOUNT:role/ROLE_NAME

创建转移作业

您可以使用 REST API 或 Cloud 控制台创建基于事件的转移作业。

Cloud 控制台

  1. 转到 Google Cloud 控制台中的创建转移作业页面。

    转到创建转移作业

  2. 选择 Amazon S3 作为来源类型,选择 Cloud Storage 作为目标。

  3. 输入您的 S3 存储桶名称。

  4. 选择您的身份验证方法,然后输入您在上一部分中创建并记下的请求信息。

  5. 选择目标 Cloud Storage 存储桶以及可选的路径。

  6. 转移作业执行模式屏幕中,选择事件驱动

  7. 输入 Amazon SQS 队列 ARN。

  8. (可选)输入转移作业的开始时间和结束时间。如果未指定时间,转移作业将立即开始运行,并一直运行,直到手动停止。

  9. 指定任何转移选项。如需了解详情,请参阅创建转移作业页面。 无法将事件驱动的转移作业配置为从来源删除文件。

  10. 点击创建

创建后,转移作业将开始运行,且事件监听器会等待 SQS 队列中的通知。作业详情页面每小时显示一次操作,并包含每项作业转移的数据的详细信息。

REST

如需使用 REST API 创建事件驱动型转移作业,请将以下 JSON 对象发送到 transferJobs.create 端点:

transfer_job {
  "description": "YOUR DESCRIPTION",
  "status": "ENABLED",
  "projectId": "PROJECT_ID",
  "transferSpec" {
    "awsS3DataSource" {
      "bucketName": "AWS_SOURCE_NAME",
      "roleArn": "arn:aws:iam::1234567891011:role/role_for_federated_auth"
    },
    "gcsDataSink": {
        "bucketName": "GCS_SINK_NAME"
    }
  }
  "eventStream" {
    "name": "arn:aws:sqs:us-east-1:1234567891011:s3-notification-queue",
    "eventStreamStartTime": "2022-12-02T01:00:00+00:00",
    "eventStreamExpirationTime": "2023-01-31T01:00:00+00:00"
  }
}

eventStreamStartTimeeventStreamExpirationTime 是可选的。如果省略开始时间,转移作业会立即启动;如果省略结束时间,转移作业将继续运行,直到手动停止。