Di Function Compute, instans eksekusi bersifat stateless. Anda dapat menggunakan database untuk menyimpan data terstruktur secara persisten dan berbagi status. Dengan mengakses database cloud dari Function Compute, Anda dapat melakukan operasi seperti kueri dan penyisipan data. Topik ini menggunakan fungsi Python sebagai contoh untuk menjelaskan cara mengakses instans ApsaraDB RDS for MySQL dari VPC yang sama atau lintas VPC dan wilayah berbeda.
Prasyarat
-
Kode sampel
index.pydalam topik ini melakukan kueri semua data dari tabel bernamausers. Anda dapat mengubah nama tabel sesuai kebutuhan, tetapi pastikan tabel tersebut berisi setidaknya satu catatan.
Prosedur
Langkah 1: Konfigurasikan daftar putih database
Skenario 1: VPC yang sama
Jika Anda mengakses database dalam VPC yang sama, pastikan instans database dan fungsi berada di wilayah yang sama. Kami menyarankan Anda membuat instans database di zona yang didukung oleh Function Compute. Untuk informasi selengkapnya, lihat Zona yang didukung Function Compute. Jika instans database Anda tidak berada di zona yang didukung, Anda dapat membuat vSwitch di zona yang sama dengan fungsi Anda dan menentukan ID-nya dalam konfigurasi VPC fungsi tersebut. Karena vSwitch dalam VPC yang sama dapat berkomunikasi satu sama lain melalui jaringan pribadi, fungsi Anda dapat menggunakan vSwitch ini untuk mengakses sumber daya di zona lain dalam VPC tersebut. Untuk informasi selengkapnya, lihat Apa yang harus saya lakukan jika menerima error 'vSwitch berada di zona yang tidak didukung'?.
-
Masuk ke konsol Function Compute dan buat fungsi web Python. Di halaman detail fungsi, pilih tab Configuration, lalu klik Modify pada bagian Advanced Settings. Di panel Advanced Settings, temukan bagian Network, aktifkan akses VPC untuk fungsi tersebut, lalu konfigurasikan sumber daya VPC tujuan.
CatatanPastikan VPC yang dikonfigurasi untuk fungsi sama dengan VPC tempat instans database terikat.
Anda dapat mengonfigurasi VPC, vSwitch, dan security group. Kami menyarankan Anda men-deploy vSwitch di dua zona atau lebih untuk memanfaatkan sepenuhnya kemampuan disaster recovery multi-zona dari Function Compute, yang meningkatkan ketersediaan tinggi layanan Anda. Zona yang didukung di wilayah saat ini adalah cn-hangzhou-h, i, j, k, f, g, dan b.
-
Di halaman detail fungsi, buka tab Configuration. Di bagian Network, peroleh Blok CIDR vSwitch yang dikonfigurasi untuk fungsi tersebut.
-
Tambahkan Blok CIDR vSwitch yang diperoleh pada langkah sebelumnya ke daftar putih akses database.
PentingKami menyarankan Anda mengizinkan akses fungsi menggunakan daftar putih alamat IP, bukan security group. Penggunaan security group dapat menyebabkan kegagalan koneksi intermiten yang berdampak pada layanan Anda.
-
Buka daftar instans RDS, pilih wilayah, lalu klik ID instans target.
-
Di panel navigasi sebelah kiri, klik Whitelist and SecGroup.
Di halaman Whitelist Settings, Anda dapat melihat mode daftar putih IP saat ini.
CatatanInstans lama mungkin beroperasi dalam mode keamanan tinggi. Semua instans baru menggunakan mode daftar putih standar.
-
Di sebelah kanan grup default, klik Modify. Di kotak dialog Edit Whitelist, tambahkan Blok CIDR IPv4 vSwitch yang diperoleh di langkah 2 ke daftar putih, lalu klik OK.
Setelah konfigurasi selesai, fungsi dapat mengakses database RDS melalui titik akhir internalnya.
-
Skenario 2: Lintas VPC atau wilayah
VPC dan wilayah secara logis terisolasi. Secara default, Anda tidak dapat mengakses database lintas VPC atau wilayah. Untuk mengaktifkannya, konfigurasikan alamat IP publik statis untuk fungsi Anda. Sistem akan membuat gerbang NAT publik di VPC fungsi tersebut, yang memungkinkan fungsi mengakses database melalui Internet menggunakan alamat IP publik tersebut.
-
Login ke Konsol Function Compute. Di panel navigasi sebelah kiri, klik Functions. Pilih wilayah, lalu buat fungsi sesuai petunjuk.
-
Di halaman detail fungsi, klik tab Configuration. Di bagian Advanced Settings, klik Modify. Di panel Advanced Settings, temukan bagian Network. Untuk mengaktifkan alamat IP publik statis, aktifkan Static Public IP Address dan nonaktifkan Allow Default NIC to Access Internet. Lalu, klik Deploy.
-
Di halaman detail fungsi, buka tab Configuration. Di bagian Network, peroleh Alamat IP Elastis yang dikonfigurasi untuk fungsi tersebut.
-
Tambahkan Alamat IP Elastis yang diperoleh pada langkah sebelumnya ke daftar putih akses database.
PentingKami menyarankan Anda mengizinkan akses fungsi menggunakan daftar putih alamat IP, bukan security group. Penggunaan security group dapat menyebabkan kegagalan koneksi intermiten yang berdampak pada layanan Anda.
-
Buka daftar instans RDS, pilih wilayah, lalu klik ID instans target.
-
Di panel navigasi sebelah kiri, klik Whitelist and SecGroup.
Di halaman Whitelist Settings, Anda dapat melihat mode daftar putih IP saat ini.
CatatanInstans lama mungkin beroperasi dalam mode keamanan tinggi. Semua instans baru menggunakan mode daftar putih standar.
-
Di sebelah kanan grup default, klik Modify. Pada kotak dialog Edit Whitelist, tambahkan alamat IP publik statis yang diperoleh di langkah 3 ke daftar putih, lalu klik OK.
Daftar putih dapat berisi alamat IP spesifik, seperti
192.168.0.1, dan Blok CIDR, seperti192.168.0.0/24. Pisahkan beberapa entri dengan koma. Catatan: Menyetel daftar putih ke0.0.0.0/0mengizinkan akses dari Internet publik, sedangkan menyetelnya ke127.0.0.1memblokir semua akses eksternal. Daftar putih baru akan berlaku dalam waktu sekitar satu menit.
Setelah konfigurasi selesai, fungsi dapat mengakses database RDS melalui titik akhir publiknya.
-
Langkah 2: Akses RDS dari fungsi Anda
-
Login ke Konsol Function Compute. Di daftar fungsi, temukan fungsi target. Di halaman detailnya, klik tab Code dan masukkan kode sampel berikut di editor.
from flask import Flask, jsonify import pymysql import os from datetime import datetime import logging app = Flask(__name__) # Variabel global untuk menyimpan koneksi MySQL singleton _mysql_connection = None # Buat koneksi database (pola singleton) def getConnection(): global _mysql_connection try: # Jika koneksi sudah ada dan aktif, kembalikan koneksi tersebut. if _mysql_connection is not None: try: # Uji apakah koneksi valid dengan kueri sederhana. with _mysql_connection.cursor() as cursor: cursor.execute("SELECT 1") # Kueri sederhana untuk menguji status koneksi result = cursor.fetchone() if result and result[0] == 1: return _mysql_connection except pymysql.OperationalError: # Jika koneksi rusak, atur ulang. _mysql_connection = None # Jika koneksi belum ada atau rusak, buat koneksi baru. _mysql_connection = pymysql.connect( host=os.environ['MYSQL_HOST'], port=int(os.environ['MYSQL_PORT']), user=os.environ['MYSQL_USER'], password=os.environ['MYSQL_PASSWORD'], db=os.environ['MYSQL_DBNAME'] ) return _mysql_connection except Exception as e: logging.error(f"Terjadi error saat koneksi ke database: {e}") raise @app.route('/', defaults={'path': ''}) @app.route('/<path:path>', methods=['GET', 'POST', 'PUT', 'DELETE']) def hello_world(path): conn = getConnection() try: with conn.cursor() as cursor: # Kueri semua catatan dari tabel users. Anda harus mengganti 'users' dengan nama tabel aktual Anda. sql = "SELECT * FROM users" cursor.execute(sql) result = cursor.fetchall() columns = [desc[0] for desc in cursor.description] # Dapatkan daftar nama kolom # Konversi hasil kueri menjadi daftar dictionary users = [] for row in result: user = {} for idx, column_name in enumerate(columns): value = row[idx] if isinstance(value, datetime): # Tangani field datetime user[column_name] = value.strftime('%Y-%m-%d %H:%M:%S') else: user[column_name] = value users.append(user) if users: # Kembalikan respons JSON dengan semua pengguna return jsonify(users), 200 else: # Jika tidak ada pengguna yang ditemukan, kembalikan error 404 return jsonify({'error': 'Tidak ada pengguna yang ditemukan'}), 404 except Exception as e: logging.error(f"Terjadi error saat operasi database: {e}") return jsonify({'error': 'Error database'}), 500 if __name__ == '__main__': app.run(host='0.0.0.0', port=9000) -
Di halaman Detail Fungsi, pilih tab Configuration, temukan Advanced Settings, dan klik Modify di sebelah kanannya. Di panel Advanced Settings, temukan bagian Environment Variables, konfigurasikan variabel lingkungan berikut, lalu klik Deploy.
Parameter
Nilai
Deskripsi
MYSQL_HOST
rm-bp19u8e76ae****.mysql.rds.aliyuncs.com
Titik akhir instans RDS.
-
Jika Anda mengakses database RDS dalam VPC yang sama, atur variabel lingkungan ini ke titik akhir internal database tersebut.
-
Jika Anda mengakses database RDS lintas VPC atau wilayah berbeda, atur variabel lingkungan ini ke titik akhir publik database tersebut.
Pada daftar instans RDS, klik ID instans RDS yang dituju. Di panel navigasi sebelah kiri, klik Database Connection. Pada halaman Database Connection, Anda dapat memperoleh titik akhir internal atau publik database tersebut.
MYSQL_DBNAME
db_test
Nama database yang dibuat dalam instans RDS.
MYSQL_PASSWORD
*****
Password database.
MYSQL_PORT
3306
Port privat instans database.
MYSQL_USER
dms_user_****
Nama akun yang dibuat dalam instans RDS.
-
-
Di halaman detail fungsi, klik tab Code, lalu klik Test Function. Setelah fungsi dieksekusi berhasil, periksa hasil yang dikembalikan untuk memastikan kueri telah selesai.
Data JSON yang dikembalikan berisi catatan pengguna dengan field seperti
id,username,email,password_hash,created_at, danupdated_at.
Informasi lebih lanjut
-
Untuk contoh lain mengakses database ApsaraDB RDS for MySQL, lihat Function Compute Python mengakses database MySQL.
-
Jika Anda tidak dapat mengakses database Anda, lakukan pemecahan masalah berdasarkan gejalanya. Untuk informasi selengkapnya, lihat Penyebab umum kegagalan akses database.
-
ApsaraDB RDS mendukung mesin database MySQL, SQL Server, PostgreSQL, dan MariaDB. Untuk informasi selengkapnya, lihat Pengenalan ApsaraDB RDS.
-
Untuk menggunakan tool command-line Serverless Devs guna membuat fungsi dan mengakses database ApsaraDB RDS for MySQL, ikuti langkah-langkah berikut.