arrow_back

Apigee X によるアプリケーションのモダナイゼーション

参加 ログイン
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

Apigee X によるアプリケーションのモダナイゼーション

Lab 1時間 30分 universal_currency_alt クレジット: 5 show_chart 中級
Test and share your knowledge with our community!
done
Get access to over 700 hands-on labs, skill badges, and courses

GSP842

Google Cloud セルフペース ラボ

概要

Google Cloud の Apigee API Platform を使用すると、既存の API に新しい機能を追加して既存のアプリケーションをモダナイズできます。

このラボでは、まず、Cloud Run にバックエンド サービスをデプロイします。このバックエンド サービスは、Firestore データベースで銀行データ(顧客、口座、ATM、取引)の保存 / 取得を行う REST API を実装します。次に、このバックエンド サービスをプロキシする Apigee API プロキシと、外部サービスからコンテンツを取得してキャッシュに保存する共有フローを作成します。その後、作成した API プロキシからその共有フローを呼び出して、API レスポンスを JavaScript コードで変更します。

目標

このラボでは、次のタスクの実行方法について学びます。

  • Cloud Run にバックエンド サービスをデプロイする
  • Apigee X プロキシを使用してバックエンド サービスをプロキシする
  • 複数のプロキシによって使用される機能のための共有フローを作成する
  • 構成データをプロパティ セットに保存する
  • Service Callout ポリシーを使用してサービスからコンテンツを取得する
  • キャッシュ ポリシーを使用して再利用可能な情報をキャッシュに保存する
  • JavaScript コードを使用してレスポンスのペイロードを変更する

セットアップ

[ラボを開始] ボタンをクリックする前に

こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。

このハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。

このラボを完了するためには、下記が必要です。

  • 標準的なインターネット ブラウザ(Chrome を推奨)
注: このラボの実行には、シークレット モードまたはシークレット ブラウジング ウィンドウを使用してください。これにより、個人アカウントと受講者アカウント間の競合を防ぎ、個人アカウントに追加料金が発生することを防ぎます。
  • ラボを完了するために十分な時間を確保してください。ラボをいったん開始すると一時停止することはできません。
注: すでに個人の Google Cloud アカウントやプロジェクトをお持ちの場合でも、このラボでは使用しないでください。アカウントへの追加料金が発生する可能性があります。

ラボを開始して Google Cloud コンソールにログインする方法

  1. [ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側の [ラボの詳細] パネルには、以下が表示されます。

    • [Google コンソールを開く] ボタン
    • 残り時間
    • このラボで使用する必要がある一時的な認証情報
    • このラボを行うために必要なその他の情報(ある場合)
  2. [Google コンソールを開く] をクリックします。 ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。

    ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。

    注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。
  3. 必要に応じて、[ラボの詳細] パネルから [ユーザー名] をコピーして [ログイン] ダイアログに貼り付けます。[次へ] をクリックします。

  4. [ラボの詳細] パネルから [パスワード] をコピーして [ようこそ] ダイアログに貼り付けます。[次へ] をクリックします。

    重要: 認証情報は左側のパネルに表示されたものを使用してください。Google Cloud Skills Boost の認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。
  5. その後次のように進みます。

    • 利用規約に同意してください。
    • 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
    • 無料トライアルには登録しないでください。

その後このタブで Cloud Console が開きます。

注: 左上にある [ナビゲーション メニュー] をクリックすると、Google Cloud のプロダクトやサービスのリストが含まれるメニューが表示されます。 ナビゲーション メニュー アイコン

Cloud Shell をアクティブにする

Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。

  1. Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする」アイコン 「Cloud Shell をアクティブにする」アイコン をクリックします。

接続した時点で認証が完了しており、プロジェクトに各自の PROJECT_ID が設定されます。出力には、このセッションの PROJECT_ID を宣言する次の行が含まれています。

Your Cloud Platform project in this session is set to YOUR_PROJECT_ID

gcloud は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。

  1. (省略可)次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
gcloud auth list
  1. [承認] をクリックします。

  2. 出力は次のようになります。

出力:

ACTIVE: * ACCOUNT: student-01-xxxxxxxxxxxx@qwiklabs.net To set the active account, run: $ gcloud config set account `ACCOUNT`
  1. (省略可)次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
gcloud config list project

出力:

[core] project = <project_ID>

出力例:

[core] project = qwiklabs-gcp-44776a13dea667a6 注: Google Cloud における gcloud ドキュメントの全文については、gcloud CLI の概要ガイドをご覧ください。

Apigee UI を開く

Apigee UI には、Google Cloud コンソールとは別のページからアクセスします。このラボでは、Google Cloud プロジェクトと同じ名前の Apigee 組織が自動的に作成されています。

  • クリックして、Apigee UI を開きます。

    Google Cloud コンソールから Apigee UI を開くこともできます。開くには、ナビゲーション メニューナビゲーション メニュー)を開き、[Apigee API Management] > [Apigee] を選択します。

プロジェクトに組織がプロビジョニングされていないことを示すエラーが表示される場合は、過去のラボの組織をタブが読み込もうとしている可能性があります。

このエラーが表示される場合:

  • 組織プルダウンをクリックします。

    「プロビジョニングされていません」エラー メッセージ

    組織プルダウンには、Google Cloud プロジェクトと同じ名前の組織が表示されているはずです。

    Apigee UI 組織プルダウン

    リストアップされている組織は、ログイン ユーザーがアクセスできる組織です。このラボでは、ラボの開始時に [ラボの詳細] パネルで指定されたラボ認証情報を使用してログインする必要があります。

    Apigee UI を操作するには、左側のナビゲーション メニューを使用します。ランディング ページには、よく使用される場所に移動できるクイックリンクも表示されます。

タスク 1. Cloud Run にバックエンド サービスをデプロイする

このタスクでは、Cloud Run にバックエンド サービスをデプロイします。

このサービスは、SimpleBank の API を実装します。この API は、顧客、口座、取引、ATM を使用して銀行をシンプルに表現します。SimpleBank サービスは Node.js を使用して構築されており、データは Firestore に保存されます。コードは Docker コンテナにパッケージ化されているため、そのコンテナを Cloud Run にデプロイします。

コード リポジトリのクローンを作成する

  1. SimpleBank サービスのコードを含むリポジトリのクローンを作成するには、Cloud Shell で次のコマンドを実行します。

    git clone --depth 1 https://github.com/GoogleCloudPlatform/training-data-analyst
  2. 作業ディレクトリへのソフトリンクを作成します。

    ln -s ~/training-data-analyst/quests/develop-apis-apigee ~/develop-apis-apigee
  3. REST バックエンドを含むディレクトリに移動するには、次のコマンドを実行します。

    cd ~/develop-apis-apigee/rest-backend

プロジェクトを初期化する

プロジェクト初期化スクリプトの init-project.sh は、Cloud Run API をプロジェクトで有効にします。これらの API は、Cloud Run サービスをデプロイするために必要です。

このサービスのデータベースは、ネイティブ モードの Firestore です。1 つのプロジェクトで、1 つの Firestore データベースをネイティブ モードか Datastore モードでホストできます。このスクリプトは、ネイティブ モードの Firestore データベースを作成します。

  1. init-project.sh スクリプトによって実行されるコマンドを表示するには、次のコマンドを入力します。

    cat init-project.sh

    このスクリプトは、Cloud Run API を有効にし、ネイティブ モードの Firestore データベースを作成します。

  2. スクリプトを実行するには、次のコマンドを入力します。

    ./init-project.sh

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Cloud Run API を有効にして、Firestore データベースを作成する

サービスを初期化する

サービス初期化スクリプトの init-service.sh は、simplebank-rest という名前のサービス アカウントを作成します。このサービス アカウントは、Cloud Run サービスの ID として使用されます。roles/datastore.user ロールが付与されるため、Firestore でデータの読み取りと更新を行うことができます。

サービスを作成する際には、そのサービス用のサービス アカウントを作成して、最小権限の原則に従って権限を付与することをおすすめします。最小権限の原則とは、アカウントに付与する権限を、そのアカウントに固有の機能を実行するために不可欠な権限のみにする原則です。

  1. init-service.sh スクリプトによって実行されるコマンドを表示するには、次のコマンドを入力します。

    cat init-service.sh

    このスクリプトは、サービスによって使用されるサービス アカウントを作成して、roles/datastore.user ロールを追加します。

  2. スクリプトを実行するには、次のコマンドを入力します。

    ./init-service.sh

バックエンド サービスをデプロイする

デプロイ スクリプトの deploy.sh は、現在のディレクトリにあるコードを使用して simplebank サービス アプリケーションをビルドし、simplebank-rest サービス アカウントを使用して Cloud Run にデプロイします。このデプロイ スクリプトは、アプリケーション コードを更新する度に実行することになります。

このサービスは認証アクセスを必要とするようにデプロイされるため、有効な OpenID Connect ID トークンがなければ呼び出すことができません。

  1. deploy.sh スクリプトによって実行されるコマンドを表示するには、Cloud Shell で次のコマンドを入力します。

    cat deploy.sh

    このスクリプトは、Cloud Build を使用してサービスをビルドし、ビルドされた simplebank-grpc サービスを Cloud Run にデプロイします。

注: このデプロイ スクリプトでは、max-instances パラメータを使用して、Cloud Run クラスタのインスタンス数を 1 に制限しています。実際の本番環境サービスでは、このように低い制限を指定することはありません。
  1. このスクリプトを Cloud Run にデプロイするには、次のコマンドを入力します。

    ./deploy.sh

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 バックエンド サービスをデプロイする

サービスをテストする

  1. サービスが実行されていることを確認するために、サービスを呼び出す curl リクエストを実行します。

    export RESTHOST=$(gcloud run services describe simplebank-rest --platform managed --region us-west1 --format 'value(status.url)') echo "export RESTHOST=${RESTHOST}" >> ~/.bashrc curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" -X GET "${RESTHOST}/_status"

    RESTHOST 変数を設定するコマンドで、gcloud を使用して simplebank-rest Cloud Run サービスのホスト名を取得した後、この変数を .bashrc ファイルに追加しています。これにより、Cloud Shell が再起動した場合に RESTHOST 変数が再読み込みされるようになります。

    GET /_status コマンドは、API が稼働していることを示す JSON レスポンスを返すだけです。この呼び出しでは、gcloud auth print-identity-token を使用して、Cloud Shell にログインしているユーザーの OpenID Connect ID トークンを取得しています。ここではプロジェクト オーナーのロールでログインしているため、非常に幅広い権限が付与されています。

  2. Firestore への書き込みを行えることを確認するために、顧客を作成する curl リクエストを実行します。

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" -H "Content-Type: application/json" -X POST "${RESTHOST}/customers" -d '{"lastName": "Diallo", "firstName": "Temeka", "email": "temeka@example.com"}'

    POST /customers コマンドによって顧客が作成されます。lastName、firstName、email の各パラメータはいずれも必須です。メールアドレスは一意でなければならず、顧客の ID として使用されます。顧客レコードは Firestore に保存されます。

    注: 「AlreadyExist」というエラーが返される場合は、Firestore データベースが正常に作成されていない可能性があります。データベースを作成するには init-project.sh スクリプトを実行します。
  3. Firestore からの読み取りを行えることを確認するために、作成した顧客を取得する curl リクエストを実行します。

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" -X GET "${RESTHOST}/customers/temeka@example.com"

    GET /customers/ コマンドによって Firestore から顧客レコードが取得されます。

  4. Firestore に追加のサンプルデータを読み込むために、次のコマンドを入力します。

    gcloud firestore import gs://cloud-training/api-dev-quest/firestore/example-data

    この gcloud コマンドは、Firestore のインポート / エクスポート機能を使用して、顧客、口座、ATM をデータベースにインポートします。

  5. ATM のリストを取得するには、次の curl コマンドを実行します。

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" -X GET "${RESTHOST}/atms"
  6. 1 つの ATM を取得するには、次の curl コマンドを実行します。

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" -X GET "${RESTHOST}/atms/spruce-goose"

    このリクエストは、ATM を名前で取得します。レスポンスにはその ATM の緯度と経度が含まれますが、住所は含まれません。

    {"name":"spruce-goose","longitude":-118.408207,"description":"","latitude":33.977601}

    後のタスクで、Apigee と Geocoding API を使用して、特定の ATM を取得した場合に返されるレスポンスに住所を追加します。

タスク 2. Apigee API プロキシを使用してバックエンド サービスをプロキシする

このタスクでは、バックエンド サービスのファサードとして機能する Apigee API プロキシを作成します。API プロキシでは、サービス アカウントを使用して、Cloud Run サービスに OpenID Connect ID トークンを提示できるようにします。

Apigee API プロキシ用のサービス アカウントを作成する

  1. Apigee API プロキシが使用できるサービス アカウントを作成するには、次のコマンドを入力します。

    gcloud iam service-accounts create apigee-internal-access \ --display-name="Service account for internal access by Apigee proxies" \ --project=${GOOGLE_CLOUD_PROJECT}

    この gcloud コマンドは、apigee-internal-access という名前のサービス アカウントを作成します。このサービス アカウントは、Apigee プロキシがバックエンド サービスを呼び出すときに使用されます。

  2. サービスへのアクセスを許可するロールを付与するには、次のコマンドを入力します。

    gcloud run services add-iam-policy-binding simplebank-rest \ --member="serviceAccount:apigee-internal-access@${GOOGLE_CLOUD_PROJECT}.iam.gserviceaccount.com" \ --role=roles/run.invoker --region=us-west1 \ --project=${GOOGLE_CLOUD_PROJECT}

    この gcloud コマンドは、simplebank-rest Cloud Run サービスに対する roles/run.invoker ロールをこのサービス アカウントに付与します。これにより、このサービス アカウントでこのサービスを呼び出せるようになります。

  3. 次のコマンドを使用して、バックエンド サービスの URL を取得します。

    gcloud run services describe simplebank-rest --platform managed --region us-west1 --format 'value(status.url)'

    この URL を保存します。API プロキシの作成時に使用します。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。付与されたロールが検出されるまでに少し時間がかかることがあります。 Apigee API プロキシ用のサービス アカウントを作成する

Apigee プロキシを作成する

  1. ブラウザ ウィンドウで Apigee UI タブを選択します。

  2. 左側のナビゲーション メニューで [Develop] > [API Proxies] を選択します。

  3. プロキシ ウィザードを使用して新しいプロキシを作成するには、[Create New] をクリックします。

    バックエンド サービスのリバース プロキシを作成します。

  4. [Reverse proxy] ボックスをクリックします。

    注: [Reverse proxy] ボックス内の [Use OpenAPI Spec] リンクはクリックしないでください。
  5. [Proxy details] で次のように指定します。

    プロパティ
    Name bank-v1
    Base path /bank/v1
    Target (Existing API) バックエンド URL
    注: [Base path] には 「/bank-v1」 ではなく 「/bank/v1」 を使用していることを確認してください。

    ターゲットには、このタスクですでに取得した次のようなバックエンド URL を指定する必要があります。

    https://simplebank-rest-mtdtzt7yzq-ue.a.run.app
  6. [Next] をクリックします。

  7. [Common Policies] の設定はデフォルトのままにして、[Next] をクリックします。

  8. [Summary] ページで、設定をデフォルトのままにして [Create] をクリックします。

  9. [Edit proxy] をクリックします。

  10. 右上隅に [Switch to Classic] リンクがある場合は、そのリンクをクリックします。

ランタイム インスタンスが使用可能であることを確認する

  1. Cloud Shell で、次のコマンドセットを貼り付けて実行します。

    export INSTANCE_NAME=eval-instance; export ENV_NAME=eval; export PREV_INSTANCE_STATE=; echo "waiting for runtime instance ${INSTANCE_NAME} to be active"; while : ; do export INSTANCE_STATE=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${GOOGLE_CLOUD_PROJECT}/instances/${INSTANCE_NAME}" | jq "select(.state != null) | .state" --raw-output); [[ "${INSTANCE_STATE}" == "${PREV_INSTANCE_STATE}" ]] || (echo; echo "INSTANCE_STATE=${INSTANCE_STATE}"); export PREV_INSTANCE_STATE=${INSTANCE_STATE}; [[ "${INSTANCE_STATE}" != "ACTIVE" ]] || break; echo -n "."; sleep 5; done; echo; echo "instance created, waiting for environment ${ENV_NAME} to be attached to instance"; while : ; do export ATTACHMENT_DONE=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${GOOGLE_CLOUD_PROJECT}/instances/${INSTANCE_NAME}/attachments" | jq "select(.attachments != null) | .attachments[] | select(.environment == \"${ENV_NAME}\") | .environment" --join-output); [[ "${ATTACHMENT_DONE}" != "${ENV_NAME}" ]] || break; echo -n "."; sleep 5; done; echo "***ORG IS READY TO USE***";

    この一連のコマンドでは、Apigee API を使用して、Apigee ランタイム インスタンスが作成されて eval 環境がアタッチされたことを確認します。

  2. インスタンスが使用可能になるまで待ちます。

    ***ORG IS READY TO USE*** というテキストが表示されたら、インスタンスは使用可能です。ラボを開始する前にすでに Apigee 組織が作成されていることがあります。その場合はインスタンスが作成されるまで待つ必要はありません。

    組織の準備ができるまで待つ場合は、その間に、ApigeeApigee X のアーキテクチャAPI と API プロキシの詳細をご覧ください。

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

  1. ブラウザ ウィンドウで Apigee UI タブを選択します。

  2. 左側のナビゲーション メニューで [Develop] > [API Proxies] を選択し、[bank-v1] をクリックします。

  3. [Develop] タブをクリックします。

  4. [Deploy to eval] をクリックします。

    デプロイの確認を求めるダイアログが表示されます。

  5. [Service Account] に、サービス アカウントのメールアドレスを指定します。

    apigee-internal-access@{{{ project_0.project_id | PROJECT }}}.iam.gserviceaccount.com
  6. [Deploy] をクリックします。

  7. [Overview] タブをクリックして eval のデプロイ ステータスを確認し、プロキシがデプロイされるまで待ちます。

API プロキシをテストする

Apigee 組織の eval 環境は、eval.example.com というホスト名を使用して呼び出すことができます。このホスト名を Apigee ランタイム インスタンスの IP アドレスに解決する DNS エントリは、すでにプロジェクト内に作成されています。この DNS エントリは限定公開ゾーンに作成されているため、内部ネットワーク上でのみ表示されます。

Cloud Shell は内部ネットワーク上に存在しないため、Cloud Shell のコマンドではこの DNS エントリを解決できません。プロジェクト内の仮想マシン(VM)は、限定公開ゾーンの DNS にアクセスできます。apigeex-test-vm という名前の仮想マシンが自動的に作成されています。このマシンを使用して API プロキシを呼び出すことができます。

  1. Cloud Shell で、テスト VM への SSH 接続を開きます。

    TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)") gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite

    1 つ目の gcloud コマンドでテスト VM のゾーンを取得し、2 つ目のコマンドで VM への SSH 接続を開きます。

  2. 承認するよう求められた場合は、[承認] をクリックします。

    Cloud Shell で確認されるすべての項目について、Enter キーまたは Return キーを押して、デフォルトの入力を指定します。

    プロジェクトのオーナーとしてログインしているため、このマシンへの SSH は許可されます。

    これで、Cloud Shell セッションが VM 内で実行されます。

  3. eval 環境にデプロイした bank-v1 API プロキシを呼び出します。

    curl -i -k "https://eval.example.com/bank/v1/_status"

    -k オプションを指定すると、curl は TLS 証明書の検証をスキップします。Apigee ランタイムは、信頼できる認証局(CA)によって作成された証明書ではなく、自己署名証明書を使用します。

    注: 本番環境のユースケースでは、-k オプションを使用して証明書の検証を省略しないでください。

    403 Forbidden ステータス コードが返されて、クライアントに URL を取得する権限がないという内容のエラー メッセージが表示されます。クライアントが必要なトークンをリクエストで渡さなかったために、バックエンド サービスに対するリクエストが拒否されました。API プロキシは正しい ID で実行されていますが、それでも、リクエストで OpenId Connect ID トークンを強制的に送信する必要があります。

  4. Apigee UIbank-v1 プロキシに戻り、[Develop] タブをクリックします。

  5. プロキシの [Navigator] メニューで、[Target Endpoints] セクションの [PreFlow] をクリックします。

  6. 次のコードを探します(URL は異なります)。

    <HTTPTargetConnection> <URL>https://simplebank-rest-zce6j3rjwq-uw.a.run.app</URL> </HTTPTargetConnection> 注: HTTPTargetConnection セクションが見つからない場合は、[Proxy Endpoints] セクションではなく [Target Endpoints] セクションの [PreFlow] をクリックしたことを確認してください。
  7. URL の下に、次のような Authentication セクションを追加します。

    <Authentication> <GoogleIDToken> <Audience>AUDIENCE</Audience> </GoogleIDToken> </Authentication>
  8. AUDIENCE は、HTTPTargetConnection セクションにすでにある URL 値に置き換えます。コードは、URL 要素と Audience 要素の独自の URL を除いて、次のようになります。

    <TargetEndpoint name="default"> <PreFlow name="PreFlow"> <Request/> <Response/> </PreFlow> <Flows/> <PostFlow name="PostFlow"> <Request/> <Response/> </PostFlow> <HTTPTargetConnection> <URL>https://simplebank-rest-zce6j3rjwq-uw.a.run.app</URL> <Authentication> <GoogleIDToken> <Audience>https://simplebank-rest-zce6j3rjwq-uw.a.run.app</Audience> </GoogleIDToken> </Authentication> </HTTPTargetConnection> </TargetEndpoint>
  9. [Save] をクリックし、続いて [OK] をクリックします。

  10. [Deploy to eval] をクリックしてから [Deploy] をクリックします。

    注: サービス アカウントを変更しないでください。前回のデプロイと同じである必要があります。
  11. [Overview] タブをクリックして eval のデプロイ ステータスを確認し、新しいリビジョンがデプロイされるまで待ちます。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Apigee プロキシを作成する

  1. SSH ログインがタイムアウトした場合は、Cloud Shell で次のコマンドを実行して接続を再確立します。

    TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)") gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite
  2. VM 内でステータス コマンドを再実行します。

    curl -i -k "https://eval.example.com/bank/v1/_status"

    今度は、次のような成功のレスポンス(200)が表示されるはずです。

    HTTP/2 200 x-powered-by: Express content-type: application/json; charset=utf-8 etag: W/"41-x4uozCo6q/yN+kzizriXxryNZvc" x-cloud-trace-context: 5c810a7faa3353bcc085473fd58805b7 date: Thu, 11 Nov 2021 22:54:35 GMT server: Google Frontend content-length: 65 x-request-id: cf109193-6d6f-49a1-b323-7f66f63c5e28 via: 1.1 google {"serviceName":"simplebank-rest","status":"API up","ver":"1.0.0"}

    このレスポンスは、API プロキシがバックエンド サービスの呼び出しに成功したことを示しています。

  3. コマンド exit を入力して SSH セッションを終了し、Cloud Shell に戻ります。

タスク 3. Google Cloud Geocoding API を使用できるようにする

このタスクでは、Geocoding API を有効にします。この API を API プロキシで使用して、SimpleBank サービスから ATM を取得する際にレスポンスに住所の情報を追加します。

  1. Geocoding API を有効にするには、Cloud Shell で次のコマンドを実行します。

    gcloud services enable geocoding-backend.googleapis.com

    次に、Geocoding API にアクセスできる API キーを作成します。

  2. この API キーを作成するには、次のコマンドを実行します。

    API_KEY=$(gcloud alpha services api-keys create --project=${GOOGLE_CLOUD_PROJECT} --display-name="Geocoding API key for Apigee" --api-target=service=geocoding_backend --format "value(response.keyString)") echo "export API_KEY=${API_KEY}" >> ~/.bashrc echo "API_KEY=${API_KEY}" 注: project プロパティが空の文字列に設定されているという内容のエラーが返される場合は、VM の SSH セッションを終了して Cloud Shell に戻っていることを確認してください。

    この gcloud コマンドは、Geocoding API にリクエストを送信できる API キーを作成します。--format パラメータで response の keyString フィールドを選択して API_KEY シェル変数に格納し、その API_KEY 変数を Cloud Shell の .bashrc ファイルに格納しています。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Google Cloud Geocoding API を使用できるようにする

  1. 緯度と経度を指定してジオコーディング情報を取得するには、次の curl コマンドを実行します。

    curl "https://maps.googleapis.com/maps/api/geocode/json?key=${API_KEY}&latlng=37.404934,-122.021411"

    このコマンドは、Geocoding API を呼び出して、API キーと、目的の緯度および経度を渡します。レスポンスには、書式設定済みの住所を含む結果の配列が含まれます。その最初の結果の書式設定済み住所を API プロキシで使用して、1 つの ATM の詳細を取得する際に API レスポンスに住所を追加します。

タスク 4. Geocoding API を呼び出す共有フローを作成する

このタスクでは、Google Geocoding API を呼び出すための共有フローを作成します。共有フローを使用すると、ポリシーとリソースを組み合わせて 1 つのフローを作成し、複数の API プロキシや他の共有フローから使用できます。

この共有フローでは次のパターンを使用します。

Lookup Cache、Service Callout、Extract Variables、Populate Cache の各ステップの上にキャッシュ ヒットとキャッシュミスの矢印が示されている

データベースに含まれている ATM の数は限られており、ATM の緯度と経度は変わりません。Geocoding API の過剰な呼び出しを防ぐために、取得した住所をキャッシュに保存して、緯度と経度をキャッシュキーとして使用します。指定された緯度と経度に対応する住所がキャッシュにない場合は、Geocoding API が呼び出されて、返された住所がキャッシュに保存されます。

共有フローを作成する

  1. Apigee UI に戻ります。
  2. 左側のナビゲーション メニューで [Develop] > [Shared Flows] を選択します。
  3. [Create New] をクリックします。
  4. [Name] を get-address-for-location に設定し、[Create] をクリックします。
  5. 右上隅に [Switch to Classic] リンクがある場合は、そのリンクをクリックします。
  6. [Develop] タブをクリックします。
  7. 共有フローの [Navigator] メニューで、[Shared Flows] セクションの [default] をクリックします。

LookupCache ポリシーを追加する

LookupCache ポリシーで、住所がすでにキャッシュに保存されている場合にその住所を取得します。

  1. フローの矢印の上にある [+ Step] をクリックします。

  2. [Traffic Management] セクションで、[Lookup Cache] ポリシータイプを選択します。以下を指定します。

    プロパティ
    Display Name LC-LookupAddress
    Name LC-LookupAddress
  3. [Add] をクリックします。

    ポリシーがフローに追加されて、ポリシーの構成 XML がフローの下のペインに表示されます。

  4. LookupCache の XML 構成を次の内容に置き換えます。

    <LookupCache continueOnError="false" enabled="true" name="LC-LookupAddress"> <CacheResource>AddressesCache</CacheResource> <Scope>Exclusive</Scope> <CacheKey> <KeyFragment ref="geocoding.latitude"/> <KeyFragment ref="geocoding.longitude"/> </CacheKey> <AssignTo>geocoding.address</AssignTo> </LookupCache>

    このポリシーは、指定された緯度と経度に一致するエントリを AddressesCache で探して、見つかった場合はその値を変数 address に割り当てます。

Service Callout ポリシーを追加する

Service Callout ポリシーで Google Geocoding API を呼び出します。

  1. 共有フローの [Navigator] メニューで、[Shared Flows] セクションの [default] をクリックします。

  2. [+ Step] をクリックしてポリシーをさらに追加します。

  3. [Extension] セクションで、[Service Callout] ポリシータイプを選択します。以下を指定します。

    プロパティ
    Display Name SC-GoogleGeocode
    Name SC-GoogleGeocode
  4. [HTTP Target] フィールドは空白のままにして、[Add] をクリックします。

  5. ServiceCallout の XML 構成を次の内容に置き換えます。

    <ServiceCallout continueOnError="false" enabled="true" name="SC-GoogleGeocode"> <Request> <Set> <QueryParams> <QueryParam name="latlng">{geocoding.latitude},{geocoding.longitude}</QueryParam> <QueryParam name="key">{geocoding.apikey}</QueryParam> </QueryParams> <Verb>GET</Verb> </Set> </Request> <Response>calloutResponse</Response> <HTTPTargetConnection> <URL>https://maps.googleapis.com/maps/api/geocode/json</URL> </HTTPTargetConnection> </ServiceCallout>

    このポリシーは、geocoding.latitude、geocoding.longitudegeocoding.apikey の各変数を使用して Geocoding API を呼び出します。API 呼び出しのレスポンスは calloutResponse 変数に格納されます。

ExtractVariables ポリシーを追加する

ExtractVariables ポリシーで、Google Geocoding API のレスポンスから書式設定済み住所を抽出します。

  1. 共有フローの [Navigator] メニューで、[Shared Flows] セクションの [default] をクリックします。

  2. [+ Step] をクリックしてポリシーをさらに追加します。

  3. [Mediation] セクションで、[Extract Variables] ポリシータイプを選択します。以下を指定します。

    プロパティ
    Display Name EV-ExtractAddress
    Name EV-ExtractAddress
  4. [Add] をクリックします。

  5. ExtractVariables の XML 構成を次の内容に置き換えます。

    <ExtractVariables continueOnError="false" enabled="true" name="EV-ExtractAddress"> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> <JSONPayload> <Variable name="address"> <JSONPath>$.results[0].formatted_address</JSONPath> </Variable> </JSONPayload> <Source clearPayload="false">calloutResponse.content</Source> <VariablePrefix>geocoding</VariablePrefix> </ExtractVariables>

    このポリシーは、JSONPath を使用して、calloutResponse メッセージの JSON ペイロードの最初の結果から formatted_addressを抽出します。抽出した住所は geocoding.address 変数に格納されます。

PopulateCache ポリシーを追加する

PopulateCache ポリシーで住所をキャッシュに保存します。

  1. 共有フローの [Navigator] メニューで、[Shared Flows] セクションの [default] をクリックします。

  2. [+ Step] をクリックしてポリシーをさらに追加します。

  3. [Traffic Management] セクションで、[Populate Cache] ポリシータイプを選択します。以下を指定します。

    プロパティ
    Display Name PC-StoreAddress
    Name PC-StoreAddress
  4. [Add] をクリックします。

    ポリシーがフローに追加されて、ポリシーの構成 XML がフローの下のペインに表示されます。

  5. PopulateCache の XML 構成を次の内容に置き換えます。

    <PopulateCache continueOnError="false" enabled="true" name="PC-StoreAddress"> <CacheResource>AddressesCache</CacheResource> <Scope>Exclusive</Scope> <Source>geocoding.address</Source> <CacheKey> <KeyFragment ref="geocoding.latitude"/> <KeyFragment ref="geocoding.longitude"/> </CacheKey> <ExpirySettings> <TimeoutInSec>3600</TimeoutInSec> </ExpirySettings> </PopulateCache>

    このポリシーは、address 変数の値を AddressesCache に格納します。その際、LookupCache ポリシーによって使用されるのと同じキー フラグメント(latitude と longitude)を同じ順序で使用します。ExpirySettings/TimeoutInSec の設定で、格納されたデータがキャッシュに保存される期間を 3600 秒(1 時間)に指定しています。

条件に基づいてポリシーをスキップする

特定の緯度と経度に対応する住所がキャッシュで見つかった場合(キャッシュ ヒット)、ServiceCallout、ExtractVariables、PopulateCache の各ポリシーは不要になるため、スキップする必要があります。

  1. 共有フローの [Navigator] メニューで、[Shared Flows] セクションの [default] をクリックします。

    [Code] ペインに default フローが表示されます。このフローには 4 つのポリシーがアタッチされています。

    <SharedFlow name="default"> <Step> <Name>LC-LookupAddress</Name> </Step> <Step> <Name>SC-GoogleGeocode</Name> </Step> <Step> <Name>EV-ExtractAddress</Name> </Step> <Step> <Name>PC-StoreAddress</Name> </Step> </SharedFlow>

    各 Step は、アタッチされたポリシーを指定しています。Name は、アタッチされたポリシーの名前を指定しています。Condition 要素を追加して、ポリシーを実行するかどうかを決定するブール条件を指定することもできます。

    このタスクの最初に確認した、この共有フローのパターンに示されているとおり、キャッシュで住所が見つかった場合は、サービスを呼び出す必要も、データをキャッシュに保存する必要もないため、2 番目から 4 番目までのポリシー ステップをスキップする必要があります。

    LookupCache ポリシーは、キャッシュでアイテムが見つかったかどうかを示す変数を設定します。その lookupcache.{policyName}.cachehit 変数が false の場合は、アイテムが見つからなかったことになります。2 番目から 4 番目までのステップのポリシーは、キャッシュ ヒットがなかった場合にのみ実行する必要があります。

  2. 2 番目から 4 番目までのステップで、Step 要素に次の条件を追加します。

    <Condition>lookupcache.LC-LookupAddress.cachehit == false</Condition>

    すべて追加し終わると、この共有フローは次のようになります。

    <SharedFlow name="default"> <Step> <Name>LC-LookupAddress</Name> </Step> <Step> <Condition>lookupcache.LC-LookupAddress.cachehit == false</Condition> <Name>SC-GoogleGeocode</Name> </Step> <Step> <Condition>lookupcache.LC-LookupAddress.cachehit == false</Condition> <Name>EV-ExtractAddress</Name> </Step> <Step> <Condition>lookupcache.LC-LookupAddress.cachehit == false</Condition> <Name>PC-StoreAddress</Name> </Step> </SharedFlow>
  3. [Save] をクリックし、[Deploy to eval] をクリックします。

  4. [Service Account] は空白のままにして、[Deploy] をクリックします。

    この共有フローは API キーを使用して Geocoding API を呼び出すため、サービス アカウントは必要ありません。

    共有フローをテストするには API プロキシから呼び出す必要があります。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 Geocoding API を呼び出す共有フローを作成する

タスク 5. 1 つの ATM を取得する際に ATM の住所を追加する

このタスクでは、作成した共有フローを呼び出す FlowCallout ポリシーを API プロキシに追加します。この API プロキシでは、特定の ATM を取得する際に、Cloud Run サービスのレスポンスから緯度と経度を抽出して、それらに対応する住所を取得するためにこの共有フローを呼び出す必要があります。取得した住所は、JavaScript ポリシーによって API レスポンスに追加されます。

API キー用のプロパティ セットを追加する

プロパティ セットを使用すると、無期限のデータを格納して、API プロキシ内から簡単にアクセスできます。プロパティ セットの値で API キーを保持します。

  1. 左側のナビゲーション メニューで [Develop] > [API Proxies] を選択します。

  2. [bank-v1] をクリックし、[Develop] タブを選択します。

  3. プロキシの [Navigator] メニューで、[Resources] セクションの [+] をクリックします。

  4. [File Type] のプルダウンで [Property Set] を選択します。

  5. [File Name] に geocoding.properties を指定して、[Add] をクリックします。

  6. [geocoding.properties] ペインで、次のプロパティを追加します。

    apikey=<APIKEY>
  7. <APIKEY> は、タスク 3 で作成した API_KEY に置き換えます。

  8. API_KEY を取得するには、Cloud Shell で次のコマンドを使用します。

    echo ${API_KEY}

    geocoding.properties ファイルが次のようになります。

    apikey=AIzaSyC8-B6nt7M240wwZtsxR2O5sb0xznuhQWc

条件フローを作成する

  1. API プロキシの [Navigator] メニューで、[Proxy Endpoints] セクション内の [default] の行にある [+] をクリックします。

  2. []New Conditional Flow ダイアログで次の値を指定します。

    プロパティ
    Flow Name GetATM
    Description retrieve a single ATM
    Condition Type [Path and Verb] を選択
    Path /atms/{name}
    Verb [GET] を選択

    [Optional Target URL] は空白のままにします。

  3. [Add] をクリックします。

    API プロキシは多数のフローで構成されます。各フローは、ポリシーをステップとしてアタッチするための場を提供します。以下の図は API プロキシを表しています。

    プロキシ エンドポイントからターゲット エンドポイントへのリクエストのフローと返されるレスポンスのフロー

    条件フローの構成は、条件が true の場合にのみ実行されます。この条件フローでは、proxy.pathsuffix 変数が /atms/{name} という形式に一致し、request.verb 変数が GET である必要があります。

    このGetATM 条件フローにいくつかのポリシーをアタッチして、それらが GET /atms/{name} リクエストに対してのみ実行されるようにします。それらのポリシーは、バックエンド サービスが呼び出された後に実行される必要があるため、Proxy Endpoint Response 条件フローにアタッチする必要があります。

緯度と経度を抽出する

  1. ハイライト表示されていない場合は [GetATM] フローをクリックしてから、Response フローの下の左側にある [+ Step] ボタンをクリックします。

  2. [Mediation] セクションで、[Extract Variables] ポリシータイプを選択します。以下を指定します。

    プロパティ
    Display Name EV-ExtractLatLng
    Name EV-ExtractLatLng
  3. [Add] をクリックします。

  4. ExtractVariables の XML 構成を次の内容に置き換えます。

    <ExtractVariables name="EV-ExtractLatLng"> <Source>response</Source> <JSONPayload> <Variable name="latitude"> <JSONPath>$.latitude</JSONPath> </Variable> <Variable name="longitude"> <JSONPath>$.longitude</JSONPath> </Variable> </JSONPayload> <IgnoreUnresolvedVariables>true</IgnoreUnresolvedVariables> </ExtractVariables>

    このポリシーは、バックエンド サービスからの GET /atms/{name} JSON レスポンスから latitude と longitude を抽出します。IgnoreUnresolvedVariables 要素が true に設定されているため、レスポンスに latitude と longitude が見つからない場合も処理が続行されます。

共有フローを呼び出す

  1. ハイライト表示されていない場合は [GetATM] フローをクリックしてから、Response フローの下の左側にある [+ Step] ボタンをクリックします。

  2. [Extension] セクションで、[Flow Callout] ポリシータイプを選択します。以下を指定します。

    プロパティ
    Display Name FC-GetAddress
    Name FC-GetAddress
    Shared Flow [get-address-for-location] を選択
  3. [Add] をクリックします。

  4. API プロキシの [Navigator] メニューで、[FC-GetAddress] ポリシーをクリックします。

    FC-GetAddress の構成が [Code] ペインに表示されます。

  5. FC-GetAddress の XML 構成を次の内容に置き換えます。

    <FlowCallout continueOnError="false" enabled="true" name="FC-GetAddress"> <Parameters> <Parameter name="geocoding.latitude">{latitude}</Parameter> <Parameter name="geocoding.longitude">{longitude}</Parameter> <Parameter name="geocoding.apikey">{propertyset.geocoding.apikey}</Parameter> </Parameters> <SharedFlowBundle>get-address-for-location</SharedFlowBundle> </FlowCallout>

    このポリシーは、latitude、longitude、apikey の各変数をパラメータとして設定して共有フローを呼び出します。共有フローによって geocoding.address 変数が設定されます。

住所を追加する

  1. [GetATM] フローをクリックしてから、Response フローの下の左側にある [+ Step] ボタンをクリックします。

  2. [Extension] セクションで、[JavaScript] ポリシータイプを選択します。以下を指定します。

    プロパティ
    Display Name JS-AddAddress
    Name JS-AddAddress
    Script File [Create new script] を選択
    Script Name addAddress.js
  3. [Add] をクリックします。

  4. API プロキシの [Navigator] メニューで、[Resources] セクションの [addAddress.js] をクリックします。

    addAddress.js コードの [Code] ペインは空です。

  5. レスポンスに住所を追加する次の JavaScript コードを追加します。

    // フロー変数 'geocoding.address' を取得します var address = context.getVariable('geocoding.address'); // レスポンスのペイロードを responsePayload オブジェクトに解析します var responsePayload = JSON.parse(context.getVariable('response.content')); try { // レスポンスに住所を追加します responsePayload.address = address; // レスポンス オブジェクトを再度 JSON に変換します context.setVariable('response.content', JSON.stringify(responsePayload)); } catch(e) { // 例外をキャッチします print('Error occurred when trying to add the address to the response.'); }

    このコードは、JSON レスポンスのペイロードをオブジェクトに解析して住所のフィールドを追加し、そのオブジェクトを再度 JSON 文字列に変換してレスポンスに格納します。

    JavaScript ポリシーの外に例外がスローされないようにするために try / catch ブロックが使用されています。例外がキャッチされない場合は障害が発生して、API プロキシの処理が中止されます。

条件に基づいてポリシーをスキップする

  1. プロキシの [Navigator] メニューで、[Proxy Endpoints] セクションの [GetATM] をクリックします。

    [Code] ペインに GetATM フローが表示されます。このフローには 3 つのポリシーがアタッチされています。

    <Flows> <Flow name="GetATM"> <Description>retrieve a single ATM</Description> <Request/> <Response> <Step> <Name>EV-ExtractLatLng</Name> </Step> <Step> <Name>FC-GetAddress</Name> </Step> <Step> <Name>JS-AddAddress</Name> </Step> </Response> <Condition>(proxy.pathsuffix MatchesPath "/atms/{name}") and (request.verb = "GET")</Condition> </Flow> </Flows>

    GET /atms/{name} のレスポンスに緯度と経度の両方が含まれていない場合(無効な ATM 名が指定された場合など)は、FC-GetAddress ポリシーと JS-AddAddress ポリシーをスキップする必要があります。

  2. 2 番目と 3 番目のステップで、Step 要素に次の条件を追加します。

    <Condition>latitude != null AND longitude != null</Condition>

    条件を追加し終わると、この条件フローは次のようになります。

    <Flow name="GetATM"> <Description>retrieve a single ATM</Description> <Request/> <Response> <Step> <Name>EV-ExtractLatLng</Name> </Step> <Step> <Condition>latitude != null AND longitude != null</Condition> <Name>FC-GetAddress</Name> </Step> <Step> <Condition>latitude != null AND longitude != null</Condition> <Name>JS-AddAddress</Name> </Step> </Response> <Condition>(proxy.pathsuffix MatchesPath "/atms/{name}") and (request.verb = "GET")</Condition> </Flow>
  3. [Save] をクリックします。プロキシが新しいリビジョンとして保存されたことを知らせるメッセージが表示された場合は、[OK] をクリックします。

  4. [Deploy to eval] をクリックし、eval 環境に新しいリビジョンをデプロイすることを確認するメッセージが表示されたら [Deploy] をクリックします。

  5. [Overview] タブをクリックして eval のデプロイ ステータスを確認し、新しいリビジョンがデプロイされるまで待ちます。

[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。 1 つの ATM を取得する際に ATM の住所を追加する

更新した API プロキシをテストする

  1. Cloud Shell で、テスト VM への SSH 接続を開きます。

    TEST_VM_ZONE=$(gcloud compute instances list --filter="name=('apigeex-test-vm')" --format "value(zone)") gcloud compute ssh apigeex-test-vm --zone=${TEST_VM_ZONE} --force-key-file-overwrite
  2. 次のコマンドを使用して、bank-v1 プロキシを呼び出してすべての ATM を取得します。

    curl -i -k "https://eval.example.com/bank/v1/atms"

    レスポンスに住所は含まれません。このリクエストでは GET /atms/{name} のフローは使用されないからです。

  3. 1 つの ATM を取得します。

    curl -i -k "https://eval.example.com/bank/v1/atms/spruce-goose"

    今度は、API プロキシで追加された住所がレスポンスに含まれます。

    {"longitude":-118.408207,"latitude":33.977601,"description":"","name":"spruce-goose","address":"5865 S Campus Center Dr, Los Angeles, CA 90094, USA"}

お疲れさまでした

このラボでは、まず、Cloud Run にバックエンド サービスをデプロイし、そのバックエンド サービスをプロキシする Apigee API プロキシを作成しました。次に、外部サービスからコンテンツを取得してキャッシュに保存する共有フローを作成しました。その後、作成した API プロキシからその共有フローを呼び出して、API レスポンスを JavaScript コードで変更しました。

クエストを完了する

このセルフペース ラボは、「Develop and Secure APIs with Apigee X」スキルバッジ クエストの一部です。クエストとは学習パスを構成する一連のラボのことで、完了すると成果が認められてバッジが贈られます。バッジは公開して、オンライン レジュメやソーシャル メディア アカウントにリンクできます。このラボの修了後、こちらのクエストに登録すれば、すぐにクレジットを受け取ることができます。受講可能なその他のクエストもご確認ください

次のラボを受講する

シリーズの次のラボ「Apigee X による API の公開」に進んでクエストを続けてください。

次のステップと詳細情報

マニュアルの最終更新日: 2023 年 10 月 26 日

ラボの最終テスト日: 2023 年 10 月 26 日

Copyright 2024 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。