IBM Cloud Docs
外部アプリケーションの接続

外部アプリケーションの接続

アプリケーションおよびドライバーは、接続ストリングを使用して、IBM Cloud® Databases for MySQLへの接続を確立します。 このサービスは、ドライバーおよびアプリケーション専用の接続ストリングを提供します。 接続文字列は、デプロイメントの [概要][エンドポイント] パネルに表示されます。また、Cloud Databases の CLI プラグイン および Cloud Databases API から取得することもできます。

デプロイメント上に作成されたすべての資格情報は、その接続ストリングを使用できます。 すべての接続およびアプリケーションに対して admin ユーザーを使用できますが、接続するアプリケーション専用のユーザーを作成することをお勧めします。 資格情報の生成方法については、ユーザーの作成と接続文字列の取得についてのページを参照してください。

言語のドライバーによる接続

ドライバーがデプロイメントに接続するために必要なすべての情報は、接続文字列の「mysql」セクション内にあります。 参照用に、接続文字列の構成要素を次の表に示します。

mysql/URI接続情報
フィールド名 索引 説明
Type 接続のタイプ - MySQL, の場合は「URI」。
Scheme URIのスキーム - MySQL, の場合は "mysql" です。
Path URI のパス- MySQL の場合は、データベース名。 デフォルトは ibmclouddb です。
Authentication Username 接続に使用するユーザー名。
Authentication Password ユーザーのパスワードは、 $PASSWORD のように表示されます。
Authentication Method 認証が行われる方法。「direct」認証はドライバーによって処理されます。
Hosts 0... ホスト名と接続先ポート。
Composed 0... Scheme、Authentication、Host、Pathを組み合わせたURI。
Certificate Name データベース展開のためのサービス専有証明書の割り当て名。
Certificate Base64 base64 でエンコードされたバージョンの証明書
  • 0... は、配列内のこれらの項目の 1 つ以上を示します。

接続情報の「Composed」フィールドに URI 形式の接続文字列があれば、MySQL ドライバーの多くはデプロイメントに接続できます。 例 :

mysql://ibm_cloud_30399dec_4835_4967_a23d_30587a08d9a8:$PASSWORD@981ac415-5a35-4ac7-b6bb-fb609326dc42.8f7bfd8f3faa4218aec56e069eb46187.databases.appdomain.cloud:32704/ibmclouddb?ssl-mode=verify-full

ssl-mode の状態について詳しくは、 追加の接続パラメーターを参照してください。

以下の例では、接続ス文字列および Java ドライバー jdbc の情報を使用して、データベースに接続します。

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

public class App {
 private final String STATUS_COMMAND = "SHOW VARIABLES LIKE '%version%';";

 private Connection connect = null;
 private Statement stmt = null;
 private ResultSet rs = null;

 private final String url = "mysql://127.0.0.1:30799";
 private final String username = "";
 private final String password = "";
 private final Boolean useSSL = true;

 public static void main(String args[]) throws Exception {
   App app = new App();
   final byte maxConnectionAttempt = 5;
   byte currentConnectionAttempt = 0;

   while (!app.connectDatabase() && currentConnectionAttempt < maxConnectionAttempt)
      ++currentConnectionAttempt;

   if (currentConnectionAttempt >= maxConnectionAttempt) {
      System.out.println(currentConnectionAttempt + " weren't successfull!");
         } else {
            app.printStatus();
            app.closeConnection();
         }
   }

   public void printStatus() {
         try {
            stmt = connect.createStatement();
            rs = stmt.executeQuery(STATUS_COMMAND);
            while (rs.next())
            System.out.println(rs.getString(1) + ": " + rs.getString(2));
         } catch (SQLException ex) {
            System.out.println("SQLException: " + ex.getMessage());
            System.out.println("SQLState: " + ex.getSQLState());
            System.out.println("VendorError: " + ex.getErrorCode());
            closeConnection();
         }
   }

   private void closeConnection() {
      try {
         if (rs != null) {
            rs.close();
         }

         if (stmt != null) {
            stmt.close();
         }

         if (connect != null) {
            connect.close();
         }
      } catch (Exception e) {
         System.out.println(e.getMessage());
      }
      System.out.println("Connection closed.");
   }

   public boolean connectDatabase() {
      // https://dev.mysql.com/doc/connector-j/8.0/en/connector-j-usagenotes-connect-drivermanager.html
      try {
            Properties props = new Properties();
            props.setProperty("user", username);
            props.setProperty("password", password);
            props.setProperty("useSSL", Boolean.toString(useSSL));
            props.setProperty("sslMode", (useSSL ? "REQUIRED" : "DISABLED"));
            props.setProperty("requireSSL", Boolean.toString(useSSL));
            props.setProperty("verifyServerCertificate", Boolean.toString(useSSL));

            Class.forName("com.mysql.cj.jdbc.Driver");
            connect = DriverManager.getConnection("jdbc:" + url, props);
            return true;
      } catch (SQLException ex) {
            System.out.println("SQLException: " + ex.getMessage());
            System.out.println("SQLState: " + ex.getSQLState());
            System.out.println("VendorError: " + ex.getErrorCode());
      } catch (ClassNotFoundException ex) {
            System.out.println("Connector class can not be found: " + ex.getMessage());
      }
      return false;
   }
}

以下の例では、接続文字列および Python ドライバー pymysql からの情報を使用して、データベースに接続します。 これは接続の簡単な例に過ぎません。エラー処理も再試行ロジックもないので、実稼働環境に適しているとはいえません。

import pymysql
connection = pymysql.connect(
  host="hostname",
  port=32089,
  user="username",
  passwd="password",
  ssl_ca="/home/user/mysql_ca.crt",
  ssl_verify_cert=True,
  ssl_verify_identity=True)

cursor = connection.cursor()
cursor.execute("SHOW STATUS;")

for row in cursor:
    print(row[0] + "\t" + row[1])

cursor.close()
connection.close()

ドライバーTLSおよびサービス独自証明書のサポート

Databases for MySQL へのすべての接続は TLS 1.2 が有効になっているので、接続に使用するドライバーは、暗号化のサポートが可能であることが必要です。 また、ドライバが接続時にサーバを検証できるように、配備にはサービス専有証明書も付属しています。

詳しくは、 Cloud Databases Certificates FAQを参照してください。

サービス独自証明書の使用

  1. *「エンドポイント」*パネルまたは接続情報の Base64 フィールドから証明書情報をコピーします。
  2. 必要に応じて、Base64 ストリングをテキストにデコードします。
  3. 証明書をファイルに保存します (ファイル名は、提供される名前をそのまま使用することも、自分で指定することもできます)。
  4. ドライバーまたはクライアントに証明書へのパスを提供します。

CLIエンドポイントパネル※
エンドポイントパネル
CLIエンドポイントパネル

サービス独自証明書のCLIプラグインサポート

コマンド ibmcloud cdb deployment-cacert "your-service-name" を使用して、デプロイメントのデコードされた証明書を CLI プラグインと共に表示することができます。 これにより、base64 がテキストにデコードされます。 コマンドの出力をコピーしてファイルに保存し、そのファイルのパスをドライバーに提供します。

その他のドライバー

MySQL には、多くの言語ドライバーがあります。 最もよく使用されているドライバーを以下の表にいくつか示します。 詳しくは、MySQLの 「コネクターおよび API」 を参照してください。

MySQLドライバ
言語 ドライバー
PHP mysql トランザクションの API サポート
Ruby ruby-mysql Ruby/MySQLAPI
C# ODBC LiMySQL ODBC開発者ガイド
Go mysql Go-MySQL-Driver

PHP を使用して MySQL に接続する場合、認証プラグインを sha256_password から mysql_native_password に変更する必要があります。