GCP: Integrasi Cloud Function dan Cloud SQL

Achmad Zulfikar
NDID Engineering
Published in
12 min readJun 4, 2024

Google Cloud Platform (GCP) merupakan salah satu penyedia public cloud yang populer saat ini. GCP merupakan kumpulan layanan cloud (komputasi, storage, analisa data, kecerdasan buatan, jaringan, IOT dan lainnya) yang ditawarkan oleh google dan berjalan diatas infrastruktur yang sama dengan produk-produk google yang ditawarkan ke public (google search, youtube, gmail dan lainnya). Google menyediakan layanan infrastruture yang tersebar di berbagai region dan terbagi kedalam beberapa zona pada setiap region, setiap layanan infrastruktur yang tersebar pada setiap region juga mengadopsi regulasi lokal untuk tetap memenuhi standar compliance dari masing-masing negara.

Pada artikel kali ini akan dibahas langkah-langkah untuk melakukan integrasi dari dua buah service pada GCP yaitu cloud function dan cloud SQL untuk membuat sebuah backend sederhana (aplikasi notes). Aplikasi notes menyediakan dua buah cloud function dengan trigger https, fungsi yang pertama untuk mengambil data note dari cloud SQL dan fungsi yang kedua untuk menginpukan data note kedalam cloud SQL. Proses testing cloud function yang telah dibuat akan dilakukan melalui aplikasi postman.

Langkah 1: Membuat project baru pada GCP

Sebelum melakukan proses integrasi antara cloud function dan cloud SQL maka terlebih dahulu dilakukan pembuatan project baru pada GCP. Untuk membuat project baru pada GCP maka pilih new project pada console GCP kemudian isikan informasi sesuai gambar berikut. Setelah mengisikan informasi project name dan project id kemudian pilih create untuk membuat project baru.

Setelah melakukan pembuatan project baru, pilih project baru yang telah dibuat kemudian pastikan bahwa project baru terhubung ke billing free trial dan masih terdapat sisa kredit untuk menghindari biaya yang tidak diinginkan.

Langkah 2: Membuat Cloud SQL instance

Pada bagian atas console GCP terdapat seach bar yang dapat digunakan untuk navigasi ke semua service yang disediakan oleh GCP. Untuk membuka service cloud SQL maka ketik cloud sql pada search bar kemudian pilih SQL sesuai dengan gambar dibawah ini.

Setelah memilih SQL pada Langkah sebelumnya maka browser akan mengarahkan ke halaman home dari service cloud SQL. Setelah halaman home dari cloud SQL ditampilkan maka pilih create instance with your free credits untuk membuat instance database baru sesuai dengan gambar dibawah ini.

Pilih database engine yang akan digunakan. Pada artikel ini database engine yang digunakan adalah MySQL.

Setelah memilih database engine maka langkah selanjutnya adalah melakukan konfigurasi detail pada database instance yang akan dibuat. Isikan informasi instance id, password dan versi database MySQL yang akan digunakan sesuai gambar dibawah ini.

Selanjutnya pilih enterprise edition untuk database instance yang akan dibuat sesuai gambar dibawah ini.

Langkah selanjutnya adalah memilih pengaturan environment, region serta zone dari database instance yang akan dibuat. Isikan informasi untuk environment, region dan zone sesuai gambar dibawah ini.

Terdapat banyak konfigurasi detail yang dapat diatur sesuai dengan kebutuhan pada menu show configuration options, pada artikel ini konfigurasi tersebut dibiarkan tetap menggunakan nilai default yang sudah disediakan oleh GCP. Selanjutnya pilih create instance untuk membuat database instance.

Pada saat melakukan konfigurasi database instance maka terdapat informasi mengenai estimasi harga yang akan dikonsumsi dari database instance yang akan dibuat. Estimasi harga akan berubah sesuai dengan konfigurasi yang dipilih, misal harga untuk pembuatan instance pada multi zone akan lebih mahal dibandingkan dengan harga instance pada single zone (detail perhitungan harga dapat dilihat pada dokumentasi GCP untuk Cloud SQL).

Berikut adalah detail biaya dari database instance yang dibuat sesuai dengan konfigurasi diatas.

Setelah proses pembuatan database instance selesai maka database instance yang baru dapat dilihat pada halaman home dari service cloud SQL.

Langkah 3: Membuat user untuk database instance

Pilih database instance yang telah dibuat untuk membuat user sesuai gambar dibawah ini. Setelah memilih database instance maka browser akan mengarahkan ke halaman overview dari database instance yang dipilih.

Pada halaman overview database, pilih menu user yang terdapat pada menu sebelah kiri dari halaman overview sesuai dengan gambar dibawah ini.

Pilih add user account untuk menambahkan user baru untuk database instance.

Isikan informasi username dan password dari user baru yang akan dibuat, selanjutnya pilih add untuk membuat user database baru sesuai gambar dibawah ini.

Setelah proses pembuatan user selesai maka user baru akan ditambahkan kedalam tabel user sesuai dengan gambar dibawah ini.

Langkah 4: Membuat database baru pada database instance

Pada halaman overview database, pilih menu databases yang terdapat pada menu sebelah kiri dari halaman overview sesuai dengan gambar dibawah ini.

Pilih create database untuk menambahkan database baru.

Isikan informasi database name dari database baru yang akan dibuat, selanjutnya pilih create untuk membuat database baru sesuai gambar dibawah ini.

Setelah proses pembuatan database selesai maka database baru akan ditambahkan kedalam tabel database sesuai dengan gambar dibawah ini.

Langkah 5: Membuat table baru pada database

Pada halaman overview database, pilih menu Cloud SQL Studio yang terdapat pada menu sebelah kiri dari halaman overview sesuai dengan gambar dibawah ini.

Masukan informasi database dan user yang telah dibuat pada Langkah sebelumnya sesuai dengan gambar dibawah ini. Setelah mengisikan informasi maka pilih authenticate untuk mengakses database baru yang dibuat pada Langkah sebelumnya.

Setelah koneksi ke database berhasil maka ketik DDL untuk membuat table baru kemudian pilih Run untuk melakukan eksekusi DDL sesuai dengan gambar dibawah ini.

Jika eksekusi DDL berhasil maka akan ditampilkan pesan sukses pada layar. Pilih refresh untuk memperbarui informasi database. Table baru yang telah dibuat akan tampil pada layar sesuai dengan gambar dibawah ini.

Langkah 6: Mengaktifkan API Cloud SQL Admin

API Cloud SQL Admin perlu diaktifkan untuk melakukan integrasi cloud function dan cloud SQL. Untuk mengaktifkan API Cloud SQL Admin ketik Enabled API pada search bar kemudian pilih Enabled APIs and services sesuai dengan gambar dibawah ini.

Pada bagian atas halaman home APIs and services pilih enable APIS AND SERVICES kemudian ketik cloud SQL pada bagian search bar APIs and services, pilih Cloud SQL Admin API sesuai dengan gambar dibawah ini.

Pilih enable pada halaman Cloud SQL Admin API dan pastikan bahwa API telah berhasil diaktifkan sesuai dengan gambar dibawah ini.

Langkah 7: Membuat cloud function get-notes dan put-note

Untuk membuat cloud function ketik cloud function pada search bar kemudian pilih Cloud Functions sesuai dengan gambar dibawah ini.

Browser akan mengarahkan tampilan menuju home screen cloud function sesuai dengan gambar dibawah ini. Pada gambar terlihat bahwa belum ada cloud function yang dibuat pada project ini. PIlih create function untuk membuat cloud function baru.

Setelah memilih cloud function maka pop-up window akan muncul untuk konfirmasi aktifasi API yang dibutuhkan untuk menjalankan cloud function. Pop-up window hanya akan muncul satu kali pada saat pertama kali membuat cloud function, jika sebelumnya API yang dibutuhkan untuk menjalankan cloud function sudah diaktifkan maka pop-up window tidak akan muncul. Pilih enable untuk mengaktifkan semua API yang dibutuhkan untuk menjalankan cloud function sesuai dengan gambar dibawah ini.

Langkah selanjutnya adalah melakukan konfigurasi pada cloud function baru yang akan dibuat. Terdapat 2 langkah yang dibutuhkan untuk membuat cloud function pada GCP yaitu configuration dan code. Pada bagian configuration isikan informasi untuk function name dan region sesuai dengan gambar dibawah ini.

Pada bagian Trigger pilih allow unauthenticated invocations untuk mengizinkan akses API dari jaringan public tanpa proses autentikasi. Terdapat banyak konfigurasi detail yang dapat diatur pada cloud function, pada artikel ini konfigurasi tersebut dibiarkan tetap menggunakan nilai default yang sudah disediakan oleh GCP. Selanjutnya pilih next untuk melanjutkan proses pembuatan cloud function.

Pop-up window akan muncul sekali lagi untuk konfirmasi aktifasi APIs yang akan digunakan oleh cloud function. Pop-up window Kembali muncul karena pada konfigurasi sebelumnya kita menggunakan nilai default untuk environment yang 2th gen sehingga dibutuhkan APIs tambahan untuk menggunakan cloud function dengan environment 2th gen. Pop-up window hanya akan muncul satu kali pada saat pertama kali membuat cloud function.

Langkah selanjutnya konfigurasi code yang akan berjalan pada cloud function. Pada artikel ini runtime yang akan digunakan adalah Java, pilih Java 17 pada bagian runtime sesuai dengan gambar dibawah ini. Pada gambar terlihat code default yang disediakan oleh GCP untuk menampilkan pesan Hello World Ketika URL dari cloud function diakses melalui browser.

Pilih file pom.xml pada bagian kiri editor kemudian ganti semua code yang ada pada file pom.xml dengan menggunakan code dibawah ini.

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>explore</groupId>
<artifactId>http</artifactId>
<version>0.0.1</version>
<name>HTTP Function for Cloud Functions 2nd gen</name>

<properties>
<maven.compiler.release>17</maven.compiler.release>
</properties>

<dependencies>
<dependency>
<groupId>com.google.cloud.functions</groupId>
<artifactId>functions-framework-api</artifactId>
<version>1.0.4</version>
</dependency>
<dependency>
<groupId>com.google.code.gson</groupId>
<artifactId>gson</artifactId>
<version>2.11.0</version>
</dependency>
<dependency>
<groupId>com.google.cloud.sql</groupId>
<artifactId>mysql-socket-factory-connector-j-8</artifactId>
<version>1.18.1</version>
</dependency>
<dependency>
<groupId>com.zaxxer</groupId>
<artifactId>HikariCP</artifactId>
<version>5.1.0</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.33</version>
</dependency>
</dependencies>

</project>

Selanjutnya tambahkan dua buah file java (Note.java dan Main.java) dengan menggunakan code dibawah ini.

package explore;

public class Note {
private Integer noteId;
private String noteTitle;
private String noteBody;

public Integer getNoteId() {
return this.noteId;
}

public String getNoteTitle() {
return this.noteTitle;
}

public String getNoteBody() {
return this.noteBody;
}

public void setNoteId(Integer noteId) {
this.noteId = noteId;
}

public void setNoteTitle(String noteTitle) {
this.noteTitle = noteTitle;
}

public void setNoteBody(String noteBody) {
this.noteBody = noteBody;
}
}
package explore;

import java.io.BufferedWriter;
import java.util.ArrayList;
import java.util.List;
import java.sql.ResultSet;
import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;


public class Main implements HttpFunction {
private static final Gson gson = new Gson();
private static final String INSTANCE_CONNECTION_NAME = "my-instance-connection-name";
private static final String INSTANCE_UNIX_SOCKET = "com.google.cloud.sql.mysql.SocketFactory";
private static final String DB_USER = "my-user";
private static final String DB_PASS = "mysecretpassword";
private static final String DB_NAME = "my-notes";

public void service(final HttpRequest request, final HttpResponse response) throws Exception {
JsonObject body = gson.fromJson(request.getReader(), JsonObject.class);
DataSource dataSource = createConnectionPool();

List<Note> noteList = new ArrayList<Note>();
ResultSet resultSet = dataSource.getConnection().prepareStatement("SELECT * FROM notes").executeQuery();
while (resultSet.next()) {
Note note = new Note();
note.setNoteId(resultSet.getInt("note_id"));
note.setNoteTitle(resultSet.getString("note_title"));
note.setNoteBody(resultSet.getString("note_body"));
noteList.add(note);
}

BufferedWriter writer = response.getWriter();
writer.write(gson.toJson(noteList));
}

private DataSource createConnectionPool() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(String.format("jdbc:mysql:///%s", DB_NAME));
config.setUsername(DB_USER);
config.setPassword(DB_PASS);
config.addDataSourceProperty("socketFactory", INSTANCE_UNIX_SOCKET);
config.addDataSourceProperty("cloudSqlInstance", INSTANCE_CONNECTION_NAME);
config.setDriverClassName(com.mysql.cj.jdbc.Driver.class.getName());

return new HikariDataSource(config);
}
}

Berikut adalah hasil penambahan dua buah file java kedalam editor. Pada gambar terlihan dua file java yang baru ditambahkan kedalam editor dan entry point diarahkan ke file Main.java yang baru ditambahkan. File default yang disediakan oleh GCP dapat dihapus ataupun tetap dibiarkan seperti semula. Setelah memastikan semua file telah ditambahkan dan mengubah entry point maka pilih deploy untuk menyelesaikan proses pembuatan cloud function yang baru.

Setelah proses build dan deploy selesai maka dapat dilanjutkan untuk membuat cloud function yang ke dua yaitu put-note. Secara umum Langkah yang dilakukan untuk membuat function put-note sama dengan Langkah yang dilakukan pada proses pembuatan service pertama get-notes, perbedaan dari kedua cloud function tersebut hanya ada pada bagian file Main.java. Cloud function put-notes menggunakan file Main.java dibawah ini.

package explore;

import java.io.BufferedWriter;
import java.util.ArrayList;
import java.util.List;
import java.sql.ResultSet;
import com.google.cloud.functions.HttpFunction;
import com.google.cloud.functions.HttpRequest;
import com.google.cloud.functions.HttpResponse;
import com.google.gson.Gson;
import com.google.gson.JsonObject;
import com.zaxxer.hikari.HikariConfig;
import com.zaxxer.hikari.HikariDataSource;
import javax.sql.DataSource;

public class Main implements HttpFunction {
private static final Gson gson = new Gson();
private static final String INSTANCE_CONNECTION_NAME = "my-instance-connection-name";
private static final String INSTANCE_UNIX_SOCKET = "com.google.cloud.sql.mysql.SocketFactory";
private static final String DB_USER = "my-user";
private static final String DB_PASS = "mysecretpassword";
private static final String DB_NAME = "my-notes";

public void service(final HttpRequest request, final HttpResponse response) throws Exception {
Note note = gson.fromJson(request.getReader(), Note.class);

String SQL = "INSERT INTO notes (note_title,note_body) VALUES ('"+note.getNoteTitle()+"','"+note.getNoteBody()+"')";
DataSource dataSource = createConnectionPool();
dataSource.getConnection().prepareStatement(SQL).executeUpdate();

BufferedWriter writer = response.getWriter();
writer.write(gson.toJson(note));
}

private DataSource createConnectionPool() {
HikariConfig config = new HikariConfig();
config.setJdbcUrl(String.format("jdbc:mysql:///%s", DB_NAME));
config.setUsername(DB_USER);
config.setPassword(DB_PASS);
config.addDataSourceProperty("socketFactory", INSTANCE_UNIX_SOCKET);
config.addDataSourceProperty("cloudSqlInstance", INSTANCE_CONNECTION_NAME);
config.setDriverClassName(com.mysql.cj.jdbc.Driver.class.getName());

return new HikariDataSource(config);
}
}

Setelah menambahkan dua buah cloud function yaitu get-notes dan put-note maka tampilan home dari cloud function akan terlihat sesuai gambar dibawah ini.

Langkah 8: Menambahkan role cloud sql client pada default service account pada cloud function

Langkah selanjutnya adalah menambahkan role cloud sql client pada default service account yang digunakan oleh cloud function. Untuk mengecek service account yang digunakan oleh cloud function yang telah dibuat pada Langkah sebelumnya pilih nama cloud function sesuai dengan gambar dibawah ini.

Pada bagian details dari cloud function terdapat informasi mengenai service account yang digunakan oleh cloud function sesuai dengan gambar dibawah ini. Simpan sementara informasi service account pada notepad.

Pada search bar ketik iam kemudian pilih IAM sesuai dengan gambar dibawah ini.

Setelah halaman IAM terbuka maka pilih grant access untuk menambahkan role sesuai dengan gambar dibawah ini.

Isikan informasi principal dengan menggunakan nama service account dari cloud function yang disimpan pada Langkah sebelumnya kemudian tambahkan role Cloud SQL Client. Selanjutnya pilih save untuk menyelesaikan proses penambahan role sesuai dengan gambar dibawah ini.

Langkah 9: Testing menggunakan aplikasi Postman

Setelah menyelesaikan semua Langkah sebelumnya maka selanjutnya dapat dilakukan testing dengan menggunakan aplikasi Postman. URL untuk melakukan testing dapat dilihat pada halaman detail untuk masing-masing cloud function yang sudah dibuat sebelumnya (halaman detail untuk mendapatkan informasi service account pada Langkah sebelumnya) sesuai dengan gambar dibawah ini.

Copy dan paste URL yang didapatkan dari halaman detail cloud function ke aplikasi Postman. Setelah mengisikan informasi URL maka pilih send untuk mengirimkan https request menuju cloud function yang telah dibuat. Berikut adalah tampilan aplikasi Postman untuk testing cloud function get-notes. Function get-notes akan mengembalikan informasi list dari table notes dalam bentuk json format.

Berikut adalah tampilan aplikasi Postman untuk testing cloud function put-note. Function put-note akan menambahkan data note kedalam table notes pada database. Data note dikirimkan dalam bentuk json format dan response dari cloud function adalah note yang berhasil diinput juga dalam bentuk json format.

Kesimpulan

Cloud Function dan Cloud SQL merupakan serverless services yang disediakan oleh GCP. Pada Langkah yang sudah dibahas pada artikel ini dapat disimpulan bahwa penggunaan serverless service sangat membantu pada proses development ataupun research sebuah aplikasi. Pada Langkah konfigurasi Cloud SQL, Instance database baru dapat dibuat dengan waktu yang singkat tanpa instalasi hardware maupun software. Pada Langkah konfigurasi Cloud Function, Function dapat dipublish dengan waktu singkat tanpa instalasi hardware maupun software. Dengan kemudahan setup yang ditawarkan oleh Cloud SQL dan Cloud Function maka engineer bisa lebih fokus pada fungsi-fungsi yang akan disediakan pada aplikasi dibandingkan fokus pada setup dan instalasi middleware ataupun runtime selain itu time to market untuk sebuah aplikasi juga akan menjadi lebih singkat.

--

--