Bermigrasi dari aplikasi Java Google App Engine ke Cloud Run dengan Jib

1. Ringkasan

Rangkaian codelab ini (tutorial praktik mandiri) bertujuan untuk membantu developer Java Google App Engine (Standar) memodernisasi aplikasi mereka dengan memandu mereka melalui serangkaian migrasi. Dengan mengikuti langkah-langkah ini, Anda dapat memperbarui aplikasi agar lebih portabel dan memutuskan untuk mem-build aplikasi dalam container untuk Cloud Run, layanan serupa container-hosting di Google Cloud untuk App Engine, dan layanan container-hosting lainnya.

Tutorial ini mengajarkan cara mem-build aplikasi App Engine dalam container untuk di-deploy ke layanan Cloud Run yang terkelola sepenuhnya menggunakan Jib. Dengan Jib, Anda dapat membuat image Docker, platform yang terkenal di industri untuk mengembangkan, mengirim, dan menjalankan aplikasi dalam container.

Selain mempelajari langkah-langkah yang diperlukan untuk berpindah dari App Engine ke Cloud Run, Anda juga akan mempelajari cara mengupgrade aplikasi App Engine Java 8 ke Java 17.

Jika aplikasi Anda banyak menggunakan layanan paket lama App Engine atau fitur App Engine lainnya, sebaiknya migrasikan layanan paket tersebut atau ganti fitur tersebut sebelum beralih ke Cloud Run. Jika Anda memerlukan lebih banyak waktu untuk mempelajari opsi migrasi atau ingin terus menggunakan layanan paket lama untuk saat ini, Anda dapat terus mengakses layanan paket App Engine untuk Java 11/17 saat mengupgrade ke runtime yang lebih baru. Setelah aplikasi Anda lebih portabel, kembali ke codelab ini untuk mempelajari cara menerapkan petunjuk ke aplikasi Anda.

Anda akan mempelajari cara

  • Menggunakan Cloud Shell
  • Mengaktifkan Cloud Run, Artifact Registry, dan Cloud Build API
  • Memasukkan aplikasi ke dalam container menggunakan Jib dan Cloud Build
  • Men-deploy image container Anda ke Cloud Run

Yang Anda butuhkan

Survei

Bagaimana Anda akan menggunakan tutorial ini?

Hanya membacanya Membacanya dan menyelesaikan latihan

Bagaimana penilaian Anda terhadap pengalaman dengan Java?

Pemula Menengah Mahir

Bagaimana penilaian Anda terhadap pengalaman menggunakan layanan Google Cloud?

Pemula Menengah Mahir

2. Latar belakang

Sistem Platform as a Service (PaaS) seperti App Engine dan Cloud Functions memberikan banyak kemudahan bagi tim dan aplikasi Anda, seperti memungkinkan SysAdmin dan Devops untuk fokus pada solusi proses build. Dengan platform serverless, aplikasi Anda dapat melakukan penskalaan otomatis sesuai kebutuhan, memperkecil skala hingga nol dengan biaya penagihan per penggunaan untuk membantu mengontrol biaya, dan menggunakan berbagai bahasa pengembangan yang umum.

Namun, fleksibilitas container juga menarik. Dengan kemampuan untuk memilih bahasa, library, dan biner apa pun, container memberi Anda yang terbaik dari kedua hal tersebut: kemudahan tanpa server beserta fleksibilitas container. Inilah yang dimaksud dengan Cloud Run.

Mempelajari cara menggunakan Cloud Run tidak berada dalam cakupan codelab ini. Anda dapat menemukannya di dokumentasi Cloud Run. Tujuannya di sini adalah agar Anda memahami cara mem-build aplikasi App Engine dalam container untuk Cloud Run (atau layanan yang dihosting dalam container lainnya). Ada beberapa hal yang harus Anda ketahui sebelum melanjutkan, terutama bahwa pengalaman pengguna akan sedikit berbeda.

Dalam codelab ini, Anda akan mempelajari cara membuat dan men-deploy container. Anda akan mempelajari cara:

  • Memasukkan aplikasi ke dalam container dengan Jib
  • Bermigrasi dari konfigurasi App Engine
  • dan, secara opsional, tentukan langkah-langkah build untuk Cloud Build.

Hal ini akan melibatkan penghentian penggunaan fitur khusus App Engine tertentu. Jika Anda memilih untuk tidak mengikuti jalur ini, Anda tetap dapat melakukan upgrade ke runtime Java 11/17 sambil mempertahankan aplikasi Anda di App Engine.

3. Penyiapan/Prakerja

1. Menyiapkan project

Untuk tutorial ini, Anda akan menggunakan aplikasi contoh dari repositori appengine-java-migration-samples di project baru. Pastikan project memiliki akun penagihan yang aktif.

Jika Anda ingin memindahkan aplikasi App Engine yang sudah ada ke Cloud Run, Anda dapat menggunakan aplikasi tersebut untuk mengikuti langkah-langkahnya.

Jalankan perintah berikut untuk mengaktifkan API yang diperlukan untuk project Anda:

gcloud services enable artifactregistry.googleapis.com cloudbuild.googleapis.com run.googleapis.com

2. Dapatkan aplikasi contoh dasar pengukuran

Clone aplikasi contoh di komputer Anda sendiri atau Cloud Shell, lalu buka folder baseline.

Contoh ini adalah aplikasi Datastore berbasis Servlet Java 8 yang ditujukan untuk di-deploy di App Engine. Ikuti petunjuk di README tentang cara menyiapkan aplikasi ini untuk deployment App Engine.

3. (Opsional) Deploy aplikasi dasar pengukuran

Langkah berikut hanya diperlukan jika Anda ingin mengonfirmasi bahwa aplikasi berfungsi di App Engine sebelum kami memigrasikan ke Cloud Run.

Lihat langkah-langkah di README.md:

  1. Menginstal/Mempelajari kembali gcloud CLI
  2. Lakukan inisialisasi gcloud CLI untuk project Anda dengan gcloud init
  3. Buat project App Engine dengan gcloud app create
  4. Men-deploy aplikasi contoh ke App Engine
./mvnw package appengine:deploy -Dapp.projectId=$PROJECT_ID
  1. Konfirmasi bahwa aplikasi berjalan di App Engine tanpa masalah

4. Membuat repositori Artifact Registry

Setelah membuat container aplikasi, Anda memerlukan tempat untuk mengirim dan menyimpan image. Cara yang direkomendasikan untuk melakukannya di Google Cloud adalah dengan Artifact Registry.

Buat repositori bernama migration dengan gcloud seperti berikut:

gcloud artifacts repositories create migration --repository-format=docker \
--description="Docker repository for the migrated app" \
--location="northamerica-northeast1"

Perhatikan bahwa repositori ini menggunakan jenis format docker, tetapi ada beberapa jenis repositori yang tersedia.

Pada tahap ini, Anda memiliki aplikasi App Engine dasar, dan project Google Cloud Anda siap untuk memigrasikannya ke Cloud Run.

4. Mengubah File Aplikasi

Jika aplikasi Anda banyak menggunakan layanan paket lama, konfigurasi, atau fitur khusus App Engine lainnya, sebaiknya terus akses layanan tersebut saat mengupgrade ke runtime baru. Codelab ini menunjukkan jalur migrasi untuk aplikasi yang sudah menggunakan layanan mandiri, atau dapat direfaktor secara layak untuk melakukannya.

1. Mengupgrade ke Java 17

Jika aplikasi Anda menggunakan Java 8, pertimbangkan untuk mengupgrade ke kandidat LTS yang lebih baru seperti 11 atau 17 agar tetap mendapatkan update keamanan dan akses ke fitur bahasa baru.

Mulailah dengan memperbarui properti di pom.xml Anda untuk menyertakan hal berikut:

<properties>
    <java.version>17</java.version>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
</properties>

Tindakan ini akan menyetel versi project ke 17, memberi tahu plugin compiler bahwa Anda ingin mengakses fitur bahasa Java 17, dan ingin agar class yang dikompilasi kompatibel dengan JVM Java 17.

2. Termasuk server web

Ada sejumlah perbedaan antara App Engine dan Cloud Run yang perlu dipertimbangkan saat Anda beralih dari salah satunya ke yang lain. Salah satu perbedaannya adalah, meskipun runtime Java 8 App Engine menyediakan dan mengelola server Jetty untuk aplikasi yang dihostingnya, Cloud Run tidak melakukannya. Kita akan menggunakan Spring Boot untuk menyediakan server web dan penampung servlet.

Tambahkan dependensi berikut:

<dependencies>
<!-- ... -->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-web</artifactId>
       <version>2.6.6</version>
       <exclusions>
           <!-- Exclude the Tomcat dependency -->
           <exclusion>
               <groupId>org.springframework.boot</groupId>
               <artifactId>spring-boot-starter-tomcat</artifactId>
           </exclusion>
       </exclusions>
   </dependency>
   <!-- Use Jetty instead -->
   <dependency>
       <groupId>org.springframework.boot</groupId>
       <artifactId>spring-boot-starter-jetty</artifactId>
       <version>2.6.6</version>
   </dependency>
<!-- ... -->
</dependencies>

Spring Boot menyematkan server Tomcat secara default, tetapi contoh ini akan mengecualikan artefak tersebut dan tetap menggunakan Jetty untuk meminimalkan perbedaan perilaku default setelah migrasi. Kita juga dapat mengonfigurasi versi Jetty agar sesuai dengan versi yang disediakan App Engine secara langsung.

<properties>
    <java.version>17</java.version>
    <maven.compiler.source>17</maven.compiler.source>
    <maven.compiler.target>17</maven.compiler.target>
    <jetty.version>9.4.46.v20220331</jetty.version>
</properties>

3. Penyiapan Spring Boot

Meskipun Spring Boot dapat menggunakan kembali servlet Anda tanpa modifikasi, servlet tersebut memerlukan beberapa konfigurasi agar dapat ditemukan.

Buat class MigratedServletApplication.java berikut dalam paket com.example.appengine:

package com.example.appengine;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@ServletComponentScan
@SpringBootApplication
@EnableAutoConfiguration
public class MigratedServletApplication {
    public static void main(String[] args) {
        SpringApplication.run(MigratedServletApplication.class, args);
    }
}

Perhatikan bahwa ini mencakup anotasi @ServletComponentScan, yang akan mencari (dalam paket saat ini secara default) @WebServlets, dan menyediakannya seperti yang diharapkan.

4. Mengemas aplikasi sebagai JAR

Meskipun Anda dapat membuat container aplikasi dengan Jib mulai dari war, prosesnya akan lebih mudah jika Anda mengemas aplikasi sebagai JAR yang dapat dieksekusi. Hal ini tidak memerlukan banyak konfigurasi, terutama untuk project yang menggunakan Maven sebagai alat build — karena pengemasan jar adalah perilaku default.

Hapus tag packaging dalam filepom.xml:

<packaging>war</packaging>

Selanjutnya, tambahkan spring-boot-maven-plugin:

<plugins>
<!-- ... -->
  <plugin>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-maven-plugin</artifactId>
    <version>2.6.6</version>
  </plugin>
<!-- ... -->
</plugins>

5. Bermigrasi dari konfigurasi, layanan, dan dependensi App Engine

Seperti yang disebutkan di awal codelab, Cloud Run dan App Engine dirancang untuk menawarkan pengalaman pengguna yang berbeda. Fitur tertentu yang ditawarkan App Engine secara langsung—seperti layanan Cron dan Task Queue—harus dibuat ulang secara manual dan akan dibahas lebih mendetail di modul berikutnya.

Aplikasi contoh tidak menggunakan layanan paket lama, tetapi pengguna yang aplikasinya menggunakan layanan paket lama dapat melihat panduan berikut:

Karena Anda akan men-deploy ke Cloud Run mulai sekarang, appengine-maven-plugin dapat dihapus:

<plugin>
 <groupId>com.google.cloud.tools</groupId>
 <artifactId>appengine-maven-plugin</artifactId>
 <version>2.4.1</version>
 <configuration>
   <!-- can be set w/ -DprojectId=myProjectId on command line -->
   <projectId>${app.projectId}</projectId>
   <!-- set the GAE version or use "GCLOUD_CONFIG" for an autogenerated GAE version -->
   <version>GCLOUD_CONFIG</version>
 </configuration>
</plugin>

5. Membuat Aplikasi dalam Container

Pada tahap ini, Anda dapat men-deploy aplikasi secara manual ke Cloud Run langsung dari kode sumber. Ini adalah opsi yang sangat baik yang menggunakan Cloud Build di balik layar untuk memberikan pengalaman deployment tanpa interaksi. Kita akan membahas deployment sumber secara lebih mendetail di modul selanjutnya.

Atau, jika Anda memerlukan kontrol lebih besar atas cara aplikasi di-deploy, Anda dapat melakukannya dengan menentukan file cloudbuild.yaml yang secara eksplisit menjelaskan langkah-langkah build yang diinginkan:

1. Tentukan file cloudbuild.yaml

Buat file cloudbuild.yaml berikut di tingkat yang sama dengan pom.xml:

steps:
  # Test your build
  - name: maven:eclipse-temurin
    entrypoint: mvn
    args: ["test"]
  # Build with Jib
  - name: maven:eclipse-temurin
    entrypoint: mvn
    args: [ "compile", "com.google.cloud.tools:jib-maven-plugin:3.2.1:build", "-Dimage=northamerica-northeast1-docker.pkg.dev/PROJECT_ID/migration/visitors:jib"]
  # Deploy to Cloud Run
  - name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
    entrypoint: gcloud
    args: [ 'run', 'deploy', 'visitors', '--image', 'northamerica-northeast1-docker.pkg.dev/PROJECT_ID/migration/visitors:jib', '--region', 'northamerica-northeast1', '--allow-unauthenticated']

Setelah kita memberi tahu Cloud Build untuk mengikuti langkah-langkah ini, Cloud Build akan:

  1. Menjalankan pengujian dengan ./mvnw test
  2. Bangun, kirim, dan beri tag pada image Anda ke Artifact Registry dengan Jib
  3. Deploy image Anda ke Cloud Run dengan gcloud run deploy

Perhatikan bahwa ‘visitors' diberikan ke Cloud Run sebagai nama layanan yang diinginkan. Flag –allow-unauthenticated memungkinkan pengguna membuka aplikasi web tanpa memerlukan autentikasi. Pastikan untuk mengganti PROJECT_ID dengan ID project Anda di file cloudbuild.yaml .

Selanjutnya, tambahkan binding kebijakan IAM berikut untuk mengizinkan Akun Layanan Cloud Build mengakses Artifact Registry:

export PROJECT_ID=$(gcloud config list --format 'value(core.project)')
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID --format="value(projectNumber)" )

gcloud projects add-iam-policy-binding $PROJECT_ID \
--member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
--role=roles/run.admin \
--project=$PROJECT_ID
gcloud iam service-accounts add-iam-policy-binding $PROJECT_NUMBER-compute@developer.gserviceaccount.com \
--member=serviceAccount:$PROJECT_NUMBER@cloudbuild.gserviceaccount.com \
--role roles/iam.serviceAccountUser --project=$PROJECT_ID

2. Menjalankan proses build

Setelah memberi tahu Cloud Build tentang langkah-langkah build yang diinginkan, Anda siap melakukan deployment sekali klik.

Jalankan perintah berikut:

gcloud builds submit

Setelah proses selesai, image container Anda telah dibangun, disimpan di Artifact Registry, dan di-deploy ke Cloud Run.

Di akhir codelab ini, aplikasi Anda akan terlihat sama seperti yang ada di java17-and-cloud-run/finish.

Jadi itulah. Anda telah berhasil memigrasikan aplikasi App Engine Java 8 ke Java 17 dan Cloud Run, serta kini memiliki pemahaman yang lebih jelas tentang pekerjaan yang terlibat saat beralih dan memilih antara opsi hosting.

6. Ringkasan/Pembersihan

Selamat, Anda telah mengupgrade, mem-build dalam container, memigrasikan, dan aplikasi Anda, yang mengakhiri tutorial ini.

Dari sini, langkah selanjutnya adalah mempelajari lebih lanjut fitur CI/CD dan keamanan supply chain software yang kini dapat Anda gunakan untuk men-deploy dengan Cloud Build:

Opsional: Membersihkan dan/atau menonaktifkan layanan

Jika Anda men-deploy aplikasi contoh di App Engine selama tutorial ini, jangan lupa untuk menonaktifkan aplikasi agar tidak dikenai biaya. Jika sudah siap untuk beralih ke codelab berikutnya, Anda dapat mengaktifkannya kembali. Meskipun dinonaktifkan, aplikasi App Engine tidak akan mendapatkan traffic yang menimbulkan biaya. Namun, penggunaan Datastore dapat ditagih jika melebihi kuota gratis, jadi hapus cukup banyak data hingga berada di bawah batas tersebut.

Di sisi lain, jika Anda tidak akan melanjutkan migrasi dan ingin menghapus semuanya, Anda dapat menghapus layanan atau mematikan project sepenuhnya.

7. Referensi lainnya

Masalah/masukan codelab modul migrasi App Engine

Jika Anda menemukan masalah dengan codelab ini, telusuri masalah Anda terlebih dahulu sebelum mengajukan masalah. Link untuk menelusuri dan membuat masalah baru:

Referensi migrasi

Referensi online

Berikut adalah referensi online yang mungkin relevan untuk tutorial ini:

App Engine

Informasi Cloud lainnya

Video

Lisensi

Karya ini dilisensikan berdasarkan Lisensi Umum Creative Commons Attribution 2.0.