Apigee、BigQuery ML、Cloud Spanner を使用して顧客の購入傾向を予測するスマート API を構築する

このチュートリアルでは、顧客が購入する可能性を予測する API の作成方法について説明します。API の作成には、Apigee、BigQuery ML、Cloud Spanner を使用します。

このチュートリアルは、よりパーソナライズされたエクスペリエンスをユーザーに提供することでオムニチャネルや e コマースのプラットフォームを通じて収益を向上させることを目指す API デベロッパーとデータ スペシャリストを対象としています。このドキュメントは、BigQuery、Apigee、Google Cloud CLI、Apache Maven に精通していることを前提としています。

作成した API は、オンライン予測を使用し、ウェブサイトでのユーザーの行動に基づいてリアルタイムのアクションを実行します。オンライン予測は、機械学習(ML)の分析情報を商品カタログやその他の情報と組み合わせることで、複数のチャネルでカスタマー エクスペリエンスを向上させます。作成した API のアーキテクチャを次の図に示します。

顧客の購入傾向を予測するための API のアーキテクチャ。

この図は次のアーキテクチャを示しています。

  1. モバイル アプリケーションが Apigee プラットフォームにデプロイされた API にリクエストを送信します。このリクエストでは、ログインしているユーザーの商品のレコメンデーション データを取得します。
  2. API プロキシは、BigQuery データセットからそのユーザー ID 向けの商品のおすすめデータを取得します。
  3. API プロキシは、Cloud Spanner インスタンス上のプロダクト プライマリ データベースからデータを取得するコールアウトを行います。
  4. API プロキシは、商品のおすすめと商品のプライマリ データセットのデータを集計します。
  5. レスポンスがモバイルアプリに返されます。

目標

  • BigQuery で顧客の購入傾向データセットを作成します。
  • 商品カタログデータを Cloud Spanner データベースにインポートします。
  • Apigee API プロキシをインポートおよびデプロイします。
  • BigQuery からの顧客の購入傾向データを Cloud Spanner データベースの商品カタログと価格情報と統合します。
  • おすすめの商品情報の集計ビューを作成します。

費用

このチュートリアルでは、課金対象である次の Google Cloud コンポーネントを使用します。

  • BigQuery と BigQuery ML の Flex Slots のスロット
  • Cloud Spanner
  • Apigee

料金計算ツールを使うと、予想使用量に基づいて費用の見積もりを生成できます。 新しい Google Cloud ユーザーは無料トライアルをご利用いただける場合があります。

準備

  1. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  2. Cloud プロジェクトに対して課金が有効になっていることを確認します。詳しくは、プロジェクトで課金が有効になっているかどうかを確認する方法をご覧ください。

  3. AI Platform Training & Prediction, BigQuery, BigQuery Reservation, BigQuery Storage, Cloud Spanner, Cloud Storage, Cloud Storage API, Dataflow, Google Cloud, Cloud Storage JSON, Service Management, Service Usage API を有効にします。

    API を有効にする

  4. コンソールで Cloud Shell をアクティブにします。

    Cloud Shell をアクティブにする

    コンソールの下部にある Cloud Shell セッションが開始し、コマンドライン プロンプトが表示されます。Cloud Shell はシェル環境です。Google Cloud CLI がすでにインストールされており、現在のプロジェクトの値もすでに設定されています。セッションが初期化されるまで数秒かかることがあります。

  5. Google アカウントにロールを付与します。次の IAM ロールごとに次のコマンドを 1 回実行します。

    • roles/apigee.admin
    • roles/bigquery.user
    • roles/bigquery.dataViewer
    • roles/spanner.admin
    • roles/spanner.databaseAdmin
    • roles/resourcemanager.projectIamAdmin
    • roles/serviceusage.serviceUsageConsumer

    gcloud projects add-iam-policy-binding PROJECT_ID --member="user:EMAIL_ADDRESS" --role=ROLE
    • PROJECT_ID は、実際のプロジェクト ID に置き換えます。
    • EMAIL_ADDRESS は実際のメールアドレスに置き換えます。
    • ROLE は、個々のロールに置き換えます。
  6. Apigee X アカウントをまだ持っていない場合は、Apigee を設定して、Apigee X インスタンスをプロビジョニングします。プロビジョニングには 1 時間ほどかかることがあります。
  7. 外部アクセスを許可するように Apigee X 組織を構成します。

このチュートリアルを終了した後、作成したリソースを削除すると、それ以上の請求は発生しません。詳細については、クリーンアップをご覧ください。

BigQuery ML を使用して e コマース レコメンデーション データセットを作成する

このセクションでは、BigQuery ML で標準 SQL クエリを使用して ML モデルを作成し、BigQuery の顧客データでトレーニングを行ってから、デプロイします。データのエクスポートや、モデルのトレーニングとデプロイのパイプラインの作成は必要ありません。BigQuery は自動スケーリングを行い、必要なコンピューティング リソースを処理します。

このチュートリアルで作成する ML モデルは、行列分解を使用します。これは、ユーザーの設定データに基づいてレコメンデーション システムを作成する場合の、一般的で効果的な方法です。

このチュートリアルでは、BigQuery でホストされ、一般公開されている Google アナリティクスのサンプル データセットを使用します。このデータセットは、Google ブランドの商品を販売する実在の e コマースストア、Google Merchandise Store の 12 か月間(2016 年 8 月から 2017 年 8 月)の難読化されたアナリティクス 360 データを提供します。

サンプルデータの処理

行列分解を使用する場合は、明示的または暗黙的なユーザー フィードバックを評価し、お客様の好みを判断します。明示的なフィードバックを使用するには、データセットに 1~5 の評価など、商品に対するユーザーの好みに関するデータが含まれている必要があります。明示的なフィードバックがない場合、他の行動指標を使用して、お客様の好みを推測します。たとえば、ユーザーが商品の詳細ページを閲覧した合計時間を調べます。このチュートリアルでは、セッション継続時間データを使用して顧客の好みを推測します。

行列分解モデルをトレーニングするには、お客様、評価対象のアイテム、暗黙的な評価を識別する列を含むテーブルが必要です。このセクションでは、useriditemIdsession_duration 列を持つテーブルを作成します。session_duration 列には、指定した商品の商品ページでのユーザーのセッション継続時間が含まれます。

アナリティクスのサンプル データセットのデータを使用してテーブルを作成するには、次の操作を行います。

  1. Google Cloud Marketplace で、アナリティクス サンプルページに移動します。

    アナリティクス サンプルに移動

  2. [データセットを表示] をクリックします。 BigQuery SQL ワークスペース ページが開き、アナリティクス サンプル データセットが選択されています。

  3. [エクスプローラ] セクションで、プロジェクトの横にある [アクションを表示] をクリックし、[データセットを作成] をクリックします。

  4. 表示された [データセットを作成] ダイアログで、次の操作を行います。

    1. [データセット ID] フィールドに「bqml」と入力します。
    2. [データロケータ] リストで、[us(米国の複数のリージョン)] を選択します。
    3. [データセットを作成] をクリックします。
  5. [データセットに移動] をクリックし、[クエリを新規作成] をクリックします。

  6. クエリエディタで、次の SQL ステートメントを実行して、トレーニング データを含むテーブルを作成します。

    CREATE OR REPLACE TABLE bqml.aggregate_web_stats AS (
      WITH
        durations AS (
          --calculate pageview durations
          SELECT
            CONCAT(fullVisitorId,'-',
                 CAST(visitNumber AS STRING),'-',
                 CAST(hitNumber AS STRING) ) AS visitorId_session_hit,
            LEAD(time, 1) OVER (
              PARTITION BY CONCAT(fullVisitorId,'-',CAST(visitNumber AS STRING))
              ORDER BY
              time ASC ) - time AS pageview_duration
          FROM
            `bigquery-public-data.google_analytics_sample.ga_sessions_2017*`,
            UNNEST(hits) AS hit
        ),
        prodview_durations AS (
          --filter for product detail pages only
         SELECT
            CONCAT(fullVisitorId,'-',CAST(visitNumber AS STRING)) AS userId,
            productSKU AS itemId,
            IFNULL(dur.pageview_duration,
             1) AS pageview_duration,
          FROM
            `bigquery-public-data.google_analytics_sample.ga_sessions_2017*` t,
            UNNEST(hits) AS hits,
            UNNEST(hits.product) AS hits_product
          JOIN
            durations dur
          ON
            CONCAT(fullVisitorId,'-',
                   CAST(visitNumber AS STRING),'-',
                   CAST(hitNumber AS STRING)) = dur.visitorId_session_hit
          WHERE
          eCommerceAction.action_type = "2"
        ),
        aggregate_web_stats AS(
          --sum pageview durations by userId, itemId
          SELECT
            userId,
            itemId,
            SUM(pageview_duration) AS session_duration
          FROM
            prodview_durations
          GROUP BY
            userId,
            itemId )
        SELECT
        *
       FROM
          aggregate_web_stats
    );
    

    bqml.aggregate_web_stats テーブルが作成され、トレーニング データが入力されます。

  7. データのサンプルを表示するには、クエリエディタで次の SQL ステートメントを実行します。

    SELECT
    *
    FROM
      bqml.aggregate_web_stats
    LIMIT
      10;
    

出力には、ユーザーID ごとに行があり、ユーザーが閲覧したアイテムのID とセッション継続時間が含まれるテーブルが表示されます。出力は次のようになります。

userId itemId session_duration
1 6703373209489429228-1 GGOEAXXX0808 19523
2 868731560082458910-1 GGOEAXXX0808 8312
3 4805474958539278422-1 GGOEAXXX0808 62892
4 8353360074725418910-3 GGOEAXXX0808 4883
5 8253742246691621007-2 GGOEAXXX0808 10
6 7211254729136975568-1 GGOEAXXX0808 96090
7 66777488032155805-1 GGOEAXXX0808 3893
8 0804312527321649470-1 GGOEAXXX0808 7539
9 2965429397557124425-1 GGOEAXXX0808 21776
10 8459600677575627508-1 GGOEAXXX0808 6265

Flex Slots のスロットの購入

BigQuery のオンデマンド料金をご利用の場合、行列分解モデルをトレーニングするには、Flex Slots のスロットを購入してから、予約と割り当てを作成する必要があります。BigQuery で定額料金を利用している場合は、このセクションをスキップしてモデルの作成、トレーニング、デプロイに進みます。

Flex Slots のスロットを購入するには、bigquery.reservations.create 権限を含む IAM ロールが必要です。この権限はプロジェクト オーナーに付与されます。この権限は、BigQuery 管理者(roles/bigquery.admin)と BigQuery リソース管理者(roles/bigquery.resourceAdmin)の IAM ロールに含まれています。

  1. コンソールで、BigQuery ページに移動します。

    BigQuery に移動

  2. [容量管理] をクリックし、[予約] をクリックします。

  3. API を有効にするために [BigQuery Reservation API] ページにリダイレクトされた場合は、[有効にする] をクリックします。それ以外の場合は、次の手順に進みます。

  4. [予約] タブで、[スロットの購入] をクリックします。

  5. [スロットの購入] ページで、次の操作を行います。

    1. [コミット期間] リストで [Flex] を選択します。
    2. [ロケーション] リストで、[us(米国の複数のリージョン)] を選択します。
    3. [スロット数] リストで、[500] を選択します。
    4. [次へ] をクリックします。
    5. [注文確認] フィールドに「CONFIRM」と入力し、[購入] をクリックします。

  6. [スロット コミットメントを表示] をクリックします。

    容量がプロビジョニングされるまでに、最大で 20 分間お待ちください。容量がプロビジョニングされると、スロット コミットメントの [ステータス] 列に が表示されます。

  7. [予約を作成] をクリックして、次のオプションを設定します。

    1. [予約名] に「model」と入力します。
    2. [ロケーション] リストで、[us(米国の複数のリージョン)] を選択します。
    3. [スロット数] に「500」と入力します。
    4. [保存] をクリックします。[予約] ページに戻ります。
  8. model 予約の横にある [アクション] 列で [割り当ての作成] を選択します。

  9. [組織、フォルダ、プロジェクトを選択] で、[参照] をクリックします。

  10. このチュートリアルを実施するプロジェクトの名前を入力するか、リストから選択します。

  11. [選択]をクリックし、次に[作成]をクリックします。

モデルの作成、トレーニング、デプロイ

行列分解モデルを作成、トレーニング、デプロイするには、次の手順に従います。

  1. Console の BigQuery ページで、 [クエリを新規作成] をクリックします。
  2. CREATE MODEL SQL ステートメントを実行します。

    CREATE OR REPLACE MODEL bqml.retail_recommender`
      OPTIONS(model_type='matrix_factorization',
            user_col='userId',
            item_col='itemId',
            rating_col='session_duration',
            feedback_type='implicit'
            )
      AS
      SELECT * FROM bqml.aggregate_web_stats;
    

トレーニングが完了すると、トレーニング済みのモデルが bqml.retail_recommender モデルとしてデプロイされます。

トレーニング済みモデルを使用して予測を行う

このセクションでは、デプロイされた bqml.retail_recommender モデルから予測を取得するために、ML.RECOMMEND SQL 関数を使用します。

  1. コンソール の BigQuery ページでクエリを作成し、指定された userId の上位 5 件のレコメンデーションを表す予測を取得します。

    DECLARE MY_USERID STRING DEFAULT "0824461277962362623-1";
    
    SELECT
     *
    FROM
      ML.RECOMMEND(MODEL `bqml.retail_recommender`,
      (SELECT MY_USERID as userID)
                  )
    ORDER BY predicted_session_duration_confidence DESC
    LIMIT 5;
    

    出力には、予測されたセッション継続時間の信頼度(高いほど望ましい)、関連するユーザー ID、ユーザーが閲覧したアイテムのID の行が表示されます。出力は次のようになります。

    predicted_session_duration_confidence userId itemId
    1 29011.10454702254 0824461277962362623-1 GGOEGAAX0574
    2 28212.99840462358 0824461277962362623-1 GGOEGDHQ015399
    3 28126.79442866013 0824461277962362623-1 GGOEGETR014599
    4 27303.60852083874 0824461277962362623-1 GGOEGAAX0338
    5 25692.370609851147 0824461277962362623-1 GGOEGEFR024199
  2. すべてのユーザーの上位 5 件の予測を取得するには、次の SQL ステートメントを実行します。このステートメントでは多数の行が生成されるため、出力はテーブルに書き込まれます。次に最初の 10 個のレコードが取得され、データの例が表示されます。

    -- Create output table of top 5 predictions
    CREATE OR REPLACE TABLE bqml.prod_recommendations AS (
    WITH predictions AS (
        SELECT
          userId,
          ARRAY_AGG(STRUCT(itemId,
                           predicted_session_duration_confidence)
                    ORDER BY
                      predicted_session_duration_confidence DESC
                    LIMIT 5) as recommended
        FROM ML.RECOMMEND(MODEL bqml.retail_recommender)
        GROUP BY userId
    )
    SELECT
      userId,
      itemId,
      predicted_session_duration_confidence
    FROM
      predictions p,
      UNNEST(recommended)
    );
    -- Show table
    SELECT
    *
    FROM
      bqml.prod_recommendations
    ORDER BY
      userId
    LIMIT
      10;
    

    出力には、複数のユーザー ID、ユーザーが閲覧した商品アイテム ID、予測されるセッション継続時間の信頼度が表示されます。出力は次のようになります。

    userId itemId predicted_session_duration_confidence
    1 000170187170673177-6 GGOEGDHQ015399 15931.156936770309
    2 000170187170673177-6 GGOEGAAX0574 20178.608474922632
    3 000170187170673177-6 GGOEGAAX0338 20247.337545389437
    4 000170187170673177-6 GGOEGETR014599 15524.355852692066
    5 000170187170673177-6 GGOEGEFR024199 16443.307099088597
    6 000338059556124978-1 GGOEGAAX0338 18143.067737280064
    7 000338059556124978-1 GGOEGAAX0279 16531.718889063464
    8 000338059556124978-1 GGOEGAAX0574 20916.672241880347
    9 000338059556124978-1 GGOEGETR014599 16155.674211782945
    10 000338059556124978-1 GGOEGEFR024199 18417.17554202264

Cloud Spanner データを設定する

このチュートリアルの以降のセクションでは、gcloud CLIMaven を使用します。両方のツールのコマンドを Cloud Shell から実行します。ツールを使用するためにインストールは必要ありません。

  1. Cloud Shell で、Cloud Spanner データベースにデータを設定するための プロダクト レコメンデーション API プロキシ バンドルとスクリプトを含むプロダクト レコメンデーション GitHut リポジトリのクローンを作成します。

    git clone https://github.com/apigee/devrel/tree/main/references/product-recommendations
    cd product-recommendations-v1
    
  2. datareader サービス アカウントを作成し、IAM ロールを割り当てます。サービス アカウントは、API プロキシから BigQuery と Cloud Spanner データベースのデータにアクセスするために使用されます。

    gcloud iam service-accounts create datareader --display-name="Data reader for BigQuery and Spanner Demo"
    gcloud iam service-accounts list | grep datareader
    gcloud iam service-accounts create datareader --display-name="Data reader for Apigee, BigQuery, and Spanner Demo"
    gcloud projects add-iam-policy-binding $PROJECT_ID --member="serviceAccount:$SA" --role="roles/spanner.databaseUser" --quiet
    gcloud projects add-iam-policy-binding $PROJECT_ID --member="serviceAccount:$SA" --role="roles/spanner.databaseReader" --quiet
    gcloud projects add-iam-policy-binding $PROJECT_ID --member="serviceAccount:$SA" --role="roles/bigquery.dataViewer" --quiet
    gcloud projects add-iam-policy-binding $PROJECT_ID --member="serviceAccount:$SA" --role="roles/bigquery.user" --quiet
    
  3. 環境変数を設定します。

    # For ApigeeX
    export PROJECT_ID=APIGEEX_PROJECT
    export ORG=$PROJECT_ID
    export ENV=eval
    export ENVGROUP_HOSTNAME=API_DOMAIN_NAME
    export SA=datareader@$PROJECT_ID.iam.gserviceaccount.com
    
    # For Cloud Spanner
    export SPANNER_INSTANCE=product-catalog
    export SPANNER_DATABASE=product-catalog-v1
    export REGION=regional-us-east1
    

    以下を置き換えます。

    • APIGEEX_PROJECT: Apigee X プロジェクトの名前。
    • API_DOMAIN_NAME: Apigee X UI の [Admin] > [Environments] > [Groups] ページで構成されたホスト名。
  4. コンソール の BigQuery ページで prod_recommendations テーブルを選択し、[プレビュー] タブをクリックして結果を表示します。

    1. 任意の userId 値をコピーします。
    2. Cloud Shell で、環境変数を設定します。

      export CUSTOMER_USERID=USER_ID
      

      USER_ID は、前のステップでコピーしたuserId値に置き換えます。

  5. Cloud Shell で、指定された CUSTOMER_USERID 値に対してオーダーされた商品のレコメンデーションの結果を表示します。

    bq query --nouse_legacy_sql \
        "SELECT * FROM \`$PROJECT_ID.bqml.prod_recommendations\` AS A where A.userid = \"$CUSTOMER_USERID\"" \
        ORDER BY A.predicted_session_duration_confidence DESC
    

    出力には、個々のユーザー ID、ユーザーが閲覧した商品アイテム ID、予測されるセッション継続時間の信頼度が表示されます。出力は次のようになります。

    +-----------------------+----------------+--------------------------------------------+
    |        userId         |     itemId     |      predicted_session_duration_confidence |
    +-----------------------+----------------+--------------------------------------------+
    | 6929470170340317899-1 | GGOEGAAX0037   |                          40161.10446942589 |
    | 6929470170340317899-1 | GGOEYDHJ056099 |                          27642.28480729123 |
    | 6929470170340317899-1 | GGOEGAAX0351   |                         27204.111219270915 |
    | 6929470170340317899-1 | GGOEGDWC020199 |                         25863.861349754334 |
    | 6929470170340317899-1 | GGOEGAAX0318   |                         24585.509088154067 |
    +-----------------------+----------------+--------------------------------------------+
    

Cloud Spanner データベースを作成し、商品カタログデータをインポートする

  1. Cloud Shell で、指定されたリージョンに Cloud Spanner インスタンスを作成し、商品カタログ データベースを作成して、データをインポートします。

    ./setup_spanner.sh
    

    このスクリプトは、CUSTOMER_USERID 環境変数を使用して、作成されたエントリを表示します。

    Cloud Spanner 商品カタログには、特定のユーザーの BigQuery トレーニング ステップで使用したアイテムのみが含まれています。 したがって、Cloud Spanner データベースで商品カタログデータを作成した後、CUSTOMER_USERID 環境変数を変更する場合は、setup_spanner.sh シェル スクリプトを再実行してデータを再入力する必要があります。

  2. Cloud Spanner データベース内のデータを確認します。

    gcloud spanner databases execute-sql $SPANNER_DATABASE --sql='SELECT * FROM products'
    

    出力には、商品 ID と、Spanner の商品カタログ(価格や画像のパスなど)の記述情報が表示されます。出力は次のようになります。

    productid       name                description                price  discount  image
    GGOEGAAX0037    Aviator Sunglasses  The ultimate sunglasses    42.42  0         products_Images/sunglasses.jpg
    GGOEGAAX0318    Bamboo glass jar    Bamboo glass jar           19.99  0         products_Images/bamboo-glass-jar.jpg
    GGOEGAAX0351    Loafers             Most comfortable loafers   38.99  0         products_Images/loafers.jpg
    GGOEGDWC020199  Hair dryer          Hottest hair dryer         84.99  0         products_Images/hairdryer.jpg
    GGOEYDHJ056099  Coffee Mug          Best Coffee Mug            4.2    0         products_Images/mug.jpg
    

Apigee プロキシをデプロイする

このセクションでは、Maven コマンドを実行して次のリソースを作成します。

  • product-recommendations-v1 という名前のプロキシ
  • product-recommendations-v1-$ENV という名前の API プロダクト
  • demo@any.com という名前のアプリ デベロッパー ユーザー
  • product-recommendations-v1-app-$ENV という名前のアプリ

リソースを作成するには、Maven は GitHub リポジトリの pom.xml ファイルを使用します。このファイルには、インストール手順とインストール手順が含まれています。

pom.xml ファイルのプロファイル セクションには、apigee.orgapigee.envapi.northbound.domaingcp.projectidgoogletoken.emailapi.userid の値が含まれています。これらの値はプロジェクトによって異なり、コマンドラインを使用して設定します。次の例は、値を含む pom.xml ファイルのセクションを示しています。

<profile>
  <id>eval</id>
  <properties>
    <apigee.profile>eval</apigee.profile>
    <apigee.org>${apigeeOrg}</apigee.org>
    <apigee.env>${apigeeEnv}</apigee.env>
    <api.northbound.domain>${envGroupHostname}</api.northbound.domain>
    <gcp.projectid>${gcpProjectId}</gcp.projectid>
<apigee.googletoken.email>${googleTokenEmail}</apigee.googletoken.email>
    <api.userid>${customerUserId}</api.userid>
  </properties>
</profile>

これらの値は、早い段階で、Cloud Spanner データを設定するときに設定します。

プロキシをデプロイするには、次のようにします。

  • Cloud Shell で、プロキシと関連アーティファクトをインストールして API をテストします。

    mvn -P eval clean install -Dbearer=$(gcloud auth print-access-token) \
        -DapigeeOrg=$ORG \
        -DapigeeEnv=$ENV \
        -DenvGroupHostname=$ENVGROUP_HOSTNAME \
        -DgcpProjectId=$PROJECT_ID \
        -DgoogleTokenEmail=$SA \
        -DcustomerUserId=$CUSTOMER_USERID
    

    出力には、インストール手順の実行と統合 API 呼び出しの結果が表示されます。1 つは /openapi エンドポイントへの呼び出し、もう 1 つは /products エンドポイントへの呼び出しです。テスト結果により、API プロキシがインストール、デプロイされ、動作していることを確認します。出力には、後続の API テスト呼び出しに使用できるアプリの認証情報も表示されます。

Recommendations API をテストする

  1. Cloud Shell で、Apigee API に対して curl 呼び出しを実行してアプリの API キーの環境変数を設定します。

    APIKEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" \
    https://apigee.googleapis.com/v1/organizations/$ORG/developers/demo@any.com/apps/product-recommendations-v1-app-$ENV \
        | jq -r .credentials[0].consumerKey)
    

    APIKEY の値をメモします。この情報は、後で AppSheet アプリを作成する(オプション)場合に必要です。

  2. API プロキシのインストール時に指定した CUSTOMER_USERID 値の結果を取得するには、テスト呼び出しを行います。

    curl -s https://$ENVGROUP_HOSTNAME/v1/recommendations/products \
    -H "x-apikey:$APIKEY" | jq
    

OpenAPI 仕様(OAS)で定義されている API では、リクエストで次のヘッダーを指定できます。

  • x-apikey: セキュリティ スキームのアプリ コンシューマ キー。
  • x-userid: リクエストを行っているユーザー ID。指定しない場合、この値はデフォルトでプロキシで構成されている CUSTOMER_USERID 値になります。
  • cache-control: レスポンスをキャッシュに保存する時間量。このヘッダーでは、300 秒間レスポンスをキャッシュに保存するか、no-cache を指定してオーバーライドできます。

CUSTOMER_USERID 値の変更や、キャッシュ制御を行うには、次の呼び出し例のようにヘッダー値を設定します。

curl -s "https://$ENVGROUP_HOSTNAME/v1/recommendations/products" \
-H "x-apikey:$APIKEY" \
-H "x-userid:$CUSTOMER_USERID" \
-H "Cache-Control:no-cache" | jq

呼び出し例に対するレスポンスは次のようになります。

{
  "products": [
    {
      "productid": "GGOEGAAX0037",
      "name": "Aviator Sunglasses",
      "description": "The ultimate sunglasses",
      "price": "42.42",
      "image": "products_Images/sunglasses.jpg"
    },
    {
      "productid": "GGOEYDHJ056099",
      "name": "Coffee Mug",
      "description": "Best Coffee Mug",
      "price": "4.2",
      "image": "products_Images/mug.jpg"
    },
    {
      "productid": "GGOEGAAX0351",
      "name": "Loafers",
      "description": "Most comfortable loafers",
      "price": "38.99",
      "image": "products_Images/loafers.jpg"
    },
    {
      "productid": "GGOEGDWC020199",
      "name": "Hairdryer",
      "description": "Hotest hairdryer",
      "price": "84.99",
      "image": "products_Images/hairdryer.jpg"
    },
    {
      "productid": "GGOEGAAX0318",
      "name": "Bamboo glass jar",
      "description": "Bamboo glass jar",
      "price": "19.99",
      "image": "products_Images/bamboo-glass-jar.jpg"
    }
  ]
}

Apigee ポリシー

以降のセクションに示す Apigee ポリシーは、このチュートリアルの API プロキシ バンドルで使用されます。

Pre-flow

SpikeArrest
バックエンドの BiqQuery サービスをトラフィックの急増から保護します。
割り当て
コンシューマ アプリケーションとデベロッパーに基づいて API リクエストを調整します。スロットル制限は API プロダクトで構成されます。
ResponseCache - uri
サービスからのレスポンスをキャッシュ保存し、BiqQuery データ ウェアハウスへのリクエストを減少させます。

プロダクト フロー

AssignMessage - クエリ リクエストの作成
BigQuery データセットから商品のレコメンデーションのリストを取得するための SQL クエリで HTTP リクエストを設定します。
JavaScript と ExtractVariable ポリシー
BigQuery サービスからデータをフォーマットし、よりユーザー フレンドリーなレスポンス メッセージを作成します。
LookupCache - Cloud Spanner セッション
Apigee キャッシュから Cloud Spanner データベースのセッション ID を検索します。
ServiceCallout - Cloud Spanner セッション
Apigee キャッシュにセッション ID がないか、ID の有効期限が切れている場合は、Cloud Spanner サービスへのリクエストを行い、データベース セッションを作成します。
PopulateCache - Cloud Spanner セッション
Cloud Spanner のセッション ID を Apigee キャッシュに入力します。
ServiceCallout - 商品カタログ検索
Cloud Spanner 商品カタログ データベースから商品の詳細を取得します。
JavaScript - 商品データのフォーマット
商品カタログ データベースのデータをフォーマットすることで、OAS に準拠する API レスポンス メッセージを作成します。

OpenAPI フロー

AssignMessage - OAS JSON
API の OAS JSON レスポンスを設定します。

省略可: Apigee をデータソースとして使用して AppSheet アプリを作成する

e コマースサイトのエンドユーザーとビジネス ユーザーにおすすめの商品情報を表示するには、このセクションの説明に従って AppSheet アプリを作成します。

AppSheet アカウントを作成する。

メールアドレスを使用して AppSheet アカウントを作成します。

データソースを作成する

AppSheet では、API プロキシを新しいアプリのデータソースとして使用します。データソースを作成するには、次のようにします。

  1. AppSheet にログインする
  2. [アカウント] ページで、[ソース] > [新しいデータソース] をクリックします。
  3. [Add a new data source] ダイアログで、プロキシ product-recommendations-v1 の名前を入力し、[Apigee] をクリックします。
  4. [Add Apigee API connection information] ダイアログで、次のオプションを設定します。

    1. [手動] を選択します。
    2. [Apigee API Key] フィールドに、プロキシのテストに使用したアプリの API キーを入力します。API キーをお持ちでない場合は、echo $APIKEY. を実行して Cloud Shell で取得します。
    3. [Apigee API Base Path] フィールドに、次のように入力します。

      https://ENVGROUP_HOSTNAME/v1/recommendations
      

      ENVGROUP_HOSTNAME は、次のように置き換えます。Apigee X UI for Admin で構成されたホスト名を使用する>環境>グループ。

    4. [API リソースパス] フィールドに、パス接尾辞 products を入力します。

    5. [テスト] をクリックします。

    6. テストが正常に完了したら、[アクセスを承認] をクリックします。

アクセスを承認すると、AppSheet コンソールに product-recommendations-v1 の新しいタイルが表示されます。

アプリを作成する

  1. AppSheet の products-template app ページに移動します。
  2. [コピーしてカスタマイズ] をクリックします。[Clone your App] ダイアログが表示されます。
  3. [App name] フィールドに、プロキシの名前(product-recommendations-v1)を入力し、[Copy app] をクリックします。アプリが作成されるまで待ちます。
  4. [Welcome to your app] ページで、[Customize app] をクリックします。デフォルトでは、アプリは Google スプレッドシートのサンプル データソースを使用します。
  5. 前に作成した Apigee データソースと一致するようにデータソースを変更します。

    1. [+ New Table] をクリックし、[product recommendations v1] をクリックします。
    2. [Choose a Sheet/Table] ダイアログで [products] を選択します。
    3. [新しいテーブルの作成] ダイアログで、[読み取り専用] をクリックし、[このテーブルを追加] をクリックします。

    アプリが products 2 タブと別のデータビューで表示されます。新しいデータビューでは、各項目の説明と価格の値が異なります。アイテムの順序は予測の順序と同じではないことに注意してください。

  6. AppSheet のデフォルトの並べ替えを削除して、データソースからアイテムが返される順序を変更します。

    1. サイド ナビゲーション メニューで、[UX] を選択します。
    2. [Primary View]セクション で [products 2] を選択します。
    3. [表示オプション] セクションで、[並べ替え] の横にある [名前, 昇順] のエントリを削除します。AppSheet に表示される順序が、API 呼び出しの結果と同じになり、レスポンスの最後のアイテムが一番下のことを確認します。
  7. アプリを保存します。

オプションで、元の商品テーブルと UX を削除し、「商品 2」のテーブルとビューの名前を「商品のおすすめ」に変更することもできます。

クリーンアップ

このチュートリアルで使用したリソースについて、Google Cloud アカウントに課金されないようにするには、リソースを含むプロジェクトを削除するか、プロジェクトを維持して個々のリソースを削除します。

プロジェクトの削除

  1. コンソールで [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

個々のリソースの削除

繰り返し費用が発生しないようにするには、BigQuery Flex Slots のスロット の予約、BigQuery データセット、AI Platform モデルを削除します。

BigQuery Flex Slots のスロット の予約を削除する

  1. Console の BigQuery ページで [容量管理] を選択し、[予約] タブをクリックします。
  2. model エントリを開きます。
  3. 予約の横にある [アクションを表示] をクリックし、[削除] をクリックします。
  4. モデル エントリの横にある [アクションを表示] をクリックし、[削除] をクリックします。
  5. Cloud Shell で、デプロイ、プロキシ、関連するアーティファクトを削除します。

    mvn -P eval process-resources -Dbearer=$(gcloud auth print-access-token) \
        -DapigeeOrg=$ORG -DapigeeEnv=$ENV -Dskip.integration=true \
        apigee-config:apps apigee-config:apiproducts apigee-config:developers -Dapigee.config.options=delete \
        apigee-enterprise:deploy -Dapigee.options=clean
    
  6. Spanner リソースを削除します。

    ./cleanup_spanner.sh
    

BigQuery データセットの削除

  1. コンソール の BigQuery ページの [リソース] セクションで、このチュートリアルを完了したプロジェクトを展開します。
  2. bqml データセットを選択し、[データセットを削除] をクリックします。
  3. 上に重なったウィンドウで、「bqml」と入力して [削除] をクリックします。

AI Platform モデルの削除

  1. Google Cloud コンソール で、[AI Platform モデル] ページに移動します。

    AI Platform モデルに移動

  2. モデルリストで、rpm_bqml_model をクリックします。

  3. [モデルの詳細] ページで、V_1(デフォルト)バージョンのチェックボックスをオンにします。

  4. [その他] をクリックし、[削除] をクリックします。

  5. バージョンの削除が完了したら、[戻る] をクリックしてモデルの一覧に戻ります。

  6. rpm_bqml_model モデルのチェックボックスをオンにします。

  7. [その他] をクリックして、[削除] をクリックします。

  8. Cloud Shell でサービス アカウントを削除します。

    gcloud iam service-accounts delete $SA
    

次のステップ