Uji dan bagikan pengetahuan Anda kepada komunitas kami.
done
Dapatkan akses ke lebih dari 700 lab praktik, badge keahlian, dan kursus

Mengembangkan REST API dengan Go dan Cloud Run

Lab 1 jam universal_currency_alt 5 Kredit show_chart Menengah
info Lab ini mungkin menggabungkan alat AI untuk mendukung pembelajaran Anda.
Uji dan bagikan pengetahuan Anda kepada komunitas kami.
done
Dapatkan akses ke lebih dari 700 lab praktik, badge keahlian, dan kursus

GSP761

Lab Mandiri Google Cloud

Logo Pet Theory

Ringkasan

Untuk lab dalam kursus Serverless Cloud Run Development, Anda akan membaca skenario bisnis fiktif dan membantu para karakter menerapkan rencana migrasi serverless mereka.

Dua belas tahun lalu, Lily memulai jaringan klinik hewan Pet Theory. Seiring pertumbuhan jaringan klinik tersebut, Lily lebih banyak menghabiskan waktunya untuk berbincang di telepon dengan perusahaan asuransi daripada merawat hewan peliharaan. Ia berharap perusahaan asuransi bisa melihat total biaya perawatan secara online.

Dalam lab sebelumnya pada seri ini, Ruby, konsultan komputer, dan Patrick, DevOps Engineer, memindahkan database pelanggan Pet Theory ke database Firestore serverless di cloud, lalu membuka akses bagi pelanggan sehingga mereka dapat membuat janji temu secara online. Karena Pet Theory hanya memiliki satu staf operasional yang menangani bermacam tugas, mereka membutuhkan solusi serverless yang tidak perlu banyak pemeliharaan berkelanjutan.

Dalam lab ini, Anda akan membantu Ruby dan Patrick memberi perusahaan asuransi akses ke data pelanggan tanpa mengekspos Informasi Identitas Pribadi (PII). Anda akan membangun gateway Representational State Transfer (REST) API yang aman menggunakan Cloud Run, yang bersifat serverless. Dengan begitu, perusahaan asuransi akan dapat melihat total biaya perawatan tanpa melihat PII pelanggan.

Tujuan

Dalam lab ini, Anda akan:

  • Mengembangkan REST API dengan Go
  • Mengimpor data uji coba pelanggan ke Firestore
  • Menghubungkan REST API ke database Firestore
  • Men-deploy REST API ke Cloud Run

Prasyarat

Ini adalah lab tingkat menengah. Anda dianggap sudah familier dengan Konsol Cloud dan lingkungan Cloud Shell. Lab ini adalah bagian dari sebuah seri. Pengalaman dari lab sebelumnya seperti yang berikut akan bermanfaat, tetapi tidak wajib:

  • Mengimpor Data ke Database Serverless
  • Membangun Aplikasi Web Serverless dengan Firebase dan Firestore
  • Membangun Aplikasi Serverless yang Membuat File PDF

Penyiapan dan persyaratan

Sebelum mengklik tombol Mulai Lab

Baca petunjuk ini. Lab memiliki timer dan Anda tidak dapat menjedanya. Timer, yang dimulai saat Anda mengklik Start Lab, akan menampilkan durasi ketersediaan resource Google Cloud untuk Anda.

Lab praktik ini dapat Anda gunakan untuk melakukan sendiri aktivitas lab di lingkungan cloud sungguhan, bukan di lingkungan demo atau simulasi. Untuk mengakses lab ini, Anda akan diberi kredensial baru yang bersifat sementara dan dapat digunakan untuk login serta mengakses Google Cloud selama durasi lab.

Untuk menyelesaikan lab ini, Anda memerlukan:

  • Akses ke browser internet standar (disarankan browser Chrome).
Catatan: Gunakan jendela Samaran atau browser pribadi untuk menjalankan lab ini. Hal ini akan mencegah konflik antara akun pribadi Anda dan akun Siswa yang dapat menyebabkan tagihan ekstra pada akun pribadi Anda.
  • Waktu untuk menyelesaikan lab. Ingat, setelah dimulai, lab tidak dapat dijeda.
Catatan: Jika Anda sudah memiliki project atau akun pribadi Google Cloud, jangan menggunakannya untuk lab ini agar terhindar dari tagihan ekstra pada akun Anda.

Cara memulai lab dan login ke Google Cloud Console

  1. Klik tombol Start Lab. Jika Anda perlu membayar lab, jendela pop-up akan terbuka untuk memilih metode pembayaran. Di sebelah kiri adalah panel Lab Details dengan info berikut:

    • Tombol Open Google Cloud console
    • Waktu tersisa
    • Kredensial sementara yang harus Anda gunakan untuk lab ini
    • Informasi lain, jika diperlukan, untuk menyelesaikan lab ini
  2. Klik Open Google Cloud console (atau klik kanan dan pilih Open Link in Incognito Window jika Anda menjalankan browser Chrome).

    Lab akan menjalankan resource, lalu membuka tab lain yang menampilkan halaman Sign in.

    Tips: Atur tab di jendela terpisah secara berdampingan.

    Catatan: Jika Anda melihat dialog Choose an account, klik Use Another Account.
  3. Jika perlu, salin Username di bawah dan tempel ke dialog Sign in.

    {{{user_0.username | "Username"}}}

    Anda juga dapat menemukan Username di panel Lab Details.

  4. Klik Next.

  5. Salin Password di bawah dan tempel ke dialog Welcome.

    {{{user_0.password | "Password"}}}

    Anda juga dapat menemukan Password di panel Lab Details.

  6. Klik Next.

    Penting: Anda harus menggunakan kredensial yang diberikan lab. Jangan menggunakan kredensial akun Google Cloud Anda. Catatan: Menggunakan akun Google Cloud sendiri untuk lab ini dapat dikenai biaya tambahan.
  7. Klik halaman berikutnya:

    • Setujui persyaratan dan ketentuan.
    • Jangan tambahkan opsi pemulihan atau autentikasi 2 langkah (karena ini akun sementara).
    • Jangan mendaftar uji coba gratis.

Setelah beberapa saat, Konsol Google Cloud akan terbuka di tab ini.

Catatan: Untuk melihat menu dengan daftar produk dan layanan Google Cloud, klik Navigation menu di kiri atas. Ikon Navigation menu

Mengaktifkan Cloud Shell

Cloud Shell adalah mesin virtual yang dilengkapi dengan berbagai alat pengembangan. Mesin virtual ini menawarkan direktori beranda persisten berkapasitas 5 GB dan berjalan di Google Cloud. Cloud Shell menyediakan akses command-line untuk resource Google Cloud Anda.

  1. Klik Activate Cloud Shell Ikon Activate Cloud Shell di bagian atas konsol Google Cloud.

Setelah terhubung, Anda sudah diautentikasi, dan project ditetapkan ke PROJECT_ID Anda. Output berisi baris yang mendeklarasikan PROJECT_ID untuk sesi ini:

Project Cloud Platform Anda dalam sesi ini disetel ke YOUR_PROJECT_ID

gcloud adalah alat command line untuk Google Cloud. Alat ini sudah terinstal di Cloud Shell dan mendukung pelengkapan command line.

  1. (Opsional) Anda dapat menampilkan daftar nama akun yang aktif dengan perintah ini:
gcloud auth list
  1. Klik Authorize.

  2. Output Anda sekarang akan terlihat seperti ini:

Output:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net Untuk menyetel akun aktif, jalankan: $ gcloud config set account `ACCOUNT`
  1. (Opsional) Anda dapat menampilkan daftar project ID dengan perintah ini:
gcloud config list project

Output:

[core] project = <project_ID>

Contoh output:

[core] project = qwiklabs-gcp-44776a13dea667a6 Catatan: Untuk mendapatkan dokumentasi gcloud yang lengkap di Google Cloud, baca panduan ringkasan gcloud CLI.

Lily

Lily, Pendiri Pet Theory

Halo Ruby,

Ingat percakapan kita minggu lalu saat saya mengeluh kewalahan menangani dokumen dan panggilan telepon dari perusahaan asuransi? Andai saja ada cara yang memungkinkan perwakilan mereka mengakses data pelanggan dengan aman dan efisien.

Beban kerja semacam ini tidak bagus untuk ke depannya. Bisakah Anda membantu?

Lily

Ruby

Ruby, Konsultan Software

Halo Lily,

Kemarin, saya makan siang bersama Patrick dan kami membuat rencana untuk mempermudah pihak ke-3 yang berwenang mengakses data digital Pet Theory secara aman.

Kami akan membuat solusi tersebut dengan empat langkah:

  1. Membangun REST API sederhana.
  2. Mengimpor data uji coba pelanggan.
  3. Menghubungkan REST API ke database pelanggan.
  4. Menambahkan autentikasi ke REST API.

Saya dan Patrick punya skill untuk langkah 1 + 2, jadi kami bisa langsung memulai. Kami berharap prototipe yang berfungsi sudah siap akhir pekan ini.

Ruby

Bantu Ruby mengelola aktivitas yang diperlukan guna membangun REST API untuk Pet Theory.

Tugas 1. Mengaktifkan Google API

Untuk lab ini, 2 API sudah diaktifkan untuk Anda:

Nama API
Cloud Build cloudbuild.googleapis.com
Cloud Run run.googleapis.com

Tugas 2. Mengembangkan REST API

  1. Aktifkan project Anda:
gcloud config set project $(gcloud projects list --format='value(PROJECT_ID)' --filter='qwiklabs-gcp')
  1. Clone repositori pet-theory dan akses kode sumbernya:
git clone https://github.com/rosera/pet-theory.git && cd pet-theory/lab08
  1. Gunakan editor teks favorit Anda, atau gunakan tombol Code Editor di panel Cloud Shell, untuk melihat file go.mod dan go.sum.

  2. Buat file main.go dan tambahkan konten berikut ke file tersebut:

package main import ( "fmt" "log" "net/http" "os" ) func main() { port := os.Getenv("PORT") if port == "" { port = "8080" } http.HandleFunc("/v1/", func(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "{status: 'running'}") }) log.Println("Pets REST API listening on port", port) if err := http.ListenAndServe(":"+port, nil); err != nil { log.Fatalf("Error launching Pets REST API server: %v", err) } } Catatan: Dalam kode di atas, Anda membuat endpoint untuk menguji bahwa layanan tersebut aktif dan berjalan sesuai harapan. Dengan menambahkan "/v1/" ke URL layanan, Anda dapat memverifikasi bahwa aplikasi berfungsi seperti yang diharapkan. Cloud Run men-deploy container, jadi Anda perlu menyediakan definisi container. Sebuah file dengan nama `Dockerfile` akan memberi tahu Cloud Run versi Go yang akan digunakan, file yang akan disertakan dalam aplikasi, dan cara memulai kode.
  1. Sekarang, buat file dengan nama Dockerfile dan tambahkan kode berikut ke file tersebut:
FROM gcr.io/distroless/base-debian12 WORKDIR /usr/src/app COPY server . CMD [ "/usr/src/app/server" ]

File server adalah program biner eksekusi yang dibuat dari main.go.

  1. Jalankan perintah berikut untuk membangun program biner:
go build -o server
  1. Setelah menjalankan perintah build, pastikan Anda memiliki Dockerfile dan server yang diperlukan di direktori yang sama:
ls -la . ├── Dockerfile ├── go.mod ├── go.sum ├── main.go └── server

Untuk sebagian besar aplikasi berbasis Go Cloud Run, Dockerfile template seperti di atas biasanya dapat digunakan tanpa perlu memodifikasinya.

  1. Deploy REST API sederhana Anda dengan menjalankan:
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/rest-api:0.1

Perintah ini akan membangun container dengan kode Anda dan menempatkannya di Container Registry project Anda. Anda dapat melihat container ini dengan mengklik Navigation menu > Container Registry. Jika rest-api tidak terlihat, klik Refresh.

Container Registry

Klik Check my progress untuk memastikan Anda telah menjalankan tugas di atas.

Membangun image dengan Cloud Build
  1. Setelah dibangun, deploy container tersebut:
gcloud run deploy rest-api \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/rest-api:0.1 \ --platform managed \ --region {{{ project_0.default_region | "Filled in at lab startup." }}} \ --allow-unauthenticated \ --max-instances=2
  1. Setelah deployment selesai, Anda akan melihat pesan seperti ini:
Service [rest-api] revision [rest-api-00001] has been deployed and is serving traffic at https://rest-api-[hash].a.run.app

Klik Check my progress untuk memastikan Anda telah menjalankan tugas di atas.

Men-deploy layanan REST API
  1. Klik URL Layanan di akhir pesan untuk membukanya di tab browser baru. Tambahkan /v1/ ke akhir URL, lalu tekan Enter.

Anda akan melihat pesan ini:

{&quot;status&quot; : &quot;running&quot;}

Sekarang, REST API sudah aktif dan berjalan. Setelah layanan prototipe ini tersedia, API tersebut akan digunakan di bagian berikutnya untuk mengambil informasi "customer" dari database Firestore.

Tugas 3. Mengimpor data uji coba pelanggan

Ruby

Ruby, Konsultan Software

Halo Patrick,

Masih menyimpan data pelanggan fiktif yang kita buat beberapa waktu lalu? Kita akan memerlukannya untuk pengujian.

Anda ingat cara menyiapkan database Firestore dan mengimpor data?

Ruby

Patrick

Patrick, Admin IT

Halo Ruby,

Ya, saya masih menyimpan data itu. Saya akan memigrasikannya ke Firestore hari ini supaya Anda bisa menggunakannya untuk pengujian.

Patrick

Ruby dan Patrick sebelumnya sudah membuat database uji coba yang berisi 10 pelanggan, dengan beberapa usulan perawatan untuk kucing salah satu pelanggan.

Bantu Patrick mengonfigurasi database Firestore dan mengimpor data uji coba pelanggan. Pertama-tama, aktifkan Firestore di project Anda.

  1. Kembali ke Konsol Cloud dan klik Navigation Menu > Firestore.

  2. Klik tombol Create Database.

  3. Klik tombol Native Mode, lalu klik Continue.

  4. Untuk Location type, pilih Region.

  5. Pilih region dari daftar yang tersedia, lalu klik Create Database.

Tunggu hingga database selesai dibuat sebelum melanjutkan.

Klik Check my progress untuk memastikan Anda telah menjalankan tugas di atas.

Membuat database Firestore
  1. Migrasikan file impor ke bucket Cloud Storage yang telah dibuat untuk Anda:
gsutil mb -c standard -l {{{ project_0.default_region | Region }}} gs://$GOOGLE_CLOUD_PROJECT-customer gsutil cp -r gs://spls/gsp645/2019-10-06T20:10:37_43617 gs://$GOOGLE_CLOUD_PROJECT-customer
  1. Sekarang, impor data ini ke Firebase:
gcloud beta firestore import gs://$GOOGLE_CLOUD_PROJECT-customer/2019-10-06T20:10:37_43617/

Muat ulang browser Konsol Cloud untuk melihat hasil Firestore.

  1. Di Firestore, klik customers di bagian "Default". Anda akan melihat data hewan peliharaan yang telah diimpor. Silakan buka. Jika Anda tidak melihat data apa pun, coba refresh halaman.

Bagus, database Firestore sudah berhasil dibuat dan diisi dengan data uji coba.

Tugas 4. Menghubungkan REST API ke database Firestore

Ruby

Ruby, Konsultan Software

Halo Lily,

Hanya ingin mengabari: saya dan Patrick sudah menyelesaikan dua tugas pertama dalam daftar.

Sekarang, saya akan melanjutkan ke tahap menyusun REST API agar bisa mengakses data pelanggan di Firestore.

Ruby

Lily

Lily, Pendiri Pet Theory

Halo Ruby,

Bagus! Saya tunggu hasil tahap berikutnya.

Lily

Di bagian ini, Anda akan membantu Ruby membuat end-point lain di REST API yang akan terlihat seperti ini:

https://rest-api-[hash].a.run.app/v1/customer/22530

Misalnya, URL tersebut akan menampilkan total biaya untuk semua perawatan yang diusulkan, disetujui, dan ditolak untuk pelanggan dengan ID 22530, jika pelanggan tersebut tercantum di database Firestore:

{ "status": "success", "data": { "proposed": 1602, "approved": 585, "rejected": 489 } } Catatan: Jika pelanggan ini tidak ada di database, kode status 404 (not found) dan pesan error akan ditampilkan.

Fungsionalitas baru ini memerlukan sebuah paket untuk mengakses database Firestore dan satu paket lainnya untuk menangani Cross-Origin Resource Sharing (CORS).

  1. Dapatkan nilai untuk variabel lingkungan $GOOGLE_CLOUD_PROJECT.
echo $GOOGLE_CLOUD_PROJECT
  1. Buka file main.go yang sudah ada di direktori pet-theory/lab08.
Catatan: Perbarui isi file main.go menggunakan nilai yang ditampilkan untuk $GOOGLE_CLOUD_PROJECT.
  1. Ganti isi file ini dengan kode di bawah. Pastikan PROJECT_ID ditetapkan ke :
package main import ( "context" "encoding/json" "fmt" "log" "net/http" "os" "cloud.google.com/go/firestore" "github.com/gorilla/handlers" "github.com/gorilla/mux" "google.golang.org/api/iterator" ) var client *firestore.Client func main() { var err error ctx := context.Background() client, err = firestore.NewClient(ctx, "{{{ project_0.project_id | \"Filled in at lab startup\"}}}") if err != nil { log.Fatalf("Error initializing Cloud Firestore client: %v", err) } port := os.Getenv("PORT") if port == "" { port = "8080" } r := mux.NewRouter() r.HandleFunc("/v1/", rootHandler) r.HandleFunc("/v1/customer/{id}", customerHandler) log.Println("Pets REST API listening on port", port) cors := handlers.CORS( handlers.AllowedHeaders([]string{"X-Requested-With", "Authorization", "Origin"}), handlers.AllowedOrigins([]string{"https://storage.googleapis.com"}), handlers.AllowedMethods([]string{"GET", "HEAD", "POST", "OPTIONS", "PATCH", "CONNECT"}), ) if err := http.ListenAndServe(":"+port, cors(r)); err != nil { log.Fatalf("Error launching Pets REST API server: %v", err) } }
  1. Tambahkan dukungan handler di bagian bawah file:
func rootHandler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "{status: 'running'}") } func customerHandler(w http.ResponseWriter, r *http.Request) { id := mux.Vars(r)["id"] ctx := context.Background() customer, err := getCustomer(ctx, id) if err != nil { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, `{"status": "fail", "data": '%s'}`, err) return } if customer == nil { w.WriteHeader(http.StatusNotFound) msg := fmt.Sprintf("`Customer \"%s\" not found`", id) fmt.Fprintf(w, fmt.Sprintf(`{"status": "fail", "data": {"title": %s}}`, msg)) return } amount, err := getAmounts(ctx, customer) if err != nil { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, `{"status": "fail", "data": "Unable to fetch amounts: %s"}`, err) return } data, err := json.Marshal(amount) if err != nil { w.WriteHeader(http.StatusInternalServerError) fmt.Fprintf(w, `{"status": "fail", "data": "Unable to fetch amounts: %s"}`, err) return } fmt.Fprintf(w, fmt.Sprintf(`{"status": "success", "data": %s}`, data)) }
  1. Tambahkan dukungan Customer ke bagian bawah file:
type Customer struct { Email string `firestore:"email"` ID string `firestore:"id"` Name string `firestore:"name"` Phone string `firestore:"phone"` } func getCustomer(ctx context.Context, id string) (*Customer, error) { query := client.Collection("customers").Where("id", "==", id) iter := query.Documents(ctx) var c Customer for { doc, err := iter.Next() if err == iterator.Done { break } if err != nil { return nil, err } err = doc.DataTo(&c) if err != nil { return nil, err } } return &c, nil } func getAmounts(ctx context.Context, c *Customer) (map[string]int64, error) { if c == nil { return map[string]int64{}, fmt.Errorf("Customer should be non-nil: %v", c) } result := map[string]int64{ "proposed": 0, "approved": 0, "rejected": 0, } query := client.Collection(fmt.Sprintf("customers/%s/treatments", c.Email)) if query == nil { return map[string]int64{}, fmt.Errorf("Query is nil: %v", c) } iter := query.Documents(ctx) for { doc, err := iter.Next() if err == iterator.Done { break } if err != nil { return nil, err } treatment := doc.Data() result[treatment["status"].(string)] += treatment["cost"].(int64) } return result, nil }
  1. Simpan file.

Tugas 6. Kuis hiburan

Fungsi mana yang merespons URL dengan pola `/v1/customer/` getAmounts customerHandler Pernyataan mana yang menampilkan success kepada klien fmt.Fprintf(w, `{"status": "fail", "data": "Unable to fetch amounts: %s"} fmt.Fprintf(w, fmt.Sprintf(`{"status": "success", "data": %s} Fungsi mana yang membaca dari database Firestore customerHandler and getCustomer getCustomer and getAmounts

Tugas 7. Men-deploy revisi baru

  1. Bangun ulang kode sumber:
go build -o server
  1. Bangun image baru untuk REST API:
gcloud builds submit \ --tag gcr.io/$GOOGLE_CLOUD_PROJECT/rest-api:0.2

Klik Check my progress untuk memverifikasi tujuan. Membangun revisi image 0.2

  1. Deploy image yang telah diupdate:
gcloud run deploy rest-api \ --image gcr.io/$GOOGLE_CLOUD_PROJECT/rest-api:0.2 \ --platform managed \ --region {{{ project_0.default_region | "Filled in at lab startup." }}} \ --allow-unauthenticated \ --max-instances=2 4. Setelah deployment selesai, Anda akan melihat pesan yang mirip dengan sebelumnya. URL untuk REST API tidak berubah saat Anda men-deploy versi barunya: Service [rest-api] revision [rest-api-00002] has been deployed and is serving traffic at https://rest-api-[hash].a.run.app
  1. Kembalilah ke tab browser yang sudah mengarah ke URL tersebut (dengan /v1/ di bagian akhirnya). Refresh tab ini dan pastikan Anda menerima pesan yang sama seperti sebelumnya, yang menunjukkan bahwa status API masih berjalan.

{status&quot; : &quot;running&quot;}

  1. Di kolom URL browser, tambahkan /customer/22530 ke URL aplikasi. Anda akan menerima respons JSON ini, yang mencantumkan jumlah total biaya perawatan yang diusulkan, disetujui, dan ditolak untuk pelanggan ini:

{&quot;status&quot; : &quot;success&quot;, &quot;data&quot; :{&quot;proposed&quot; :1602, &quot;approved&quot; :585, &quot;rejected&quot; :489}}

  1. Berikut ini beberapa client ID lain yang dapat Anda masukkan di URL sebagai pengganti 22530:
  • 34216
  • 70156 (semua jumlah harus nol)
  • 12345 (klien/hewan peliharaan tidak ada, error akan ditampilkan, misalnya Query is nil)

Anda telah membangun REST API yang skalabel, minim perawatan, dan serverless yang dapat membaca dari database.

Selamat!

Selamat! Dalam lab ini, Anda telah membantu Ruby dan Patrick berhasil membangun REST API prototipe untuk Pet Theory. Anda membuat REST API yang terhubung ke database Firestore dan men-deploy-nya ke Cloud Run. Anda juga telah menguji API tersebut untuk memastikannya berfungsi sesuai harapan.

Sertifikasi dan pelatihan Google Cloud

...membantu Anda mengoptimalkan teknologi Google Cloud. Kelas kami mencakup keterampilan teknis dan praktik terbaik untuk membantu Anda memahami dengan cepat dan melanjutkan proses pembelajaran. Kami menawarkan pelatihan tingkat dasar hingga lanjutan dengan opsi on demand, live, dan virtual untuk menyesuaikan dengan jadwal Anda yang sibuk. Sertifikasi membantu Anda memvalidasi dan membuktikan keterampilan serta keahlian Anda dalam teknologi Google Cloud.

Manual Terakhir Diperbarui 06 Mei 2024

Lab Terakhir Diuji 06 Mei 2024

Hak cipta 2024 Google LLC Semua hak dilindungi undang-undang. Google dan logo Google adalah merek dagang dari Google LLC. Semua nama perusahaan dan produk lain mungkin adalah merek dagang masing-masing perusahaan yang bersangkutan.

Konten ini tidak tersedia untuk saat ini

Kami akan memberi tahu Anda melalui email saat konten tersedia

Bagus!

Kami akan menghubungi Anda melalui email saat konten tersedia