All Products
Search
Document Center

Function Compute:Mengakses ApsaraDB RDS for MySQL

Last Updated:Jun 22, 2026

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

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'?.

  1. 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.

    Catatan

    Pastikan 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.

  2. Di halaman detail fungsi, buka tab Configuration. Di bagian Network, peroleh Blok CIDR vSwitch yang dikonfigurasi untuk fungsi tersebut.

  3. Tambahkan Blok CIDR vSwitch yang diperoleh pada langkah sebelumnya ke daftar putih akses database.

    Penting

    Kami 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.

    1. Buka daftar instans RDS, pilih wilayah, lalu klik ID instans target.

    2. Di panel navigasi sebelah kiri, klik Whitelist and SecGroup.

      Di halaman Whitelist Settings, Anda dapat melihat mode daftar putih IP saat ini.

      Catatan

      Instans lama mungkin beroperasi dalam mode keamanan tinggi. Semua instans baru menggunakan mode daftar putih standar.

    3. 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.

  1. Login ke Konsol Function Compute. Di panel navigasi sebelah kiri, klik Functions. Pilih wilayah, lalu buat fungsi sesuai petunjuk.

  2. 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.

  3. Di halaman detail fungsi, buka tab Configuration. Di bagian Network, peroleh Alamat IP Elastis yang dikonfigurasi untuk fungsi tersebut.

  4. Tambahkan Alamat IP Elastis yang diperoleh pada langkah sebelumnya ke daftar putih akses database.

    Penting

    Kami 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.

    1. Buka daftar instans RDS, pilih wilayah, lalu klik ID instans target.

    2. Di panel navigasi sebelah kiri, klik Whitelist and SecGroup.

      Di halaman Whitelist Settings, Anda dapat melihat mode daftar putih IP saat ini.

      Catatan

      Instans lama mungkin beroperasi dalam mode keamanan tinggi. Semua instans baru menggunakan mode daftar putih standar.

    3. 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, seperti 192.168.0.0/24. Pisahkan beberapa entri dengan koma. Catatan: Menyetel daftar putih ke 0.0.0.0/0 mengizinkan akses dari Internet publik, sedangkan menyetelnya ke 127.0.0.1 memblokir 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

  1. 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)
    
  2. 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.

  3. 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, dan updated_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.

    Klik di sini untuk melihat prosedur Serverless Devs

    1. Instal Serverless Devs dan Docker, serta konfigurasikan kredensial Anda. Untuk informasi selengkapnya, lihat Quick start.

    2. Buat direktori kode bernama mycode, dan siapkan file s.yaml serta file kode app.py. Contoh file s.yaml disediakan di bawah ini. Untuk kode sampel, lihat kode yang disediakan di Langkah 2: Akses RDS dari fungsi Anda.

      Contoh s.yaml berikut ditujukan untuk mengakses database RDS dalam VPC yang sama. Jika Anda perlu mengakses database lintas VPC atau wilayah berbeda, lihat Skenario 2: Lintas VPC atau wilayah.

      # ------------------------------------
      #   Dokumentasi resmi: https://manual.serverless-devs.com/user-guide/aliyun/#fc3
      #   Tips: https://manual.serverless-devs.com/user-guide/tips/
      #   Jika Anda memiliki pertanyaan, bergabunglah dengan grup DingTalk: 33947367
      # ------------------------------------
      edition: 3.0.0
      name: hello-world-app
      access: "default"
      vars: # Variabel global
        region: "cn-hangzhou"  # Jika Anda mengakses database RDS dalam VPC yang sama, pastikan fungsi dideploy di wilayah yang sama dengan database RDS.
      resources:
        hello_world:
          component: fc3 
          actions:       
            pre-${regex('deploy|local')}: 
              - component: fc3 build 
          props:
            region: ${vars.region}              
            functionName: "start-python-0t1m"
            runtime: custom.debian10
            description: 'hello world by serverless devs'
            timeout: 10
            memorySize: 512
            cpu: 0.5
            diskSize: 512
            code: ./code
            customRuntimeConfig:
              port: 9000
              command:
                - python3
                - app.py
            internetAccess: true
            vpcConfig:
             vpcId: vpc-bp1dxqii29fpkc8pw**** # ID VPC tempat instans database berada.
             securityGroupId: sg-bp12ly2ie92ixrfc**** # ID security group.
             vSwitchIds: 
              - vsw-bp1ty76ijntee9z83**** # Pastikan Blok CIDR vSwitch ini ditambahkan ke daftar putih akses instans database.
            environmentVariables:
              PYTHONPATH: /code/python
              PATH: /code/python/bin:/var/fc/lang/python3.10/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin
              MYSQL_HOST: rm-bp1j1y7657640z5****.mysql.rds.aliyuncs.com  # Titik akhir internal instans database.
              MYSQL_PORT: "3306"  # Port privat instans database.
              MYSQL_USER: dms_user_****  # Akun untuk database di instans.
              MYSQL_PASSWORD: ****   # Password untuk akun database.
              MYSQL_DBNAME: db_test  # Nama database yang dibuat di instans.
    3. Jalankan perintah berikut untuk mem-build proyek.

      sudo s build --use-docker
    4. Jalankan perintah berikut untuk mendeploy proyek.

      sudo s deploy -y
    5. Jalankan perintah berikut untuk memanggil fungsi.

      Catatan

      Pastikan Blok CIDR vSwitch atau Alamat IP Elastis yang dikonfigurasi untuk fungsi telah ditambahkan ke daftar putih akses instans database. Untuk informasi selengkapnya, lihat Langkah 1.

      sudo s invoke -e "{}"