Amazon S3에서 Cloud Storage로 단순 마이그레이션

이 페이지에서는 Amazon Simple Storage Service(Amazon S3)에서 Cloud Storage로 단순 마이그레이션을 완료하는 방법을 설명합니다. 단순 마이그레이션에서는 기존 도구와 라이브러리를 사용하여 Amazon S3에 대한 인증된 REST 요청을 생성하여 인증된 요청을 대신 Cloud Storage에 전송합니다.

Cloud Storage를 처음 사용하며 API를 직접 사용하지 않는 경우 전송 설정 및 관리에 Google Cloud 콘솔을 사용하는 것이 좋습니다. Google Cloud 콘솔은 Amazon S3에서 Cloud Storage로 데이터를 마이그레이션하는 등 브라우저를 사용하여 많은 스토리지 작업을 수행할 수 있는 그래픽 인터페이스를 Cloud Storage에 제공합니다.

Cloud Storage로 Amazon S3 데이터 백업을 저장하려면 이벤트 기반 전송을 사용합니다. 이렇게 하면 Amazon S3 이벤트 알림을 사용하여 Cloud Storage 버킷을 자동으로 Amazon S3 소스와 동기화된 상태로 유지합니다.

단순 마이그레이션 시나리오에서 Amazon S3에서 Cloud Storage로 마이그레이션

Cloud Storage에 요청을 전송하려면 다음 단계를 완료해야 합니다.

  • 기본 Google Cloud 프로젝트를 설정합니다.
  • HMAC(해시 기반 메시지 인증 코드) 키를 가져옵니다.
  • 기존 도구나 라이브러리에서 다음과 같이 변경합니다.

    • Cloud Storage XML API 요청 엔드포인트를 사용하도록 요청 엔드포인트를 변경합니다.
    • Amazon Web Services(AWS) 액세스 및 보안 비밀 키를 해당 Cloud Storage 액세스 ID 및 보안 비밀 키(통칭하여 Cloud Storage HMAC 키)로 바꿉니다.
    • x-amz- 헤더에 지원되는 Cloud Storage 값을 사용합니다. 예를 들어 x-amz-storage-class는 지원되는 Cloud Storage의 스토리지 클래스 중 하나를 사용해야 합니다.

      단순 마이그레이션 시나리오에서 Cloud Storage XML API를 사용할 경우 Authorization 헤더에 AWS 서명 식별자를 지정하여 요청에 x-amz-* 헤더와 Amazon S3 ACL XML 구문이 포함된다고 Cloud Storage에 알릴 수 있습니다. Cloud Storage는 헤더 표에 나열된 x-goog-*와 같은 x-amz-*를 갖는 헤더를 처리하고 x-amz-decoded-content-length 헤더를 처리합니다.

변경한 후에 기존 도구와 라이브러리를 사용하여 HMAC 요청을 Cloud Storage에 보낼 수 있습니다.

예를 들어 다음은 Amazon S3 SDK를 사용하여 Cloud Storage 버킷을 나열하는 방법을 보여주는 샘플입니다.

Go

자세한 내용은 Cloud Storage Go API 참고 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

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

	"github.com/aws/aws-sdk-go/aws"
	"github.com/aws/aws-sdk-go/aws/credentials"
	"github.com/aws/aws-sdk-go/aws/session"
	"github.com/aws/aws-sdk-go/service/s3"
)

func listGCSBuckets(w io.Writer, googleAccessKeyID string, googleAccessKeySecret string) error {
	// googleAccessKeyID := "Your Google Access Key ID"
	// googleAccessKeySecret := "Your Google Access Key Secret"

	// Create a new client and do the following:
	// 1. Change the endpoint URL to use the Google Cloud Storage XML API endpoint.
	// 2. Use Cloud Storage HMAC Credentials.
	sess := session.Must(session.NewSession(&aws.Config{
		Region:      aws.String("auto"),
		Endpoint:    aws.String("https://storage.googleapis.com"),
		Credentials: credentials.NewStaticCredentials(googleAccessKeyID, googleAccessKeySecret, ""),
	}))

	client := s3.New(sess)
	ctx := context.Background()

	ctx, cancel := context.WithTimeout(ctx, time.Second*10)
	defer cancel()
	result, err := client.ListBucketsWithContext(ctx, &s3.ListBucketsInput{})
	if err != nil {
		return fmt.Errorf("ListBucketsWithContext: %w", err)
	}

	fmt.Fprintf(w, "Buckets:")
	for _, b := range result.Buckets {
		fmt.Fprintf(w, "%s\n", aws.StringValue(b.Name))
	}

	return nil
}

Java

자세한 내용은 Cloud Storage Java API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.client.builder.AwsClientBuilder;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.Bucket;
import java.util.List;

public class ListGcsBuckets {
  public static void listGcsBuckets(String googleAccessKeyId, String googleAccessKeySecret) {

    // String googleAccessKeyId = "your-google-access-key-id";
    // String googleAccessKeySecret = "your-google-access-key-secret";

    // Create a BasicAWSCredentials using Cloud Storage HMAC credentials.
    BasicAWSCredentials googleCreds =
        new BasicAWSCredentials(googleAccessKeyId, googleAccessKeySecret);

    // Create a new client and do the following:
    // 1. Change the endpoint URL to use the Google Cloud Storage XML API endpoint.
    // 2. Use Cloud Storage HMAC Credentials.
    AmazonS3 interopClient =
        AmazonS3ClientBuilder.standard()
            .withEndpointConfiguration(
                new AwsClientBuilder.EndpointConfiguration(
                    "https://storage.googleapis.com", "auto"))
            .withCredentials(new AWSStaticCredentialsProvider(googleCreds))
            .build();

    // Call GCS to list current buckets
    List<Bucket> buckets = interopClient.listBuckets();

    // Print bucket names
    System.out.println("Buckets:");
    for (Bucket bucket : buckets) {
      System.out.println(bucket.getName());
    }

    // Explicitly clean up client resources.
    interopClient.shutdown();
  }

Python

자세한 내용은 Cloud Storage Python API 참조 문서를 확인하세요.

Cloud Storage에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

import boto3  # type: ignore


def list_gcs_buckets(
    google_access_key_id: str, google_access_key_secret: str
) -> List[str]:
    """Lists all Cloud Storage buckets using AWS SDK for Python (boto3)
    Positional arguments:
        google_access_key_id: hash-based message authentication code (HMAC) access ID
        google_access_key_secret: HMAC access secret

    Returned value is a list of strings, one for each bucket name.

    To use this sample:
    1. Create a Cloud Storage HMAC key: https://cloud.google.com/storage/docs/authentication/managing-hmackeys#create
    2. Change endpoint_url to a Google Cloud Storage XML API endpoint.

    To learn more about HMAC: https://cloud.google.com/storage/docs/authentication/hmackeys#overview
    """
    client = boto3.client(
        "s3",
        region_name="auto",
        endpoint_url="https://storage.googleapis.com",
        aws_access_key_id=google_access_key_id,
        aws_secret_access_key=google_access_key_secret,
    )

    # Call GCS to list current buckets
    response = client.list_buckets()

    # Return list of bucket names
    results = []
    for bucket in response["Buckets"]:
        results.append(bucket["Name"])
        print(bucket["Name"])  # Can remove if not needed after development
    return results

기본 프로젝트 설정

단순 마이그레이션 시나리오에서 Cloud Storage를 사용하려면 Cloud Storage에서 GET 서비스 또는 PUT 버킷과 같은 특정 작업을 수행하는 데 사용하는 기본 프로젝트를 설정하는 것이 좋습니다. 기본 프로젝트를 설정하지 않으면 일부 요청에서 프로젝트 헤더를 지정해야 합니다.

기본 프로젝트를 설정하려면 다음 단계를 따르세요.

  1. Google Cloud Console에서 Cloud Storage 설정 페이지를 엽니다.
  2. 상호 운용성 탭을 선택합니다.
  3. 상호 운용이 가능한 액세스용 기본 프로젝트 섹션에 있는 기본 프로젝트로 PROJECT-ID 설정을 클릭합니다.

    프로젝트가 이미 기본 프로젝트이면 상호 운용이 가능한 액세스를 위한 기본 프로젝트는 PROJECT-ID입니다라는 메시지가 표시됩니다.

이 프로젝트가 이제 기본 프로젝트입니다. 다른 프로젝트를 선택하고 이러한 단계에 따라 언제든지 기본 프로젝트를 변경할 수 있습니다.

대안으로 프로젝트 헤더 지정

기본 프로젝트를 설정하는 대신, 또는 그와는 별도로 프로젝트를 지정해야 하는 개별 요청에서 x-amz-project-id 헤더를 사용할 수 있습니다.

  • x-amz-project-id를 사용하는 요청에서는 기존 기본 프로젝트가 있더라도 헤더에 지정된 프로젝트를 사용합니다.

x-amz-project-id 헤더는 다음과 같은 경우에 유용합니다.

  • 여러 프로젝트로 작업 중입니다.
  • 서비스 계정이 상위 프로젝트를 기본 프로젝트로 사용하기 때문에 다른 프로젝트와 연결된 서비스 계정으로 요청을 실행합니다.

Amazon S3에는 프로젝트가 없으므로 사용하는 도구 또는 클라이언트 라이브러리에 따라서는 x-amz-project-id 헤더를 지정하지 못할 수도 있습니다. 이 경우에는 기본 프로젝트를 설정해야 합니다.

HMAC 키 사용

단순 마이그레이션 시나리오에서 Cloud Storage XML API를 사용하려면 사용자 인증 정보에 Cloud Storage 해시 기반 메시지 인증 코드(HMAC) 키를 사용합니다. 일반적으로 서비스 계정과 연결된 HMAC 키를 만들어야 하지만 대안으로 사용자 계정과 연결된 키를 사용할 수도 있습니다.

단순 마이그레이션 시나리오에서 인증

Authorization 헤더 사용

인증이 필요한 단순 마이그레이션 시나리오 작업의 경우 Amazon S3에 대한 요청과 마찬가지로 Authorization 요청 헤더를 포함합니다. Amazon S3 요청의 Authorization 헤더 문법은 다음과 같습니다.

Authorization: AWS4-HMAC-SHA256 Credential=AWS-ACCESS-KEY/CREDENTIAL_SCOPE, SignedHeaders=SIGNED_HEADERS, Signature=SIGNATURE

단순 마이그레이션 시나리오에서는 Cloud Storage HMAC 액세스 ID를 사용하도록 헤더만 변경하여 연결된 Signature가 Cloud Storage HMAC 보안 비밀 키로 계산되도록 합니다.

Authorization: ALGORITHM Credential=GOOG-ACCESS-ID/CREDENTIAL_SCOPE, SignedHeaders=SIGNED_HEADERS, Signature=SIGNATURE

Authorization 헤더 부분은 다음과 같습니다.

  • ALGORITHM: 사용하고 있는 서명 알고리즘 및 버전입니다. AWS4-HMAC-SHA256을 사용하면 현재 HMAC V4 서명을 사용하고 있으며 x-amz-* 헤더를 보내려고 함을 나타냅니다. 또한 GOOG4-HMAC-SHA256을 사용하면 현재 HMAC V4 서명을 사용하고 있으며 x-goog-* 헤더를 보내려고 함을 나타낼 수 있고, GOOG4-RSA-SHA256을 사용하면 RSA V4 서명을 사용하고 있으며 x-goog-* 헤더를 보내려고 함을 나타낼 수 있습니다.

  • GOOG-ACCESS-ID: 액세스 ID는 요청을 실행하고 서명하는 항목을 식별합니다. 단순 마이그레이션에서는 Amazon S3에 액세스하는 데 사용하는 Amazon Web Service(AWS) 액세스 키 ID를 Cloud Storage HMAC 액세스 ID로 바꿉니다. Cloud Storage HMAC 액세스 ID는 GOOG로 시작합니다.

  • CREDENTIAL_SCOPE: 서명에 정의된 사용자 인증 정보 범위입니다. 단순 마이그레이션에서는 ALGORITHM 값에 AWS4-HMAC-SHA256을 사용하는 경우 사용자 인증 정보 범위를 변경할 필요가 없습니다.

  • SIGNED_HEADERS: 요청에 서명하기 위해 포함되어야 하는 헤더 이름의 세미콜론 구분 목록입니다. 모든 헤더는 소문자여야 하고 문자 코드를 기준으로 정렬되어야 합니다.

    Amazon S3 형식의 서명된 헤더 문자열의 예시는 다음과 같습니다.

    content-type;host;x-amz-date

    단순 이전에서는 서명된 헤더 문자열을 변경할 필요가 없습니다.

  • SIGNATURE: 요청을 인증할 수 있는 서명입니다. 단순 마이그레이션에서는 AWS 액세스 키 정보를 이에 상응하는 Cloud Storage HMAC 키 정보로 바꿉니다.

샘플 인증 요청

다음 예시에서는 /europe/france/paris.jpg라는 객체를 my-travel-maps라는 버킷에 업로드하고 미리 정의된 ACL public-read를 적용하며 검토자용 커스텀 메타데이터 헤더를 정의합니다. 다음은 Amazon S3의 버킷에 대한 요청입니다.

PUT europe/france/paris.jpg HTTP/1.1
Host: my-travel-maps.s3.amazonaws.com
Date: Mon, 11 Mar 2019 23:46:19 GMT
Content-Length: 888814
Content-Type: image/jpg
x-amz-acl: public-read
x-amz-date:20190311T192918Z
x-amz-meta-reviewer: joe,jane
Authorization: AWS4-HMAC-SHA256 Credential=AWS-ACCESS-KEY/20190311/us-east-1/s3/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-acl;x-amz-date;x-amz-meta-reviewer, Signature=SIGNATURE

다음은 Cloud Storage의 버킷에 대한 요청입니다.

PUT europe/france/paris.jpg HTTP/1.1
Host: my-travel-maps.storage.googleapis.com
Date: Mon, 11 Mar 2019 23:46:19 GMT
Content-Length: 888814
Content-Type: image/jpg
x-amz-acl: public-read
x-amz-date:20190311T192918Z
x-amz-meta-reviewer: joe,jane
Authorization: AWS4-HMAC-SHA256 Credential=GOOG-ACCESS-ID/20190311/us-east-1/s3/aws4_request, SignedHeaders=content-length;content-type;host;x-amz-acl;x-amz-date;x-amz-meta-reviewer, Signature=SIGNATURE

다음은 이 요청에 생성된 해당 정규 요청입니다.

PUT
/europe/france/paris.jpg

content-length:888814
content-type:image/jpg
host:my-travel-maps.storage.googleapis.com
x-amz-acl:public-read
x-amz-date:20190311T192918Z
x-amz-meta-reviewer:joe,jane

content-length,content-type,host,x-amz-acl,x-amz-date,x-amz-meta-reviewer
82e3da8b3f35989512e8d428add7eca73ab0e5f36586e66fbad8e1051343cbd2

다음은 이 요청에 생성된 해당 서명할 문자열입니다.

AWS4-HMAC-SHA256
20190311T192918Z
20190311/us-east-1/s3/aws4_request
73918a5ff373d7a03e406fbf9ea35675396b06fca2af76c27a5c451fa783ef65

이 요청은 Content-MD5 헤더를 제공하지 않으므로 메시지의 두 번째 줄에 빈 문자열이 표시됩니다.

단순 마이그레이션 시나리오에서 액세스 제어

단순 마이그레이션을 지원하기 위해 Cloud Storage는 Amazon S3에서 생성된 ACL을 허용합니다. 단순 마이그레이션 시나리오에서는 서명 식별자로 AWS를 사용하여, Amazon S3 ACL XML 문법을 사용하는 ACL 문법을 예상할 것을 Cloud Storage에 알립니다. 사용하는 Amazon S3 ACL이 Cloud Storage ACL 모델에 매핑되는지 확인해야 합니다. 예를 들어 도구와 라이브러리에서 Amazon S3의 ACL 문법을 사용하여 버킷에 WRITE 권한을 부여하는 경우 버킷에도 READ 권한을 부여해야 합니다. 이는 Cloud Storage 권한이 공통적이기 때문입니다. Cloud Storage 문법을 사용하여 WRITE 권한을 부여할 때 WRITE 권한과 READ 권한을 모두 지정할 필요는 없습니다.

Cloud Storage는 다음 시나리오에서 Amazon S3 ACL 문법을 지원합니다.

  • GET 객체 또는 GET 버킷 요청과 같이 ACL 검색을 위한 Cloud Storage 요청에서 Cloud Storage는 Amazon S3 ACL 문법을 반환합니다.
  • PUT 객체 또는 PUT 버킷 요청과 같이 ACL 적용을 위한 Cloud Storage 요청에서 Cloud Storage는 Amazon S3 ACL 문법을 받을 것으로 예상합니다.

단순 마이그레이션 시나리오의 Authorization 헤더는 Google 액세스 ID로 서명 식별자에 AWS를 사용합니다.

Authorization: AWS4-HMAC-SHA256 Credential=GOOG-ACCESS-ID/CREDENTIAL_SCOPE, SignedHeaders=SIGNED_HEADERS, Signature=SIGNATURE

다음 예시에서는 객체의 ACL 반환을 위한 Cloud Storage에 대한 GET 요청을 보여줍니다.

GET europe/france/paris.jpg?acl HTTP/1.1
Host: my-travel-maps.storage.googleapis.com
Date: Thu, 21 Feb 2019 23:50:10 GMT
Content-Type: application/xml
X-Amz-Date: 20190221T235010Z
Authorization: AWS4-HMAC-SHA256 Credential=GOOGMC5PDPA5JLZYQMHQHRAX/20190221/region/s3/aws4_request, SignedHeaders=host;x-amz-date, Signature=29088b1d6dfeb2549f6ff67bc3744abb7e45475f0ad60400485805415bbfc534

이 요청의 응답에는 Amazon S3 ACL 문법을 사용하는 ACL이 포함됩니다.

<?xml version='1.0' encoding='UTF-8'?>
<AccessControlPolicy>
    <Owner>
        <ID>00b4903a972faa8bcce9382686e9129676f1cd6e5def1f5663affc2ba4652490
        </ID>
        <DisplayName>OwnerName</DisplayName>
    </Owner>
    <AccessControlList>
        <Grant>
            <Grantee xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance'
                xsi:type='CanonicalUser'>
                <ID>00b4903a972faa8bcce9382686e9129676f1cd6e5def1f5663affc2ba4652490</ID>
                <DisplayName>UserName</DisplayName>
            </Grantee>
            <Permission>FULL_CONTROL</Permission>
        </Grant>
    </AccessControlList>
</AccessControlPolicy>

다음 예시에서는 객체의 ACL 설정을 위한 Cloud Storage에 대한 PUT 요청을 보여줍니다. 또한 Amazon S3 ACL 문법을 포함한 요청 본문을 보여줍니다.

PUT europe/france/paris.jpg?acl HTTP/1.1
Host: my-travel-maps.storage.googleapis.com
Date: Thu, 21 Feb 2019 23:50:10 GMT
Content-Type: application/xml
Content-Length: 337
X-Amz-Date: 20190221T235010Z
Authorization: AWS4-HMAC-SHA256 Credential=GOOGMC5PDPA5JLZYQMHQHRAX/20190221/region/s3/aws4_request, SignedHeaders=host;x-amz-date, Signature=29088b1d6dfeb2549f6ff67bc3744abb7e45475f0ad60400485805415bbfc534

<?xml version='1.0' encoding='utf-8'?>
<AccessControlPolicy>
  <AccessControlList>
    <Grant>
      <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="AmazonCustomerByEmail">
        <EmailAddress>jane@gmail.com</EmailAddress>
      </Grantee>
      <Permission>FULL_CONTROL</Permission>
    </Grant>
  </AccessControlList>
</AccessControlPolicy>

마지막으로 단순 마이그레이션 시나리오에서는 Authorization 헤더에 GOOG1 서명 식별자를 사용할 수도 있습니다. 이 경우 Cloud Storage ACL 문법을 사용하고 모든 x-amz-* 헤더가 x-goog-*로 변경되는지 확인해야 합니다. 가능하면 Cloud Storage의 모든 이점을 사용할 수 있도록 전체 마이그레이션을 선택하는 것이 좋습니다.

Amazon S3와의 XML API 호환성 지원

XML API 상호 운용성에 대한 토론은 google-cloud-storage 태그를 사용하는 Stack Overflow를 참조하세요.

다음 단계