チェックポイント
Create the API proxy
/ 20
Create the full access API product
/ 20
Create the read-only API product, app developer, and 2 apps
/ 20
Add the quota policy
/ 10
Add CORS to the API proxy
/ 20
Create the integrated developer portal
/ 10
Apigee X を使った API の公開
GSP843
概要
API は、API を利用してユーザーに独自のエクスペリエンスを提供するアプリ デベロッパー向けに設計されています。Google Cloud の Apigee API Platform を使用すると、API を公開し、アプリ デベロッパーがその API を利用できるようにすることができます。
このラボでは、API へのアクセスを制限するために API キー検証が必要となる Apigee API プロキシを作成します。
API プロダクトを作成して、内部と外部のアプリケーション デベロッパーにさまざまなレベルのサービスを提供します。特定のアプリケーションごとに呼び出し回数を制限するために、割り当てポリシーを使用します。CORS ポリシーを作成して API にクロスオリジン リソース シェアリング(CORS)機能を追加し、ウェブ アプリケーションから呼び出すことができるようにします。次に、デベロッパー ポータルを作成して、アプリ デベロッパーが使用できるように API プロダクトを公開します。
学習内容
このラボでは、次のタスクを行う方法について学びます。
-
API キーを作成して、API へのアクセスを制限し、アプリケーションの使用状況を追跡する
-
API プロダクトを作成して、さまざまなタイプのアプリ デベロッパーにさまざまなレベルのアクセスを提供する
-
割り当てポリシーを使用し、接続されている API プロダクトに基づいて特定のアプリケーションに対する呼び出し回数を制限する
-
API にクロスオリジン リソース シェアリング(CORS)機能を追加して、ウェブ アプリケーションからのオリジン間の API 呼び出しを許可する
-
デベロッパー ポータルを作成して API プロダクトを公開する
設定と要件
[ラボを開始] ボタンをクリックする前に
こちらの手順をお読みください。ラボの時間は記録されており、一時停止することはできません。[ラボを開始] をクリックするとスタートするタイマーは、Google Cloud のリソースを利用できる時間を示しています。
このハンズオンラボでは、シミュレーションやデモ環境ではなく、実際のクラウド環境を使ってご自身でラボのアクティビティを行うことができます。そのため、ラボの受講中に Google Cloud にログインおよびアクセスするための、新しい一時的な認証情報が提供されます。
このラボを完了するためには、下記が必要です。
- 標準的なインターネット ブラウザ(Chrome を推奨)
- ラボを完了するために十分な時間を確保してください。ラボをいったん開始すると一時停止することはできません。
ラボを開始して Google Cloud コンソールにログインする方法
-
[ラボを開始] ボタンをクリックします。ラボの料金をお支払いいただく必要がある場合は、表示されるポップアップでお支払い方法を選択してください。 左側の [ラボの詳細] パネルには、以下が表示されます。
- [Google Cloud コンソールを開く] ボタン
- 残り時間
- このラボで使用する必要がある一時的な認証情報
- このラボを行うために必要なその他の情報(ある場合)
-
[Google Cloud コンソールを開く] をクリックします(Chrome ブラウザを使用している場合は、右クリックして [シークレット ウィンドウでリンクを開く] を選択します)。
ラボでリソースが起動し、別のタブで [ログイン] ページが表示されます。
ヒント: タブをそれぞれ別のウィンドウで開き、並べて表示しておきましょう。
注: [アカウントの選択] ダイアログが表示されたら、[別のアカウントを使用] をクリックします。 -
必要に応じて、下のユーザー名をコピーして、[ログイン] ダイアログに貼り付けます。
{{{user_0.username | "Username"}}} [ラボの詳細] パネルでも [ユーザー名] を確認できます。
-
[次へ] をクリックします。
-
以下のパスワードをコピーして、[ようこそ] ダイアログに貼り付けます。
{{{user_0.password | "Password"}}} [ラボの詳細] パネルでも [パスワード] を確認できます。
-
[次へ] をクリックします。
重要: ラボで提供された認証情報を使用する必要があります。Google Cloud アカウントの認証情報は使用しないでください。 注: このラボでご自身の Google Cloud アカウントを使用すると、追加料金が発生する場合があります。 -
その後次のように進みます。
- 利用規約に同意してください。
- 一時的なアカウントなので、復元オプションや 2 要素認証プロセスは設定しないでください。
- 無料トライアルには登録しないでください。
その後、このタブで Google Cloud コンソールが開きます。
Cloud Shell をアクティブにする
Cloud Shell は、開発ツールと一緒に読み込まれる仮想マシンです。5 GB の永続ホーム ディレクトリが用意されており、Google Cloud で稼働します。Cloud Shell を使用すると、コマンドラインで Google Cloud リソースにアクセスできます。
- Google Cloud コンソールの上部にある「Cloud Shell をアクティブにする」アイコン をクリックします。
接続した時点で認証が完了しており、プロジェクトに各自の PROJECT_ID が設定されます。出力には、このセッションの PROJECT_ID を宣言する次の行が含まれています。
gcloud
は Google Cloud のコマンドライン ツールです。このツールは、Cloud Shell にプリインストールされており、タブ補完がサポートされています。
- (省略可)次のコマンドを使用すると、有効なアカウント名を一覧表示できます。
-
[承認] をクリックします。
-
出力は次のようになります。
出力:
- (省略可)次のコマンドを使用すると、プロジェクト ID を一覧表示できます。
出力:
出力例:
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 を操作するには、左側のナビゲーション メニューを使用します。ランディング ページには、よく使用される場所に移動できるクイックリンクも表示されます。
タスク 1. Apigee API プロキシを使用してバックエンド サービスをプロキシする
このタスクでは、バックエンド サービスのファサードとして機能する Apigee API プロキシを作成します。API プロキシは、サービス アカウントを使用して、Cloud Run サービスに OpenID Connect ID トークンを提示できるようにします。
simplebank-rest
という名前のバックエンド サービスがすでに作成され、Cloud Run にデプロイされています。
Apigee プロキシを作成する
-
Cloud Shell でバックエンド サービスの URL を取得するには、次のコマンドを使用します。
gcloud run services describe simplebank-rest --platform managed --region us-west1 --format 'value(status.url)' この URL を保存します。API プロキシの作成時にこれを使用します。
-
ブラウザ ウィンドウで Apigee UI タブを選択します。
-
左側のナビゲーション メニューで [Develop] > [API Proxies] を選択します。
-
プロキシ ウィザードを使用して新しいプロキシを作成するには、[Create New] をクリックします。
バックエンド サービスのリバース プロキシを作成します。
-
[Reverse proxy] ボックスをクリックします。
-
[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 -
[Next] をクリックします。
-
[Common Policies] の設定はデフォルトのままにして、[Next] をクリックします。
-
[Summary] ページで、設定をデフォルトのままにして [Create] をクリックします。
-
[Edit proxy] をクリックします。
-
右上隅に [Switch to Classic] リンクがある場合は、そのリンクをクリックします。
タスク 2. VerifyAPIKey ポリシーを追加する
このタスクでは、API プロキシに VerifyAPIKey ポリシーを追加します。有効な API キーを提供しないリクエストは拒否されます。
VerifyAPIKey ポリシーを使用すると、実行時に API キーを検証できるため、承認された API キーを持つアプリケーションのみに API へのアクセスを許可できます。このポリシーにより、API キーが有効で失効しておらず、リクエストされた特定のリソースの利用が承認されていることを確認できます。
VerifyAPIKey ポリシーを追加する
-
[Develop] タブをクリックします。
-
プロキシの [Navigator] メニューで、[Proxy Endpoints] セクションの [PreFlow] をクリックします。
VerifyAPIKey ポリシーは、API プロキシの初期段階に配置する必要があります。デフォルトのプロキシ エンドポイントのリクエスト PreFlow が API プロキシにリクエストが届いたときに最初に実行されるフローです。
-
[Flow] ペインで、リクエスト フローの右上にある [+Step] ボタンをクリックします。
-
[Security] セクションで、[Verify API Key] を選択し、[Display Name] と [Name] を
VAK-VerifyKey
に設定します。 -
[Add] をクリックします。
VerifyAPIKey 構成が [Code] ペインに表示されます。
APIKey 要素は、リクエストで指定されている API キーの場所を示します。
-
APIKey 要素で、
request.queryparam.apikey
をrequest.header.apikey
に置き換えます。API キーをヘッダーで指定すると、ログに記録されたりブラウザ履歴に保存されたりする可能性が低くなります。
OpenID Connect ID トークンを送信するようにターゲットを変更する
バックエンド サービスは認証アクセスを必要とするようにデプロイされているため、有効な OpenID Connect ID トークンがなければサービスを呼び出すことができません。
HTTPTargetConnection でサービスのバックエンド ターゲットを指定します。
-
プロキシの [Navigator] メニューで、[Target Endpoints] セクションの [PreFlow] をクリックします。
-
次のコードを探します(URL は異なります)。
<HTTPTargetConnection> <URL>https://simplebank-rest-zce6j3rjwq-uw.a.run.app</URL> </HTTPTargetConnection>
-
URL の下に、次のような Authentication セクションを追加します。
-
AUDIENCE は、HTTPTargetConnection セクションにすでにある URL 値に置き換えます。コードは、URL 要素と Audience 要素のユーザー固有の URL を除いて、次のようになります。
-
[Save] をクリックします。
ランタイム インスタンスが使用可能であることを確認する
-
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 環境がアタッチされたかを確認します。
-
インスタンスが使用可能になるまで待ちます。
***ORG IS READY TO USE***
というテキストが表示されたら、インスタンスは使用可能です。ラボを開始する前にすでに Apigee 組織が作成されていることがあります。その場合はインスタンスが作成されるまで待つ必要はありません。組織の準備が整うまで待つ場合は、その間にAPI プロダクト、CORS、デベロッパー ポータルの詳細をご覧ください。
API プロキシをデプロイする
-
ブラウザ ウィンドウで Apigee UI タブを選択します。
-
左側のナビゲーション メニューで [Develop] > [API Proxies] を選択し、[bank-v1] をクリックします。
-
[Develop] タブをクリックします。
-
[Deploy to eval] をクリックします。
デプロイの確認を求めるダイアログが表示されます。
-
[Service Account] に、サービス アカウントのメールアドレスを指定します。
apigee-internal-access@{{{ project_0.project_id | PROJECT }}}.iam.gserviceaccount.com -
[Deploy] をクリックします。
-
[Overview] タブをクリックして eval のデプロイ ステータスを確認し、プロキシがデプロイされたと示されるまで待ちます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
API プロキシをテストする
Apigee 組織の eval 環境は、eval.example.com というホスト名を使用して呼び出すことができます。このホスト名を Apigee ランタイム インスタンスの IP アドレスに解決する DNS エントリは、すでにプロジェクト内に作成されています。この DNS エントリは限定公開ゾーンに作成されているため、内部ネットワーク上でのみ表示されます。
Cloud Shell は内部ネットワークに存在しないため、Cloud Shell コマンドではこの DNS エントリを解決できません。組織内の仮想マシン(VM)であれば、限定公開ゾーンの DNS にアクセスできます。apigeex-test-vm という名前の VM が自動的に作成されています。このマシンを使用して API プロキシを呼び出すことにします。
-
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 -
承認するよう求められた場合は、[Authorize] をクリックします。
-
Cloud Shell で確認されるすべての項目について、Enter キーまたは Return キーを押して、デフォルトの入力を指定します。
プロジェクトのオーナーでログインしているため、このマシンへの SSH は許可されます。
これで、Cloud Shell セッションを VM 内で実行できるようになります。
-
eval 環境にデプロイした bank-v1 API プロキシを呼び出します。
curl -i -k -X GET "https://eval.example.com/bank/v1/customers" -k
オプションを指定すると、curl
は TLS 証明書の検証をスキップします。このラボの Apigee ランタイムでは、信頼できる認証局(CA)によって作成された証明書ではなく、自己署名証明書を使用します。注: 本番環境のユースケースでは、 -k
オプションを使用した証明書の検証の省略は行わないでください。この API は、顧客リストを取得しようとします。次のような 401 Unauthorized レスポンスが表示されます。
HTTP/2 401 content-type: application/json x-request-id: 01e8da87-dc8c-4428-9cdf-8bea84e98860 content-length: 146 date: Tue, 07 Dec 2021 22:54:37 GMT via: 1.1 google {"fault":{"faultstring":"Failed to resolve API Key variable request.header.apikey","detail":{"errorcode":"steps.oauth.v2.FailedToResolveAPIKey"}}} このレスポンスは、API キーが指定されていないためにバックエンド サービスへのアクセスが API プロキシによってブロックされたことを示しています。
-
コマンド
exit
を入力して SSH セッションを終了し、Cloud Shell に戻ります。
タスク 3. API プロダクトとアプリケーションを追加する
このタスクでは、API のさまざまなレベルのアクセスを提供する API プロダクトを追加します。次に、2 つのアプリケーションを作成し、個別の API プロダクトを関連付けて、異なるアクセス権を付与します。
最初の API プロダクトを作成する
最初の API プロダクトは、サービスへの完全アクセス権を付与します。
-
ブラウザ ウィンドウで Apigee UI タブを選択します。
-
左側のナビゲーション メニューで [Publish] > [API Products] を選択します。
-
新しい API プロダクトを作成するには、[+Create] をクリックします。
-
[Product details] ペインで、以下を指定します。
プロパティ 値 Name bank-fullaccess Display Name bank (full access) Description bank API への完全アクセスを許可する Environment [eval] を選択 Access [Public] を選択 [Automatically approve access requests] は選択したままにします。
-
[Operations] セクションで、[+Add an Operation] をクリックします。
オペレーションは、API プロダクトに関連付けられているアプリケーションに対してどの API プロキシのどのリクエストを許可するかを指定するために使用されます。
注: ボタンが [GraphQL Operations] セクションではなく [Operations] セクションにあることを確認します。 -
以下を指定します。
プロパティ 値 Source bank-v1 API プロキシを選択 Path /** Methods GET、PATCH、POST、PUT、DELETE を選択 パス式 "/**" は、任意の深さの任意のパス接尾辞がオペレーションに一致することを示します。
本番環境では、このワイルドカード パス式を使用せずに、許可する各オペレーションを個別に追加することもできます。
-
[Save] をクリックして、オペレーションを保存します。
-
API プロダクトの [Custom Attributes] セクションで、[+Add Custom Attribute] をクリックします。
カスタム属性を使用すると、プロキシで利用できるようにするデータをアタッチして、アクセスを制御できます。
この場合は、Retail API 用の完全アクセスの API プロダクトであるため、API を呼び出すアプリケーションに完全アクセス権を許可することを示すカスタム属性を作成します。
-
以下を指定します。
プロパティ 値 Name full-access Value yes -
[OK] をクリックしてカスタム属性を保存します。
-
API プロダクトを保存するには、ページ上部の [Save] をクリックします。
-
[Publish] > [API Products] ページに戻ります。API プロダクトがリストに表示されます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
アクセスを制限する API プロダクトを作成する
2 つ目の API プロダクトは、サービスに対する読み取り専用アクセス権を付与します。
-
新しい API プロダクトを作成するには、[+Create] をクリックします。
-
[Product details] ペインで、以下を指定します。
プロパティ 値 Name bank-readonly Display Name bank (read-only) Description bank API への読み取り専用アクセスを許可する Environment [eval] を選択 Access [Public] を選択 [Automatically approve access requests] は選択したままにします。
-
[Operations] セクションで、[+Add an Operation] をクリックします。
注: ボタンが [GraphQL Operations] セクションではなく [Operations] セクションにあることを確認します。 -
以下を指定します。
プロパティ 値 Source bank-v1 API プロキシを選択 Path /** Methods GET を選択 -
[Save] をクリックして、オペレーションを保存します。
-
API プロダクトを保存するには、ページ上部の [Save] をクリックします。
-
[Publish] > [API Products] ページに戻ります。API プロダクトがリストに表示されます。
アプリ デベロッパーを作成する
アプリを作成する前に、アプリ デベロッパーを作成する必要があります。
-
左側のナビゲーション メニューで [Publish] > [Developers] をクリックします。
-
新しいアプリ デベロッパーを作成するには、[+Developer] をクリックします。
-
以下を指定します。
プロパティ 値 First Name Joe Last Name Developer Username joe Email joe@example.com -
[Create] をクリックして、アプリ デベロッパーを作成します。
読み取り専用アクセス権を持つアプリを作成する
-
左側のナビゲーション メニューで [Publish] > [Apps] をクリックします。
-
新しいアプリを作成するには、[+App] をクリックします。
-
[App details] ペインで、以下を指定します。
プロパティ 値 Name readonly-app Developer joe@example.com を選択 -
[Credentials] ペインで、[Add product] をクリックし、[bank (read-only)] をクリックしてから [Add(1)] をクリックして追加します。
ステータスは、すでに approved とマークされています。
-
右上の [Create] をクリックしてアプリを作成します。
これで、アプリのキーとシークレットが構成されました。
-
[Key] の横にある [Show] をクリックします。
これが API の呼び出しに使用される API キーです。キーはコピーできますが、次のステップでは、Apigee API の curl 呼び出しを使用して API キーを取得します。
完全アクセス権を持つアプリを作成する
-
左側のナビゲーション メニューで [Publish] > [Apps] をクリックします。
-
新しいアプリを作成するには、[+App] をクリックします。
-
[App details] ペインで、以下を指定します。
プロパティ 値 Name fullaccess-app Developer joe@example.com を選択 -
[Credentials] ペインで、[Add product] をクリックし、[bank (full access)] をクリックしてから [Add(1)] をクリックして追加します。
ステータスは、すでに approved とマークされています。
-
右上の [Create] をクリックしてアプリを作成します。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
API キーでテストする
-
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 -
承認するよう求められた場合は、[Authorize] をクリックします。
これで、Cloud Shell セッションを VM 内で実行できるようになります。
-
読み取り専用アプリケーションの API キーを取得するには、次のコマンドを実行します。
export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null) echo "PROJECT_ID=${PROJECT_ID}" export API_KEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerKey" --raw-output) echo "API_KEY=${API_KEY}" 最初のコマンドでは、gcloud 構成を読み取って現在のプロジェクトを取得します。2 番目のコマンドでは、Apigee API を使用して API キーを取得します。ログインしているユーザーのアクセス許可を持つアクセス トークンが送信されるので、リクエストは承認されます。
-
疑似 API キーを使用して、eval 環境でデプロイされている bank-v1 API プロキシを呼び出します。
curl -i -k -X GET -H "apikey: ABC123" "https://eval.example.com/bank/v1/customers" レスポンスは、API キーが無効であることを示すフォールトを含む 401 Unauthorized です。
-
実際の API キーを使用して、eval 環境でデプロイされている bank-v1 API プロキシを呼び出します。
curl -i -k -X GET -H "apikey: ${API_KEY}" "https://eval.example.com/bank/v1/customers" リクエストが許可され、レスポンスには顧客のリストが含まれます。
-
再び実際の API キーを使用して、eval 環境でデプロイされている bank-v1 API プロキシに対する別の呼び出しを行います。
curl -i -k -X POST -H "apikey: ${API_KEY}" -H "Content-Type: application/json" "https://eval.example.com/bank/v1/customers" -d '{"firstName": "Julia", "lastName": "Dancey", "email": "julia@example.org"}' 今度は、レスポンスは指定されたリソースについて API キーが無効であることを示すフォールトを含む 401 Unauthorized です。指定された API キーが読み取り専用 API プロダクトに関連付けられているためにリクエストが拒否され、POST リクエストが許可されません。
-
「
exit
」と入力して、仮想マシンの SSH セッションを終了します。
タスク 4. 割り当てを適用する
このタスクでは、アプリケーションごとに許可される特定の期間のリクエスト数を制限する割り当てポリシーを追加します。割り当てポリシーでは、API プロダクトで指定されている割り当て構成を使用します。
割り当てポリシーを追加する
-
ブラウザ ウィンドウで Apigee UI タブを選択します。
-
左側のナビゲーション メニューで [Develop] > [API Proxies] を選択し、[bank-v1] をクリックします。
-
[Develop] タブをクリックします。
-
プロキシの [Navigator] メニューで、[Proxy Endpoints] セクションの [PreFlow] をクリックします。
割り当てポリシーでは、特定のアプリケーションの割り当てが超過していないことを確認します。上限に達するとエラーが発生し、リクエストは中止されます。上限に達していない場合は、許可されるリクエストの数が減少します。
割り当てポリシーは、VerifyAPIKey ポリシーで設定された変数に基づいて呼び出し元アプリケーションを特定します。そのため、割り当てポリシーは VerifyAPIKey ポリシーの後に配置する必要があります。
-
[Flow] ペインで、リクエスト フローの右上にある [+Step] ボタンをクリックします。
-
[Traffic Management] セクションで、[Quota] を選択し、[Display Name] と [Name] を
Q-EnforceQuota
に設定します。 -
[Add] をクリックします。
割り当て構成が [Code] ペインに表示されます。
-
割り当て構成を次のように変更します。
<Quota continueOnError="false" enabled="true" name="Q-EnforceQuota" type="calendar"> <Identifier ref="client_id"/> <UseQuotaConfigInAPIProduct stepName="VAK-VerifyKey"> <DefaultConfig> <Allow>2</Allow> <Interval>1</Interval> <TimeUnit>hour</TimeUnit> </DefaultConfig> </UseQuotaConfigInAPIProduct> <Distributed>true</Distributed> <Synchronous>true</Synchronous> <StartTime>2021-01-01 00:00:00</StartTime> </Quota> API プロダクトを使用して、許可されるレートを指定します。UseQuotaConfigInAPIProduct 要素の stepName では、API プロダクトを特定するステップを指定しています。
API キーまたは OAuth トークンが検証されると、API プロダクトに関連付けられているアプリに関連付けることができます。こうしたポリシー設定を使用して、VAK-VerifyKey という VerifyAPIKey ステップが API プロダクトを特定します。Q-EnforceQuota ポリシーの前に VerifyAPIKey ポリシーを実行する必要があります。
割り当てポリシーで指定されているデフォルトの構成値では、1(Interval)か月(TimeUnit)あたり最大 2(Allow)つのリクエストが指定されます。デフォルト値は、値が使用できない場合にのみ使用され、これは API キーに関連付けられている API プロダクトの割り当て設定が指定されていない場合にのみ発生します。
-
[Save] をクリックします。プロキシが新しいリビジョンとして保存されたことを知らせるメッセージが表示された場合は、[OK] をクリックします。
-
[Deploy to eval] をクリックしてから [Deploy] をクリックします。
-
[Overview] タブをクリックして eval のデプロイ ステータスを確認し、プロキシがデプロイされたと示されるまで待ちます。
完全アクセスの API プロダクトの割り当て構成を追加する
- 左側のナビゲーション メニューで、[Publish] > [API Products] を選択し、[bank (full access)] をクリックします。
- [Edit] をクリックします。
- [Operations] セクションの [bank-v1] 行で [Actions] メニュー アイコン()をクリックし、[Edit] を選択します。
- オペレーションの割り当てを [5 requests every 1 minute] に設定し、[Save] をクリックしてオペレーションを保存します。
- [Save] をクリックして、API プロダクトを保存します。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
デバッグ セッションを開始する
Debug は、Apigee で動作している API プロキシのトラブルシューティングとモニタリングを行うためのツールです。Debug ツールを使用すると、API 呼び出しの各ステップの詳細を調べることができます。
-
左側のナビゲーション メニューで [Develop] > [API Proxies] を選択し、[bank-v1] をクリックします。
-
[Debug] タブをクリックします。
-
[Start a debug session] ペインで、環境のプルダウンから [eval] を選択します。
-
[Start Debug Session] をクリックします。
デバッグ セッションでリクエストのキャプチャが開始されるまで少し時間がかかる場合があります。
API リクエストを行ってからデバッグ セッションを確認します。
割り当てをテストする
-
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 -
承認するよう求められた場合は、[Authorize] をクリックします。
これで、Cloud Shell セッションを VM 内で実行できるようになります。
-
両方の API キーを取得するには、次のコマンドを実行します。
export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null) echo "PROJECT_ID=${PROJECT_ID}" export API_KEY_READONLY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/readonly-app" | jq ".credentials[0].consumerKey" --raw-output) echo "API_KEY_READONLY=${API_KEY_READONLY}" export API_KEY_FULL=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/fullaccess-app" | jq ".credentials[0].consumerKey" --raw-output) echo "API_KEY_FULL=${API_KEY_FULL}" -
割り当てエラーが発生するまでこのリクエストを繰り返し送信します。
curl -i -k -X GET -H "apikey: ${API_KEY_READONLY}" "https://eval.example.com/bank/v1/customers" 注: Cloud Shell または SSH セッションですばやくコマンドを繰り返すには、上矢印キーを押してから Return キーまたは Enter キーを押します。 割り当て違反は次のようになります。
{"fault":{"faultstring":"Rate limit quota violation. Quota limit exceeded. Identifier : bKSV3nOz2JS5Z58sWMh2RBnnwWeEeNK2N2G6HMCESgLGDLFI","detail":{"errorcode":"policies.ratelimit.QuotaViolation"}}} -
Apigee UI タブに戻ります。
数件の 200 リクエストと 1 件の 429 リクエストが表示されます。
200 リクエストをクリックします。トランザクション マップの右側に、バックエンドが呼び出されたことを示すファクトリー アイコンが表示されます。
-
デバッグ セッション ペインで、左上にある左矢印(<)をクリックして、[Start a debug session] ペインに戻ります。
-
[Start Debug Session] をクリックして新しいデバッグ セッションを開始します。
-
SSH セッションに戻り、割り当てエラーが発生するまで完全アクセスの API キーを使用してこのリクエストを繰り返し送信します。
date; curl -i -k -X GET -H "apikey: ${API_KEY_FULL}" "https://eval.example.com/bank/v1/customers" 今回は、429 レスポンスで拒否されるまで少なくとも 5 件のリクエストを送信できます。完全アクセスの API プロダクトの割り当ては、1 分あたり 5 件のリクエストです。時間の秒の部分がゼロにリセットされると、割り当てがリセットされます。上記のコマンドでは、API を呼び出す前に時間を出力しているため、割り当てがリセットされたおおよその時刻を確認できます。
-
「
exit
」と入力して、仮想マシンの SSH セッションを終了します。 -
Apigee UI タブに戻ります。
リクエストを選択して割り当てアイコンをクリックすると、VAK-VerifyKey 割り当て変数が 1 分あたり 5 件のリクエストを示しているのがわかります。
タスク 5. API プロキシに CORS を追加する
このタスクでは、bank-v1 プロキシに CORS を追加します。
CORS は、HTTP ヘッダーを使用して、別のドメインから制限付きリソースに安全にアクセスできるかどうかをブラウザに示すプロトコルです。デフォルトでは、クロスドメイン リクエストは、同一オリジン セキュリティ ポリシーで禁止されています。同一オリジン ポリシーは、ブラウザ ユーザーが知らないうちに不正な行為者とセッション情報を共有しないよう保護します。
同一オリジン ポリシーが適用されると、www.example.com から提供されたウェブページでは、api.example.com の API はホスト名が異なるためデフォルトでは呼び出すことができません。CORS を使用すると、このようなクロスオリジン アクセスが可能になります。
デベロッパー ポータルの bank API では CORS が必要です。Apigee デベロッパー ポータルにはドメイン名 *.apigee.io があり、API には別のドメインからアクセスします。ドキュメントから API を呼び出すには、エラー レスポンスなどのすべての API レスポンスに CORS ヘッダーを追加します。
CORS ではプリフライト リクエストも使用します。ブラウザは OPTIONS 動詞を使用してプリフライト リクエストを送信し、次の呼び出しが許可されるかどうかを確認します。
CORS ポリシーでは、すべての CORS 機能を処理できます。
CORS の詳細については、Apigee CORS のドキュメントを参照してください。
CORS ポリシーを追加する
-
左側のナビゲーション メニューで [Develop] > [API Proxies] を選択し、[bank-v1] をクリックします。
-
[Develop] タブをクリックします。
-
プロキシの [Navigator] メニューで、[Proxy Endpoints] セクションの [PreFlow] をクリックします。
-
[Flow] ペインで、リクエスト フローの右上にある [+Step] ボタンをクリックします。
-
[Security] セクションで、[CORS] を選択し、[Display Name] と [Name] を
CORS
に設定します。 -
[Add] をクリックします。
[Flow] ペインの下に CORS ポリシーの構成が表示されます。
AllowOrigins には、許可されるオリジンが一覧表示されます。デフォルトの構成では、許可されるオリジンがリクエストで渡されるオリジンと等しいため、すべてのオリジンが許可されます。一般的な本番環境では、特定のホスト名からのリクエストのみを許可できます。
AllowMethods では、API の許可されるメソッドのみを指定します。
AllowHeaders には、リクエストで渡される可能性があるヘッダーが一覧表示されます。
ExposeHeaders では、オリジンで呼び出されたときに許可するレスポンスのヘッダーを指定します。デフォルト値の * を使用すると、レスポンス ヘッダーはレスポンスから削除されません。
MaxAge は、ブラウザでプリフライト レスポンスをキャッシュに保存する時間を秒単位で指定します。
AllowCredentials は、Authorization ヘッダー、TLS クライアント証明書、Cookie をリクエストで送信できるかどうかを示します。
GeneratePreflightResponse は、OPTIONS メソッドを含むプリフライト リクエストを処理するかどうかを指定します。
-
AllowHeaders 構成を次の構成に置き換えます。
<AllowHeaders>origin, x-requested-with, accept, content-type, apikey</AllowHeaders> API で
apikey
ヘッダーを使用して API キーを指定しているため、これをブラウザから呼び出すことができるように追加する必要があります。 -
MaxAge の値を
-1
に置き換えます。これにより、ブラウザによるプリフライト レスポンスのキャッシュ保存が無効になるため、常にプリフライト リクエストが表示されます。本番環境のユースケースでは、一般的にレスポンスのキャッシュ保存を許可して、リクエストごとに呼び出しが 2 回行われないようにします。
-
プロキシの [Navigator] メニューで、[Proxy Endpoints] セクションの [PreFlow] をクリックします。
CORS ポリシーを追加すると、自動的にフローの最後に追加されます。ただし、プリフライト リクエストでは、API キーは必要ありません。
-
CORS ポリシーを VAK-VerifyKey ポリシーの前に移動します。
マウスを使用してポリシーを左側にドラッグできます。
PreFlow 構成を編集してポリシーを移動することもできます。以下の構成を、
<PreFlow name="PreFlow"> <Request> <Step> <Name>VAK-VerifyKey</Name> </Step> <Step> <Name>Q-EnforceQuota</Name> </Step> <Step> <Name>CORS</Name> </Step> </Request> <Response/> </PreFlow> 次の構成に置き換えます。
<PreFlow name="PreFlow"> <Request> <Step> <Name>CORS</Name> </Step> <Step> <Name>VAK-VerifyKey</Name> </Step> <Step> <Name>Q-EnforceQuota</Name> </Step> </Request> <Response/> </PreFlow> -
[Save] をクリックします。プロキシが新しいリビジョンとして保存されたことを知らせるメッセージが表示された場合は、[OK] をクリックします。
-
[Deploy to eval] をクリックしてから [Deploy] をクリックします。
-
[Overview] タブをクリックして eval のデプロイ ステータスを確認し、プロキシがデプロイされたと示されるまで待ちます。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
デバッグ セッションを開始する
-
[Debug] タブをクリックします。
-
[Start a debug session] ペインで、環境のプルダウンから [eval] を選択します。
-
[Start Debug Session] をクリックします。
デバッグ セッションでリクエストのキャプチャが開始されるまで少し時間がかかる場合があります。
CORS 機能をテストする
-
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 -
承認するよう求められた場合は、[Authorize] をクリックします。
これで、Cloud Shell セッションを VM 内で実行できるようになります。
-
API キーを取得するには、次のコマンドを実行します。
export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null) echo "PROJECT_ID=${PROJECT_ID}" export API_KEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/fullaccess-app" | jq ".credentials[0].consumerKey" --raw-output) echo "API_KEY=${API_KEY}" -
顧客リストを取得するリクエストを送信します。
curl -i -k -X GET -H "apikey: ${API_KEY}" "https://eval.example.com/bank/v1/customers" オリジンがないため、CORS 機能はスキップされます。Access-Control-Allow-Origin ヘッダーが返されないことを確認します。
-
別のリクエストを送信しますが、今度は Origin ヘッダーを含めます。これにより、通常の CORS リクエストがテストされます。
curl -i -k -X GET -H "Origin: https://www.example.com" -H "apikey: ${API_KEY}" "https://eval.example.com/bank/v1/customers" オリジンが指定されているため、access-control-* ヘッダーが返されます。
-
プリフライト リクエストを送信します。
curl -i -k -X OPTIONS -H "Origin: https://www.example.com" -H "Access-Control-Request-Method: POST" -H "Access-Control-Request-Headers: Content-Type,apikey" "https://eval.example.com/bank/v1/customers" CORS ポリシーによってレスポンスにプリフライト ヘッダーが設定され、リクエストがバックエンドに到達しなくなります。
Apigee UI に戻ってデバッグツールで OPTIONS 呼び出しを確認すると、CORS ポリシーによってバックエンド サービスへの呼び出しの引き渡しが許可されなかったことを確認できます。
-
「
exit
」と入力して、仮想マシンの SSH セッションを終了します。
タスク 6. OpenAPI 仕様をダウンロードして変更する
このタスクでは、API プロキシのインターフェースを定義している OpenAPI 仕様をダウンロードして変更します。
OpenAPI 仕様は、API プロキシをデベロッパー ポータルに公開するときに使用されます。
OpenAPI 仕様をダウンロードして編集する
-
Cloud Shell で API プロキシの OpenAPI 仕様をダウンロードするには、次のコマンドを実行します。
curl https://storage.googleapis.com/cloud-training/api-dev-quest/dev-portal/simplebank-spec.yaml?$(date +%s) --output ~/simplebank-spec.yaml この curl コマンドにより、simplebank-spec.yaml という名前のファイルがダウンロードされ、ホーム ディレクトリに同じ名前のファイルで保存されます。
-
Cloud Shell で、[エディタを開く] をクリックし、必要に応じて [新しいウィンドウで開く] をクリックします。
-
エディタで、simplebank-spec.yaml ファイルを選択します。
この OpenAPI 仕様は、このラボで作成した API プロキシのインターフェースを指定しています。この仕様は、デベロッパー ポータルでライブ ドキュメントを提供するために使用されます。
デベロッパー ポータルは、外部ネットワークから Apigee プロキシにアクセスします。使用しているホスト名 eval.example.com は、内部ネットワークでのみ利用できます。
ロードバランサが API プロキシへの外部アクセスを提供するようにプロビジョニングされています。外部アクセスは、ワイルドカード DNS プロバイダである nip.io が提供するホスト名を使用します。
外部ホスト名は次のようになります。
eval.60.70.80.90.nip.io このホスト名は、eval-group 環境グループで一致するホスト名としてすでに指定されています。
-
Cloud Shell で eval-group 設定を取得するには、次のコマンドを使用します。
curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${GOOGLE_CLOUD_PROJECT}/envgroups/eval-group" hostnames 配列には、2 つのホスト名が含まれています。一つは IP アドレスのないホスト名(eval.example.com)、もう一つは IP アドレスを含むホスト名(eval.60.70.80.90.nip.io など)です。OpenAPI 仕様では IP アドレスを含むホスト名を使用します。
-
エディタで、10 行目のホスト名を次のホスト名に置き換えます。
eval.<IPADDR>.nip.io サーバー URL のホスト名を置き換えると、10 行目は次のようになります。
- url: "https://eval.60.70.80.90.nip.io/bank/v1" -
[ファイル] > [保存] をクリックします。
-
[ファイル] > [ダウンロード] をクリックします。
これでファイルがローカルマシンにダウンロードされます。更新した仕様をデベロッパー ポータルで使用します。
タスク 7. デベロッパー ポータルを作成して API を公開する
このタスクでは、統合デベロッパー ポータルを作成して API を公開します。
統合デベロッパー ポータルを作成する
-
Apigee UI で、[Publish] > [Portals] をクリックします。
-
[Get started] をクリックします。
-
名前として「bank」と入力し、[Create] をクリックします。
作成には少し時間がかかる場合があります。作成されるとポータルの概要ページが開きます。
-
「Enroll in beta for team and audience management features」というメッセージが表示された場合は、[Enroll] をクリックします。
API をポータルに公開する
-
[API catalog] をクリックします。
-
[+] をクリックします。
-
[bank (full access)] プロダクトを選択し、[Next] をクリックします。
-
API の詳細をカスタマイズします。
プロパティ 値 Published (listed in the catalog) 選択済み Display title SimpleBank Display description SimpleBank API v1 API visibility [Public (visible to anyone)] を選択 [Published] を選択すると、API がポータルに表示され、[Public] を選択すると、ユーザーがポータルにログインしていない場合でも API を表示できます。
-
[Select image] をクリックしてから [Image URL] リンクをクリックします。
-
画像の URL を次のように設定します。
https://storage.googleapis.com/cloud-training/api-dev-quest/dev-portal/piggy-bank.png ブタの貯金箱の画像が表示されます。
-
[Select] をクリックします。
-
[API documentation] セクションで、[OpenAPI document] を選択します。
-
[Select Document] をクリックします。
-
クラウドの画像をクリックして、アップロードするファイルを選択します。
-
Cloud Shell からダウンロードした OpenAPI 仕様ファイル(simplebank-spec.yaml)を選択し、[Open] をクリックします。
-
[Select] をクリックします。
-
[Save] をクリックします。
-
デベロッパー ポータルを新しいタブで開くには、[Live Portal] をクリックします。
[進行状況を確認] をクリックして、目標に沿って進んでいることを確認します。
デバッグ セッションを開始する
-
Apigee UI に戻るには、[Develop] > [API Proxies] を選択し、[bank-v1] をクリックします。
-
[Debug] タブをクリックします。
-
[Start a debug session] ペインで、環境のプルダウンから [eval] を選択します。
-
[Start Debug Session] をクリックします。
デベロッパー ポータルを使用して API をテストする
-
Cloud Shell で完全アクセスの API キーを取得するには、次のコマンドを実行します。
export PROJECT_ID=$(gcloud config list --format 'value(core.project)' 2>/dev/null) echo "PROJECT_ID=${PROJECT_ID}" export API_KEY=$(curl -s -H "Authorization: Bearer $(gcloud auth print-access-token)" -X GET "https://apigee.googleapis.com/v1/organizations/${PROJECT_ID}/developers/joe@example.com/apps/fullaccess-app" | jq ".credentials[0].consumerKey" --raw-output) echo "API_KEY=${API_KEY}" API キーをクリップボードにコピーします。
-
[Live Portal] タブに戻り、[APIs] をクリックします。
-
ブタの貯金箱をクリックします。
SimpleBank API が表示されます。
-
[Authorize] をクリックします。
-
[Key] に API キーを貼り付けます。
-
[Authorize] をクリックしてから [OK] をクリックします。
任意のリクエストで API キーが送信されるようになります。
-
左側のメニューで [/customers POST] をクリックします。
-
次のリクエスト本文を指定します。
{ "email": "mina@example.com", "lastName": "Yu", "firstName": "Mina" } -
[Execute] をクリックします。
200 OK レスポンスは、顧客が作成されたことを示します。
-
左側のメニューで [/customers GET] をクリックします。
-
[Execute] をクリックします。
作成した顧客がデータベース内の他の顧客とともに返されます。
Apigee UI とデバッグ セッションに戻ると、両方のコマンドを送信する前に OPTIONS(プリフライト)リクエストがブラウザによって自動的に送信されたことがわかります。ブラウザは apikey ヘッダーが許可されるかどうかを把握していないため、GET コマンドの前にプリフライト リクエストが必要となります。
タスク 8. ポータルでアプリ デベロッパーを作成する(省略可)
このタスクでは、デベロッパー ポータルを使用してアプリ デベロッパーを作成します。
デベロッパー ポータルでアプリ デベロッパーを登録する
-
[Live Portal] に戻り、[Sign In] をクリックします。
-
[Create an account] をクリックします。
-
名、姓、メールアドレス、パスワードを入力します。
パスワードを使用してデベロッパー ポータルにログインする必要があるため、覚えやすいパスワードにします。
-
チェックボックスをオンにして、利用規約に同意します。
利用規約ページは、アプリ デベロッパーに API を提供する組織が指定します。
-
[Create Account] をクリックします。
メールアドレスにメールが届きます。このメールには、アカウント ユーザーのログインを許可するためにクリックする必要があるリンクが含まれています。
-
メールに記載されたリンクをクリックします。
デベロッパー ポータルにブラウザタブが開きます。
-
[Sign In] をクリックします。
-
メールアドレスとパスワードを入力し、[Sign In] をクリックします。
アプリ デベロッパーのアプリを作成する
-
右上のメールアドレスをクリックし、[Apps] をクリックします。
-
[+ New App] をクリックします。
-
[App Name] として
MyApp
を指定します。 -
API セクションの SimpleBank で、[Enable] をクリックします。
-
[Save] をクリックします。
アプリが登録され、API キーが表示されます。この API キーは、デベロッパー ポータル内で使用できます。アプリ デベロッパーとアプリは、Apigee UI に戻り、それぞれ [Publish] > [Developers]、[Publish] > [Apps] に移動すると表示されます。
お疲れさまでした
このラボでは、API キー検証を使用して API へのアクセスを制限しました。API プロダクトを作成して、内部と外部のアプリ デベロッパーにさまざまなレベルのサービスを提供しました。割り当てポリシーを使用して、各アプリの呼び出し回数を制限し、API での CORS をサポートとするために CORS ポリシーを追加しました。デベロッパー ポータルを作成し、アプリ デベロッパーが利用できるように API プロダクトを公開しました。
クエストを完了する
このセルフペース ラボは、「Develop and Secure APIs with Apigee X」スキルバッジ クエストの一部です。クエストとは学習パスを構成する一連のラボのことで、完了すると成果が認められて上のようなバッジが贈られます。バッジは公開して、オンライン レジュメやソーシャル メディア アカウントにリンクできます。こちらのクエストに登録すれば、すぐにクレジットを受け取ることができます。受講可能な全クエストについては、Google Cloud Skills Boost カタログをご覧ください。
次のラボを受講する
シリーズの次のラボ「Apigee X を使った API の保護」に進んでクエストを続けてください。
次のステップと詳細情報
Google Cloud トレーニングと認定資格
Google Cloud トレーニングと認定資格を通して、Google Cloud 技術を最大限に活用できるようになります。必要な技術スキルとベスト プラクティスについて取り扱うクラスでは、学習を継続的に進めることができます。トレーニングは基礎レベルから上級レベルまであり、オンデマンド、ライブ、バーチャル参加など、多忙なスケジュールにも対応できるオプションが用意されています。認定資格を取得することで、Google Cloud テクノロジーに関するスキルと知識を証明できます。
マニュアルの最終更新日: 2023 年 2 月 4 日
ラボの最終テスト日: 2023 年 1 月 13 日
Copyright 2024 Google LLC All rights reserved. Google および Google のロゴは Google LLC の商標です。その他すべての企業名および商品名はそれぞれ各社の商標または登録商標です。