全部产品
Search
文档中心

Function Compute:Praktik Terbaik untuk Mengakses RDS MySQL

更新时间:Jul 02, 2025

Dalam Function Compute, status tidak dibagikan antara berbagai instance lingkungan eksekusi. Anda dapat menggunakan database untuk menyimpan data terstruktur secara permanen guna mencapai pembagian status. Melalui Function Compute, Anda dapat melakukan operasi seperti kueri dan penyisipan data pada database cloud. Topik ini menggunakan fungsi Python sebagai contoh untuk menjelaskan cara mengakses ApsaraDB RDS for MySQL dalam VPC yang sama atau lintas VPC dan wilayah.

Prasyarat

  • Buat instans RDS MySQL.

  • Buat database dan akun.

  • Logika dalam kode contoh index.py dalam topik ini adalah untuk menanyakan semua data dalam tabel database bernama users. Anda dapat memodifikasi nama tabel sesuai dengan situasi aktual Anda dan memastikan bahwa setidaknya ada satu catatan dalam tabel.

Prosedur

Langkah 1: Konfigurasikan daftar putih database

Skenario 1: Akses database RDS di VPC yang sama

Jika Anda memilih untuk mengakses database di VPC yang sama, pastikan bahwa instans database dan fungsi berada di wilayah yang sama. Kami merekomendasikan agar Anda membuat instans database di zona yang didukung oleh Function Compute. Untuk informasi lebih lanjut, lihat Zona yang didukung oleh Function Compute. Jika instans database Anda tidak berada di zona yang didukung oleh Function Compute, Anda dapat membuat vSwitch di VPC Anda di zona yang sama dengan Function Compute dan gunakan ID vSwitch ini dalam konfigurasi VPC fungsi. vSwitch di VPC yang sama dapat berkomunikasi satu sama lain melalui jaringan pribadi. Oleh karena itu, Function Compute dapat menggunakan vSwitch untuk mengakses sumber daya di VPC yang berada di zona lain. Untuk informasi lebih lanjut, lihat Apa yang harus saya lakukan jika terjadi kesalahan vSwitch berada di zona yang tidak didukung?.

  1. Masuk ke Konsol Function Compute, buat fungsi web Python, aktifkan akses VPC untuk fungsi tersebut, dan konfigurasikan sumber daya VPC target.

    Catatan

    Pastikan bahwa VPC yang dikonfigurasikan untuk fungsi tersebut sama dengan VPC tempat instans database dilampirkan.

    image

  2. Di halaman detail fungsi, pilih Configuration > Network, dan kemudian di halaman Network, peroleh blok CIDR dari vSwitch dalam konfigurasi fungsi.

    image

  3. Tambahkan blok CIDR dari vSwitch yang diperoleh di langkah sebelumnya ke daftar putih akses database.

    Penting

    Gunakan daftar putih alamat IP untuk mengotorisasi fungsi mengakses database. Jangan gunakan mode kelompok keamanan. Jika tidak, fungsi mungkin gagal terhubung ke database secara berkala, yang memengaruhi bisnis.

    1. Kunjungi Daftar instans RDS, pilih wilayah di bagian atas, dan klik ID instans target.

    2. Di bilah navigasi kiri, klik Whitelist and SecGroup.

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

      Catatan

      Instans RDS yang ada mungkin berjalan dalam mode daftar putih yang ditingkatkan. Semua instans RDS baru berjalan dalam mode daftar putih standar.

    3. Klik Modify di sebelah kanan grup Default. Di kotak dialog Modify Whitelist Group yang muncul, konfigurasikan blok CIDR IPv4 dari vSwitch yang diperoleh di Langkah 2 dalam daftar putih, dan klik OK.

      image

    Setelah konfigurasi selesai, fungsi dapat mengakses database RDS melalui titik akhir internal database.

Skenario 2: Akses database RDS lintas VPC atau wilayah

VPC dan wilayah yang berbeda sepenuhnya terisolasi secara logis satu sama lain. Secara umum, Anda tidak dapat mengakses database lintas VPC dan wilayah. Jika Anda perlu mengakses database lintas VPC atau wilayah, Anda dapat mengonfigurasi alamat IP publik statis untuk fungsi tersebut. Dalam kasus ini, sistem akan membuat gateway NAT publik di VPC tempat fungsi dilampirkan. Anda dapat menggunakan gateway publik untuk mengakses database melalui alamat IP publik.

  1. Masuk ke Konsol Function Compute. Di bilah navigasi kiri, klik Functions, pilih wilayah, dan buat fungsi sesuai petunjuk.

  2. Di halaman detail fungsi, pilih Configuration > Network. Di panel Network, konfigurasikan alamat IP publik statis untuk fungsi tersebut, dan klik Deploy.

    image

  3. Di kotak dialog Static Public IP Configuration yang muncul, pilih kotak centang di prompt, dan klik OK. Setelah konfigurasi selesai, atur parameter Allow Default NIC To Access Internet ke No untuk membuat alamat IP publik statis yang dikonfigurasikan berlaku.

  4. Di halaman detail fungsi, pilih Configuration > Network, dan di halaman Network, peroleh alamat IP publik statis yang dikonfigurasikan untuk fungsi tersebut.

    image

  5. Tambahkan alamat IP publik statis fungsi yang diperoleh di langkah sebelumnya ke daftar putih akses database.

    Penting

    Gunakan daftar putih alamat IP untuk mengotorisasi fungsi mengakses database. Jangan gunakan mode kelompok keamanan. Jika tidak, fungsi mungkin gagal terhubung ke database secara berkala, yang memengaruhi bisnis.

    1. Kunjungi Daftar instans RDS, pilih wilayah di bagian atas, dan klik ID instans target.

    2. Di bilah navigasi kiri, klik Whitelist and SecGroup.

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

      Catatan

      Instans RDS yang ada mungkin berjalan dalam mode daftar putih yang ditingkatkan. Semua instans RDS baru berjalan dalam mode daftar putih standar.

    3. Klik Modify di sebelah kanan grup Default. Di kotak dialog Modify Whitelist Group yang muncul, konfigurasikan blok CIDR IPv4 dari vSwitch yang diperoleh di Langkah 2 dalam daftar putih, dan klik OK.

      image

    Setelah konfigurasi selesai, fungsi dapat mengakses database RDS melalui titik akhir publik database.

Langkah 2: Akses RDS dalam fungsi

  1. Masuk ke Konsol Function Compute, temukan fungsi target dalam daftar fungsi, klik tab Code di halaman detail fungsi, dan tulis kode contoh berikut di editor kode.

    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 tidak terputus, kembalikan langsung
            if _mysql_connection is not None:
                try:
                    # Uji apakah koneksi valid (tes perintah 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 terputus, reset
                    _mysql_connection = None
    
            # Jika koneksi tidak ada atau terputus, buat ulang
            _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 kesalahan selama koneksi 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 dalam tabel users, modifikasi tabel users sesuai nama tabel aktual
                sql = "SELECT * FROM users"
                cursor.execute(sql)
                result = cursor.fetchall()
                
                columns = [desc[0] for desc in cursor.description]  # Dapatkan daftar nama bidang
    
                # Ubah hasil kueri menjadi daftar kamus
                users = []
                for row in result:
                    user = {}
                    for idx, column_name in enumerate(columns):
                        value = row[idx]
                        if isinstance(value, datetime):  # Tangani tipe bidang tanggal
                            user[column_name] = value.strftime('%Y-%m-%d %H:%M:%S')
                        else:
                            user[column_name] = value
                    users.append(user)
                    
                if users:
                    # Kembalikan respons JSON untuk semua pengguna
                    return jsonify(users), 200
                else:
                    # Jika tidak ada pengguna yang ditemukan, kembalikan kesalahan 404
                    return jsonify({'error': 'Tidak ada pengguna yang ditemukan'}), 404
    
        except Exception as e:
            logging.error(f"Terjadi kesalahan selama operasi database: {e}")
            return jsonify({'error': 'Kesalahan database'}), 500
    
    
    if __name__ == '__main__':
        app.run(host='0.0.0.0', port=9000)
    
    
  2. Di halaman detail fungsi, pilih Configuration > Environment Variables, klik Edit, dan konfigurasikan variabel lingkungan berikut di panel Environment Variables.

    Nama variabel lingkungan

    Nilai variabel lingkungan

    Deskripsi

    MYSQL_HOST

    rm-bp19u8e76ae****.mysql.rds.aliyuncs.com

    Titik akhir instans database.

    • Jika Anda memilih skenario Database RDS di VPC yang sama, atur variabel lingkungan ini ke titik akhir internal database.

    • Jika Anda memilih skenario Akses database RDS lintas VPC atau wilayah, atur variabel lingkungan ini ke titik akhir publik database.

    Di Daftar instans RDS, klik ID instans RDS target. Di bilah navigasi kiri, klik Database Connection. Di halaman Database Connection, peroleh titik akhir internal atau publik database.

    MYSQL_DBNAME

    db_test

    Nama database yang dibuat di instans RDS.

    MYSQL_PASSWORD

    *****

    Kata sandi akun database.

    MYSQL_PORT

    3306

    Port pribadi instans database.

    MYSQL_USER

    dms_user_****

    Nama pengguna akun yang digunakan untuk terhubung ke instans RDS.

  3. Di halaman detail fungsi, klik tab Kode, klik Uji Fungsi, dan lihat hasil yang dikembalikan setelah eksekusi berhasil. Operasi kueri tabel telah berhasil diselesaikan.

    image

Informasi lebih lanjut

  • Untuk lebih banyak contoh mengakses database RDS MySQL, lihat Function Compute Python mengakses database MySQL.

  • Jika akses database Anda gagal, Anda perlu mendiagnosis berdasarkan gejala masalah. Untuk informasi lebih lanjut, lihat Penyebab umum kegagalan akses database.

  • ApsaraDB RDS mendukung mesin database MySQL, SQL Server, PostgreSQL, dan MariaDB. Untuk informasi lebih lanjut, lihat Apa itu ApsaraDB RDS?.

  • Jika Anda ingin menggunakan alat baris perintah Serverless Devs untuk membuat fungsi dan mengakses database RDS MySQL, ikuti langkah-langkah berikut.

    Klik di sini untuk melihat prosedur Serverless Devs

    1. Instal Serverless Devs dan Docker, dan tambahkan informasi kunci. Untuk informasi lebih lanjut, lihat Mulai Cepat.

    2. Buat direktori kode mycode, siapkan file s.yaml dan file kode app.py. Berikut adalah contoh file s.yaml. Untuk kode contoh, lihat kode contoh yang disediakan di Langkah 2: Akses RDS dalam fungsi.

      Contoh s.yaml berikut berlaku untuk skenario mengakses database RDS di VPC yang sama. Jika Anda perlu mengakses database lintas VPC dan wilayah, lihat Skenario 2: Akses database RDS lintas VPC atau wilayah.

      # ------------------------------------
      #   Panduan 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 memilih untuk mengakses database RDS di VPC yang sama, pastikan bahwa fungsi diterapkan 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 kelompok keamanan
             vSwitchIds: 
              - vsw-bp1ty76ijntee9z83**** # Pastikan bahwa blok CIDR dari vSwitch ini dikonfigurasikan dalam 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 pribadi instans database
              MYSQL_USER: dms_user_****  # Database yang dibuat di instans database
              MYSQL_PASSWORD: ****   # Kata sandi instans database
              MYSQL_DBNAME: db_test  # Nama database yang dibuat di instans database
    3. Jalankan perintah berikut untuk membangun proyek:

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

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

      Catatan

      Pastikan bahwa blok CIDR dari vSwitch atau alamat IP publik statis yang Anda konfigurasikan untuk fungsi telah ditambahkan ke daftar putih akses instans database. Untuk informasi lebih lanjut, lihat Langkah 3.

      sudo s invoke -e "{}"