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:

  • Tetapkan project Google Cloud default.
  • 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, dan memproses header x-amz-decoded-content-length.

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 informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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 informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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 informasi selengkapnya, lihat Menyiapkan autentikasi untuk library klien.

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

Menetapkan project default

Untuk menggunakan Cloud Storage dalam skenario migrasi sederhana, sebaiknya Anda menetapkan project default, yang digunakan Cloud Storage untuk melakukan operasi tertentu, seperti layanan GET atau bucket PUT. Jika tidak menetapkan project default, Anda harus menentukan header project dalam permintaan tertentu.

Untuk menetapkan project default:

  1. Buka halaman Setelan Cloud Storage di Konsol Google Cloud.
  2. Pilih tab Interoperabilitas.
  3. Klik Set PROJECT-ID as default project yang terletak di bagian Project default untuk akses interoperabilitas.

    Jika project sudah menjadi project default, Anda akan melihat PROJECT-ID adalah project default untuk akses interoperabilitas.

Project ini sekarang menjadi project default Anda. Anda dapat mengubah project default kapan saja dengan memilih project lain dan mengikuti langkah-langkah berikut.

Atau, menentukan header project

Sebagai ganti atau selain menyetel project default, Anda dapat menggunakan header x-amz-project-id dalam setiap permintaan yang mengharuskan Anda menentukan project.

  • Permintaan yang menggunakan x-amz-project-id menggunakan project yang ditentukan dalam header, meskipun sudah ada project default.

Header x-amz-project-id berguna saat:

  • Anda bekerja dengan beberapa project.
  • Permintaan Anda dibuat oleh akun layanan yang terkait dengan project lain, karena akun layanan menggunakan project induknya sebagai project default.

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 dapat Anda pilih. Dalam hal ini, Anda harus menetapkan project default.

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 dilampirkan 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-*, atau GOOG4-RSA-SHA256, yang menunjukkan bahwa Anda menggunakan tanda tangan RSA 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 dimulai 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-* Anda 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 berikutnya