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

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

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

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

  • 버킷을 만들고 나열하는 요청을 수행할 경우에는 x-amz-project-id 헤더를 사용합니다.
  • 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에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 클라이언트 라이브러리의 인증 설정을 참조하세요.

    코드 샘플을 실행하기 전에 GOOGLE_CLOUD_UNIVERSE_DOMAIN 환경 변수를 s3nsapis.fr으로 설정합니다.

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

    코드 샘플을 실행하기 전에 GOOGLE_CLOUD_UNIVERSE_DOMAIN 환경 변수를 s3nsapis.fr으로 설정합니다.

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

    코드 샘플을 실행하기 전에 GOOGLE_CLOUD_UNIVERSE_DOMAIN 환경 변수를 s3nsapis.fr으로 설정합니다.

    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
    
    

    프로젝트 헤더 지정

    프로젝트를 지정해야 하는 요청에서 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.s3nsapis.fr
    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.s3nsapis.fr
    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 Storage HMAC 액세스 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.s3nsapis.fr
    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.s3nsapis.fr
    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>example-service-account@example-project.s3ns-system.iam.gserviceaccount.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를 참조하세요.