すべてのプロダクト
Search
ドキュメントセンター

Function Compute:ApsaraDB RDS for MySQLデータベースへのアクセス

最終更新日:Aug 28, 2024

このトピックでは、仮想プライベートクラウド (VPC) 経由でFunction ComputeからApsaraDB RDS for MySQLデータベースへのアクセスを実装するためのガイダンスを提供します。 具体的には、ApsaraDB RDS for MySQLデータベースにアクセスし、関連する操作を実行するために、関数およびデータベースのホワイトリストで仮想プライベートクラウド (VPC) 関連の設定を設定できます。 このトピックでは、Serverless Devsを使用して、Python 3ランタイムでApsaraDB RDS for MySQLデータベースにアクセスする関数をデプロイします。

始める前に

  • ApsaraDB RDS for MySQLインスタンスの作成

    重要
    • 作成するデータベースインスタンスが、データベースインスタンスにアクセスする必要がある関数と同じリージョンにあることを確認します。

    • Function Computeがサポートするゾーンにデータベースインスタンスを作成することを推奨します。 詳細については、「Function Computeが利用可能なゾーン」をご参照ください。

      データベースインスタンスがFunction Computeでサポートされているゾーンにない場合、Function Computeと同じゾーンのVPCにvSwitchを作成し、関数のVPC設定でこのvSwitch IDを使用できます。 同じVPC内のvSwitchは、プライベートネットワークを介して相互に通信できます。 したがって、Function ComputeはvSwitchを使用して、他のゾーンにあるVPCのリソースにアクセスできます。 詳細については、「」をご参照ください。vSwitchがサポートされていないゾーンエラーが報告された場合はどうすればよいですか?

  • アカウントとデータベースの作成

  • 作成したデータベースにuserという名前のテーブルを作成します。

    このトピックのindex.pyのサンプルコードのロジックは、ユーザーデータベーステーブル内のすべてのデータを照会することです。 したがって、事前にテーブルを作成する必要があります。

手順

  1. Serverless DevsとDockerをインストールし、AccessKey情報を設定します。

    詳細については、「Serverless Devsと依存関係のインストール」および「Serverless Devsの設定」をご参照ください。

  2. 次のコマンドを実行して、プロジェクトを初期化します。

    sudo s init 

    CLIで、ベンダーとしてAlibaba Cloudを指定し、クイックスタートモードを指定し、組み込みのPythonランタイムを選択します。 プロジェクト名とプロジェクトがデプロイされるリージョンを設定します。 この例では、start-fc-mysql-pythonプロジェクトが中国 (杭州) リージョンにデプロイされています。

  3. 次のコマンドを実行して、プロジェクトディレクトリに移動します。

    cd start-fc3-python
  4. 独自のビジネス要件に基づいてディレクトリファイルを変更します。

    • s.yamlファイルを編集します。 例:

      edition: 3.0.0
      name: hello-world-app
      access: "default"
      
      vars: # The global variables.
        region: "cn-hangzhou"
      
      resources:
        hello_world:
          component: fc3 # The component name.
          # actions:       # The custom execution logic. For more information about actions, visit https://docs.serverless-devs.com/serverless-devs/yaml#%E8%A1%8C%E4%B8%BA%E6%8F%8F%E8%BF%B0actions.
          props:
            region: ${vars.region}              # For information about how to use variables, visit https://docs.serverless-devs.com/serverless-devs/yaml#%E5%8F%98%E9%87%8F%E8%B5%8B%E5%80%BC.
            functionName: "start-python-0t1m"
            description: 'hello world by serverless devs'
            runtime: "python3.9"
            code: ./code
            handler: index.handler
            memorySize: 128
            timeout: 30
            internetAccess: true
            vpcConfig:
             vpcId: vpc-bp11y195luy47h8c**** # The ID of the VPC in which the database instance resides.
             securityGroupId: sg-bp1el3hto8hhkdu**** # The security group ID.
             vSwitchIds: 
              - vsw-bp116uemmj7fniub**** # Make sure that the CIDR block of the vSwitch is added to the whitelist of the database instance.
            environmentVariables:      
             PYTHONPATH: /code/python  
             MYSQL_HOST: rm-bp19j9og672d4****.mysql.rds.aliyuncs.com  # The private endpoint of the database instance.
             MYSQL_PORT: "3306"  # The private port of the database instance.
             MYSQL_USER: z*****  # The database created in the database instance.
             MYSQL_PASSWORD: 1****   # The password of the account that is used to access the database instance.
             MYSQL_DBNAME: db****  # The name of the database created in the database instance.
      重要

      関数用に設定したvSwitchのCIDRブロックがデータベースインスタンスのホワイトリストに追加されていることを確認します。 詳細については、「データベースのIPアドレスホワイトリストの設定」をご参照ください。

    • index.pyファイルを編集します。 次のコードスニペットは、例を示しています。 コードロジックは、ユーザーテーブル内のすべてのデータを照会します。

      # -*- coding: utf-8 -*-
      import pymysql  # You need to install the pymysql library first.
      import os
      import logging
      
      
      def handler(event, context):
          # Obtain the information used to connect the ApsaraDB RDS for MySQL database. In most cases, such information can be obtained by using environment variables or Key Management Service (KMS).
          db_host = os.environ['MYSQL_HOST']
          db_port = int(os.environ['MYSQL_PORT'])
          db_user = os.environ['MYSQL_USER']
          db_password = os.environ['MYSQL_PASSWORD']
          db_name = os.environ['MYSQL_DBNAME']
      
          # Establish a database connection.
          connection = pymysql.connect(host=db_host,
                                       port=db_port,
                                       user=db_user,
                                       password=db_password,
                                       db=db_name)
      
          try:
              with connection.cursor() as cursor:
                  # Query all data records in the user table.
                  sql = "SELECT * FROM user"
                  cursor.execute(sql)
                  result = cursor.fetchall()
      
                  for row in result:
                      print(f"User: {row}")
      
          except Exception as e:
              logging.error(f"Error occurred during database operation: {e}")
      
          finally:
              # Close the database connection.
              connection.close()
      
          return 'Finished querying the user table'
      
  5. 次のコマンドを実行してプロジェクトをビルドします。

    sudo s build --use-docker
  6. 次のコマンドを実行して、プロジェクトをデプロイします。

    sudo s deploy -y
  7. 次のコマンドを実行して、関数を呼び出します。

    sudo s invoke -e "{}"

    次のコードスニペットは、期待される出力を示しています。 返された結果は、ユーザーテーブルへのアクセスが成功したことを示します。

    ========= FC invoke Logs begin =========
    FC Invoke Start RequestId: 1-65d2b4b4-1502c418-30faff838bec
    FC Invoke End RequestId: 1-65d2b4b4-1502c418-30faff838bec
    
    Duration: 35.37 ms, Billed Duration: 36 ms, Memory Size: 128 MB, Max Memory Used: 14.16 MB
    ========= FC invoke Logs end =========
    
    Invoke instanceId: c-65d2b45f-15f440b6-a01ef0d32d36
    Code Checksum: 8737553540873826675
    Qualifier: LATEST
    RequestId: 1-65d2b4b4-1502c418-30faff838bec
    
    Invoke Result:
    Finished querying the user table
    > [hello_world] completed (0.25s)

データベースのIPアドレスホワイトリストの構成

重要

IPアドレスホワイトリストを使用して、関数がデータベースにアクセスすることを許可します。 セキュリティグループモードを使用しないでください。 そうしないと、関数がデータベースへの接続に失敗し、ビジネスに影響を与えることがあります。

  1. [インスタンス] ページに移動します。 上部のナビゲーションバーで、RDS インスタンスが存在するリージョンを選択します。 次に、RDSインスタンスを見つけ、インスタンスのIDをクリックします。

  2. 左側のナビゲーションウィンドウで、ホワイトリストとセキュリティグループ をクリックします。

    ホワイトリストの設定 タブで、IPアドレスホワイトリストのモードを表示できます。

    説明

    既存のRDSインスタンスは、拡張ホワイトリストモードで実行できます。 すべての新しいRDSインスタンスは標準ホワイトリストモードで実行されます。

  3. ホワイトリスト設定タブで、デフォルトホワイトリストグループを見つけ、変更をクリックします。

  4. ホワイトリストの編集ダイアログボックスでIPアドレスコンテンツを変更し、OK をクリックします。

    重要

    Function Computeで関数用に設定したvSwitchのCIDRブロックを入力します。

詳細情報