Amazon S3에서 Cloud Storage로 이전

이 페이지에서는 Amazon S3에서 Cloud Storage로의 전송 작업을 만들고 시작하는 방법을 보여줍니다.

권한 구성

전송을 만들기 전에 Amazon S3 버킷에 대한 권한을 구성해야 합니다. 자세한 내용은 소스에 대한 액세스 권한 구성: Amazon S3를 참조하세요.

다음 Google Cloud 항목에 대한 권한도 구성해야 합니다.

전송을 만드는 데 사용되는 사용자 계정. 이 계정은 Google Cloud 콘솔에 로그인된 계정이거나 `gcloud` CLI에 인증할 때 지정된 계정입니다. 사용자 계정은 일반 사용자 계정이나 사용자 관리형 서비스 계정일 수 있습니다.
Google 관리 서비스 계정은 서비스 에이전트라고도 하며 Storage Transfer Service에서 사용됩니다. 이 계정은 일반적으로 project-PROJECT_NUMBER@storage-transfer-service.iam.gserviceaccount.com 형식을 사용하는 이메일 주소로 식별됩니다.

자세한 내용은 에이전트리스 전송 권한을 참조하세요.

이그레스 옵션

Storage Transfer Service는 S3 데이터를 Cloud Storage로 전송하는 방법에 대한 여러 가지 옵션을 제공합니다.

이그레스 옵션 설명
기본 에이전트리스 이 옵션에서는 S3의 관리형 에이전트리스 전송을 사용합니다. Amazon에서 이그레스 요금을 청구합니다.

이 옵션을 사용하려면 이 페이지의 안내를 따르세요.
CloudFront 배포 Amazon CloudFront 배포를 이그레스 경로로 사용합니다. CloudFront를 통한 데이터 전송의 AWS 이그레스 비용이 S3에서 직접 전송에 비해 저렴할 수 있습니다. 자세한 내용은 CloudFront 가격 책정S3 이그레스 요금을 참조하세요.

CloudFront를 통해 S3에서 전송의 안내를 수행하여 배포를 설정하고 전송을 만듭니다.
관리형 비공개 네트워크 Google 관리 네트워크를 통해 데이터를 전송합니다. S3 이그레스 요금은 청구하지 않습니다. 대신 Google Cloud에 GiB당 요금이 청구됩니다. 자세한 내용은 가격 책정 페이지를 참조하세요. AWS에서 작업 비용이 계속 청구될 수 있습니다(예: LIST 또는 GET 호출). 자세한 내용은 가격 책정을 참조하세요.

관리형 비공개 네트워크를 통한 모든 프로젝트의 전송에서 같은 대역폭을 공유합니다. 사용량이 높으면 전송 속도가 느릴 수 있습니다. 파일이 많이 포함된 전송이 파일이 적게 포함된 전송보다 더 많은 영향을 받습니다.

이 옵션을 사용하려면 이 페이지의 안내를 따르세요. Google Cloud 콘솔에서 관리형 비공개 네트워크 옵션 또는 REST API의 managedPrivateNetwork 필드를 지정합니다. gcloud CLI 및 클라이언트 라이브러리에서는 관리형 비공개 네트워크 전송을 지원하지 않습니다. 지원되는 리전을 참조하세요.
에이전트 기반 Amazon S3를 포함한 모든 S3 호환 스토리지에 유효합니다. S3 버킷에 액세스할 수 있는 머신에 에이전트 소프트웨어를 설치하면 네트워크 경로와 대역폭을 제어할 수 있습니다. 이 옵션을 사용하려면 에이전트와 에이전트 풀이 필요합니다.

이 옵션을 사용하려면 S3 호환 소스에서 전송의 안내를 따르세요.

지원되는 리전

Storage Transfer Service는 다음 Amazon S3 리전을 지원합니다.

af-south-1
ap-east-1
ap-northeast-1
ap-northeast-2
ap-northeast-3
ap-south-1
ap-south-2
ap-southeast-1
ap-southeast-2
ap-southeast-3
ap-southeast-4
ca-central-1
ca-west-1
eu-central-1
eu-central-2
eu-north-1
eu-south-1
eu-south-2
eu-west-1
eu-west-2
eu-west-3
il-central-1
me-central-1
me-south-1
sa-east-1
us-east-1
us-east-2
us-west-1
us-west-2

관리형 비공개 네트워크를 사용하는 전송에서 다음 AWS 리전을 지원합니다.

us-east-1
us-east-2
us-west-1
us-west-2
ca-west-1
ca-central-1

전송 옵션

S3에서 Cloud Storage로 전송할 때 다음과 같은 Storage Transfer Service 기능을 사용할 수 있습니다.

매니페스트를 사용하여 특정 파일 전송
작업할 Storage Transfer Service 파일의 목록을 전달할 수 있습니다. 자세한 내용은 매니페스트를 사용하여 특정 파일 또는 객체 전송을 참조하세요.
스토리지 클래스 지정
대상 버킷의 데이터에 사용할 Cloud Storage 스토리지 클래스를 지정할 수 있습니다. REST 세부정보는 StorageClass 옵션을 참조하거나 Google Cloud CLI에서 --custom-storage-class 플래그를 사용하세요.

대상 버킷에 자동 클래스가 사용 설정되면 스토리지 클래스 설정이 무시됩니다. 자동 클래스를 사용 설정하면 처음에는 버킷으로 전송된 객체가 Standard Storage로 설정됩니다.

메타데이터 보존

S3에서 파일을 전송할 때 Storage Transfer Service는 선택적으로 특정 속성을 커스텀 메타데이터로 보존할 수 있습니다.

보존할 수 있는 메타데이터와 전송을 구성하는 방법에 대한 자세한 내용은 메타데이터 보존Amazon S3에서 Cloud Storage로 전송 섹션을 참조하세요.

이벤트 기반 전송
Storage Transfer Service는 Amazon SQS로 전송된 Amazon S3 이벤트 알림을 리슨하여 소스 위치에 추가되거나 업데이트된 데이터를 자동으로 전송할 수 있습니다. 자세한 내용은 이벤트 기반 전송을 참조하세요.
로깅 및 모니터링
Cloud Logging 및 Cloud Monitoring에서 S3에서의 전송을 볼 수 있습니다. 자세한 내용은 Storage Transfer Service용 Cloud Logging전송 작업 모니터링을 참조하세요. 또한 Pub/Sub 알림을 구성할 수 있습니다.

전송 만들기

Storage Transfer Service는 전송을 만드는 데 사용되는 인터페이스를 여러 개 제공합니다.

전송 작업 이름에 개인 식별 정보(PII) 또는 보안 데이터와 같은 민감한 정보를 포함하지 마세요. 리소스 이름은 다른 Google Cloud 리소스 이름으로 전파될 수 있으며 프로젝트 외부의 Google 내부 시스템에 노출될 수 있습니다.

Google Cloud 콘솔

  1. Google Cloud 콘솔의 Storage Transfer Service 페이지로 이동합니다.

    Storage Transfer Service로 이동

  2. 전송 작업 만들기를 클릭합니다. 전송 작업 만들기 페이지가 표시됩니다.

  3. 소스 유형에서 Amazon S3를 선택합니다.

  4. 대상 유형으로 Google Cloud Storage를 선택합니다.

  5. 예약 모드를 선택합니다. 일괄 전송은 일회성 또는 예약 기반으로 실행됩니다. 이벤트 기반 전송은 소스를 지속적으로 모니터링하고 데이터가 추가되거나 수정되면 데이터를 전송합니다.

    이벤트 기반 전송을 구성하려면 이벤트 기반 전송의 안내를 수행합니다.

  6. 다음 단계를 클릭합니다.

  7. 버킷 또는 폴더 이름 필드에 소스 버킷 이름을 입력합니다.

    버킷 이름은 AWS 관리 콘솔에 나타나는 이름입니다.

  8. CloudFront 배포를 사용하여 S3에서 전송하는 경우 CloudFront 도메인 필드에 배포 도메인 이름을 입력합니다. 예를 들면 https://dy1h2n3l4ob56.cloudfront.net입니다. CloudFront 배포를 구성하려면 CloudFront를 통해 S3에서 전송을 참조하세요.

  9. 이 전송에 관리형 비공개 네트워크를 사용하려면 체크박스를 선택합니다. 자세한 내용은 이그레스 옵션을 참조하세요.

  10. Amazon Web Services(AWS) 인증 방법을 선택합니다. 자세한 내용은 소스에 대한 액세스 권한 구성: Amazon S3를 참조하세요.

    • 액세스 키: 액세스 키 ID 필드에 액세스 키를 입력하고 보안 비밀 액세스 키 필드에 액세스 키와 연관된 보안 비밀을 입력합니다.

    • ID 제휴를 위한 AWS IAM 역할: AWS IAM 역할 ARN 필드에 다음 구문으로 ARN을 입력합니다.

      arn:aws:iam::ACCOUNT:role/ROLE-NAME-WITH-PATH
      

      각 항목의 의미는 다음과 같습니다.

      • ACCOUNT: 하이픈이 없는 AWS 계정 ID입니다.
      • ROLE-NAME-WITH-PATH: 경로가 포함된 AWS 역할 이름입니다.

      ARN에 관한 자세한 내용은 IAM ARN을 참조하세요.

    • 보안 비밀 리소스: Secret Manager에 저장된 Amazon 사용자 인증 정보를 사용하려면 이 옵션을 선택합니다. 목록에서 보안 비밀을 선택하거나 projects/PROJECT_NUMBER/secrets/SECRET_NAME 형식으로 직접 입력합니다.

  11. 이벤트 기반 전송인 경우 다음 형식을 사용하는 Amazon SQS 큐 ARN을 입력합니다.

    arn:aws:sqs:us-east-1:1234567890:event-queue
    
  12. 원하는 경우 프리픽스를 기준으로 객체를 필터링하거나 최종 수정 날짜를 기준으로 객체를 필터링하도록 선택합니다. 폴더를 소스 위치로 지정한 경우 프리픽스 필터는 해당 폴더를 기준으로 합니다. 예를 들어 소스가 my-test-bucket/path/인 경우 file의 포함 필터는 my-test-bucket/path/file로 시작하는 모든 파일을 포함합니다.
  13. 다음 단계를 클릭합니다.

  14. 버킷 또는 폴더 필드에 대상 버킷과 폴더 이름(선택사항)을 입력하거나 찾아보기를 클릭하여 현재 프로젝트의 기존 목록에서 버킷을 선택합니다. 새 버킷을 만들려면 새 버킷 만들기를 클릭합니다.

  15. 다음 단계를 클릭합니다.

  16. 전송 작업의 설정을 선택합니다.

    1. 설명 필드에 전송 설명을 입력합니다. 작업을 구분할 수 있도록 의미 있고 고유한 설명을 입력하는 것이 좋습니다.

    2. 메타데이터 옵션에서 기본 옵션을 사용하도록 선택하거나 옵션 보기 및 선택을 클릭하여 지원되는 모든 메타데이터의 값을 지정합니다. 자세한 내용은 메타데이터 보존을 참조하세요.

    3. 덮어쓸 시점에서 다음 중 하나를 선택합니다.

      • 다른 경우: 이름이 같은 소스 파일에 다른 Etag 또는 체크섬 값이 있는 경우 대상 파일을 덮어씁니다.

      • 항상: 소스 파일 이름이 같으면 동일하더라도 항상 대상 파일을 덮어씁니다.

    4. 삭제 시점에서 다음 중 하나를 선택합니다.

      • 삭제 안함: 소스 또는 대상 위치에서 파일을 삭제하지 않습니다.

      • 전송 후 소스에서 파일 삭제: 파일이 대상으로 전송된 후 소스에서 파일을 삭제합니다.

      • 소스에도 없는 경우 대상 위치에서 파일 삭제: 대상 Cloud Storage 버킷의 파일이 소스에도 없는 경우 Cloud Storage 버킷에서 파일을 삭제합니다.

        이 옵션을 사용하면 대상 Cloud Storage 버킷이 소스와 정확하게 일치합니다.

    5. 알림 옵션에서 Pub/Sub 주제 및 알림을 받을 이벤트를 선택합니다. 자세한 내용은 Pub/Sub 알림을 참조하세요.

  17. 다음 단계를 클릭합니다.

  18. 예약 옵션을 선택합니다.

    1. 한 번 실행 드롭다운 목록에서 다음 중 하나를 선택합니다.

      • 한 번 실행: 선택한 시간에 단일 전송을 실행합니다.

      • 매일 실행: 선택한 시점부터 매일 전송을 실행합니다.

        선택사항인 종료일을 입력하거나 종료일을 비워 두어 전송을 계속 실행할 수 있습니다.

      • 매주 실행: 선택한 시간부터 매주 전송을 실행합니다.

      • 커스텀 빈도로 실행: 선택한 빈도로 전송을 실행합니다. 시간, 또는 라는 정기적인 간격으로 전송을 반복하도록 선택할 수 있습니다.

        선택사항인 종료일을 입력하거나 종료일을 비워 두어 전송을 계속 실행할 수 있습니다.

    2. 지금 시작 드롭다운 목록에서 다음 중 하나를 선택합니다.

      • 지금 시작: 만들기를 클릭한 후 전송을 시작합니다.

      • 시작일: 선택한 날짜 및 시간에 전송을 시작합니다. 캘린더를 클릭하여 시작일을 선택할 캘린더를 표시합니다.

    3. 전송 작업을 만들려면 만들기를 클릭합니다.

gcloud CLI

새 전송 작업을 만들려면 gcloud transfer jobs create 명령어를 사용합니다. 일정 또는 --do-not-run이 지정되지 않은 한, 새 작업을 만들면 지정된 전송이 시작됩니다.

gcloud CLI는 CloudFront 또는 관리형 비공개 네트워크를 통한 전송을 지원하지 않습니다.

gcloud transfer jobs create \
  s3://S3_BUCKET_NAME gs://STORAGE_BUCKET_NAME \
  --source-creds-file="relative_path/to/creds.json"

각 항목의 의미는 다음과 같습니다.

  • S3_BUCKET_NAME는 이 전송의 데이터 소스입니다. 원하는 경우 s3://S3_BUCKET_NAME/S3_FOLDER_PATH 경로를 포함할 수 있습니다.

  • STORAGE_BUCKET_NAME은 전송할 Cloud Storage 버킷입니다. 특정 디렉터리로 전송하려면 후행 슬래시를 포함하여 gs://STORAGE_BUCKET_NAME/STORAGE_FOLDER_PATH/를 지정합니다.

  • --source-creds-file은 머신에서 전송 소스의 AWS 사용자 인증 정보가 포함된 로컬 파일에 대한 상대 경로를 지정합니다. 콘텐츠는 다음 JSON 형식이어야 합니다.

    {
      "accessKeyId": string,
      "secretAccessKey": string
    }

추가로 선택할 수 있는 옵션은 다음과 같습니다.

  • --do-not-run은 명령어를 제출할 때 Storage Transfer Service가 작업을 실행하지 못하도록 방지합니다. 작업을 실행하려면 이를 업데이트해서 일정을 추가하거나 jobs run을 사용해서 수동으로 시작합니다.

  • --manifest-file은 소스에서 전송할 파일 목록이 포함된 Cloud Storage의 CSV 파일 경로를 지정합니다. 매니페스트 파일 형식 지정은 매니페스트를 사용하여 특정 파일 또는 객체 전송을 참조하세요.

  • 작업 정보: --name--description을 지정할 수 있습니다.

  • 일정: --schedule-starts, --schedule-repeats-every, --schedule-repeats-until, --do-not-run을 지정합니다.

  • 객체 조건: 조건을 사용해서 전송되는 객체를 결정합니다. 여기에는 --include-prefixes--exclude-prefixes--include-modified-[before | after]-[absolute | relative]의 시간 기준 조건이 포함됩니다. 소스로 폴더를 지정한 경우 프리픽스 필터는 해당 폴더를 기준으로 합니다. 자세한 내용은 프리픽스로 소스 객체 필터링을 참조하세요.

  • 전송 옵션: 대상 파일(--overwrite-when=different 또는always)을 덮어쓸지 여부와 전송 중 또는 전송 후에 특정 파일을 삭제할지 여부(--delete-from=destination-if-unique 또는source-after-transfer)를 지정하고, 보존할 메타데이터 값(--preserve-metadata)을 지정하며, 필요한 경우 전송된 객체에 스토리지 클래스를 선택적으로 설정할 수 있습니다(--custom-storage-class).

  • 알림: --notification-pubsub-topic, --notification-event-types, --notification-payload-format으로 Pub/Sub 전송 알림을 구성합니다.

  • Cloud Logging: --log-actions--log-action-states로 Cloud Logging을 사용 설정합니다. 자세한 내용은 Storage Transfer Service의 Cloud Logging을 참조하세요.

모든 옵션을 보려면 gcloud transfer jobs create --help를 실행하거나 gcloud 참고 문서를 참조하세요.

REST

다음 샘플에서는 REST API를 통해 Storage Transfer Service를 사용하는 방법을 보여줍니다.

Storage Transfer Service API를 사용하여 전송 작업을 구성하거나 편집할 때 시간은 UTC여야 합니다. 전송 작업 일정을 지정하는 방법에 대한 자세한 내용은 일정을 참조하세요.

전송 작업을 만들 때 Amazon S3 버킷 소스 이름에 bucketNames3:// 접두사를 포함하지 마세요.

에이전트리스 전송

다음 예시에서는 표준 에이전트리스 구성을 사용하여 전송 작업을 만듭니다. 자세한 내용은 transferJobs.create 참조를 확인하세요.

POST https://storagetransfer.googleapis.com/v1/transferJobs
{
  "description": "DESCRIPTION",
  "status": "ENABLED",
  "projectId": "PROJECT_ID",
  "transferSpec": {
      "awsS3DataSource": {
          "bucketName": "AWS_SOURCE_NAME",
          "awsAccessKey": {
            "accessKeyId": "AWS_ACCESS_KEY_ID",
            "secretAccessKey": "AWS_SECRET_ACCESS_KEY"
          }
      },
      "gcsDataSink": {
          "bucketName": "GCS_SINK_NAME"
      }
  }
}

다른 인증 옵션은 소스에 대한 액세스 권한 구성: Amazon S3를 참조하세요.

CloudFront 배포

CloudFront 배포를 통해 S3에서 전송하는 경우 배포 도메인 이름을 transferSpec.awsS3DataSource.cloudfrontDomain 필드 값으로 지정합니다.

POST https://storagetransfer.googleapis.com/v1/transferJobs
{
  "description": "DESCRIPTION",
  "status": "ENABLED",
  "projectId": "PROJECT_ID",
  "transferSpec": {
      "awsS3DataSource": {
          "bucketName": "AWS_SOURCE_NAME",
          "cloudfrontDomain": "https://dy1h2n3l4ob56.cloudfront.net",
          "awsAccessKey": {
            "accessKeyId": "AWS_ACCESS_KEY_ID",
            "secretAccessKey": "AWS_SECRET_ACCESS_KEY"
          }
      },
      "gcsDataSink": {
          "bucketName": "GCS_SINK_NAME"
      }
  }
}

관리형 비공개 네트워크

Google 관리 비공개 네트워크를 사용하여 S3에서 전송하려면 transferSpec.awsS3DataSource.managedPrivateNetwork 필드를 지정합니다.

POST https://storagetransfer.googleapis.com/v1/transferJobs
{
  "description": "DESCRIPTION",
  "status": "ENABLED",
  "projectId": "PROJECT_ID",
  "transferSpec": {
      "awsS3DataSource": {
          "bucketName": "AWS_SOURCE_NAME",
          "managedPrivateNetwork": TRUE,
          "awsAccessKey": {
            "accessKeyId": "AWS_ACCESS_KEY_ID",
            "secretAccessKey": "AWS_SECRET_ACCESS_KEY"
          }
      },
      "gcsDataSink": {
          "bucketName": "GCS_SINK_NAME"
      }
  }
}

클라이언트 라이브러리

다음 샘플에서는 Go, Java, Node.js, Python을 사용하여 프로그래매틱 방식으로 Storage Transfer Service를 사용하는 방법을 보여줍니다.

전송 작업을 프로그래매틱 방식으로 구성하거나 편집할 때 시간은 UTC여야 합니다. 전송 작업 일정을 지정하는 방법에 대한 자세한 내용은 일정을 참조하세요.

Storage Transfer Service 클라이언트 라이브러리에 대한 자세한 내용은 Storage Transfer Service 클라이언트 라이브러리 시작하기를 참조하세요.

Amazon S3에서 Cloud Storage로 이전

이 예시에서는 파일을 Amazon S3에서 Cloud Storage 버킷으로 이동하는 방법을 학습합니다.

전송 작업을 만들 때 Amazon S3 버킷 소스 이름에 bucketNames3:// 접두사를 포함하지 마세요.

Storage Transfer Service 클라이언트 라이브러리에서는 CloudFront 또는 관리형 비공개 네트워크를 통한 전송을 지원하지 않습니다.

Go

import (
	"context"
	"fmt"
	"io"
	"os"
	"time"

	storagetransfer "cloud.google.com/go/storagetransfer/apiv1"
	"cloud.google.com/go/storagetransfer/apiv1/storagetransferpb"
	"google.golang.org/genproto/googleapis/type/date"
	"google.golang.org/genproto/googleapis/type/timeofday"
)

func transferFromAws(w io.Writer, projectID string, awsSourceBucket string, gcsSinkBucket string) (*storagetransferpb.TransferJob, error) {
	// Your Google Cloud Project ID
	// projectID := "my-project-id"

	// The name of the Aws bucket to transfer objects from
	// awsSourceBucket := "my-source-bucket"

	// The name of the GCS bucket to transfer objects to
	// gcsSinkBucket := "my-sink-bucket"

	ctx := context.Background()
	client, err := storagetransfer.NewClient(ctx)
	if err != nil {
		return nil, fmt.Errorf("storagetransfer.NewClient: %w", err)
	}
	defer client.Close()

	// A description of this job
	jobDescription := "Transfers objects from an AWS bucket to a GCS bucket"

	// The time to start the transfer
	startTime := time.Now().UTC()

	// The AWS access key credential, should be accessed via environment variable for security
	awsAccessKeyID := os.Getenv("AWS_ACCESS_KEY_ID")

	// The AWS secret key credential, should be accessed via environment variable for security
	awsSecretKey := os.Getenv("AWS_SECRET_ACCESS_KEY")

	req := &storagetransferpb.CreateTransferJobRequest{
		TransferJob: &storagetransferpb.TransferJob{
			ProjectId:   projectID,
			Description: jobDescription,
			TransferSpec: &storagetransferpb.TransferSpec{
				DataSource: &storagetransferpb.TransferSpec_AwsS3DataSource{
					AwsS3DataSource: &storagetransferpb.AwsS3Data{
						BucketName: awsSourceBucket,
						AwsAccessKey: &storagetransferpb.AwsAccessKey{
							AccessKeyId:     awsAccessKeyID,
							SecretAccessKey: awsSecretKey,
						}},
				},
				DataSink: &storagetransferpb.TransferSpec_GcsDataSink{
					GcsDataSink: &storagetransferpb.GcsData{BucketName: gcsSinkBucket}},
			},
			Schedule: &storagetransferpb.Schedule{
				ScheduleStartDate: &date.Date{
					Year:  int32(startTime.Year()),
					Month: int32(startTime.Month()),
					Day:   int32(startTime.Day()),
				},
				ScheduleEndDate: &date.Date{
					Year:  int32(startTime.Year()),
					Month: int32(startTime.Month()),
					Day:   int32(startTime.Day()),
				},
				StartTimeOfDay: &timeofday.TimeOfDay{
					Hours:   int32(startTime.Hour()),
					Minutes: int32(startTime.Minute()),
					Seconds: int32(startTime.Second()),
				},
			},
			Status: storagetransferpb.TransferJob_ENABLED,
		},
	}
	resp, err := client.CreateTransferJob(ctx, req)
	if err != nil {
		return nil, fmt.Errorf("failed to create transfer job: %w", err)
	}
	if _, err = client.RunTransferJob(ctx, &storagetransferpb.RunTransferJobRequest{
		ProjectId: projectID,
		JobName:   resp.Name,
	}); err != nil {
		return nil, fmt.Errorf("failed to run transfer job: %w", err)
	}
	fmt.Fprintf(w, "Created and ran transfer job from %v to %v with name %v", awsSourceBucket, gcsSinkBucket, resp.Name)
	return resp, nil
}

자바

이전 샘플을 찾고 계신가요? Storage Transfer Service 이전 가이드를 참조하세요.


import com.google.storagetransfer.v1.proto.StorageTransferServiceClient;
import com.google.storagetransfer.v1.proto.TransferProto.CreateTransferJobRequest;
import com.google.storagetransfer.v1.proto.TransferTypes.AwsAccessKey;
import com.google.storagetransfer.v1.proto.TransferTypes.AwsS3Data;
import com.google.storagetransfer.v1.proto.TransferTypes.GcsData;
import com.google.storagetransfer.v1.proto.TransferTypes.Schedule;
import com.google.storagetransfer.v1.proto.TransferTypes.TransferJob;
import com.google.storagetransfer.v1.proto.TransferTypes.TransferJob.Status;
import com.google.storagetransfer.v1.proto.TransferTypes.TransferSpec;
import com.google.type.Date;
import com.google.type.TimeOfDay;
import java.io.IOException;
import java.util.Calendar;

public class TransferFromAws {

  // Creates a one-off transfer job from Amazon S3 to Google Cloud Storage.
  public static void transferFromAws(
      String projectId,
      String jobDescription,
      String awsSourceBucket,
      String gcsSinkBucket,
      long startDateTime)
      throws IOException {

    // Your Google Cloud Project ID
    // String projectId = "your-project-id";

    // A short description of this job
    // String jobDescription = "Sample transfer job from S3 to GCS.";

    // The name of the source AWS bucket to transfer data from
    // String awsSourceBucket = "yourAwsSourceBucket";

    // The name of the GCS bucket to transfer data to
    // String gcsSinkBucket = "your-gcs-bucket";

    // What day and time in UTC to start the transfer, expressed as an epoch date timestamp.
    // If this is in the past relative to when the job is created, it will run the next day.
    // long startDateTime =
    //     new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse("2000-01-01 00:00:00").getTime();

    // The ID used to access your AWS account. Should be accessed via environment variable.
    String awsAccessKeyId = System.getenv("AWS_ACCESS_KEY_ID");

    // The Secret Key used to access your AWS account. Should be accessed via environment variable.
    String awsSecretAccessKey = System.getenv("AWS_SECRET_ACCESS_KEY");

    // Set up source and sink
    TransferSpec transferSpec =
        TransferSpec.newBuilder()
            .setAwsS3DataSource(
                AwsS3Data.newBuilder()
                    .setBucketName(awsSourceBucket)
                    .setAwsAccessKey(
                        AwsAccessKey.newBuilder()
                            .setAccessKeyId(awsAccessKeyId)
                            .setSecretAccessKey(awsSecretAccessKey)))
            .setGcsDataSink(GcsData.newBuilder().setBucketName(gcsSinkBucket))
            .build();

    // Parse epoch timestamp into the model classes
    Calendar startCalendar = Calendar.getInstance();
    startCalendar.setTimeInMillis(startDateTime);
    // Note that this is a Date from the model class package, not a java.util.Date
    Date startDate =
        Date.newBuilder()
            .setYear(startCalendar.get(Calendar.YEAR))
            .setMonth(startCalendar.get(Calendar.MONTH) + 1)
            .setDay(startCalendar.get(Calendar.DAY_OF_MONTH))
            .build();
    TimeOfDay startTime =
        TimeOfDay.newBuilder()
            .setHours(startCalendar.get(Calendar.HOUR_OF_DAY))
            .setMinutes(startCalendar.get(Calendar.MINUTE))
            .setSeconds(startCalendar.get(Calendar.SECOND))
            .build();
    Schedule schedule =
        Schedule.newBuilder()
            .setScheduleStartDate(startDate)
            .setScheduleEndDate(startDate)
            .setStartTimeOfDay(startTime)
            .build();

    // Set up the transfer job
    TransferJob transferJob =
        TransferJob.newBuilder()
            .setDescription(jobDescription)
            .setProjectId(projectId)
            .setTransferSpec(transferSpec)
            .setSchedule(schedule)
            .setStatus(Status.ENABLED)
            .build();

    // Create a Transfer Service client
    StorageTransferServiceClient storageTransfer = StorageTransferServiceClient.create();

    // Create the transfer job
    TransferJob response =
        storageTransfer.createTransferJob(
            CreateTransferJobRequest.newBuilder().setTransferJob(transferJob).build());

    System.out.println("Created transfer job from AWS to GCS:");
    System.out.println(response.toString());
  }
}

Node.js


// Imports the Google Cloud client library
const {
  StorageTransferServiceClient,
} = require('@google-cloud/storage-transfer');

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// The ID of the Google Cloud Platform Project that owns the job
// projectId = 'my-project-id'

// A useful description for your transfer job
// description = 'My transfer job'

// AWS S3 source bucket name
// awsSourceBucket = 'my-s3-source-bucket'

// AWS Access Key ID
// awsAccessKeyId = 'AKIA...'

// AWS Secret Access Key
// awsSecretAccessKey = 'HEAoMK2.../...ku8'

// Google Cloud Storage destination bucket name
// gcsSinkBucket = 'my-gcs-destination-bucket'

// Creates a client
const client = new StorageTransferServiceClient();

/**
 * Creates a one-time transfer job from Amazon S3 to Google Cloud Storage.
 */
async function transferFromS3() {
  // Setting the start date and the end date as the same time creates a
  // one-time transfer
  const now = new Date();
  const oneTimeSchedule = {
    day: now.getDate(),
    month: now.getMonth() + 1,
    year: now.getFullYear(),
  };

  // Runs the request and creates the job
  const [transferJob] = await client.createTransferJob({
    transferJob: {
      projectId,
      description,
      status: 'ENABLED',
      schedule: {
        scheduleStartDate: oneTimeSchedule,
        scheduleEndDate: oneTimeSchedule,
      },
      transferSpec: {
        awsS3DataSource: {
          bucketName: awsSourceBucket,
          awsAccessKey: {
            accessKeyId: awsAccessKeyId,
            secretAccessKey: awsSecretAccessKey,
          },
        },
        gcsDataSink: {
          bucketName: gcsSinkBucket,
        },
      },
    },
  });

  console.log(
    `Created and ran a transfer job from '${awsSourceBucket}' to '${gcsSinkBucket}' with name ${transferJob.name}`
  );
}

transferFromS3();

Python

이전 샘플을 찾고 계신가요? Storage Transfer Service 이전 가이드를 참조하세요.

from datetime import datetime

from google.cloud import storage_transfer


def create_one_time_aws_transfer(
    project_id: str,
    description: str,
    source_bucket: str,
    aws_access_key_id: str,
    aws_secret_access_key: str,
    sink_bucket: str,
):
    """Creates a one-time transfer job from Amazon S3 to Google Cloud
    Storage."""

    client = storage_transfer.StorageTransferServiceClient()

    # The ID of the Google Cloud Platform Project that owns the job
    # project_id = 'my-project-id'

    # A useful description for your transfer job
    # description = 'My transfer job'

    # AWS S3 source bucket name
    # source_bucket = 'my-s3-source-bucket'

    # AWS Access Key ID
    # aws_access_key_id = 'AKIA...'

    # AWS Secret Access Key
    # aws_secret_access_key = 'HEAoMK2.../...ku8'

    # Google Cloud Storage destination bucket name
    # sink_bucket = 'my-gcs-destination-bucket'

    now = datetime.utcnow()
    # Setting the start date and the end date as
    # the same time creates a one-time transfer
    one_time_schedule = {"day": now.day, "month": now.month, "year": now.year}

    transfer_job_request = storage_transfer.CreateTransferJobRequest(
        {
            "transfer_job": {
                "project_id": project_id,
                "description": description,
                "status": storage_transfer.TransferJob.Status.ENABLED,
                "schedule": {
                    "schedule_start_date": one_time_schedule,
                    "schedule_end_date": one_time_schedule,
                },
                "transfer_spec": {
                    "aws_s3_data_source": {
                        "bucket_name": source_bucket,
                        "aws_access_key": {
                            "access_key_id": aws_access_key_id,
                            "secret_access_key": aws_secret_access_key,
                        },
                    },
                    "gcs_data_sink": {
                        "bucket_name": sink_bucket,
                    },
                },
            }
        }
    )

    result = client.create_transfer_job(transfer_job_request)
    print(f"Created transferJob: {result.name}")