Migrasi mudah dari Amazon S3 ke Cloud Storage

Halaman ini menjelaskan cara menyelesaikan migrasi sederhana dari Amazon Simple Storage Service (Amazon S3) ke Cloud Storage. Dalam migrasi sederhana, Anda menggunakan alat dan library yang sudah ada untuk menghasilkan permintaan REST yang diautentikasi ke Amazon S3 untuk mengirim permintaan yang diautentikasi ke Cloud Storage.

Jika Anda baru menggunakan Cloud Storage dan tidak akan menggunakan API secara langsung, pertimbangkan untuk menggunakan Konsol Google Cloud untuk menyiapkan dan mengelola transfer. Konsol Google Cloud menyediakan antarmuka grafis ke Cloud Storage yang memungkinkan Anda menyelesaikan banyak tugas penyimpanan hanya dengan menggunakan browser, termasuk migrasi data dari Amazon S3 ke Cloud Storage.

Jika Anda ingin Cloud Storage menyimpan cadangan data Amazon S3, sebaiknya gunakan transfer berbasis peristiwa, yang menggunakan Notifikasi Peristiwa Amazon S3 untuk otomatis menjaga agar bucket Cloud Storage tetap sinkron dengan sumber Amazon S3 Anda.

Bermigrasi dari Amazon S3 ke Cloud Storage dalam skenario migrasi yang sederhana

Untuk membuat permintaan ke Cloud Storage, Anda perlu menyelesaikan langkah-langkah berikut:

  • Gunakan header x-amz-project-id saat membuat permintaan untuk membuat dan mencantumkan bucket.
  • Dapatkan kunci HMAC (message authentication code berbasis hash).
  • Di alat atau library yang sudah ada, lakukan perubahan berikut:

    • Ubah endpoint permintaan untuk menggunakan endpoint permintaan XML API Cloud Storage.
    • Ganti akses dan kunci rahasia Amazon Web Services (AWS) dengan ID akses dan rahasia Cloud Storage yang sesuai (secara kolektif disebut kunci HMAC Cloud Storage).
    • Pastikan header x-amz- Anda menggunakan nilai Cloud Storage yang didukung. Misalnya, x-amz-storage-class harus menggunakan salah satu kelas penyimpanan Cloud Storage yang tersedia.

      Saat Anda menggunakan Cloud Storage XML API dalam skenario migrasi sederhana, menentukan ID tanda tangan AWS di header Authorization akan memberi tahu Cloud Storage tentang header x-amz-* dan Sintaksis XML Amazon S3 ACL dalam permintaan Anda. Cloud Storage memproses header x-amz-* yang memiliki x-goog-* padanan, seperti yang tercantum dalam tabel header.

  • Setelah melakukan perubahan ini, Anda dapat mulai menggunakan alat dan library yang ada untuk mengirim permintaan HMAC ke Cloud Storage.

    Misalnya, contoh berikut menunjukkan cara mencantumkan bucket Cloud Storage dengan menggunakan Amazon S3 SDK:

    Go

    Untuk mengetahui informasi selengkapnya, lihat Dokumentasi referensi Cloud Storage Go API.

    Untuk melakukan autentikasi ke Cloud Storage, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

    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

    Untuk mengetahui informasi selengkapnya, lihatDokumentasi referensi Cloud Storage Java API.

    Untuk melakukan autentikasi ke Cloud Storage, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

    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

    Untuk mengetahui informasi selengkapnya, lihatDokumentasi referensi Cloud Storage Python API.

    Untuk melakukan autentikasi ke Cloud Storage, siapkan Kredensial Default Aplikasi. Untuk mengetahui informasi selengkapnya, baca Menyiapkan autentikasi untuk lingkungan pengembangan lokal.

    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
    
    

    Menentukan header project

    Pada permintaan yang mengharuskan Anda menentukan project, gunakan header x-amz-project-id.

    Perlu diperhatikan bahwa Amazon S3 tidak memiliki project. Jadi, bergantung pada alat atau library klien yang Anda gunakan, menentukan header x-amz-project-id mungkin bukan opsi yang tersedia.

    Menggunakan kunci HMAC

    Untuk menggunakan Cloud Storage XML API dalam skenario migrasi sederhana, gunakan kunci message authentication code (HMAC) berbasis hash Cloud Storage untuk kredensial. Biasanya, Anda harus membuat kunci HMAC yang dikaitkan dengan akun layanan; namun, Anda dapat menggunakan akun yang terkait dengan akun pengguna.

    Mengautentikasi dalam skenario migrasi sederhana

    Menggunakan header Otorisasi

    Untuk operasi dalam skenario migrasi sederhana yang memerlukan autentikasi, sertakan header permintaan Authorization seperti yang Anda lakukan untuk permintaan ke Amazon S3. Sintaksis header Authorization untuk permintaan Amazon S3 adalah:

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

    Dalam skenario migrasi sederhana, Anda hanya mengubah header untuk menggunakan ID akses HMAC Cloud Storage dan memastikan Signature yang Anda pasang dihitung dengan kunci rahasia HMAC Cloud Storage:

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

    Bagian-bagian dari header Authorization adalah:

    • ALGORITHM: Algoritma dan versi tanda tangan yang Anda gunakan. Menggunakan AWS4-HMAC-SHA256 menunjukkan bahwa Anda menggunakan tanda tangan HMAC V4 dan Anda ingin mengirim header x-amz-*. Anda juga dapat menggunakan GOOG4-HMAC-SHA256, yang menunjukkan bahwa Anda menggunakan tanda tangan HMAC V4 dan ingin mengirim header x-goog-*.

    • GOOG-ACCESS-ID: ID akses mengidentifikasi entitas yang membuat dan menandatangani permintaan. Dalam migrasi sederhana, ganti ID kunci akses Amazon Web Service (AWS) yang Anda gunakan untuk mengakses Amazon S3 dengan ID akses HMAC Cloud Storage. ID akses HMAC Cloud Storage Anda diawali dengan GOOG.

    • CREDENTIAL_SCOPE: Cakupan kredensial, seperti yang didefinisikan dalam tanda tangan. Dalam migrasi sederhana, Anda tidak perlu mengubah cakupan kredensial jika menggunakan AWS4-HMAC-SHA256 untuk nilai ALGORITHM.

    • SIGNED_HEADERS: Daftar nama header yang dipisahkan titik koma yang harus disertakan untuk menandatangani permintaan ini. Semua header harus dalam huruf kecil dan diurutkan berdasarkan kode karakter.

      Contoh string header bertanda tangan gaya Amazon S3 terlihat seperti ini:

      content-type;host;x-amz-date

      Dalam migrasi sederhana, Anda tidak perlu membuat perubahan apa pun pada string header yang ditandatangani.

    • SIGNATURE: Tanda tangan yang memungkinkan permintaan diautentikasi. Dalam migrasi sederhana, ganti informasi kunci akses AWS dengan informasi kunci HMAC Cloud Storage yang setara.

    Contoh permintaan autentikasi

    Contoh berikut mengupload objek bernama /europe/france/paris.jpg ke bucket bernama my-travel-maps, menerapkan ACL public-read yang telah ditetapkan, dan menentukan header metadata kustom untuk peninjau. Berikut adalah permintaan ke bucket di 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
    

    Berikut adalah permintaan untuk bucket di 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
    

    Berikut adalah permintaan kanonis terkait yang dibuat untuk permintaan ini:

    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
    

    Berikut adalah string-to-sign yang sesuai dan telah dibuat untuk permintaan ini:

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

    Permintaan ini tidak menyediakan header Content-MD5, sehingga string kosong ditampilkan di baris kedua pesan.

    Kontrol akses dalam skenario migrasi sederhana

    Untuk mendukung migrasi sederhana, Cloud Storage menerima ACL yang dihasilkan oleh Amazon S3. Dalam skenario migrasi sederhana, Anda menggunakan AWS sebagai ID tanda tangan, yang memberi tahu Cloud Storage untuk mengharapkan sintaksis ACL menggunakan sintaksis XML Amazon S3 ACL. Anda harus memastikan bahwa Amazon S3 ACL yang Anda gunakan dipetakan ke model ACL Cloud Storage. Misalnya, jika alat dan library Anda menggunakan sintaksis ACL Amazon S3 untuk memberikan izin WRITE bucket, alat dan library tersebut juga harus memberikan izin READ bucket karena izin Cloud Storage adalah konsentris. Anda tidak perlu menentukan izin WRITE dan READ saat memberikan izin WRITE menggunakan sintaksis Cloud Storage.

    Cloud Storage mendukung sintaksis Amazon S3 ACL dalam skenario berikut:

    • Dalam permintaan ke Cloud Storage untuk mengambil ACL (misalnya, permintaan Objek GET atau Bucket GET), Cloud Storage akan menampilkan sintaksis ACL Amazon S3.
    • Dalam permintaan ke Cloud Storage untuk menerapkan ACL (misalnya, permintaan Objek PUT atau Bucket PUT), Cloud Storage akan menerima sintaksis Amazon S3 ACL.

    Header Authorization dalam skenario migrasi sederhana menggunakan AWS untuk ID tanda tangan, tetapi dengan ID akses Google Anda.

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

    Contoh berikut menunjukkan permintaan GET ke Cloud Storage untuk menampilkan ACL untuk suatu objek.

    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
    

    Respons terhadap permintaan tersebut mencakup ACL yang menggunakan sintaksis Amazon S3 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>
    

    Contoh berikut menunjukkan permintaan PUT ke Cloud Storage untuk menetapkan ACL untuk suatu objek. Contoh ini menunjukkan isi permintaan dengan sintaksis ACL Amazon S3.

    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>
    

    Terakhir, dalam skenario migrasi sederhana, Anda juga dapat menggunakan ID tanda tangan GOOG1 di header Authorization. Dalam hal ini, Anda harus menggunakan sintaksis ACL Cloud Storage dan memastikan bahwa semua header x-amz-* diubah menjadi x-goog-*. Meskipun memungkinkan, sebaiknya Anda memilih migrasi penuh untuk menggunakan semua manfaat Cloud Storage.

    Dukungan untuk kompatibilitas XML API dengan Amazon S3

    Untuk diskusi tentang interoperabilitas API XML, lihat Stack Overflow menggunakan tag google-cloud-storage.

    Langkah selanjutnya