コンテナ化されたアプリケーションをApsaraDB RDSインスタンスに接続するには、コンテナ化されたアプリケーションのエンドポイントをApsaraDB RDSインスタンスのホワイトリストに追加し、Elastic Container Instanceベースのポッドを作成するときにデータベース接続情報を指定する必要があります。このトピックでは、Container Service for Kubernetes (ACK) Serverlessクラスタでポッドを作成するときに、ポッドをApsaraDB RDSインスタンスに接続する方法について説明します。このトピックでは、ApsaraDB RDS for MySQLインスタンスを使用します。
背景情報
ApsaraDB RDSは、安定性、信頼性、拡張性に優れたオンラインデータベースサービスです。ApsaraDB RDSは、アリババクラウドのApsara Distributed File Systemと高性能SSDを使用して、MySQL、SQL Server、PostgreSQLなどのデータベースエンジンをサポートしています。このトピックでは、ApsaraDB RDS for MySQLインスタンスを例として使用して、エラスティックコンテナインスタンスをApsaraDB RDSインスタンスに接続する方法を説明します。ビジネス要件に基づいてデータベースエンジンを選択できます。詳細については、「はじめに」トピックの「データベースエンジン」セクションを参照してください(はじめに)。
前提条件
ApsaraDB RDS for MySQLインスタンスが作成され、インスタンスのユーザーアカウントが作成されていること。詳細については、ApsaraDB RDS for MySQLインスタンスを作成するおよびApsaraDB RDS for MySQLインスタンスのデータベースとアカウントを作成するを参照してください。
ACK Serverlessクラスタが作成されていること。詳細については、ACK Serverlessクラスタを作成するを参照してください。
説明この例では、ACK Serverlessクラスタを使用しています。別のタイプのKubernetesクラスタを使用する場合は、Elastic Container Instanceに接続するために、仮想ノードがクラスタにデプロイされていることを確認してください。
ApsaraDB RDSインスタンスとKubernetesクラスタが相互に通信できることを確認してください。
ApsaraDB RDSインスタンスとKubernetesクラスタを同じ仮想プライベートクラウド(VPC)にデプロイすることをお勧めします。これにより、ApsaraDB RDSインスタンスとクラスタ内のアプリケーションは、VPCを介して相互に接続されます。インスタンスとクラスタを異なるVPCにデプロイする場合は、インスタンスとクラスタ内のアプリケーション間のインターネット接続を有効にする必要があります。
ApsaraDB RDSインスタンスのホワイトリストを設定し、データベースのエンドポイントを取得する。
VPC経由でApsaraDB RDSインスタンスにアクセスする
ApsaraDB RDSインスタンスとKubernetesクラスタが同じVPCにデプロイされている場合、クラスタ内のアプリケーションはVPC経由でインスタンスにアクセスできます。ApsaraDB RDSインスタンスのホワイトリストを設定し、データベースの内部エンドポイントを取得する必要があります。
ApsaraDB RDSインスタンスのホワイトリストを設定します。
Kubernetesクラスタ内のアプリケーションが内部ネットワーク経由でApsaraDB RDSインスタンスにアクセスする場合、ホワイトリストにIPアドレスまたはセキュリティグループを追加できます。
IPアドレス
VPCまたはvSwitchのCIDRブロックをホワイトリストに追加します。CIDRブロックに属するエラスティックコンテナインスタンスは、ApsaraDB RDSインスタンスにアクセスできます。詳細については、ApsaraDB RDS for MySQLインスタンスのIPアドレスホワイトリストを設定するを参照してください。
セキュリティグループ
セキュリティグループをApsaraDB RDSインスタンスのホワイトリストに追加すると、セキュリティグループに属するすべてのエラスティックコンテナインスタンスがApsaraDB RDSインスタンスにアクセスできます。詳細については、ApsaraDB RDS for MySQLインスタンスのセキュリティグループを設定するを参照してください。
ApsaraDB RDSインスタンスのデータベース接続ページからデータベースの内部エンドポイントを取得します。
インターネット経由でApsaraDB RDSインスタンスにアクセスする
ApsaraDB RDSインスタンスとACK Serverlessクラスタが異なるVPCにデプロイされている場合、クラスタ内のアプリケーションはインターネットを使用してインスタンスにアクセスする必要があります。ApsaraDB RDSインスタンスのホワイトリストを設定し、データベースのパブリックエンドポイントを取得する必要があります。手順:
パブリックエンドポイントを使用してApsaraDB RDSインスタンスにアクセスすると、インスタンスのセキュリティが危険にさらされます。注意して進めてください。
データ転送を高速化および保護するために、アプリケーションをACK Serverlessクラスタから、ApsaraDB RDSインスタンスと同じリージョンにデプロイされ、同じネットワークタイプを持つエラスティックコンテナインスタンスに移行することをお勧めします。これにより、アプリケーションは内部エンドポイント経由でApsaraDB RDSインスタンスにアクセスできます。
ApsaraDB RDSインスタンスのホワイトリストを設定します。
アプリケーションがインターネット経由でインスタンスにアクセスする場合、インスタンスのIPアドレスホワイトリストを設定する必要があります。詳細については、ApsaraDB RDS for MySQLインスタンスのIPアドレスホワイトリストを設定するを参照してください。
エラスティックコンテナインスタンスがNATゲートウェイを使用してインターネットにアクセスする場合、NATゲートウェイに関連付けられているEIPアドレスをIPアドレスホワイトリストに追加する必要があります。
エラスティックコンテナインスタンスがEIPを使用してインターネットにアクセスする場合、エラスティックコンテナインスタンスに関連付けられているEIPアドレスをIPアドレスホワイトリストに追加する必要があります。
データベースのパブリックエンドポイントを申請し、記録します。詳細については、ApsaraDB RDS for MySQLインスタンスのパブリックエンドポイントを申請または解放するを参照してください。
アプリケーションをApsaraDB RDSインスタンスに接続するように設定する
このトピックでは、VPCを使用して、ACK Serverlessクラスタ内のアプリケーションをApsaraDB RDSインスタンスに接続します。手順:
ACKコンソールにログインします。
クラスタページで、管理するクラスタを見つけ、クラスタ名をクリックします。クラスタの管理ページが表示されます。
ConfigMapを作成して、ApsaraDB RDSインスタンスへの接続を設定します。
説明ConfigMapを使用すると、環境設定をコンテナイメージから分離できます。これにより、アプリケーション設定の変更が容易になります。
左側のナビゲーションペインで、設定> Configmapを選択します。
ページの右上隅にある作成をクリックします。
ConfigMapを設定し、OKをクリックします。
表示されるパネルで、ConfigMapの名前を指定します。例:rds-config。次に、次の表に示すパラメータを設定します。
パラメータ
例
説明
host
rm-2zem97a62s9******.mysql.rds.aliyuncs.com
データベースのエンドポイント。エンドポイントは、ApsaraDB RDSインスタンスのデータベース接続ページで取得できます。
port
3306
データベースのポート番号。ポート番号は、ApsaraDB RDSインスタンスのデータベース接続ページで取得できます。
database
test-db
データベースの名前。データベースの名前は、ApsaraDB RDSインスタンスのデータベースページで取得できます。
シークレットを作成して、データベースのユーザー名とパスワードを追加します。
説明シークレットを使用すると、データベースのユーザー名やパスワードなどの機密情報をアプリケーションに安全に渡すことができます。
左側のナビゲーションペインで、設定> シークレットを選択します。
作成をクリックします。
シークレットを設定し、OKをクリックします。
表示されるパネルで、シークレットの名前を指定します。例:rds-secret。次に、次の表に示すパラメータを設定します。
パラメータ
例
説明
username
test
データベースにアクセスするために使用するユーザー名。ユーザー名は、ApsaraDB RDSインスタンスのアカウントページで取得できます。
password
pwd******
データベースにアクセスするために使用するパスワード。パスワードを忘れた場合は、アカウントページでパスワードをリセットできます。
Elastic Container Instanceベースのポッドを作成し、ポッドをApsaraDB RDSインスタンスに接続できるかどうかをテストします。
左側のナビゲーションペインで、ワークロード> ポッドを選択します。
YAMLから作成をクリックします。
YAMLファイルの内容を入力し、作成をクリックします。
ApsaraDB RDS for MySQLは、オープンソースのMySQLと完全に互換性があります。オープンソースのMySQLデータベースに接続するのと同じ方法で、データベースクライアントからApsaraDB RDSインスタンスに接続できます。次のコードは、設定例を示しています。
説明このトピックで提供されている設定例を使用してデータベース接続をテストする場合は、ApsaraDB RDSインスタンスにusernameという名前のテーブルを作成し、テーブルにuserという名前の列を追加します。
次のYAMLコードは、環境変数を使用して、データベースのエンドポイント、ポート番号、名前、ユーザー名、パスワードなどのデータベース接続情報を渡します。イメージには、データベースをクラスタに接続してデータを挿入するために使用できるPythonスクリプトが含まれています。
apiVersion: v1 kind: Pod metadata: labels: name: rds-test name: rds-test spec: containers: - name: test-rds image: registry.cn-hangzhou.aliyuncs.com/eci_open/sqlclient:1.0.1 # ApsaraDB RDSインスタンスをクラスタに接続するために使用されるPythonジョブを含むイメージ。 imagePullPolicy: IfNotPresent command: ["/bin/bash","-c","python3 /testapp/mysqlclient.py"] env: - name: MYSQL_HOST valueFrom: configMapKeyRef: name: rds-config # ConfigMapの名前。 key: host # ConfigMapのキー。 - name: MYSQL_PORT valueFrom: configMapKeyRef: name: rds-config # ConfigMapの名前。 key: port # ConfigMapのキー。 - name: MYSQL_DB valueFrom: configMapKeyRef: name: rds-config # ConfigMapの名前。 key: database # ConfigMapのキー。 - name: MYSQL_USERNAME valueFrom: secretKeyRef: name: rds-secret # シークレットの名前。 key: username # シークレットのキー。 - name: MYSQL_PWD valueFrom: secretKeyRef: name: rds-secret # シークレットの名前。 key: password # シークレットのキー。 restartPolicy: Never
上記のイメージには、usernameテーブルのuser列にデータを挿入するために使用できるPythonスクリプト(mysqlclient.py)が含まれています。スクリプトの内容:
import pymysql import os import time config = { 'host': str(os.getenv('MYSQL_HOST')), 'port': int(os.getenv('MYSQL_PORT')), 'user': str(os.getenv('MYSQL_USERNAME')), 'password': str(os.getenv('MYSQL_PWD')), 'database': str(os.getenv('MYSQL_DB')), } def mysqlClient(): print("connecting database ......") # データベースに接続しています...... db = pymysql.connect(**config) try: cursor = db.cursor() cursor.execute("INSERT INTO username(user) VALUES('Mrs')") cursor.close() db.commit() cursor = db.cursor() cursor.execute("SELECT user FROM username") result = cursor.fetchall() cursor.close() if result != None: print(result) time.sleep(99999) except Exception as e: print('System Error: ', e) # システムエラー: finally: db.close() if __name__ == '__main__': mysqlClient()
ApsaraDB RDSデータベースにログインし、接続結果を表示します。
ApsaraDB RDSコンソールにログインします。
左側のナビゲーションペインで、インスタンスをクリックします。上部のナビゲーションバーで、ApsaraDB RDSインスタンスがデプロイされているリージョンを選択します。次に、インスタンスを見つけ、インスタンスIDをクリックします。
左側のナビゲーションペインで、データベースをクリックします。
表示するApsaraDB RDSデータベースを見つけます。SQLクエリをクリックします。
表示されるダイアログボックスで、ApsaraDB RDSデータベースのユーザー名とパスワードを入力し、ログインをクリックします。
結果をクエリするSQLコマンドを入力します。
SELECT * FROM 'username'
コマンドを実行します。usernameテーブルのuser列にデータエントリが追加されていることがわかります。
FAQ
次の部分では、ApsaraDB RDSデータベースがElastic Container Instanceに接続できない一般的な理由について説明します。
異なるネットワークタイプ
異なるVPC
ドメイン名解決の失敗またはエラー
異なるリージョン
誤ったIPアドレスホワイトリスト設定
読み取り専用インスタンスにIPアドレスホワイトリストが設定されていない
無効な内部またはパブリックエンドポイント
接続クォータの枯渇
無効なユーザー名またはパスワード
無効なホストアドレス
ApsaraDB RDSインスタンスへの接続に使用するネットワークタイプに基づいてソリューションを選択します。詳細については、ApsaraDB for RDSインスタンスを接続できない場合はどうすればよいですか?を参照してください。