Cloud SQL

App Maker のアプリは通常、Cloud SQL にデータを保存します。Cloud SQL はクラウド上でフルマネージドの SQL データベースを提供する Google Cloud Platform(GCP)サービスです。Cloud SQL の利点については、こちらをご覧ください。

アプリのデベロッパーとして、Cloud SQL インスタンスを 2 種類から選択できます。

  • デフォルト - G Suite 管理者は Cloud SQL インスタンスを設定できます。このインスタンスは組織内の App Maker のアプリに共有されます。デフォルトのインスタンスが設定されている状態で 1 つ以上の Cloud SQL データモデルが追加されると、アプリ用として新しいデータベースが自動的に作成されます。アプリで、使いやすく設定が不要なデータベースが必要な場合は、このオプションを選択してください。多くの組織では、デベロッパーがアプリのプロトタイピングとテストを行う間はデフォルトのインスタンスを使用し、本番環境用のアプリとしてデプロイが可能になった時点で、カスタム インスタンスに切り替えています。

  • カスタム - 管理者によりデフォルトの Cloud SQL インスタンスが設定されると、独自の Cloud SQL インスタンスも設定できるようになります。次のような場合にこのオプションを選択してください。

    • アプリケーションで、大規模な数のユーザーを取り扱ったり、大量のデータを保存したりする場合。
    • 他のアプリケーションとデータベースを共有する必要がある場合。
    • データベースを管理する必要がある場合や、Cloud SQL インスタンスの制御を維持する必要がある場合。

Cloud SQL のセキュリティ

アプリで Cloud SQL インスタンスを使用する場合、デフォルト インスタンス、カスタム インスタンスのいずれの場合でも、転送時および保存時の認証情報が常に暗号化されます。

  • デフォルト Cloud SQL - 認証情報は App Maker サーバーに保存されます。エンドユーザーやアプリのデベロッパーは、この情報にアクセスできません。

  • カスタム Cloud SQL - デベロッパーによって App Maker へ Cloud SQL の認証情報が送信されると、それ以降、アプリのデベロッパーは認証情報を閲覧できなくなります。デベロッパーがエディタでアプリに関する作業を行っている間は、App Maker により認証情報がブラウザに保存されます。デベロッパーがブラウザタブの再読み込みやクローズを行うと、認証情報は削除されます。

    デベロッパーがカスタム Cloud SQL モデルを使用してアプリをデプロイする場合、認証情報はデプロイされたアプリとともに Google サーバーに保存されます。エンドユーザーは認証情報にアクセスできません。

始める前に

App Maker と Cloud SQL を使用する前に、セキュリティとコストに関する次の注意事項をあらかじめご確認ください。

  • GCP に保存されるデータの所在は、G Suite を利用する組織の外部になります - 一部の組織、特に政府機関では機密データの保存に関する要件が厳密です。GCP と G Suite はともにプライバシーとセキュリティについて厳格な基準を満たしていますが、各サービスの使用にあたり異なる条件が求められる可能性があります。プライバシー基準とセキュリティ基準への準拠については、以下をご覧ください。

  • Cloud SQL は GCP に含まれています - 無料トライアルを開始して、カスタム インスタンスをお試しいただけます。ただし、継続利用の際には、組織への費用請求が発生します(料金の詳細をご覧ください)。App Maker アプリの場合、通常の月額料金は非常に少額です。

アプリで新しい Cloud SQL インスタンスを使用する

デフォルトの Cloud SQL インスタンスを使用しない場合は、カスタム Cloud SQL インスタンスを使用できます。G Suite 管理者は、カスタム Cloud SQL インスタンスを使用する前に、デフォルトのインスタンスを設定する必要があります。新しいデータベースを作成できるほか、アプリで既存のカスタム データベースを使うことも可能です。新しいカスタム インスタンスを作成する場合、その設定と App Maker への統合に一定の時間が必要です。

注: アプリをカスタム Cloud SQL インスタンスにあるデータベースへ接続するには、G Suite 管理者によるデフォルトの Cloud SQL インスタンス設定が必要です。

新しいインスタンスを設定する場合は、第 2 世代の Cloud SQL インスタンスを使用することをおすすめします。App Maker は第 1 世代のインスタンスもサポートします。インスタンスの種類によって料金とパフォーマンス特性が異なるため、インスタンスの作成前に、その機能をよく確認してください。

以降の手順では次の準備が必要です。

  • GCP Console へのアクセス
  • Cloud SQL のインスタンスとユーザーを作成する権限

第 2 世代

  1. まだ作成していない場合は、us-central リージョンに第 2 世代の Cloud SQL for MySQL インスタンスを作成してください。
  2. アプリからデータベースにアクセスできるように、GCP Console で MySQL のユーザー アカウントを作成します。

    アプリでデータベースへ接続する際に入力できるよう、ユーザー名とパスワードを記録しておきます。ユーザー アカウントを介した不正アクセスを防ぐために、インスタンス上のすべてのアカウントに強力なパスワードを設定することをおすすめします。

  3. GCP Console で新しいデータベースを作成します。
  4. App Maker を App Engine 上で実行します。クラウド プロジェクトにサービス アカウントを追加して、App Engine との接続を設定します。
    1. [IAM と管理] プロジェクト ページに移動します(GCP Console でメニュー [IAM と管理] をクリックします)。
    2. Cloud SQL インスタンスを含むプロジェクトを選択します。
    3. [追加] をクリックします。
    4. [新しいメンバー] ダイアログで次のように入力します。
      appmaker-maestro@appspot.gserviceaccount.com
      役割として [Cloud SQL] [Cloud SQL クライアント] を選択します。
    5. [保存] をクリックします。
    6. 他のデベロッパーがこのアプリを編集またはデプロイする場合は、新しいメンバーとして Google アカウントを追加し、Cloud SQL クライアントの役割を割り当てます。
  5. インスタンスの詳細をコピーします。
    1. Cloud SQL インスタンスのページを開きます(GCP Console でメニュー [SQL] をクリックします)。
    2. 対象のインスタンスをクリックして、[インスタンス接続名] フィールドを確認します。
    3. [インスタンス接続名] ボックスで、[コピー] をクリックします。
  6. アプリを設定して、カスタム Cloud SQL データベースが使用できるようにします。
    1. App Maker でアプリを開き、設定アイコン [データベース] をクリックします。
    2. [カスタム Cloud SQL データベースに切り替える] をクリックします。
    3. インスタンスの詳細を貼り付け、手順 3 で作成したデータベース名を追加します。形式は次のようにします。
      projectName:regionName:instanceName/databaseName
    4. データベース ユーザー アカウントのユーザー名とパスワードを入力し、[続行] をクリックします。

第 1 世代

App Maker は第 1 世代のインスタンスをサポートします。ただし、新しいインスタンスを作成する場合には、第 2 世代のインスタンスの作成をおすすめします。

  1. まだ作成していない場合は、第 1 世代のインスタンスを作成します
  2. 作成したインスタンスのユーザー アカウントを構成します。
    • root アカウントのパスワードを変更します。App Engine 接続(次の手順で作成します)を介した不正アクセスを防ぐために、アカウントに強力なパスワードを設定することをおすすめします。
    • アプリのデータベース アクセスに使用されるユーザー アカウントを作成します。データベース ユーザーの作成にあたり、次のことを行います。
      • ホスト名には localhost を指定します。
      • 不正アクセス防止のため、アカウントに強力なパスワードを設定してください。

      アプリでデータベースへ接続する際に入力できるよう、ユーザー名とパスワードを記録しておきます。

  3. GCP Console で新しいデータベースを作成します。
  4. App Maker を App Engine 上で実行します。Cloud SQL インスタンスに App Maker のアプリケーション ID を追加して、App Engine との接続を設定します。
    1. Cloud SQL インスタンス ページに移動します(GCP Console でメニュー [SQL] をクリックします)。
    2. インスタンスをクリックして [概要] ページを開き、[承認] タブをクリックします。
    3. [プロジェクト ID を追加] をクリックし、次のように入力します。
      appmaker-maestro
    4. [完了] をクリックして編集モードを終了します。
    5. [保存] をクリックしてインスタンスを更新します。
  5. アプリにカスタム Cloud SQL インスタンスを追加します。
    1. アプリを開き、設定アイコン [データベース] をクリックします。
    2. [カスタム Cloud SQL データベースに切り替える] をクリックします。
    3. 次の形式でアドレスを入力します。
      projectName:instanceName/databaseName
    4. データベース ユーザー アカウントのユーザー名とパスワードを入力し、[続行] をクリックします。

アプリに既存の Cloud SQL データベースを使用する

既存データが Cloud SQL にある場合、アプリでそのデータを使用するモデルを作成するには、次の操作を行います。

  1. アプリにインスタンスの詳細を追加します。
    1. Cloud SQL インスタンス ページを開きます(GCP Console でメニュー [SQL] をクリックします)。
    2. 対象のインスタンスをクリックして、[インスタンス接続名] フィールドを確認します。
    3. [インスタンス接続名] ボックスで、[コピー] をクリックします。
    4. App Maker でアプリを開き、設定アイコン [データベース] をクリックします。
    5. [カスタム Cloud SQL データベースに切り替える] をクリックします。
    6. インスタンスの詳細を貼り付け、既存のデータベース名を追加します。次の形式を使用します。 projectName:regionName:instanceName/databaseName
    7. データベース ユーザー アカウントのユーザー名とパスワードを入力し、[続行] をクリックします。
  2. App Maker の UI で、[データ] の横にある追加アイコン をクリックします。
  3. [Google Cloud SQL(既存)] を選択します。
  4. 次の形式でアドレスを入力します。

    • 第 1 世代 - projectName:instanceName/databaseName
    • 第 2 世代 - projectName:regionName:instanceName/databaseName
  5. データベース ユーザー アカウントのユーザー名とパスワードを入力します。

  6. リストからテーブルを選択して、[インポート] をクリックします。結合テーブル以外であればどのようなテーブルでもインポートできます。

関係する 2 つのテーブルを両方ともインポートすると、App Maker は自動的にリレーションを作成します。App Maker は、結合テーブルやインポートされたテーブルにある外部キー制約を使用する Cloud SQL データベースのリレーションを認識します。たとえば、テーブル A がテーブル B に対する外部キーを持つ場合、App Maker は自動的に A から B への多対 1 リレーションを作成します。

Cloud SQL データベースのスキーマが変更された場合は、モデルを更新できます。

  1. 設定アイコン [データベース] の順にクリックします。
  2. [モデルとリレーションの互換性] の下にあるチェックボタンをクリックします。変更のあったデータベースと一致するようにすべての Cloud SQL モデルを更新するか、モデルと一致するようにデータベースを更新するか選択できます。

モデルを更新する場合、App Maker は変更のあったフィールド名、検証プロパティやイベントなどのモデルへの変更を保持します。ただし、Cloud SQL からフィールドが削除された場合は、対応するフィールドもモデルから削除されます。

アプリの Cloud SQL 設定を更新する

設定アイコン [データベース] で次のことができます。

  • デフォルト SQL インスタンスへの切り替え
  • インスタンス アドレスの更新
  • モデルとリレーションの互換性の確認

デフォルト Cloud SQL データベースとカスタム Cloud SQL データベースを切り替える

デフォルトの Cloud SQL インスタンスを設定している組織では、新しいモデルにこのインスタンスが使用されます。デフォルトの Cloud SQL データベースは、設定が不要で使いやすいデータベースをアプリで使用する場合に適しています。

デフォルトのデータベースが想定する要件に合わない場合は、カスタム データベースへの変換が可能です。

  1. 設定していない場合は、カスタム Cloud SQL インスタンスを設定します。新しいインスタンスのリージョンとして us-central を選択します。
  2. アプリを開き、設定アイコン [データベース] の順に選択します。
  3. チェックボタンを押して、モデルとリレーションの互換性を確認します。App Maker により互換性の問題が発見された場合、データベースのデータを削除しないと次の手順に進めないことがあります。
  4. 手順を進められる状態になったら、[カスタム Cloud SQL データベースに切り替える] ボタンをクリックします。
  5. 次の形式でアドレスを入力します。

    • 第 1 世代 - projectName:instanceName/databaseName
    • 第 2 世代 - projectName:regionName:instanceName/databaseName
  6. データベース ユーザー アカウントのユーザー名とパスワードを入力し、[続行] をクリックします。

カスタム データベースに切り替えた後、デフォルトのデータベースに戻すこともできます。

Cloud SQL レコードを使用する

Cloud SQL モデルの各レコードは、テーブルの行を表します。App Maker レコードを作成すると、Cloud SQL インスタンスにより対応するテーブルに行が追加されます。

App Maker は通常、レコードのキーとしてテーブルの主キー列を使用します。レコードの作成後、主キーの値を変更することはできません。なお、次のような場合、キーが一致しないことがあります。

  • newRecord() を使ってサーバーで作成されたレコードは、主キー列が割り当てられた状態でも、保存されるまでは null キーを保持します。

  • クライアント上のドラフト レコードの場合、レコードが保存されるまでは、主キー列と一致しない一時的なキーが保持されます。

  • 手動保存モードのデータソースでクライアント上に作成されたレコードの場合、レコードが保存された後も、主キー列と一致しない一時キーが保持されます。

App Maker での主キー処理にはいくつかの方法があります。

Cloud SQL の主キー
通常の主キー Cloud SQL テーブルで通常の主キーが使用されている場合、そのキーに対応するアプリモデル内のフィールドが必須となり、レコードの保存前にその値を指定する必要があります。必須フィールドの処理方法の詳細については、「データを検証する」をご覧ください。
サロゲート主キー Cloud SQL テーブルでサロゲートキーが使用されている場合、レコードキーより先に主キーを設定できます。また、データベースによる主キーの提供が可能な場合は、レコードキーを null のままにして、App Maker に自動更新させることができます。なお、手動保存モードのデータソースを使い、クライアント上で作成されたレコードに対して、この方法を使用することはできません。
自動インクリメント主キー

主キーが整数型の場合は、レコードの作成時に、Cloud SQL によるシーケンス番号を値とした主キーの自動割り当てが可能です。この場合、主キーのフィールド値をユーザーやアプリから提供する必要はありません。

App Maker でこのオプションを設定するには:

  1. ナビゲーション ペインの [データ] セクションで、データモデルをクリックします。
  2. [フィールド] タブで、自動インクリメントを設定する数値フィールドをクリックします。
  3. 詳細設定アイコン をクリックして [自動インクリメント] を選択します。
一意の ID による主キー

App Maker では、レコードの作成時に主キーのフィールドに一意の ID を設定できます。一意の ID の長さは 12 文字で、ランダムに生成されます。ユーザーやアプリによる指定ではありません。

ユーザーが一部のレコードにしかアクセスできないときに、テーブルにあるレコードの順序や総数に関する情報を知らせないようにする場合は、この一意の ID を主キーに使用します。

すでに数値の主キーが存在する App Maker モデルで、一意の ID による主キーを作成するには:

  1. ナビゲーション ペインの [データ] セクションで、データモデルをクリックするか、新しいデータモデルを作成します。
  2. [フィールド] タブで [ID] フィールドをクリックします。
  3. 詳細設定アイコン をクリックして [自動インクリメント] チェックボックスをオフにします。
  4. [フィールドを追加] [文字列] の順にクリックします。
  5. [主キーとして設定] をクリックします。
  6. フィールド名を入力します(例:「uniqueID」)。
  7. 詳細設定アイコン をクリックして [一意の自動識別子] を選択します。
  8. (任意)[ID] フィールドを削除します。

リレーション

外部キーフィールドに対応するフィールドが、サーバー スクリプトを使って直接読み込まれる場合があります。クライアント側では、外部キーフィールドの値とそれに対応する関連付けが、リレーションとして変更される可能性があります。リレーションの変更について、詳細をご確認ください。

ビュー

Cloud SQL ビューを読み取り専用のデータモデルとしてインポートできます。ビューに基づくモデルでは、結合、集計、サブクエリなどの SQL クエリを利用できます。たとえば、以下のスキーマではビューを使用して、テーブルの集計データを App Maker で簡単に表示できるようにしています。

CREATE TABLE Orders (FruitName varchar(128), int Amount);
CREATE VIEW FruitOrders AS SELECT FruitName, sum(Amount) AS Amount FROM
    Orders GROUP BY FruitName ORDER BY FruitName;

計算 SQL モデル

計算 SQL モデルでは、データ取得に Cloud SQL クエリを使用します。他の計算データソースと同様に SQL データソースでのレコード作成、削除、更新はできません。

計算 SQL モデルを作成するには:

  1. App Maker で、[データ] の横にある追加アイコン をクリックします。
  2. [計算 SQL] を選択して [次へ] をクリックします。
  3. モデルに名前を付けて [作成] をクリックします。
  4. [データソース] タブに移動します。SQL データソースを追加(もしくはデフォルトのデータベースを使用)して、[SQL クエリ] フィールドにクエリを 1 つ入力します。

    SQL クエリでは以下の要件を満たす必要があります。

    • クエリに offset 句や limit 句を含めないでください。App Maker により、データソースの pageSizepageIndex の設定に沿って、limit 句と offset 句の追加が行われます。
    • SQL クエリによって出力される列の名前と型は、計算モデルの名前と型に一致しなければなりません。
    • SQL クエリのパラメータとしては、:Param のようにコロンで始まるものだけが有効です。これらのパラメータは、データソースのカスタム プロパティにある名前と種類に一致する必要があります。

たとえば、HR アプリで特定の年齢以上の従業員の数を部門ごとに表示する必要があり、Age フィールドと Dept フィールドを持つ Cloud SQL モデル Employee がアプリで利用されているとします。

フィルタリングされたデータを表示するために、アプリでは DeptNameCount の 2 つのフィールドを持つ計算モデル EmployeeCount が使用されます。計算モデルには、MinAge という number カスタム プロパティを持つ SQL データソースがあり、次のようなクエリで使用されます。

SELECT Dept AS DeptName, COUNT(*) AS Count FROM Employee WHERE Age > :MinAge GROUP BY Dept

リスト パラメータは、SQL ではかっこで囲まれたパラメータのリストに変換されます。たとえば、パラメータ リストの要素に部門名が一致する部門の ID を取得するには、以下のようなクエリを作成します。

SELECT id from Departments WHERE Name in :PossibleNames

PossibleNames パラメータが (?, ?, ?, ...) の形式に変換され、パラメータの要素値が SQL のプレースホルダに使用されます。

時間に基づいたパラメータについては、タイムゾーンの設定が必要です。

リレーション フィルタリング

Cloud SQL は、データ バインディングサーバー スクリプトで、リレーション モデルのフィールドを使ってフィルタできる唯一のモデルです。このフィルタリングはこのモデル種別でのみ可能です。

詳細については、リレーション フィルタリングをご覧ください。

タイムゾーン

場合によっては、Cloud SQL インスタンスと App Maker のタイムゾーンが異なることがあります。その結果、データベースに想定とは異なる日時が書き込まれる可能性があります。次のテーブルで、日付フィールドの種類が適切に設定されていることを確認してください。

日付フィールドの種類にあわせたタイムゾーンの処理
Cloud SQL モデル

必要に応じて、日付フィールドの種類を設定します。

  1. モデルの [フィールド] タブを開きます。
  2. 日付フィールドをクリックした後、詳細設定アイコン をクリックして日付の種類を設定します。
    • [DATE] または [DATETIME] - タイムゾーンを持たないフィールドに使用します。データベースへの書き込み前に、App Maker によって、時間が App Maker サーバーのタイムゾーン([アプリの設定] で設定)に変換されます。
    • [TIMESTAMP] - タイムゾーンを持つフィールドに使用されます。App Maker によってユーザーのタイムゾーンが保存され、Unix 時間での日付が Cloud SQL に書き込まれます。

どちらの日付型でも、表示の際には、App Maker によりデータがブラウザのタイムゾーンに変換されます。

計算 SQL モデル SQL 計算モデルに日付型のフィールドを追加すると、DATETIME 型として追加されます。
計算 SQL データソースのクエリ パラメータ

必要に応じて、日付フィールドの種類を設定します。

  1. 計算 SQL モデルの [データソース] タブを開きます。
  2. データソースをクリックした後、「パラメータを追加 をクリックします。
  3. 日付パラメータの場合は、[データ SQL 型] プルダウン リストをクリックし、次の種類からいずれかを選択します。
    • [DATE] または [DATETIME] - タイムゾーンを持たないパラメータに使用します。クエリに DATE や DATETIME フィールドが使用された場合、クエリが実行される前に、App Maker サーバーがアプリユーザーのタイムゾーンからサーバーのタイムゾーンに対応した値に変換します。

      たとえば、PST(UTC-8)のタイムゾーンにいるユーザーが、2018 年 1 月 1 日午前 9 時より前に作成されたレコードに対してクエリを実行し、App Maker サーバーが CT(UTC-6)のタイムゾーンにあった場合、そのクエリは 2018 年 1 月 1 日午前 11 時より前に作成されたレコードを検索します。

    • [TIMESTAMP] - タイムゾーンを持つパラメータに使用されます。クエリが実行される前に、App Maker によって時間が UTC に変換されます。TIMESTAMP 型の日付は、アプリとデータベースが同じタイムゾーンにある場合にのみ正しく処理されるため、クエリ パラメータに使用しないことをおすすめします。

制限事項

  • Cloud SQL テーブルに主キー列がないか、複数の主キー列がある場合、App Maker で Cloud SQL テーブルの変更やリレーションの作成はできません。

  • App Maker では、BIGINT 値は文字列として表されます。これは、BIGINT の数値の範囲が JavaScript で表現できる数値に対して大きすぎるためです。

  • BLOB や CLOB、その他のバイナリ型など、一部の Cloud SQL 列タイプは App Maker でインポートできません。このようなタイプの列を持つモデルのインポートは可能ですが、それらの列に対する読み取りや書き込みはできません。インポートできない列が null 以外でマークされている場合、データモデル全体ですべての列が読み取り専用になります。

  • App Maker では、Cloud SQL モデルに対し、結合、集計、サブクエリを含むクエリを実行できません。SQL ビューをモデルとしてインポートするか、計算モデルにある SQL データソースを使用してください。

  • アプリでは、キーワードによる検索がサポートされていません。代替方法として、contains 演算子を使用して全文検索をシミュレートするカスタムクエリを作成してください。たとえば、NameDepartment フィールドを持つモデル Employee に対し、クエリ「(Name contains? :Keywords) OR (Department contains? :Keywords)」を使い、Keywords パラメータをテキスト フィールドの value プロパティにバインディングします。