タグ: GAE

  • GASからMySQLへのアクセスにボトルネックがある

    GASからMySQL(Google Cloud SQL)へのアクセスにボトルネックがある。アクセス時に遅いので、調べてみると、GASが採用しているV8 Runtimeからの接続が遅いようだ。

    見つけたのは、以下の2つ。

    JDBC results.next iterator slower in V8
    https://issuetracker.google.com/issues/298658393

    Performance issues with JDBC
    https://issuetracker.google.com/issues/236832481

    多少待てるようなシステムであれば、いい。レスポンスが求められるのであれば、GAS自体のボトルネックもあり、DB接続のボトルネックもあり、別のものを考えたほうがいい。

  • 2023年11月の時点ではGASのJDBCからMySQL8.0に接続できる。

    ついにGoogle App Scriptから、JDBC経由で、Google CloudのCloud SQL のMySQL 8.0のインスタンスに接続を試して、成功した。JDBCがMySQL 8.0  に対応した。(忘れていたけれど、2022年11月も成功していたようだ・・・)

    なお、接続はSSL / TLS クライアント証明書による接続。

    GASサンプルコード:接続して、DB名とバージョンを取得する

    function myFunction() {
      dbConnectionSSL()
    }
    
    // --------------------------------
    // SSLで接続する
    // --------------------------------
    function dbConnectionSSL(){
      Logger.log('start dbConnection function.');
    
      // 接続先設定
      var connectionIp = '34.xx.xx.xx'; // 接続のMysqlのIPアドレス(ホスト名も可)
      var userName = 'username'; // 接続で使うユーザ名
      var passwd = 'passowrd'; // 接続で使うパスワード
      var databaseName = 'CT'; // データベース名
      var addr = 'jdbc:mysql://' + connectionIp + '/' + databaseName + '?useSSL=true';
    
      // SSL用の証明書を変数に入れる
      var clientKey = '\
    -----BEGIN RSA PRIVATE KEY-----\n\
    zylvsBC2kozS3rAxO1KUeD+rUbdDC/0PDbANXi4s/96qEN9vV80WBfH7Ut1TDdWt\n\
    ~~~中略~~~
    wGeppu4uYW4hSE6rATB+GhNwFJtAl1qz4M2nefKWBCc97wmZte/G\n\
    -----END RSA PRIVATE KEY-----';
    
      var clientCert = '\
    -----BEGIN CERTIFICATE-----\n\
    g+vn0NZqwTzhGhfXV9y7k0wsjqN3VjfvLSkSqinYRgDID/vb7FvAD3qyGyTiR9HT\n\
    ~~~中略~~~
    l+AUFjEP\n\
    -----END CERTIFICATE-----';
    
      var serverCa = '\
    -----BEGIN CERTIFICATE-----\n\
    pIa8Cnto3SIGqcwdV1SjA8iS1ohC3t+2igQq9aykOjd51jSQlVRqsE5lYty1VhiX\n\
    ~~~中略~~~
    fCcN9N2TqwxUXmD7g/+5lBi+wf+FBCPml/cyeRvDu5PZIqQ=\n\
    -----END CERTIFICATE-----';
    
      Logger.log('start mysql con');
      Logger.log(addr);
    
      var connectionInfo = {
        user: userName,
        password: passwd,
        _serverSslCertificate: serverCa,
        _clientSslCertificate: clientCert,
        _clientSslKey: clientKey
      }
    
      // DBにコネクションをはるオブジェクトを作る
      var connection = Jdbc.getConnection(addr, connectionInfo);
      Logger.log(connection.getCatalog());
    
      // Select文を実行するための処理
      // sqlステートメントをデータベースに送信するためのオブジェクトを作る
      var statement = connection.createStatement();
    
      // sqlを実行して結果をオブジェクトに入れる
      var result = statement.executeQuery('select @@version;');
    
      // 結果を取り出す
      while (result.next()) {
        var name = result.getString('@@version');
        // ログに出力する
        Logger.log(name);
      }
    
      // コネクションを閉じる
      connection.close();
    
      Logger.log('end');
    }
    
    // -----------------------------------
    // DB Connection close
    // -----------------------------------
    function dbConnectionClose(connection) {
      Logger.log('start db connection close');
    
      connection.close;  
    
      Logger.log('end db connection close');
    }
  • GAEのスタンダード環境でRubyが使えるようになる

    Google App Engineの標準環境で、Rubyのサポートが追加されるとのこと。

    いままで、GAEでは、App Engineフレキシブル環境ではRubyが使えた。今後は、スタンダード環境でも、サポートされ、つかえるようになるとのこと。これ、Ruby on Railsの環境としてはよさそう。「スケール・トゥ・ゼロ」というものをスタンダード環境だと使えるので、負荷の少ないときは0インスタンスまで少なくなるとのこと。これ、テスト環境向きだ。本番なら、スケールしていくわけなので。

    GAEも、いろいろとできるようになった。サポートもばっさり切られるけれど。